]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.launcher/src/main/java/org/argeo/slc/cli/SlcMain.java
+ update Distribution view icons
[gpl/argeo-slc.git] / runtime / org.argeo.slc.launcher / src / main / java / org / argeo / slc / cli / SlcMain.java
index 7a995e434a7697be02584b304e97525adf3928e7..4c5c82dd136f65493791e61941ec908136ebd8c2 100644 (file)
@@ -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.
 package org.argeo.slc.cli;
 
 import java.io.File;
-import java.io.FileInputStream;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.io.IOUtils;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.UUID;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+
 import org.argeo.osgi.boot.OsgiBoot;
-import org.argeo.slc.SlcException;
-import org.eclipse.core.runtime.adaptor.EclipseStarter;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.launch.Framework;
+import org.osgi.framework.launch.FrameworkFactory;
 
-@SuppressWarnings("restriction")
-public class SlcMain {
-       /** Unique launch module */
-       public static String UNIQUE_LAUNCH_MODULE_PROPERTY = "slc.launch.module";
-
-       /** Unique launch flow */
-       public static String UNIQUE_LAUNCH_FLOW_PROPERTY = "slc.launch.flow";
-
-       // public enum Type {
-       // standalone, agent, server
-       // }
-
-       // private static Boolean debug = true;
-
-       // private final static String BOOTSTRAP_LOG4J_CONFIG =
-       // "org/argeo/slc/cli/bootstrapLog4j.properties";
-       // private final static String DEFAULT_AGENT_CONTEXT =
-       // "classpath:org/argeo/slc/cli/spring-agent-default.xml";
-
-       // private final static Option typeOpt = OptionBuilder.withLongOpt("mode")
-       // .withArgName("mode").hasArg()
-       // .withDescription("Execution type, one of: " + listTypeValues())
-       // .create('t');
-       //
-       // private final static Option propertyOpt = OptionBuilder
-       // .withLongOpt("property").withArgName("prop1=val1,prop2=val2")
-       // .hasArgs().withValueSeparator(',')
-       // .withDescription("use value for given property").create('p');
-       //
-       // private final static Option propertiesOpt = OptionBuilder
-       // .withLongOpt("properties").withArgName("properties file").hasArgs()
-       // .withValueSeparator(',')
-       // .withDescription("load properties from file (-p has priority)")
-       // .create('P');
-       //
-       // private final static Option moduleOpt =
-       // OptionBuilder.withLongOpt("module")
-       // .withArgName("module").hasArg().withDescription("Execution module")
-       // .create('m');
-       //
-       // private final static Option flowsOpt = OptionBuilder.withLongOpt("flows")
-       // .withArgName("flows").hasArg().withDescription("Flows to execute")
-       // .create('f');
-       //
-       // private final static Option runtimeOpt = OptionBuilder
-       // .withLongOpt("runtime").withArgName("runtime").hasArg()
-       // .withDescription("Runtime URL").create('r');
-
-       private final static Options options;
-
-       private final static String commandName = "slc";
-
-       // private static String bundlesToInstall = "/usr/share/osgi;in=*.jar";
-       private static String bundlesToInstall = System.getProperty("user.home")
-                       + "/dev/src/slc/runtime/org.argeo.slc.launcher/target/dependency;in=*.jar";
-
-       // private static String bundlesToStart =
-       // "org.springframework.osgi.extender,"
-       // + "org.argeo.node.repofactory.jackrabbit,"
-       // + "org.argeo.node.repo.jackrabbit," + "org.argeo.security.dao.os,"
-       // + "org.argeo.slc.node.jackrabbit," + "org.argeo.slc.agent,"
-       // + "org.argeo.slc.agent.jcr";
-       private static String bundlesToStart = "org.springframework.osgi.extender,"
-                       + "org.argeo.slc.agent";
+/** Configures an SLC runtime and runs a process. */
+public class SlcMain implements Runnable {
+       public final static String NIX = "NIX";
+       public final static String WINDOWS = "WINDOWS";
+       public final static String SOLARIS = "SOLARIS";
 
+       public final static String os;
        static {
-               options = new Options();
-               // options.addOption(typeOpt);
-               // options.addOption(moduleOpt);
-               // options.addOption(flowsOpt);
-               // options.addOption(propertyOpt);
-               // options.addOption(propertiesOpt);
-               // options.addOption(runtimeOpt);
+               String osName = System.getProperty("os.name");
+               if (osName.startsWith("Win"))
+                       os = WINDOWS;
+               else if (osName.startsWith("Solaris"))
+                       os = SOLARIS;
+               else
+                       os = NIX;
        }
 
-       @SuppressWarnings({ "unchecked" })
-       public static void main(String[] args) {
-               // Type type = null;
-               // Properties properties = new Properties();
-               // String flows = null;
-               // String urlStr = null;
+       // private final DateFormat dateFormat = new
+       // SimpleDateFormat("HH:mm:ss,SSS");
+       private Long timeout = 30 * 1000l;
+       private final String[] args;
 
-               String module = null;
-               String moduleUrl = null;
-               String flow = null;
+       // private static String bundlesToInstall = "/usr/share/osgi;in=*.jar";
+       private String bundlesToInstall = System.getProperty("user.home")
+                       + "/dev/src/slc/dep/org.argeo.slc.dep.minimal/target/dependency;in=*.jar,"
+                       + System.getProperty("user.home")
+                       + "/dev/src/slc/demo/modules;in=*;ex=pom.xml;ex=.svn";
+
+       private final List<String> bundlesToStart = new ArrayList<String>();
+
+       public SlcMain(String[] args) {
+               this.args = args;
+               bundlesToStart.add("org.springframework.osgi.extender");
+               bundlesToStart.add("org.argeo.node.repo.jackrabbit");
+               bundlesToStart.add("org.argeo.security.dao.os");
+               bundlesToStart.add("org.argeo.slc.node.jackrabbit");
+               bundlesToStart.add("org.argeo.slc.agent");
+               bundlesToStart.add("org.argeo.slc.agent.jcr");
+               // bundlesToStart.add("org.argeo.slc.agent.cli");
+       }
 
-               try {
+       public void run() {
+               long begin = System.currentTimeMillis();
+               // System.out.println(dateFormat.format(new Date()));
 
-                       CommandLineParser clParser = new GnuParser();
-                       CommandLine cl = clParser.parse(options, args);
-
-                       List<String> arguments = cl.getArgList();
-                       if (arguments.size() == 0) {
-                               // TODO default behaviour
-                       } else {
-                               module = arguments.get(0);
-                               File moduleFile = new File(module);
-                               if (moduleFile.exists()) {
-                                       if (moduleFile.isDirectory()) {
-                                               moduleUrl = "reference:file:"
-                                                               + moduleFile.getCanonicalPath();
-                                       } else {
-                                               moduleUrl = "file:" + moduleFile.getCanonicalPath();
-                                       }
-                               }
-
-                               if (arguments.size() == 1) {
-                                       // TODO module info
-                               } else {
-                                       flow = arguments.get(1);
-                               }
-                       }
+               Boolean isTransient = false;
+               File dataDir = null;
+               final LoginContext lc;
+               try {
+                       // Authenticate
+                       lc = new LoginContext(os);
+                       lc.login();
 
+                       // Prepare directories
                        String executionDir = System.getProperty("user.dir");
-                       File slcDir = new File(executionDir, "target/.slc");
-                       File dataDir = new File(slcDir, "data");
+                       File slcDir = new File(executionDir, ".slc");
+                       File tempDir = new File(System.getProperty("java.io.tmpdir"));
+
+                       if (isTransient)
+                               dataDir = new File(tempDir, "slc-data-"
+                                               + UUID.randomUUID().toString());
+                       else
+                               dataDir = new File(slcDir, "data");
                        if (!dataDir.exists())
                                dataDir.mkdirs();
+
                        File confDir = new File(slcDir, "conf");
                        if (!confDir.exists())
                                confDir.mkdirs();
 
-                       BundleContext bundleContext = null;
-                       try {
-                               String[] osgiRuntimeArgs = { "-configuration",
-                                               confDir.getCanonicalPath(), "-data",
-                                               dataDir.getCanonicalPath(), "-console", "-clean" };
-                               bundleContext = EclipseStarter.startup(osgiRuntimeArgs, null);
-                       } catch (Exception e) {
-                               throw new RuntimeException("Cannot start Equinox.", e);
-                       }
+                       System.setProperty("log4j.configuration", "file:./log4j.properties");
+                       if (isTransient)
+                               System.setProperty("argeo.node.repo.configuration",
+                                               "osgibundle:repository-memory.xml");
+
+                       // Start Equinox
+                       ServiceLoader<FrameworkFactory> ff = ServiceLoader
+                                       .load(FrameworkFactory.class);
+                       FrameworkFactory frameworkFactory = ff.iterator().next();
+                       Map<String, String> configuration = new HashMap<String, String>();
+                       configuration.put("osgi.configuration.area",
+                                       confDir.getCanonicalPath());
+                       configuration.put("osgi.instance.area", dataDir.getCanonicalPath());
+                       // configuration.put("osgi.clean", "true");
+                       // configuration.put("osgi.console", "");
+
+                       // Spring configs currently require System properties
+                       System.getProperties().putAll(configuration);
+
+                       Framework framework = frameworkFactory.newFramework(configuration);
+                       framework.start();
+                       BundleContext bundleContext = framework.getBundleContext();
+                       // String[] osgiRuntimeArgs = { "-configuration",
+                       // confDir.getCanonicalPath(), "-data",
+                       // dataDir.getCanonicalPath(), "-clean" };
+                       // BundleContext bundleContext = EclipseStarter.startup(
+                       // osgiRuntimeArgs, null);
 
                        // OSGi bootstrap
                        OsgiBoot osgiBoot = new OsgiBoot(bundleContext);
                        osgiBoot.installUrls(osgiBoot.getBundlesUrls(bundlesToInstall));
 
-                       if (moduleUrl != null) {
-                               Bundle bundle = osgiBoot.installUrl(moduleUrl);
-                               module = bundle.getSymbolicName();
-                               // TODO deal with version
-                       }
-
-                       System.setProperty(UNIQUE_LAUNCH_MODULE_PROPERTY, module);
-                       System.setProperty(UNIQUE_LAUNCH_FLOW_PROPERTY, flow);
-                       System.setProperty("log4j.configuration", "file:./log4j.properties");
-
-                       // start runtime
+                       // Start runtime
                        osgiBoot.startBundles(bundlesToStart);
 
-                       // Bundle bundle = (Bundle) osgiBoot.getBundlesBySymbolicName().get(
-                       // "org.argeo.slc.specs");
-                       // bundle.loadClass(Execu)
-                       //
-                       // // retrieve modulesManager
-                       // BundlesManager bundlesManager = new
-                       // BundlesManager(bundleContext);
-                       // ExecutionModulesManager modulesManager = bundlesManager
-                       // .getSingleService(ExecutionModulesManager.class, null, true);
-                       //
-                       // RealizedFlow realizedFlow = RealizedFlow.create(module, null,
-                       // flow,
-                       // null);
-                       // modulesManager.start(new BasicNameVersion(module, "0.0.0"));
-                       // modulesManager.execute(realizedFlow);
-
-                       // osgiBoot.bootstrap();
-                       // osgiBoot.bootstrap();
-
-                       // Mode
-                       // String typeStr = cl.getOptionValue(typeOpt.getOpt());
-                       // if (typeStr == null) {
-                       // type = Type.standalone;
-                       // } else {
-                       // try {
-                       // type = Type.valueOf(typeStr);
-                       // } catch (IllegalArgumentException e) {
-                       // throw new SlcException("Unrecognized mode '" + typeStr
-                       // + "'", e);
-                       // }
-                       // }
-                       //
-                       // // Script
-                       // if (type.equals(Type.standalone)) {
-                       // if (!cl.hasOption(moduleOpt.getOpt()))
-                       // throw new SlcException("Type " + Type.standalone
-                       // + " requires option '" + moduleOpt.getLongOpt()
-                       // + "'");
-                       // module = cl.getOptionValue(moduleOpt.getOpt());
-                       //
-                       // // Targets
-                       // if (cl.hasOption(flowsOpt.getOpt()))
-                       // flows = cl.getOptionValue(flowsOpt.getOpt());
-                       // }
-                       //
-                       // // Properties
-                       // if (cl.hasOption(propertiesOpt.getOpt())) {
-                       // for (String propertyFile : cl.getOptionValues(propertiesOpt
-                       // .getOpt())) {
-                       // loadPropertyFile(properties, propertyFile);
-                       // }
-                       // }
-                       // if (cl.hasOption(propertyOpt.getOpt())) {
-                       // for (String property : cl.getOptionValues(propertyOpt.getOpt()))
-                       // {
-                       // addProperty(properties, property);
-                       // }
-                       // }
-                       //
-                       // // Runtime
-                       // if (cl.hasOption(runtimeOpt.getOpt())) {
-                       // urlStr = cl.getOptionValue(runtimeOpt.getOpt());
-                       // }
-               } catch (ParseException e) {
-                       System.err.println("Problem with command line arguments. "
-                                       + e.getMessage());
-                       badExit();
-               } catch (SlcException e) {
-                       System.err.println(e.getMessage());
-                       badExit();
+                       // Find SLC Agent
+                       ServiceReference sr = null;
+                       while (sr == null) {
+                               sr = bundleContext
+                                               .getServiceReference("org.argeo.slc.execution.SlcAgentCli");
+                               if (System.currentTimeMillis() - begin > timeout)
+                                       throw new RuntimeException("Cannot find SLC agent CLI");
+                               Thread.sleep(100);
+                       }
+                       final Object agentCli = bundleContext.getService(sr);
+
+                       // ServiceTracker agentTracker = new ServiceTracker(bundleContext,
+                       // "org.argeo.slc.execution.SlcAgentCli", null);
+                       // agentTracker.open();
+                       // final Object agentCli = agentTracker.waitForService(30 * 1000);
+                       // if (agentCli == null)
+                       // throw new RuntimeException("Cannot find SLC agent CLI");
+
+                       long duration = System.currentTimeMillis() - begin;
+                       System.out.println("Initialized in " + (duration / 1000) + "s "
+                                       + (duration % 1000) + "ms");
+                       // Run as a privileged action
+                       Subject.doAs(Subject.getSubject(AccessController.getContext()),
+                                       new PrivilegedAction<String>() {
+
+                                               public String run() {
+                                                       try {
+                                                               Class<?>[] parameterTypes = { String[].class };
+                                                               Method method = agentCli.getClass().getMethod(
+                                                                               "process", parameterTypes);
+                                                               Object[] methodArgs = { args };
+                                                               Object ret = method
+                                                                               .invoke(agentCli, methodArgs);
+                                                               return ret.toString();
+                                                       } catch (Exception e) {
+                                                               throw new RuntimeException("Cannot run "
+                                                                               + Arrays.toString(args) + " on "
+                                                                               + agentCli, e);
+                                                       }
+                                               }
+
+                                       });
+
+                       // Shutdown OSGi runtime
+                       framework.stop();
+                       framework.waitForStop(60 * 1000);
+
+                       System.exit(0);
                } catch (Exception e) {
-                       System.err.println("Unexpected exception when bootstrapping.");
                        e.printStackTrace();
-                       badExit();
-               }
-
-               // if (debug) {
-               // debug("Mode: " + type);
-               // if (urlStr != null)
-               // debug("Runtime: " + urlStr);
-               // debug("User properties: " + properties);
-               // if (module != null)
-               // debug("Module: " + module);
-               // if (flows != null)
-               // debug("Flows: " + flows);
-               // }
-               //
-               // // Standalone
-               // if (type.equals(Type.standalone)) {
-               // }
-               // // Agent
-               // else if (type.equals(Type.agent)) {
-               // }
-       }
-
-       public static void printUsage() {
-               new HelpFormatter().printHelp(commandName, options, true);
-       }
-
-       // private static String listTypeValues() {
-       // StringBuffer buf = new StringBuffer("");
-       // for (Type mode : Type.values()) {
-       // buf.append(mode).append(", ");
-       // }
-       // String str = buf.toString();
-       // // unsafe, but there will be at least one value in the enum
-       // return str.substring(0, str.length() - 2);
-       // }
-
-       protected static void addProperty(Properties properties, String property) {
-               int eqIndex = property.indexOf('=');
-               if (eqIndex == 0)
-                       throw new SlcException("Badly formatted property " + property);
-
-               if (eqIndex > 0) {
-                       String key = property.substring(0, eqIndex);
-                       String value = property.substring(eqIndex + 1);
-                       properties.setProperty(key, value);
-
-               } else {
-                       properties.setProperty(property, "true");
-               }
-       }
-
-       protected static void loadPropertyFile(Properties properties,
-                       String propertyFile) {
-               FileInputStream in = null;
-               try {
-                       in = new FileInputStream(propertyFile);
-                       properties.load(in);
-               } catch (Exception e) {
-                       throw new SlcException("Could not load proeprty file "
-                                       + propertyFile);
+                       System.exit(1);
                } finally {
-                       IOUtils.closeQuietly(in);
+                       if (isTransient && dataDir != null && dataDir.exists()) {
+                               // TODO clean up transient data dir
+                       }
+
                }
        }
 
-       private static void badExit() {
-               printUsage();
-               System.exit(1);
+       public static void main(String[] args) {
+               new SlcMain(args).run();
        }
 
        protected static void info(Object msg) {
@@ -332,4 +211,5 @@ public class SlcMain {
        protected static void debug(Object msg) {
                System.out.println(msg);
        }
+
 }