X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=maven%2Fmaven-argeo-osgi-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fmaven%2Fplugins%2Fosgi%2FEquinoxExecMojo.java;h=1289b55861bffd7f316756582c7db329d0ea3c0c;hb=059c8746edde7073bcb18af43da7195bd8958d81;hp=7f54edd3de87b0fac91c60d8f431baf3f99e6bfb;hpb=99333a1d7cad2883616c63059bd360fb91916742;p=gpl%2Fargeo-slc.git diff --git a/maven/maven-argeo-osgi-plugin/src/main/java/org/argeo/slc/maven/plugins/osgi/EquinoxExecMojo.java b/maven/maven-argeo-osgi-plugin/src/main/java/org/argeo/slc/maven/plugins/osgi/EquinoxExecMojo.java index 7f54edd3d..1289b5586 100644 --- a/maven/maven-argeo-osgi-plugin/src/main/java/org/argeo/slc/maven/plugins/osgi/EquinoxExecMojo.java +++ b/maven/maven-argeo-osgi-plugin/src/main/java/org/argeo/slc/maven/plugins/osgi/EquinoxExecMojo.java @@ -14,8 +14,11 @@ import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.argeo.slc.maven.plugin.MavenDependencyManager; import org.argeo.slc.maven.plugin.SystemCall; +import org.eclipse.core.runtime.adaptor.EclipseStarter; /** + * Starts Equinox runtime + * * @goal equinox * */ public class EquinoxExecMojo extends AbstractOsgiMojo { @@ -55,7 +58,22 @@ public class EquinoxExecMojo extends AbstractOsgiMojo { */ protected String[] jvmArgs; - protected String[] defaultJvmArgs = { "-Xmx256m" }; + /** + * JVM arguments to append + * + * @parameter alias="${jvmArgsToAppend}" + */ + protected String[] jvmArgsToAppend; + + protected String[] defaultJvmArgs = { "-Xmx128m" }; + + /** + * Debug port (0 deactivate) + * + * @parameter expression="${debug}" default-value="0" + * @required + */ + protected String debug; /** * Equinox args @@ -64,8 +82,15 @@ public class EquinoxExecMojo extends AbstractOsgiMojo { */ protected String[] args; - protected String[] defaultArgs = { "-clean", "-console", "-configuration", - "conf" }; + /** + * Equinox args to append + * + * @parameter alias="${argsToAppend}" + */ + protected String[] argsToAppend; + + protected String[] defaultArgs = { "-console", "-configuration", + "target/slc/conf", "-data", "target/slc/data" }; /** * JVM system properties @@ -78,102 +103,253 @@ public class EquinoxExecMojo extends AbstractOsgiMojo { * Execution directory * * @parameter expression="${execDir}" + * default-value="${project.build.directory}/exec" * @required */ protected File execDir; + /** + * Whether to create a new JVM + * + * @parameter expression="${fork}" default-value="false" + * @required + */ + protected boolean fork; + + /** + * Whether to wait for the runtime to exit + * + * @parameter expression="${wait}" default-value="true" + * @required + */ + protected boolean wait; + + /** + * Number of milliseconds to pause after having started the server (when + * ${wait}=false) + * + * @parameter expression="${pause}" default-value="0" + * @required + */ + protected long pause; + public void execute() throws MojoExecutionException, MojoFailureException { + if (PACKAGING_BUNDLE.equals(project.getArtifact().getType())) { + System.out.println("Skip artifact of type " + PACKAGING_BUNDLE + + " " + artifactToString(project.getArtifact())); + return; + } + + String originalUserDir = System.getProperty("user.dir"); try { - Artifact equinoxArtifact = null; - Artifact osgiBootArtifact = null; - - Set dependencies = mavenDependencyManager - .getTransitiveProjectDependencies(project, remoteRepos, - local); - - StringBuffer osgiLocations = new StringBuffer(); - List bundleArtifacts = new ArrayList(); - boolean first = true; - for (Iterator it = dependencies.iterator(); it.hasNext();) { - Artifact depArtifact = (Artifact) it.next(); - printArtifact(depArtifact); - - if (depArtifact.getArtifactId().equals(equinoxArtifactId)) { - equinoxArtifact = depArtifact; - } else if (depArtifact.getArtifactId().equals( - osgiBootArtifactId)) { - osgiBootArtifact = depArtifact; - } else { - bundleArtifacts.add(depArtifact); - - if ("jar".equals(depArtifact.getType())) { - // Add to OSGi locations - if (first) - first = false; - else - osgiLocations.append(File.pathSeparatorChar); - - osgiLocations.append(depArtifact.getFile() - .getCanonicalPath().replace(File.separatorChar, - '/')); - } + LocationsStruct locationsStruct = listOsgiLocations(); + if (fork) + execForked(locationsStruct); + else + execNonForked(locationsStruct); + } catch (Exception e) { + throw new MojoExecutionException("Cannot execute OSGi runtime", e); + } finally { + System.setProperty("user.dir", originalUserDir); + } + } + + protected LocationsStruct listOsgiLocations() throws Exception { + LocationsStruct locationsStruct = new LocationsStruct(); + + Set dependencies = mavenDependencyManager + .getTransitiveProjectDependencies(project, remoteRepos, local); + + StringBuffer osgiLocations = new StringBuffer(); + List bundleArtifacts = new ArrayList(); + boolean first = true; + for (Iterator it = dependencies.iterator(); it.hasNext();) { + Artifact depArtifact = (Artifact) it.next(); + printArtifact(depArtifact); + + if (depArtifact.getArtifactId().equals(equinoxArtifactId)) { + locationsStruct.equinoxArtifact = depArtifact; + } else if (depArtifact.getArtifactId().equals(osgiBootArtifactId)) { + locationsStruct.osgiBootArtifact = depArtifact; + } else { + bundleArtifacts.add(depArtifact); + + if ("jar".equals(depArtifact.getType())) { + // Add to OSGi locations + if (first) + first = false; + else + osgiLocations.append(File.pathSeparatorChar); + + osgiLocations.append(depArtifact.getFile() + .getCanonicalPath() + .replace(File.separatorChar, '/')); } } + } + locationsStruct.osgiLocations = osgiLocations.toString(); + return locationsStruct; + } - // Set defaults - if (jvmArgs == null) - jvmArgs = defaultJvmArgs; - if (args == null) - args = defaultArgs; - if (systemProperties == null) - systemProperties = new HashMap(); - - // Build command - List cmdList = new ArrayList(); - cmdList.add(jvm); - cmdList.addAll(Arrays.asList(jvmArgs)); - if (!systemProperties.containsKey("osgi.bundles")) - cmdList.add("-Dosgi.bundles=" - + osgiBootArtifact.getFile().getCanonicalPath() - + "@start"); - if (!systemProperties.containsKey("slc.osgi.locations")) - cmdList.add("-Dslc.osgi.locations=" + osgiLocations); - for (Iterator keys = systemProperties.keySet().iterator(); keys - .hasNext();) { - Object key = keys.next(); - Object value = systemProperties.get(key); - String strValue = null; - if (value != null) { - strValue = value.toString().trim(); - strValue = strValue.replaceAll("\n", ""); - } - cmdList.add("-D" + key + "=" + strValue); + protected void execNonForked(LocationsStruct locationsStruct) + throws Exception { + // Set defaults + if (args == null) + args = defaultArgs; + + // if (!execDir.exists()) + // execDir.mkdirs(); + // System.setProperty("user.dir", execDir.getCanonicalPath()); + + // Build command + List cmdList = new ArrayList(); + + // System properties + if (!systemProperties.containsKey("osgi.bundles")) { + if (locationsStruct.osgiBootArtifact == null) + throw new Exception("No SLC OSGi boot bundle available."); + System.setProperty("osgi.bundles", locationsStruct.osgiBootArtifact + .getFile().getCanonicalPath() + + "@start"); + } + + if (!systemProperties.containsKey("slc.osgi.locations")) + System.setProperty("slc.osgi.locations", + locationsStruct.osgiLocations); + + for (Iterator keys = systemProperties.keySet().iterator(); keys + .hasNext();) { + Object key = keys.next(); + Object value = systemProperties.get(key); + String strValue = null; + if (value != null) { + strValue = value.toString().trim(); + strValue = strValue.replaceAll("\n", ""); + strValue = strValue.replaceAll("\t", ""); } - cmdList.add("-jar"); - cmdList.add(equinoxArtifact.getFile().getCanonicalPath()); - cmdList.addAll(Arrays.asList(args)); + System.setProperty(key.toString(), strValue); + } - String[] cmd = (String[]) cmdList.toArray(new String[0]); + // Program arguments + cmdList.addAll(Arrays.asList(args)); + if (argsToAppend != null) + cmdList.addAll(Arrays.asList(argsToAppend)); - for (int i = 0; i < cmd.length; i++) - System.out.print(cmd[i]); - System.out.print('\n'); + String[] cmd = (String[]) cmdList.toArray(new String[0]); + System.out.println("Equinox arguments (non forked):"); + printCommand(cmd); - SystemCall systemCall = new SystemCall(execDir.getCanonicalPath(), - cmd, true); - systemCall.run(); + EclipseStarter.startup(cmd, null); - } catch (Exception e) { - throw new MojoExecutionException("Cannot execute Equinox", e); + if (wait) { + while (EclipseStarter.isRunning()) { + Thread.sleep(500); + } + } else { + Thread.sleep(pause); + } + } + + protected void execForked(LocationsStruct locationsStruct) throws Exception { + // Set defaults + if (jvmArgs == null) + jvmArgs = defaultJvmArgs; + if (args == null) + args = defaultArgs; + if (systemProperties == null) + systemProperties = new HashMap(); + + if (!execDir.exists()) + execDir.mkdirs(); + + // Build command + List cmdList = new ArrayList(); + // JVM + cmdList.add(jvm); + // JVM arguments + cmdList.addAll(Arrays.asList(jvmArgs)); + + if (!"0".equals(debug)) + cmdList + .add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + + debug); + + if (jvmArgsToAppend != null) + cmdList.addAll(Arrays.asList(jvmArgsToAppend)); + + // System properties + if (!systemProperties.containsKey("osgi.bundles")) + cmdList.add("-Dosgi.bundles=" + + locationsStruct.osgiBootArtifact.getFile() + .getCanonicalPath() + "@start"); + if (!systemProperties.containsKey("slc.osgi.locations")) + cmdList + .add("-Dslc.osgi.locations=" + + locationsStruct.osgiLocations); + for (Iterator keys = systemProperties.keySet().iterator(); keys + .hasNext();) { + Object key = keys.next(); + Object value = systemProperties.get(key); + String strValue = null; + if (value != null) { + strValue = value.toString().trim(); + strValue = strValue.replaceAll("\n", ""); + strValue = strValue.replaceAll("\t", ""); + } + cmdList.add("-D" + key + "=" + strValue); + } + + // Equinox jar + cmdList.add("-jar"); + cmdList.add(locationsStruct.equinoxArtifact.getFile() + .getCanonicalPath()); + + // Program arguments + cmdList.addAll(Arrays.asList(args)); + if (argsToAppend != null) + cmdList.addAll(Arrays.asList(argsToAppend)); + + String[] cmd = (String[]) cmdList.toArray(new String[0]); + System.out.println("Execute Equinox command (forked):"); + printCommand(cmd); + + SystemCall systemCall = new SystemCall(execDir.getCanonicalPath(), cmd, + true); + if (wait) { + systemCall.run(); + } else { + new Thread(systemCall).start(); + Thread.sleep(pause); } + } + protected void printArtifact(Artifact artifact) { + if (getLog().isDebugEnabled()) + getLog().debug(artifactToString(artifact)); } - protected static void printArtifact(Artifact artifact) { - System.out.println(artifact.getGroupId() + ":" - + artifact.getArtifactId() + ":" + artifact.getType() + ":" - + artifact.getClassifier() + ":" + artifact.getVersion() + " (" - + artifact.getFile() + ")"); + protected void printCommand(String[] cmd) { + for (int i = 0; i < cmd.length; i++) { + boolean containsSpace = (cmd[i].indexOf(' ') >= 0) + || (cmd[i].indexOf('\t') >= 0); + if (containsSpace) + System.out.print('\"'); + System.out.print(cmd[i]); + if (containsSpace) + System.out.print('\"'); + System.out.print(' '); + } + } + + protected static String artifactToString(Artifact artifact) { + return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + + artifact.getType() + ":" + artifact.getClassifier() + ":" + + artifact.getVersion() + " (" + artifact.getFile() + ")"; } + protected class LocationsStruct { + protected Artifact equinoxArtifact = null; + protected Artifact osgiBootArtifact = null; + protected String osgiLocations = null; + } }