package org.argeo.slc.ui.launch.script;\r
\r
+import java.io.ByteArrayInputStream;\r
+import java.io.IOException;\r
import java.util.List;\r
+import java.util.Properties;\r
import java.util.Vector;\r
\r
-import org.argeo.slc.ui.launch.DeployedSlcRuntime;\r
-import org.argeo.slc.ui.launch.EmbeddedSlcRuntime;\r
-import org.argeo.slc.ui.launch.SlcRuntime;\r
+import org.argeo.slc.ui.launch.DeployedSlcSystem;\r
+import org.argeo.slc.ui.launch.EmbeddedSlcSystem;\r
+import org.argeo.slc.ui.launch.SlcSystem;\r
import org.argeo.slc.ui.launch.SlcUiLaunchPlugin;\r
import org.argeo.slc.ui.launch.preferences.SlcPreferencePage;\r
import org.eclipse.core.resources.IFile;\r
import org.eclipse.core.resources.IProject;\r
-import org.eclipse.core.resources.IResource;\r
+import org.eclipse.core.resources.ResourcesPlugin;\r
import org.eclipse.core.runtime.CoreException;\r
+import org.eclipse.core.runtime.IPath;\r
import org.eclipse.core.runtime.IProgressMonitor;\r
import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Path;\r
import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.variables.IStringVariableManager;\r
+import org.eclipse.core.variables.VariablesPlugin;\r
+import org.eclipse.debug.core.DebugPlugin;\r
import org.eclipse.debug.core.ILaunch;\r
import org.eclipse.debug.core.ILaunchConfiguration;\r
import org.eclipse.debug.core.ILaunchManager;\r
AbstractJavaLaunchConfigurationDelegate {\r
public static final String ID = "org.argeo.slc.launch.slcScriptLaunchType";\r
\r
- private final static String ANT_MAIN = "org.apache.tools.ant.Main";\r
+ public final static String ANT_MAIN = "org.apache.tools.ant.Main";\r
+ public final static String SLC_MAIN = "org.argeo.slc.cli.SlcMain";\r
\r
public void launch(ILaunchConfiguration configuration, String mode,\r
ILaunch launch, IProgressMonitor monitor) throws CoreException {\r
- IResource[] resources = configuration.getMappedResources();\r
- if (resources.length != 1) {\r
- throw new RuntimeException("Can only launch one script.");\r
- }\r
- if (!(resources[0] instanceof IFile)) {\r
- throw new RuntimeException("Can only launch file.");\r
- }\r
- IFile file = (IFile) resources[0];\r
- System.out.println("Launched " + file.getLocation().toFile());\r
+ if (!saveBeforeLaunch(configuration, mode, monitor))\r
+ return;\r
+\r
+ String scriptLocation = configuration.getAttribute(\r
+ SlcScriptUtils.ATTR_SCRIPT, "");\r
+ if (scriptLocation.equals(""))\r
+ abort("Script has to be provided", null, 1);\r
+\r
+ IStringVariableManager manager = VariablesPlugin.getDefault()\r
+ .getStringVariableManager();\r
+ scriptLocation = manager.performStringSubstitution(scriptLocation);\r
+ IPath path = new Path(scriptLocation);\r
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot()\r
+ .findFilesForLocation(path);\r
+\r
+ if (files.length == 0)\r
+ abort("Coulkd not find related file", null, 1);\r
+\r
+ IFile file = (IFile) files[0];\r
+ DebugPlugin\r
+ .logMessage("Launching " + file.getLocation().toFile(), null);\r
+\r
+ boolean pre093 = configuration.getAttribute(SlcScriptUtils.ATTR_PRE093,\r
+ false);\r
\r
// Retrieve SLC Runtime\r
- SlcRuntime deployedSlc = null;\r
+ SlcSystem slcSystem = findSlcSystem(file, pre093);\r
+ if (slcSystem == null)\r
+ return;\r
+\r
+ IVMRunner vmRunner = slcSystem.getVmInstall().getVMRunner(mode);\r
+ final VMRunnerConfiguration vmConfig;\r
+ if (pre093) {\r
+ vmConfig = createPre093Config(slcSystem, file, mode);\r
+ } else {\r
+ vmConfig = createConfig(slcSystem, file, mode, configuration);\r
+ }\r
+ vmRunner.run(vmConfig, launch, monitor);\r
+ }\r
+\r
+ protected SlcSystem findSlcSystem(IFile file, boolean pre093)\r
+ throws CoreException {\r
+ SlcSystem slcSystem = null;\r
\r
IProject project = file.getProject();\r
if (project.getNature("org.eclipse.jdt.core.javanature") != null) {\r
IJavaProject javaProject = JavaCore.create(project);\r
- if (checkProjectForEmbedded(javaProject)) {\r
- deployedSlc = new EmbeddedSlcRuntime(javaProject);\r
+ if (checkProjectForEmbedded(javaProject, pre093)) {\r
+ slcSystem = new EmbeddedSlcSystem(javaProject);\r
}\r
}\r
\r
- if (deployedSlc == null) {\r
+ if (slcSystem == null) {\r
String slcRuntimePath = SlcUiLaunchPlugin.getDefault()\r
.getPreferenceStore().getString(\r
SlcPreferencePage.PREF_SLC_RUNTIME_LOCATION);\r
if (slcRuntimePath == null || slcRuntimePath.equals("")) {\r
showError("SLC Runtime path is not set. Set it in Windows > Preferences > SLC");\r
- return;\r
+ return null;\r
}\r
\r
- deployedSlc = new DeployedSlcRuntime(slcRuntimePath);\r
+ slcSystem = new DeployedSlcSystem(slcRuntimePath);\r
}\r
\r
- IVMRunner vmRunner = deployedSlc.getVmInstall().getVMRunner(mode);\r
- VMRunnerConfiguration vmConfig = new VMRunnerConfiguration(ANT_MAIN,\r
+ return slcSystem;\r
+ }\r
+\r
+ protected boolean checkProjectForEmbedded(IJavaProject project,\r
+ boolean pre093) {\r
+ try {\r
+ IType mainType = null;\r
+ if (pre093)\r
+ mainType = project.findType(ANT_MAIN);\r
+ else\r
+ mainType = project.findType(SLC_MAIN);\r
+\r
+ if (mainType == null)\r
+ return false;\r
+ else\r
+ return true;\r
+ } catch (JavaModelException e) {\r
+ e.printStackTrace();\r
+ return false;\r
+ }\r
+ }\r
+\r
+ // Regular SLC\r
+ protected VMRunnerConfiguration createConfig(SlcSystem deployedSlc,\r
+ IFile file, String mode, ILaunchConfiguration configuration)\r
+ throws CoreException {\r
+ VMRunnerConfiguration vmConfig = new VMRunnerConfiguration(SLC_MAIN,\r
deployedSlc.getClasspath());\r
vmConfig.setVMArguments(getVmArguments(deployedSlc));\r
vmConfig.setWorkingDirectory(file.getLocation().toFile().getParent());\r
vmConfig.setProgramArguments(getProgramArguments(deployedSlc, file,\r
- mode));\r
- vmRunner.run(vmConfig, launch, null);\r
+ mode, configuration));\r
+ return vmConfig;\r
+ }\r
+\r
+ protected String[] getVmArguments(SlcSystem deployedSlc) {\r
+ List<String> list = new Vector<String>();\r
+ if (deployedSlc.getJavaLibraryPath() != null)\r
+ list.add("-Djava.library.path=" + deployedSlc.getJavaLibraryPath());\r
+ return list.toArray(new String[list.size()]);\r
}\r
\r
- private String[] getVmArguments(SlcRuntime deployedSlc) {\r
+ protected String[] getProgramArguments(SlcSystem deployedSlc, IFile file,\r
+ String mode, ILaunchConfiguration configuration)\r
+ throws CoreException {\r
+ List<String> list = new Vector<String>();\r
+\r
+ list.add("--mode");\r
+ list.add("single");\r
+\r
+ // Script\r
+ list.add("--script");\r
+ list.add(file.getLocation().toFile().getAbsolutePath());\r
+\r
+ // Runtime\r
+ String runtime = configuration.getAttribute(\r
+ SlcScriptUtils.ATTR_RUNTIME, "");\r
+ if (!runtime.equals("")) {\r
+ list.add("--runtime");\r
+ list.add(runtime);\r
+ }\r
+\r
+ // Targets\r
+ String targets = configuration.getAttribute(\r
+ SlcScriptUtils.ATTR_TARGETS, "");\r
+ if (!targets.equals("")) {\r
+ list.add("--targets");\r
+ list.add(targets);\r
+ }\r
+\r
+ // Properties\r
+ Properties properties = new Properties();\r
+ String str = configuration.getAttribute(SlcScriptUtils.ATTR_PROPERTIES,\r
+ "");\r
+ ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes());\r
+ try {\r
+ properties.load(in);\r
+ } catch (IOException e) {\r
+ throw new RuntimeException("Cannot read properties", e);\r
+ } finally {\r
+ if (in != null)\r
+ try {\r
+ in.close();\r
+ } catch (IOException e) {\r
+ // silent\r
+ }\r
+ }\r
+\r
+ for (Object key : properties.keySet()) {\r
+ list.add("-p");\r
+ StringBuffer buf = new StringBuffer("");\r
+ buf.append(key).append('=').append(properties.get(key));\r
+ list.add(buf.toString());\r
+ }\r
+\r
+ // Debug mode\r
+ if (mode.equals(ILaunchManager.DEBUG_MODE)) {\r
+ list.add("--property");\r
+ list.add("log4j.logger.org.argeo.slc=DEBUG");\r
+ }\r
+ return list.toArray(new String[list.size()]);\r
+ }\r
+\r
+ // Pre SLC v0.9.3\r
+ protected VMRunnerConfiguration createPre093Config(SlcSystem deployedSlc,\r
+ IFile file, String mode) throws CoreException {\r
+ VMRunnerConfiguration vmConfig = new VMRunnerConfiguration(ANT_MAIN,\r
+ deployedSlc.getClasspath());\r
+ vmConfig.setVMArguments(getPre093VmArguments(deployedSlc));\r
+ vmConfig.setWorkingDirectory(file.getLocation().toFile().getParent());\r
+ vmConfig.setProgramArguments(getPre093ProgramArguments(deployedSlc,\r
+ file, mode));\r
+ return vmConfig;\r
+ }\r
+\r
+ protected String[] getPre093VmArguments(SlcSystem deployedSlc) {\r
List<String> list = new Vector<String>();\r
// list.add("-Dant.home=" + deployedSlc.getAntHome());\r
if (deployedSlc.getJavaLibraryPath() != null)\r
return list.toArray(new String[list.size()]);\r
}\r
\r
- private String[] getProgramArguments(SlcRuntime deployedSlc, IFile file,\r
- String mode) {\r
+ protected String[] getPre093ProgramArguments(SlcSystem deployedSlc,\r
+ IFile file, String mode) {\r
List<String> list = new Vector<String>();\r
list.add("-f");\r
list.add(file.getLocation().toFile().getAbsolutePath());\r
return list.toArray(new String[list.size()]);\r
}\r
\r
- private void showError(String message) {\r
+ // Utilities\r
+ private static void showError(String message) {\r
Shell shell = SlcUiLaunchPlugin.getDefault().getWorkbench()\r
.getActiveWorkbenchWindow().getShell();\r
\r
status);\r
}\r
\r
- protected boolean checkProjectForEmbedded(IJavaProject project) {\r
- try {\r
- IType antmainType = project.findType(ANT_MAIN);\r
- if (antmainType == null)\r
- return false;\r
- else\r
- return true;\r
- } catch (JavaModelException e) {\r
- e.printStackTrace();\r
- return false;\r
- }\r
- }\r
}\r