]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.launcher/src/main/java/org/argeo/slc/cli/SlcMain.java
Remove useless comments
[gpl/argeo-slc.git] / runtime / org.argeo.slc.launcher / src / main / java / org / argeo / slc / cli / SlcMain.java
index c4193369a0b172b3b66eb165503538a1b43f005d..b74d5f0949d178866345cfc4644274a3c36f4b52 100644 (file)
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.argeo.slc.cli;
 
+import java.io.File;
 import java.io.FileInputStream;
+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.Option;
-import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.argeo.osgi.boot.OsgiBoot;
 import org.argeo.slc.SlcException;
-import org.argeo.slc.logging.Log4jUtils;
-import org.argeo.slc.runtime.SlcExecutionContext;
-import org.argeo.slc.runtime.SlcRuntime;
+import org.eclipse.core.runtime.adaptor.EclipseStarter;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
+@SuppressWarnings("restriction")
 public class SlcMain {
-       public enum Mode {
-               single, agent
-       }
-
-       private static Log log = null;
-
-       private final static String BOOTSTRAP_LOG4J_CONFIG = "org/argeo/slc/cli/bootstrapLog4j.properties";
-
-       private final static Option modeOpt = OptionBuilder.withLongOpt("mode")
-                       .withArgName("mode").hasArg().withDescription(
-                                       "SLC execution mode, one of: " + listModeValues()).create(
-                                       'm');
-
-       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');
+       /** Unique launch module */
+       public static String UNIQUE_LAUNCH_MODULE_PROPERTY = "slc.launch.module";
 
-       private final static Option scriptOpt = OptionBuilder.withLongOpt("script")
-                       .withArgName("script").hasArg().withDescription(
-                                       "SLC script to execute").create('s');
-
-       private final static Option targetsOpt = OptionBuilder.withLongOpt(
-                       "targets").withArgName("targets").hasArg().withDescription(
-                       "Targets to execute").create('t');
-
-       private final static Option runtimeOpt = OptionBuilder.withLongOpt(
-                       "runtime").withArgName("runtime").hasArg().withDescription(
-                       "Runtime to use, either a full path or relative to slc app conf dir: "
-                                       + "<conf dir>/runtime/<runtime>/.xml").create('r');
+       /** Unique launch flow */
+       public static String UNIQUE_LAUNCH_FLOW_PROPERTY = "slc.launch.flow";
 
        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";
+
        static {
                options = new Options();
-               options.addOption(modeOpt);
-               options.addOption(scriptOpt);
-               options.addOption(targetsOpt);
-               options.addOption(propertyOpt);
-               options.addOption(propertiesOpt);
-               options.addOption(runtimeOpt);
        }
 
+       @SuppressWarnings({ "unchecked" })
        public static void main(String[] args) {
-               Mode mode = null;
-               Properties properties = new Properties();
-               String script = null;
-               String targets = null;
-               String runtimeStr = null;
+               String module = null;
+               String moduleUrl = null;
+               String flow = null;
 
                try {
 
                        CommandLineParser clParser = new GnuParser();
                        CommandLine cl = clParser.parse(options, args);
 
-                       // Mode
-                       String modeStr = cl.getOptionValue(modeOpt.getOpt());
-                       if (modeStr == null) {
-                               mode = Mode.single;
+                       List<String> arguments = cl.getArgList();
+                       if (arguments.size() == 0) {
+                               // TODO default behaviour
                        } else {
-                               try {
-                                       mode = Mode.valueOf(modeStr);
-                               } catch (IllegalArgumentException e) {
-                                       throw new SlcException("Unrecognized mode '" + modeStr
-                                                       + "'", e);
+                               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();
+                                       }
                                }
-                       }
 
-                       // Script
-                       if (mode.equals(Mode.single)) {
-                               if (!cl.hasOption(scriptOpt.getOpt()))
-                                       throw new SlcException("Mode " + Mode.single
-                                                       + " requires option '" + scriptOpt.getLongOpt()
-                                                       + "'");
-                               script = cl.getOptionValue(scriptOpt.getOpt());
-
-                               // Targets
-                               if (cl.hasOption(targetsOpt.getOpt()))
-                                       targets = cl.getOptionValue(targetsOpt.getOpt());
-                       }
-
-                       // Properties
-                       if (cl.hasOption(propertiesOpt.getOpt())) {
-                               for (String propertyFile : cl.getOptionValues(propertiesOpt
-                                               .getOpt())) {
-                                       loadPropertyFile(properties, propertyFile);
+                               if (arguments.size() == 1) {
+                                       // TODO module info
+                               } else {
+                                       flow = arguments.get(1);
                                }
                        }
-                       if (cl.hasOption(propertyOpt.getOpt())) {
-                               for (String property : cl.getOptionValues(propertyOpt.getOpt())) {
-                                       addProperty(properties, property);
-                               }
+
+                       String executionDir = System.getProperty("user.dir");
+                       File slcDir = new File(executionDir, "target/.slc");
+                       File 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);
                        }
 
-                       // Runtime
-                       if (cl.hasOption(runtimeOpt.getOpt())) {
-                               runtimeStr = cl.getOptionValue(runtimeOpt.getOpt());
+                       // 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
+                       osgiBoot.startBundles(bundlesToStart);
+
                } catch (ParseException e) {
                        System.err.println("Problem with command line arguments. "
                                        + e.getMessage());
@@ -137,53 +143,12 @@ public class SlcMain {
                        e.printStackTrace();
                        badExit();
                }
-
-               // Initializes logging and log arguments
-               initLogging(properties);
-               if (log.isDebugEnabled()) {
-                       log.debug("Mode: " + mode);
-                       if (runtimeStr != null)
-                               log.debug("Runtime: " + runtimeStr);
-                       log.debug("User properties: " + properties);
-                       if (script != null)
-                               log.debug("Script: " + script);
-                       if (targets != null)
-                               log.debug("Targets: " + targets);
-               }
-
-               // Execution
-               if (mode.equals(Mode.single)) {
-                       try {
-                               // DefaultSlcRuntime runtime = new DefaultSlcRuntime();
-                               // FIXME: inject this more cleanly
-                               ClassLoader cl = Thread.currentThread().getContextClassLoader();
-                               Class clss = cl.loadClass("org.argeo.slc.ant.AntSlcRuntime");
-                               SlcRuntime<? extends SlcExecutionContext> runtime = (SlcRuntime<? extends SlcExecutionContext>) clss
-                                               .newInstance();
-                               runtime.executeScript(runtimeStr, script, targets, properties,
-                                               null, null);
-                               // System.exit(0);
-                       } catch (Exception e) {
-                               log.error("SLC client terminated with an error: ", e);
-                               System.exit(1);
-                       }
-               }
        }
 
        public static void printUsage() {
                new HelpFormatter().printHelp(commandName, options, true);
        }
 
-       private static String listModeValues() {
-               StringBuffer buf = new StringBuffer("");
-               for (Mode mode : Mode.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)
@@ -213,24 +178,16 @@ public class SlcMain {
                }
        }
 
-       private static void initLogging(Properties userProperties) {
-               System.setProperty("log4j.defaultInitOverride", "true");
-
-               // Add log4j user properties to System properties
-               for (Object obj : userProperties.keySet()) {
-                       String key = obj.toString();
-                       if (key.startsWith("log4j.")) {
-                               System.setProperty(key, userProperties.getProperty(key));
-                       }
-               }
-               Log4jUtils.initLog4j(System.getProperty("log4j.configuration",
-                               "classpath:" + BOOTSTRAP_LOG4J_CONFIG));
-               log = LogFactory.getLog(SlcMain.class);
-
-       }
-
        private static void badExit() {
                printUsage();
                System.exit(1);
        }
+
+       protected static void info(Object msg) {
+               System.out.println(msg);
+       }
+
+       protected static void debug(Object msg) {
+               System.out.println(msg);
+       }
 }