X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=maven%2Fmaven-argeo-osgi-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fmaven%2Fplugins%2Fosgi%2FEquinoxExecMojo.java;h=1289b55861bffd7f316756582c7db329d0ea3c0c;hb=059c8746edde7073bcb18af43da7195bd8958d81;hp=ea75a22838a001497edb694eb11666a981d19647;hpb=7961affbcd38e4b6718ba1f102e0ce774294ba48;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 ea75a2283..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 { @@ -86,8 +89,8 @@ public class EquinoxExecMojo extends AbstractOsgiMojo { */ protected String[] argsToAppend; - protected String[] defaultArgs = { "-console", "-configuration", "conf", - "-data", "data" }; + protected String[] defaultArgs = { "-console", "-configuration", + "target/slc/conf", "-data", "target/slc/data" }; /** * JVM system properties @@ -105,132 +108,237 @@ public class EquinoxExecMojo extends AbstractOsgiMojo { */ 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 ("bundles".equals(project.getArtifact().getType())) { - System.out.println("Skip artifact of type bundles " - + artifactToString(project.getArtifact())); + 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(); - - 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=" - + 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", ""); - strValue = strValue.replaceAll("\t", ""); - } - 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", ""); } + System.setProperty(key.toString(), strValue); + } + + // Program arguments + cmdList.addAll(Arrays.asList(args)); + if (argsToAppend != null) + cmdList.addAll(Arrays.asList(argsToAppend)); - // Equinox jar - cmdList.add("-jar"); - cmdList.add(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("\nExecute command:\n"); - 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(' '); + String[] cmd = (String[]) cmdList.toArray(new String[0]); + System.out.println("Equinox arguments (non forked):"); + printCommand(cmd); + + EclipseStarter.startup(cmd, null); + + if (wait) { + while (EclipseStarter.isRunning()) { + Thread.sleep(500); } - System.out.println("\n"); + } else { + Thread.sleep(pause); + } + } - SystemCall systemCall = new SystemCall(execDir.getCanonicalPath(), - cmd, true); - systemCall.run(); + 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); + } - } catch (Exception e) { - throw new MojoExecutionException("Cannot execute Equinox", e); + // 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(artifactToString(artifact)); + 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) { @@ -239,4 +347,9 @@ public class EquinoxExecMojo extends AbstractOsgiMojo { + artifact.getVersion() + " (" + artifact.getFile() + ")"; } + protected class LocationsStruct { + protected Artifact equinoxArtifact = null; + protected Artifact osgiBootArtifact = null; + protected String osgiLocations = null; + } }