X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fcommands%2FRunInOsgi.java;h=f9e70910381ae28b3485565efe5d82b979bee0a6;hb=48b6f7647f12f4b96d1914bcafc95efd7f43cc43;hp=f274b4b13227500f999fc6fff8fc37e73ea0acad;hpb=651d33e13bfa9a7b46464be412023ee747e612e8;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 f274b4b13..f9e709103 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2012 Mathieu Baudier + * Copyright (C) 2007-2012 Argeo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,106 +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 */ 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); @@ -126,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; - } - }