X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fcommands%2FRunInOsgi.java;h=37a89712a1bddfd3236632b6ea4a5afc1ac12e8c;hb=bca1c6afbc73093b9dacb47b4dfd304d4d1b32cb;hp=bdca7c057815218892c1b76fece4d2c598425b33;hpb=58e0e18d64a2080680a9f8397b0dfa2894519910;p=gpl%2Fargeo-slc.git
diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RunInOsgi.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RunInOsgi.java
index bdca7c057..37a89712a 100644
--- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RunInOsgi.java
+++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/RunInOsgi.java
@@ -16,107 +16,222 @@
package org.argeo.slc.client.ui.dist.commands;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
-import java.util.ArrayList;
-import java.util.List;
+import java.net.URL;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
-import javax.jcr.Property;
import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
import javax.jcr.Session;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.qom.Ordering;
-import javax.jcr.query.qom.QueryObjectModel;
-import javax.jcr.query.qom.QueryObjectModelFactory;
-import javax.jcr.query.qom.Selector;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.argeo.eclipse.ui.ErrorFeedback;
import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.dist.DistPlugin;
+import org.argeo.slc.core.execution.tasks.JvmProcess;
import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.RepoUtils;
+import org.argeo.slc.repo.maven.MavenConventionsUtils;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.sonatype.aether.artifact.Artifact;
-/** UNDER DEVELOPMENT. Download and prepare an OSGi runtime*/
+/** UNDER DEVELOPMENT. Download and prepare an OSGi runtime */
public class RunInOsgi extends AbstractHandler implements SlcNames {
private final static Log log = LogFactory.getLog(RunInOsgi.class);
+ public final static String ID = DistPlugin.ID + ".runInOsgi";
+ public final static String DEFAULT_LABEL = "Run in OSGi";
+ public final static ImageDescriptor DEFAULT_ICON = DistPlugin
+ .getImageDescriptor("icons/runInOsgi.gif");
+
+ public final static String PARAM_WORKSPACE_NAME = "workspaceName";
+ public final static String PARAM_MODULE_PATH = "modulePath";
+
+ /* DEPENDENCY INJECTION */
private Repository repository;
- private String workspace;
public Object execute(ExecutionEvent event) throws ExecutionException {
- File targetDirectory = new File(
- "/home/mbaudier/dev/work/120517-ArgeoTP/" + workspace);
+
+ String workspace = event.getParameter(PARAM_WORKSPACE_NAME);
+ String modulePath = event.getParameter(PARAM_MODULE_PATH);
+ String port = System.getProperty("argeo.server.port.http");
+ // String localMavenBase = System.getProperty("user.home")
+ // + "/.m2/repository";
InputStream jarStream = null;
OutputStream out = null;
Writer writer = null;
Session session = null;
try {
- FileUtils.deleteDirectory(targetDirectory);
- targetDirectory.mkdirs();
+ // Bundle distPluginBundle = DistPlugin.getDefault().getBundle();
+ // File baseDir = distPluginBundle.getBundleContext().getDataFile(
+ // "runInOSGi");
+ File baseDir = new File(System.getProperty("java.io.tmpdir")
+ + "/runInOSGi-" + System.getProperty("user.name"));
+ if (baseDir.exists())
+ FileUtils.deleteDirectory(baseDir);
+ File libDir = new File(baseDir, "lib");
+ libDir.mkdirs();
+ File confDir = new File(baseDir, "configuration");
+ confDir.mkdirs();
+ File dataDir = new File(baseDir, "data");
+ dataDir.mkdirs();
session = repository.login(workspace);
- NodeIterator bundles = listBundleArtifacts(session);
-
- List files = new ArrayList();
- bundles: while (bundles.hasNext()) {
- Node bundleNode = bundles.nextNode();
- String symbolicName = JcrUtils.get(bundleNode,
- SLC_SYMBOLIC_NAME);
-
- // skip sources
- if (symbolicName.endsWith(".source"))
- continue bundles;
- // skip eclipse
- if (symbolicName.startsWith("org.eclipse")
- && !symbolicName.equals("org.eclipse.osgi"))
- continue bundles;
- if (symbolicName.equals("org.polymap.openlayers.rap.widget"))
- continue bundles;
-
- File targetFile = new File(targetDirectory,
- bundleNode.getName());
- out = new FileOutputStream(targetFile);
- jarStream = bundleNode.getNode(Node.JCR_CONTENT)
- .getProperty(Property.JCR_DATA).getBinary().getStream();
- IOUtils.copy(jarStream, out);
- if (!symbolicName.equals("org.eclipse.osgi"))
- files.add(targetFile);
- if (log.isDebugEnabled())
- log.debug("Copied " + targetFile.getName());
- IOUtils.closeQuietly(out);
- IOUtils.closeQuietly(jarStream);
- }
+ // NodeIterator bundles = listBundleArtifacts(session);
+ // if (log.isDebugEnabled())
+ // log.debug("## Copying to " + libDir);
+ //
+ // File equinoxJar = null;
+ // List files = new ArrayList();
+ // bundles: while (bundles.hasNext()) {
+ // Node bundleNode = bundles.nextNode();
+ // String symbolicName = JcrUtils.get(bundleNode,
+ // SLC_SYMBOLIC_NAME);
+ //
+ // // skip sources
+ // if (symbolicName.endsWith(".source"))
+ // continue bundles;
+ // // skip eclipse
+ // if (symbolicName.startsWith("org.eclipse")
+ // && !symbolicName.equals("org.eclipse.osgi"))
+ // continue bundles;
+ // if (symbolicName.equals("org.polymap.openlayers.rap.widget"))
+ // continue bundles;
+ //
+ // File targetFile = new File(libDir, bundleNode.getName());
+ // out = new FileOutputStream(targetFile);
+ // jarStream = bundleNode.getNode(Node.JCR_CONTENT)
+ // .getProperty(Property.JCR_DATA).getBinary().getStream();
+ // IOUtils.copy(jarStream, out);
+ // if (symbolicName.equals("org.eclipse.osgi"))
+ // equinoxJar = targetFile;
+ // else
+ // files.add(targetFile);
+ // if (log.isDebugEnabled())
+ // log.debug("Copied " + targetFile.getName());
+ //
+ // IOUtils.closeQuietly(out);
+ // IOUtils.closeQuietly(jarStream);
+ // }
+ //
+ // StringBuffer osgiBundles = new StringBuffer("osgi.bundles=");
+ // for (int i = 0; i < files.size(); i++) {
+ // if (i != 0)
+ // osgiBundles.append(',');
+ // osgiBundles.append(files.get(i).getName());
+ // }
- StringBuffer osgiBundles = new StringBuffer("osgi.bundles=");
- for (int i = 0; i < files.size(); i++) {
- if (i != 0)
- osgiBundles.append(',');
- osgiBundles.append(files.get(i).getName());
+ String equinoxJar = null;
+
+ Node distModule = session.getNode(modulePath);
+ NodeIterator coordinates = distModule.getNode(SLC_MODULES)
+ .getNodes();
+ StringBuilder conf = new StringBuilder(1024 * 1024);
+ conf.append("osgi.clean=true\n");
+ conf.append("osgi.console=7777\n");
+ conf.append("osgi.console.enable.builtin=true\n");
+
+ conf.append("osgi.bundles=");
+ coords: while (coordinates.hasNext()) {
+ Node coord = coordinates.nextNode();
+ // String category =
+ // coord.getProperty(SLC_CATEGORY).getString();
+ String name = coord.getProperty(SLC_NAME).getString();
+ String version = coord.getProperty(SLC_VERSION).getString();
+ Artifact artifact = RepoUtils.asArtifact(coord);
+ String path = MavenConventionsUtils.artifactPath("", artifact);
+ String url = "http://localhost:" + port + "/data/public/java/"
+ + workspace + path;
+ if (log.isDebugEnabled())
+ log.debug(url);
+ File f = new File(libDir, name + "-" + version + ".jar");
+ FileUtils.copyURLToFile(new URL(url), f);
+ if (name.equals("org.eclipse.osgi")) {
+ // File f = new File(localMavenBase + path);
+ // if (!f.exists())
+ // FileUtils.copyURLToFile(new URL(url), f);
+ equinoxJar = f.getCanonicalPath();
+ continue coords;
+ }
+ conf.append(f.getName());
+ if (coordinates.hasNext())
+ conf.append(",\\\n");
}
- File confDir = new File(targetDirectory, "configuration");
- confDir.mkdirs();
File confIni = new File(confDir, "config.ini");
writer = new FileWriter(confIni);
- writer.write(osgiBundles.toString());
+ writer.write(conf.toString());
IOUtils.closeQuietly(writer);
+
+ // Map configuration = new HashMap();
+ // configuration.put("osgi.configuration.area",
+ // confDir.getCanonicalPath());
+ // configuration.put("osgi.instance.area",
+ // dataDir.getCanonicalPath());
+ // // Do clean
+ // configuration.put("osgi.clean", "true");
+
+ JvmProcess osgiRuntime = new JvmProcess();
+ osgiRuntime.setExecDir(baseDir.getCanonicalPath());
+ if (equinoxJar == null)
+ throw new SlcException("Cannot find OSGi runtime.");
+ osgiRuntime.setMainJar(equinoxJar);
+ osgiRuntime.arg("-configuration", confDir.getCanonicalPath()).arg(
+ "-data", dataDir.getCanonicalPath());
+ // .arg("-console", "7777").arg("-clean");
+ osgiRuntime.setLogCommand(true);
+ osgiRuntime.afterPropertiesSet();
+ Job job = new RunInOsgiJob(osgiRuntime);
+ job.schedule();
+ // osgiRuntime.run();
+
+ // Map configuration = new HashMap();
+ // configuration.put("osgi.configuration.area",
+ // confDir.getCanonicalPath());
+ // configuration.put("osgi.instance.area",
+ // dataDir.getCanonicalPath());
+ // // Do clean
+ // configuration.put("osgi.clean", "true");
+ // ServiceLoader ff = ServiceLoader
+ // .load(FrameworkFactory.class);
+ // FrameworkFactory frameworkFactory = ff.iterator().next();
+ // Framework framework =
+ // frameworkFactory.newFramework(configuration);
+ // framework.start();
+ // BundleContext testBundleContext = framework.getBundleContext();
+
+ // for (int i = 0; i < files.size(); i++) {
+ // testBundleContext.installBundle("file://"
+ // + files.get(i).getCanonicalPath());
+ // }
+ //
+ // Bundle[] testBundles = testBundleContext.getBundles();
+ // for (Bundle bundle : testBundles) {
+ // if (log.isDebugEnabled())
+ // log.debug(bundle.getSymbolicName() + " "
+ // + bundle.getVersion());
+ // }
+
} catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ ErrorFeedback.show("Cannot run in OSGi", e);
} finally {
IOUtils.closeQuietly(jarStream);
IOUtils.closeQuietly(out);
@@ -127,32 +242,59 @@ public class RunInOsgi extends AbstractHandler implements SlcNames {
return null;
}
- static NodeIterator listBundleArtifacts(Session session)
- throws RepositoryException {
- QueryManager queryManager = session.getWorkspace().getQueryManager();
- QueryObjectModelFactory factory = queryManager.getQOMFactory();
+ // private NodeIterator listBundleArtifacts(Session session)
+ // throws RepositoryException {
- final String bundleArtifactsSelector = "bundleArtifacts";
- Selector source = factory.selector(SlcTypes.SLC_BUNDLE_ARTIFACT,
- bundleArtifactsSelector);
+ // QueryManager queryManager = session.getWorkspace().getQueryManager();
+ // QueryObjectModelFactory factory = queryManager.getQOMFactory();
+ //
+ // final String bundleArtifactsSelector = "bundleArtifacts";
+ // Selector source = factory.selector(SlcTypes.SLC_BUNDLE_ARTIFACT,
+ // bundleArtifactsSelector);
+ //
+ // Ordering order = factory.ascending(factory.propertyValue(
+ // bundleArtifactsSelector, SlcNames.SLC_SYMBOLIC_NAME));
+ // Ordering[] orderings = { order };
+ //
+ // QueryObjectModel query = factory.createQuery(source, null, orderings,
+ // null);
+ //
+ // QueryResult result = query.execute();
+ // return result.getNodes();
+ // }
- Ordering order = factory.ascending(factory.propertyValue(
- bundleArtifactsSelector, SlcNames.SLC_SYMBOLIC_NAME));
- Ordering[] orderings = { order };
+ private class RunInOsgiJob extends Job {
+ final JvmProcess osgiRuntime;
- QueryObjectModel query = factory.createQuery(source, null, orderings,
- null);
+ public RunInOsgiJob(JvmProcess osgiRuntime) {
+ super("OSGi Test");
+ this.osgiRuntime = osgiRuntime;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ osgiRuntime.setSynchronous(false);
+ osgiRuntime.run();
+ while (!monitor.isCanceled()) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ // silent
+ }
+
+ if (monitor.isCanceled()) {
+ osgiRuntime.kill();
+ return Status.CANCEL_STATUS;
+ }
+ if (!osgiRuntime.isRunning())
+ break;
+ }
+ return Status.OK_STATUS;
+ }
- QueryResult result = query.execute();
- return result.getNodes();
}
public void setRepository(Repository repository) {
this.repository = repository;
}
-
- public void setWorkspace(String workspace) {
- this.workspace = workspace;
- }
-
}