package org.argeo.init.osgi; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.ServiceLoader; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.framework.launch.Framework; import org.osgi.framework.launch.FrameworkFactory; /** Launch an OSGi framework and deploy a CMS Node into it. */ public class NodeRunner { private Long timeout = 30 * 1000l; private final Path baseDir; private final Path confDir; private final Path dataDir; private String baseUrl = "http://forge.argeo.org/data/java/argeo-2.1/"; private String distributionUrl = null; private Framework framework = null; public NodeRunner(String distributionUrl, Path baseDir) { this.distributionUrl = distributionUrl; Path mavenBase = Paths.get(System.getProperty("user.home") + "/.m2/repository"); Path osgiBase = Paths.get("/user/share/osgi"); if (Files.exists(mavenBase)) { Path mavenPath = mavenBase.resolve(distributionUrl); if (Files.exists(mavenPath)) baseUrl = mavenBase.toUri().toString(); } else if (Files.exists(osgiBase)) { Path osgiPath = osgiBase.resolve(distributionUrl); if (Files.exists(osgiPath)) baseUrl = osgiBase.toUri().toString(); } this.baseDir = baseDir; this.confDir = this.baseDir.resolve("state"); this.dataDir = this.baseDir.resolve("data"); } public void start() { long begin = System.currentTimeMillis(); // log4j Path log4jFile = confDir.resolve("log4j.properties"); if (!Files.exists(log4jFile)) copyResource("/org/argeo/osgi/boot/log4j.properties", log4jFile); System.setProperty("log4j.configuration", "file://" + log4jFile.toAbsolutePath()); // Start Equinox try { ServiceLoader ff = ServiceLoader.load(FrameworkFactory.class); FrameworkFactory frameworkFactory = ff.iterator().next(); Map configuration = new HashMap(); configuration.put("osgi.configuration.area", confDir.toAbsolutePath().toString()); configuration.put("osgi.instance.area", dataDir.toAbsolutePath().toString()); defaultConfiguration(configuration); framework = frameworkFactory.newFramework(configuration); framework.start(); info("## Date : " + new Date()); info("## Data : " + dataDir.toAbsolutePath()); } catch (Exception e) { throw new IllegalStateException("Cannot start OSGi framework", e); } BundleContext bundleContext = framework.getBundleContext(); try { // Spring configs currently require System properties // System.getProperties().putAll(configuration); // expected by JAAS as System.property FIXME System.setProperty("osgi.instance.area", bundleContext.getProperty("osgi.instance.area")); // OSGi bootstrap OsgiBoot osgiBoot = new OsgiBoot(bundleContext); osgiBoot.installUrls(osgiBoot.getDistributionUrls(distributionUrl, baseUrl)); // Start runtime Properties startProperties = new Properties(); // TODO make it possible to override it startProperties.put("argeo.osgi.start.2.node", "org.eclipse.equinox.http.servlet,org.eclipse.equinox.http.jetty," + "org.eclipse.equinox.metatype,org.eclipse.equinox.cm,org.eclipse.rap.rwt.osgi"); startProperties.put("argeo.osgi.start.3.node", "org.argeo.cms"); startProperties.put("argeo.osgi.start.4.node", "org.eclipse.gemini.blueprint.extender,org.eclipse.equinox.http.registry"); osgiBoot.startBundles(startProperties); // Find node repository ServiceReference sr = null; while (sr == null) { sr = bundleContext.getServiceReference("javax.jcr.Repository"); if (System.currentTimeMillis() - begin > timeout) throw new RuntimeException("Could find node after " + timeout + "ms"); Thread.sleep(100); } Object nodeDeployment = bundleContext.getService(sr); info("Node Deployment " + nodeDeployment); // Initialization completed long duration = System.currentTimeMillis() - begin; info("## CMS Launcher initialized in " + (duration / 1000) + "s " + (duration % 1000) + "ms"); } catch (Exception e) { shutdown(); throw new RuntimeException("Cannot start CMS", e); } finally { } } private void defaultConfiguration(Map configuration) { // all permissions to OSGi security manager Path policyFile = confDir.resolve("node.policy"); if (!Files.exists(policyFile)) copyResource("/org/argeo/osgi/boot/node.policy", policyFile); configuration.put("java.security.policy", "file://" + policyFile.toAbsolutePath()); configuration.put("org.eclipse.rap.workbenchAutostart", "false"); configuration.put("org.eclipse.equinox.http.jetty.autostart", "false"); configuration.put("org.osgi.framework.bootdelegation", "com.sun.jndi.ldap,com.sun.jndi.ldap.sasl,com.sun.security.jgss,com.sun.jndi.dns," + "com.sun.nio.file,com.sun.nio.sctp"); // Do clean // configuration.put("osgi.clean", "true"); // if (args.length == 0) { // configuration.put("osgi.console", ""); // } } public void shutdown() { try { framework.stop(); framework.waitForStop(15 * 1000); } catch (Exception silent) { } } public Path getConfDir() { return confDir; } public Path getDataDir() { return dataDir; } public Framework getFramework() { return framework; } public static void main(String[] args) { try { String distributionUrl; Path executionDir; if (args.length == 2) { distributionUrl = args[0]; executionDir = Paths.get(args[1]); } else if (args.length == 1) { executionDir = Paths.get(System.getProperty("user.dir")); distributionUrl = args[0]; } else if (args.length == 0) { executionDir = Paths.get(System.getProperty("user.dir")); distributionUrl = "org/argeo/commons/org.argeo.dep.cms.sdk/2.1.70/org.argeo.dep.cms.sdk-2.1.70.jar"; }else{ printUsage(); System.exit(1); return; } NodeRunner nodeRunner = new NodeRunner(distributionUrl, executionDir); nodeRunner.start(); // if (args.length != 0) // System.exit(0); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } protected static void info(Object msg) { System.out.println(msg); } protected static void err(Object msg) { System.err.println(msg); } protected static void debug(Object msg) { System.out.println(msg); } protected static void copyResource(String resource, Path targetFile) { InputStream input = null; OutputStream output = null; try { input = NodeRunner.class.getResourceAsStream(resource); Files.createDirectories(targetFile.getParent()); output = Files.newOutputStream(targetFile); byte[] buf = new byte[8192]; while (true) { int length = input.read(buf); if (length < 0) break; output.write(buf, 0, length); } } catch (Exception e) { throw new RuntimeException("Cannot write " + resource + " file to " + targetFile, e); } finally { try { input.close(); } catch (Exception ignore) { } try { output.close(); } catch (Exception ignore) { } } } static void printUsage(){ err("Usage: "); } }