From: Mathieu Baudier Date: Mon, 27 Apr 2009 14:12:15 +0000 (+0000) Subject: git-svn-id: https://svn.argeo.org/slc/trunk@2380 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc X-Git-Tag: argeo-slc-2.1.7~1936 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=3e24f32c95b5ac3ec7fcae7000c4a8cfb857d514;p=gpl%2Fargeo-slc.git git-svn-id: https://svn.argeo.org/slc/trunk@2380 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.slc.detached.launcher/.classpath b/org.argeo.slc.detached.launcher/.classpath deleted file mode 100644 index b606f1820..000000000 --- a/org.argeo.slc.detached.launcher/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/org.argeo.slc.detached.launcher/.project b/org.argeo.slc.detached.launcher/.project deleted file mode 100644 index 9c83d32f8..000000000 --- a/org.argeo.slc.detached.launcher/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - org.argeo.slc.detached.launcher - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.maven.ide.eclipse.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.maven.ide.eclipse.maven2Nature - - diff --git a/org.argeo.slc.detached.launcher/.settings/org.eclipse.jdt.core.prefs b/org.argeo.slc.detached.launcher/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3bd18ea49..000000000 --- a/org.argeo.slc.detached.launcher/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Mon Nov 17 14:48:56 CET 2008 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning -org.eclipse.jdt.core.compiler.source=1.3 diff --git a/org.argeo.slc.detached.launcher/.settings/org.maven.ide.eclipse.prefs b/org.argeo.slc.detached.launcher/.settings/org.maven.ide.eclipse.prefs deleted file mode 100644 index a8ec2344f..000000000 --- a/org.argeo.slc.detached.launcher/.settings/org.maven.ide.eclipse.prefs +++ /dev/null @@ -1,9 +0,0 @@ -#Wed Sep 24 16:04:14 CEST 2008 -activeProfiles= -eclipse.preferences.version=1 -filterResources=false -includeModules=false -resolveWorkspaceProjects=true -resourceFilterGoals=process-resources resources\:testResources -useMavenFolders=false -version=1 diff --git a/org.argeo.slc.detached.launcher/pom.xml b/org.argeo.slc.detached.launcher/pom.xml deleted file mode 100644 index b101f93dc..000000000 --- a/org.argeo.slc.detached.launcher/pom.xml +++ /dev/null @@ -1,140 +0,0 @@ - - 4.0.0 - - org.argeo.slc - argeo-slc - 0.11.3-SNAPSHOT - ../org.argeo.slc - - org.argeo.slc.detached.launcher - Argeo SLC Detached Launcher - jar - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.4 - 1.4 - - - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-jar-plugin - - - - - org.argeo.slc.detached.launcher.Main - - - - - - - org.apache.felix - maven-bundle-plugin - ${version.maven-bundle-plugin} - - - - org.argeo.slc.* - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - src/assembly/dist.xml - - - - - attach-assembly - package - - single - - - - - - - - - - org.eclipse.osgi - org.eclipse.osgi - - - - - - - - - - - - \ No newline at end of file diff --git a/org.argeo.slc.detached.launcher/src/assembly/dist.xml b/org.argeo.slc.detached.launcher/src/assembly/dist.xml deleted file mode 100644 index e7d97af79..000000000 --- a/org.argeo.slc.detached.launcher/src/assembly/dist.xml +++ /dev/null @@ -1,16 +0,0 @@ - - dist - false - - tar.gz - - - - src/main/base - - 0755 - - - \ No newline at end of file diff --git a/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached-settings.bat.template b/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached-settings.bat.template deleted file mode 100644 index 54f23e3c8..000000000 --- a/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached-settings.bat.template +++ /dev/null @@ -1,14 +0,0 @@ -@echo off - -rem Target application -set JAVA_HOME=[the target JRE] -set SLC_USER_CLASSPATH=[classpath of the application to test] -set SLC_DETACHED_APPCLASS=[main class of the application to test] -set SLC_DETACHED_APPARGS=[arguments of the application to test] -set SLC_DETACHED_JVM_ARGS=[additional JVM arguments] - -rem Runtime -set PROJECT_BASE=[base of the project to being developed] -set SLC_WORK_DIR=%PROJECT_BASE%/src/main/slc/work -set SLC_USER_BUNDLES=reference:file:%PROJECT_BASE%/target/classes - diff --git a/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached.bat b/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached.bat deleted file mode 100644 index 15480265b..000000000 --- a/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -echo SLC Detached -set SLC_HOME=%~dp0.. -echo SLC_HOME=%SLC_HOME% -set SLC_LIB_DETACHED=%SLC_HOME%\lib\detached - -call slc-detached-settings.bat - -rem FOR %%f IN (%SLC_HOME%\lib\detached\*.jar) DO set CLASSPATH=%CLASSPATH%;%%f -FOR %%f IN (%SLC_HOME%\lib\detached\org.argeo.slc.detached.launcher-*.jar) DO set SLC_DETACHED_LAUNCHER_JAR=%%f -FOR %%f IN (%SLC_HOME%\lib\org.argeo.slc.detached-*.jar) DO set SLC_DETACHED_JAR=%%f - -set CLASSPATH=%SLC_DETACHED_LAUNCHER_JAR%;%SLC_USER_CLASSPATH%;%SLC_LIB_DETACHED%\com.springsource.org.aopalliance-1.0.0.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.commons.io-1.4.0.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.commons.logging-1.1.1.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.log4j-1.2.15.jar;%SLC_LIB_DETACHED%\org.apache.felix.main-1.2.1.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.xerces-2.8.1.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.xalan-2.7.0.jar - -set CMD=%JAVA_HOME%\bin\java %SLC_DETACHED_JVM_ARGS% -Dslc.detached.jar=%SLC_DETACHED_JAR% -Dslc.home=%SLC_HOME% -Dslc.workDir=%SLC_WORK_DIR% "-Dslc.detached.userBundles=%SLC_USER_BUNDLES%" -Dslc.detached.appclass=%SLC_DETACHED_APPCLASS% "-Dslc.detached.appargs=%SLC_DETACHED_APPARGS%" -classpath %CLASSPATH% org.argeo.slc.detached.launcher.Main -rem echo CMD=%CMD% - -start %CMD% - diff --git a/org.argeo.slc.detached.launcher/src/main/java/org/argeo/slc/detached/launcher/Main.java b/org.argeo.slc.detached.launcher/src/main/java/org/argeo/slc/detached/launcher/Main.java deleted file mode 100644 index 807963e14..000000000 --- a/org.argeo.slc.detached.launcher/src/main/java/org/argeo/slc/detached/launcher/Main.java +++ /dev/null @@ -1,301 +0,0 @@ -package org.argeo.slc.detached.launcher; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.eclipse.core.runtime.adaptor.EclipseStarter; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; - -public class Main { - public final static String PROP_SLC_HOME = "slc.home"; - public final static String PROP_SLC_OSGI_START = "slc.osgi.start"; - public final static String PROP_SLC_OSGI_SCAN_CLASSPATH = "slc.osgi.scanClasspath"; - public final static String PROP_SLC_OSGI_EQUINOX_ARGS = "slc.osgi.equinox.args"; - - private final static String DEV_BUNDLE_PREFIX = "slc.osgi.devbundle."; - - public static void main(String[] args) { - info("Argeo SLC Detached launcher starting..."); - try { - // Load properties - String propertyPath = "slc-detached.properties"; - Properties config = prepareConfig(propertyPath); - - // Start app (in main class loader) - startApp(config); - - // Start OSGi framework - try { - startEquinox(config); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - info("Argeo SLC Detached launcher started."); - } catch (Exception e) { - e.printStackTrace(); - System.exit(-1); - } - } - - protected static Properties prepareConfig(String propertyFilePath) - throws Exception { - // Format slc.home - String slcHome = System.getProperty(PROP_SLC_HOME); - if (slcHome != null) { - slcHome = new File(slcHome).getCanonicalPath(); - System.setProperty(PROP_SLC_HOME, slcHome); - } - - // Load config - Properties config = new Properties(); - InputStream in = null; - try { - File file = new File(propertyFilePath); - if (file.exists()) { - in = new FileInputStream(propertyFilePath); - config.load(in); - } - } finally { - if (in != null) - in.close(); - } - - // System properties have priority. - config.putAll(System.getProperties()); - return config; - } - - public static void startEquinox(Properties config) throws Exception { - info("java.home=" + System.getProperty("java.home")); - info("java.class.path=" + System.getProperty("java.class.path")); - - File baseDir = new File(System.getProperty("user.dir")) - .getCanonicalFile(); - String equinoxConfigurationPath = baseDir.getPath() + File.separator - + "slc-detached" + File.separator + "equinoxConfiguration"; - - String equinoxArgsLineDefault = "-console -noExit -clean -debug -configuration " - + equinoxConfigurationPath; - String equinoxArgsLine = config.getProperty(PROP_SLC_OSGI_EQUINOX_ARGS, - equinoxArgsLineDefault); - // String[] equinoxArgs = { "-console", "-noExit", "-clean", "-debug", - // "-configuration", equinoxConfigurationPath }; - String[] equinoxArgs = equinoxArgsLine.split(" "); - - BundleContext context = EclipseStarter.startup(equinoxArgs, null); - - List installBundleNames = new ArrayList(); - - // Load from class path (dev environment, maven) - if (config.getProperty(PROP_SLC_OSGI_SCAN_CLASSPATH, "false").equals( - "true")) { - StringTokenizer st = new StringTokenizer(System - .getProperty("java.class.path"), File.pathSeparator); - while (st.hasMoreTokens()) { - try { - String path = st.nextToken(); - String url = "reference:file:" - + new File(path).getCanonicalPath(); - Bundle bundle = context.installBundle(url); - if (bundle.getSymbolicName() != null) - installBundleNames.add(bundle.getSymbolicName()); - info("Installed from classpath " + url); - } catch (Exception e) { - bundleInstallWarn(e.getMessage()); - } - } - } - - // Load from dev bundles - Map devBundleUrls = getDevBundleUrls(config); - Iterator devBundles = devBundleUrls.keySet().iterator(); - while (devBundles.hasNext()) { - try { - String bundleName = (String) devBundles.next(); - String url = (String) devBundleUrls.get(bundleName); - Bundle bundle = context.installBundle(url); - installBundleNames.add(bundle.getSymbolicName()); - info("Installed as dev bundle " + url); - } catch (Exception e) { - bundleInstallWarn(e.getMessage()); - } - } - - // Load from distribution - String slcHome = config.getProperty(PROP_SLC_HOME); - if (slcHome != null) { - File libDir = new File(slcHome + File.separator + "lib"); - File[] bundleFiles = libDir.listFiles(); - for (int i = 0; i < bundleFiles.length; i++) { - try { - String url = "reference:file:" - + bundleFiles[i].getCanonicalPath(); - Bundle bundle = context.installBundle(url); - installBundleNames.add(bundle.getSymbolicName()); - info("INFO: Installed from SLC home " + url); - } catch (Exception e) { - bundleInstallWarn(e.getMessage()); - } - - } - } - - // Start bundles - String bundleStart = config.getProperty(PROP_SLC_OSGI_START, - "org.springframework.osgi.extender,org.argeo.slc.detached"); - - if (bundleStart.trim().equals("*")) { - for (int i = 0; i < installBundleNames.size(); i++) { - Object obj = installBundleNames.get(i); - if (obj != null) { - String bundleSymbolicName = obj.toString(); - try { - startBundle(context, bundleSymbolicName); - } catch (Exception e) { - bundleInstallWarn("Cannot start " + bundleSymbolicName - + ": " + e.getMessage()); - } - } - } - } else { - StringTokenizer stBundleStart = new StringTokenizer(bundleStart, - ","); - while (stBundleStart.hasMoreTokens()) { - String bundleSymbolicName = stBundleStart.nextToken(); - startBundle(context, bundleSymbolicName); - } - } - } - - private static Map getDevBundleUrls(Properties config) { - Map bundles = new Hashtable(); - Iterator keys = config.keySet().iterator(); - while (keys.hasNext()) { - String key = (String) keys.next(); - if (key.startsWith(DEV_BUNDLE_PREFIX)) { - String bundle = key.substring(DEV_BUNDLE_PREFIX.length()); - String path = config.getProperty(key); - bundles.put(bundle, path); - } - } - return bundles; - } - - private static void startBundle(BundleContext bundleContext, - String symbolicName) throws BundleException { - //info("Starting bundle " + symbolicName + "..."); - Bundle bundle = findBundleBySymbolicName(bundleContext, symbolicName); - if (bundle != null) - bundle.start(); - else - throw new RuntimeException("Bundle " + symbolicName + " not found"); - info("Started " + symbolicName); - } - - /** WARNING: return the first one found! */ - private static Bundle findBundleBySymbolicName(BundleContext bundleContext, - String symbolicName) { - Bundle[] bundles = bundleContext.getBundles(); - for (int i = 0; i < bundles.length; i++) { - Bundle bundle = bundles[i]; - String bundleSymbolicName = bundle.getSymbolicName(); - if (bundleSymbolicName != null) { - // throw new RuntimeException("Bundle " + bundle.getBundleId() - // + " (" + bundle.getLocation() - // + ") has no symbolic name."); - - if (bundleSymbolicName.equals(symbolicName)) { - return bundle; - } - } - } - return null; - } - - public static void startApp(Properties config) throws Exception { - String className = config.getProperty("slc.detached.appclass"); - String[] uiArgs = readArgumentsFromLine(config.getProperty( - "slc.detached.appargs", "")); - - if (className == null) { - info("No slc.detached.appclass property define: does not try to launch an app from the standard classpath."); - } else { - // Launch main method using reflection - Class clss = Class.forName(className); - Class[] mainArgsClasses = new Class[] { uiArgs.getClass() }; - Object[] mainArgs = { uiArgs }; - Method mainMethod = clss.getMethod("main", mainArgsClasses); - mainMethod.invoke(null, mainArgs); - } - } - - /* UTILITIES */ - - /** - * Transform a line into an array of arguments, taking "" as single - * arguments. (nested \" are not supported) - */ - private static String[] readArgumentsFromLine(String lineOrig) { - - String line = lineOrig.trim();// remove trailing spaces - // System.out.println("line=" + line); - List args = new Vector(); - StringBuffer curr = new StringBuffer(""); - boolean inQuote = false; - char[] arr = line.toCharArray(); - for (int i = 0; i < arr.length; i++) { - char c = arr[i]; - switch (c) { - case '\"': - inQuote = !inQuote; - break; - case ' ': - if (!inQuote) {// otherwise, no break: goes to default - if (curr.length() > 0) { - args.add(curr.toString()); - curr = new StringBuffer(""); - } - break; - } - default: - curr.append(c); - break; - } - } - - // Add last arg - if (curr.length() > 0) { - args.add(curr.toString()); - curr = null; - } - - String[] res = new String[args.size()]; - for (int i = 0; i < args.size(); i++) { - res[i] = args.get(i).toString(); - // System.out.println("res[i]=" + res[i]); - } - return res; - } - - private static void info(Object obj) { - System.out.println("[INFO] " + obj); - } - - private static void bundleInstallWarn(Object obj) { - System.err.println("[WARN] " + obj); - //Thread.dumpStack(); - } -} diff --git a/org.argeo.slc.detached.launcher/src/main/resources/log4j.properties b/org.argeo.slc.detached.launcher/src/main/resources/log4j.properties deleted file mode 100644 index 9572fad6c..000000000 --- a/org.argeo.slc.detached.launcher/src/main/resources/log4j.properties +++ /dev/null @@ -1,16 +0,0 @@ -# Set root logger level to DEBUG and its only appender to A1. -log4j.rootLogger=WARN, console - -## Levels -# Slc -log4j.logger.org.argeo.slc=DEBUG -log4j.logger.org.springframework=WARN - -## Appenders -# A1 is set to be a ConsoleAppender. -log4j.appender.console=org.apache.log4j.ConsoleAppender - -# A1 uses PatternLayout. -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c %n - diff --git a/runtime/org.argeo.slc.detached.launcher/.classpath b/runtime/org.argeo.slc.detached.launcher/.classpath new file mode 100644 index 000000000..b606f1820 --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/runtime/org.argeo.slc.detached.launcher/.project b/runtime/org.argeo.slc.detached.launcher/.project new file mode 100644 index 000000000..9c83d32f8 --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/.project @@ -0,0 +1,23 @@ + + + org.argeo.slc.detached.launcher + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/runtime/org.argeo.slc.detached.launcher/.settings/org.eclipse.jdt.core.prefs b/runtime/org.argeo.slc.detached.launcher/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..3bd18ea49 --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Mon Nov 17 14:48:56 CET 2008 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/runtime/org.argeo.slc.detached.launcher/.settings/org.maven.ide.eclipse.prefs b/runtime/org.argeo.slc.detached.launcher/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..a8ec2344f --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Wed Sep 24 16:04:14 CEST 2008 +activeProfiles= +eclipse.preferences.version=1 +filterResources=false +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +useMavenFolders=false +version=1 diff --git a/runtime/org.argeo.slc.detached.launcher/pom.xml b/runtime/org.argeo.slc.detached.launcher/pom.xml new file mode 100644 index 000000000..b101f93dc --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/pom.xml @@ -0,0 +1,140 @@ + + 4.0.0 + + org.argeo.slc + argeo-slc + 0.11.3-SNAPSHOT + ../org.argeo.slc + + org.argeo.slc.detached.launcher + Argeo SLC Detached Launcher + jar + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.4 + 1.4 + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + + org.argeo.slc.detached.launcher.Main + + + + + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + + org.argeo.slc.* + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + src/assembly/dist.xml + + + + + attach-assembly + package + + single + + + + + + + + + + org.eclipse.osgi + org.eclipse.osgi + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.detached.launcher/src/assembly/dist.xml b/runtime/org.argeo.slc.detached.launcher/src/assembly/dist.xml new file mode 100644 index 000000000..e7d97af79 --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/src/assembly/dist.xml @@ -0,0 +1,16 @@ + + dist + false + + tar.gz + + + + src/main/base + + 0755 + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached-settings.bat.template b/runtime/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached-settings.bat.template new file mode 100644 index 000000000..54f23e3c8 --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached-settings.bat.template @@ -0,0 +1,14 @@ +@echo off + +rem Target application +set JAVA_HOME=[the target JRE] +set SLC_USER_CLASSPATH=[classpath of the application to test] +set SLC_DETACHED_APPCLASS=[main class of the application to test] +set SLC_DETACHED_APPARGS=[arguments of the application to test] +set SLC_DETACHED_JVM_ARGS=[additional JVM arguments] + +rem Runtime +set PROJECT_BASE=[base of the project to being developed] +set SLC_WORK_DIR=%PROJECT_BASE%/src/main/slc/work +set SLC_USER_BUNDLES=reference:file:%PROJECT_BASE%/target/classes + diff --git a/runtime/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached.bat b/runtime/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached.bat new file mode 100644 index 000000000..15480265b --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/src/main/base/bin/slc-detached.bat @@ -0,0 +1,19 @@ +@echo off +echo SLC Detached +set SLC_HOME=%~dp0.. +echo SLC_HOME=%SLC_HOME% +set SLC_LIB_DETACHED=%SLC_HOME%\lib\detached + +call slc-detached-settings.bat + +rem FOR %%f IN (%SLC_HOME%\lib\detached\*.jar) DO set CLASSPATH=%CLASSPATH%;%%f +FOR %%f IN (%SLC_HOME%\lib\detached\org.argeo.slc.detached.launcher-*.jar) DO set SLC_DETACHED_LAUNCHER_JAR=%%f +FOR %%f IN (%SLC_HOME%\lib\org.argeo.slc.detached-*.jar) DO set SLC_DETACHED_JAR=%%f + +set CLASSPATH=%SLC_DETACHED_LAUNCHER_JAR%;%SLC_USER_CLASSPATH%;%SLC_LIB_DETACHED%\com.springsource.org.aopalliance-1.0.0.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.commons.io-1.4.0.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.commons.logging-1.1.1.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.log4j-1.2.15.jar;%SLC_LIB_DETACHED%\org.apache.felix.main-1.2.1.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.xerces-2.8.1.jar;%SLC_LIB_DETACHED%\com.springsource.org.apache.xalan-2.7.0.jar + +set CMD=%JAVA_HOME%\bin\java %SLC_DETACHED_JVM_ARGS% -Dslc.detached.jar=%SLC_DETACHED_JAR% -Dslc.home=%SLC_HOME% -Dslc.workDir=%SLC_WORK_DIR% "-Dslc.detached.userBundles=%SLC_USER_BUNDLES%" -Dslc.detached.appclass=%SLC_DETACHED_APPCLASS% "-Dslc.detached.appargs=%SLC_DETACHED_APPARGS%" -classpath %CLASSPATH% org.argeo.slc.detached.launcher.Main +rem echo CMD=%CMD% + +start %CMD% + diff --git a/runtime/org.argeo.slc.detached.launcher/src/main/java/org/argeo/slc/detached/launcher/Main.java b/runtime/org.argeo.slc.detached.launcher/src/main/java/org/argeo/slc/detached/launcher/Main.java new file mode 100644 index 000000000..807963e14 --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/src/main/java/org/argeo/slc/detached/launcher/Main.java @@ -0,0 +1,301 @@ +package org.argeo.slc.detached.launcher; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.Vector; + +import org.eclipse.core.runtime.adaptor.EclipseStarter; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; + +public class Main { + public final static String PROP_SLC_HOME = "slc.home"; + public final static String PROP_SLC_OSGI_START = "slc.osgi.start"; + public final static String PROP_SLC_OSGI_SCAN_CLASSPATH = "slc.osgi.scanClasspath"; + public final static String PROP_SLC_OSGI_EQUINOX_ARGS = "slc.osgi.equinox.args"; + + private final static String DEV_BUNDLE_PREFIX = "slc.osgi.devbundle."; + + public static void main(String[] args) { + info("Argeo SLC Detached launcher starting..."); + try { + // Load properties + String propertyPath = "slc-detached.properties"; + Properties config = prepareConfig(propertyPath); + + // Start app (in main class loader) + startApp(config); + + // Start OSGi framework + try { + startEquinox(config); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + info("Argeo SLC Detached launcher started."); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + + protected static Properties prepareConfig(String propertyFilePath) + throws Exception { + // Format slc.home + String slcHome = System.getProperty(PROP_SLC_HOME); + if (slcHome != null) { + slcHome = new File(slcHome).getCanonicalPath(); + System.setProperty(PROP_SLC_HOME, slcHome); + } + + // Load config + Properties config = new Properties(); + InputStream in = null; + try { + File file = new File(propertyFilePath); + if (file.exists()) { + in = new FileInputStream(propertyFilePath); + config.load(in); + } + } finally { + if (in != null) + in.close(); + } + + // System properties have priority. + config.putAll(System.getProperties()); + return config; + } + + public static void startEquinox(Properties config) throws Exception { + info("java.home=" + System.getProperty("java.home")); + info("java.class.path=" + System.getProperty("java.class.path")); + + File baseDir = new File(System.getProperty("user.dir")) + .getCanonicalFile(); + String equinoxConfigurationPath = baseDir.getPath() + File.separator + + "slc-detached" + File.separator + "equinoxConfiguration"; + + String equinoxArgsLineDefault = "-console -noExit -clean -debug -configuration " + + equinoxConfigurationPath; + String equinoxArgsLine = config.getProperty(PROP_SLC_OSGI_EQUINOX_ARGS, + equinoxArgsLineDefault); + // String[] equinoxArgs = { "-console", "-noExit", "-clean", "-debug", + // "-configuration", equinoxConfigurationPath }; + String[] equinoxArgs = equinoxArgsLine.split(" "); + + BundleContext context = EclipseStarter.startup(equinoxArgs, null); + + List installBundleNames = new ArrayList(); + + // Load from class path (dev environment, maven) + if (config.getProperty(PROP_SLC_OSGI_SCAN_CLASSPATH, "false").equals( + "true")) { + StringTokenizer st = new StringTokenizer(System + .getProperty("java.class.path"), File.pathSeparator); + while (st.hasMoreTokens()) { + try { + String path = st.nextToken(); + String url = "reference:file:" + + new File(path).getCanonicalPath(); + Bundle bundle = context.installBundle(url); + if (bundle.getSymbolicName() != null) + installBundleNames.add(bundle.getSymbolicName()); + info("Installed from classpath " + url); + } catch (Exception e) { + bundleInstallWarn(e.getMessage()); + } + } + } + + // Load from dev bundles + Map devBundleUrls = getDevBundleUrls(config); + Iterator devBundles = devBundleUrls.keySet().iterator(); + while (devBundles.hasNext()) { + try { + String bundleName = (String) devBundles.next(); + String url = (String) devBundleUrls.get(bundleName); + Bundle bundle = context.installBundle(url); + installBundleNames.add(bundle.getSymbolicName()); + info("Installed as dev bundle " + url); + } catch (Exception e) { + bundleInstallWarn(e.getMessage()); + } + } + + // Load from distribution + String slcHome = config.getProperty(PROP_SLC_HOME); + if (slcHome != null) { + File libDir = new File(slcHome + File.separator + "lib"); + File[] bundleFiles = libDir.listFiles(); + for (int i = 0; i < bundleFiles.length; i++) { + try { + String url = "reference:file:" + + bundleFiles[i].getCanonicalPath(); + Bundle bundle = context.installBundle(url); + installBundleNames.add(bundle.getSymbolicName()); + info("INFO: Installed from SLC home " + url); + } catch (Exception e) { + bundleInstallWarn(e.getMessage()); + } + + } + } + + // Start bundles + String bundleStart = config.getProperty(PROP_SLC_OSGI_START, + "org.springframework.osgi.extender,org.argeo.slc.detached"); + + if (bundleStart.trim().equals("*")) { + for (int i = 0; i < installBundleNames.size(); i++) { + Object obj = installBundleNames.get(i); + if (obj != null) { + String bundleSymbolicName = obj.toString(); + try { + startBundle(context, bundleSymbolicName); + } catch (Exception e) { + bundleInstallWarn("Cannot start " + bundleSymbolicName + + ": " + e.getMessage()); + } + } + } + } else { + StringTokenizer stBundleStart = new StringTokenizer(bundleStart, + ","); + while (stBundleStart.hasMoreTokens()) { + String bundleSymbolicName = stBundleStart.nextToken(); + startBundle(context, bundleSymbolicName); + } + } + } + + private static Map getDevBundleUrls(Properties config) { + Map bundles = new Hashtable(); + Iterator keys = config.keySet().iterator(); + while (keys.hasNext()) { + String key = (String) keys.next(); + if (key.startsWith(DEV_BUNDLE_PREFIX)) { + String bundle = key.substring(DEV_BUNDLE_PREFIX.length()); + String path = config.getProperty(key); + bundles.put(bundle, path); + } + } + return bundles; + } + + private static void startBundle(BundleContext bundleContext, + String symbolicName) throws BundleException { + //info("Starting bundle " + symbolicName + "..."); + Bundle bundle = findBundleBySymbolicName(bundleContext, symbolicName); + if (bundle != null) + bundle.start(); + else + throw new RuntimeException("Bundle " + symbolicName + " not found"); + info("Started " + symbolicName); + } + + /** WARNING: return the first one found! */ + private static Bundle findBundleBySymbolicName(BundleContext bundleContext, + String symbolicName) { + Bundle[] bundles = bundleContext.getBundles(); + for (int i = 0; i < bundles.length; i++) { + Bundle bundle = bundles[i]; + String bundleSymbolicName = bundle.getSymbolicName(); + if (bundleSymbolicName != null) { + // throw new RuntimeException("Bundle " + bundle.getBundleId() + // + " (" + bundle.getLocation() + // + ") has no symbolic name."); + + if (bundleSymbolicName.equals(symbolicName)) { + return bundle; + } + } + } + return null; + } + + public static void startApp(Properties config) throws Exception { + String className = config.getProperty("slc.detached.appclass"); + String[] uiArgs = readArgumentsFromLine(config.getProperty( + "slc.detached.appargs", "")); + + if (className == null) { + info("No slc.detached.appclass property define: does not try to launch an app from the standard classpath."); + } else { + // Launch main method using reflection + Class clss = Class.forName(className); + Class[] mainArgsClasses = new Class[] { uiArgs.getClass() }; + Object[] mainArgs = { uiArgs }; + Method mainMethod = clss.getMethod("main", mainArgsClasses); + mainMethod.invoke(null, mainArgs); + } + } + + /* UTILITIES */ + + /** + * Transform a line into an array of arguments, taking "" as single + * arguments. (nested \" are not supported) + */ + private static String[] readArgumentsFromLine(String lineOrig) { + + String line = lineOrig.trim();// remove trailing spaces + // System.out.println("line=" + line); + List args = new Vector(); + StringBuffer curr = new StringBuffer(""); + boolean inQuote = false; + char[] arr = line.toCharArray(); + for (int i = 0; i < arr.length; i++) { + char c = arr[i]; + switch (c) { + case '\"': + inQuote = !inQuote; + break; + case ' ': + if (!inQuote) {// otherwise, no break: goes to default + if (curr.length() > 0) { + args.add(curr.toString()); + curr = new StringBuffer(""); + } + break; + } + default: + curr.append(c); + break; + } + } + + // Add last arg + if (curr.length() > 0) { + args.add(curr.toString()); + curr = null; + } + + String[] res = new String[args.size()]; + for (int i = 0; i < args.size(); i++) { + res[i] = args.get(i).toString(); + // System.out.println("res[i]=" + res[i]); + } + return res; + } + + private static void info(Object obj) { + System.out.println("[INFO] " + obj); + } + + private static void bundleInstallWarn(Object obj) { + System.err.println("[WARN] " + obj); + //Thread.dumpStack(); + } +} diff --git a/runtime/org.argeo.slc.detached.launcher/src/main/resources/log4j.properties b/runtime/org.argeo.slc.detached.launcher/src/main/resources/log4j.properties new file mode 100644 index 000000000..9572fad6c --- /dev/null +++ b/runtime/org.argeo.slc.detached.launcher/src/main/resources/log4j.properties @@ -0,0 +1,16 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=WARN, console + +## Levels +# Slc +log4j.logger.org.argeo.slc=DEBUG +log4j.logger.org.springframework=WARN + +## Appenders +# A1 is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c %n +