--- /dev/null
+package org.argeo.init.osgi;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.BundleContext;
+
+/** An OSGi launcher executing first another class in the system class path. */
+public class Launcher {
+
+ public static void main(String[] args) {
+ // Try to load system properties
+ String systemPropertiesFilePath = getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_SYSTEM_PROPERTIES_FILE);
+ if (systemPropertiesFilePath != null) {
+ FileInputStream in;
+ try {
+ in = new FileInputStream(systemPropertiesFilePath);
+ System.getProperties().load(in);
+ } catch (IOException e1) {
+ throw new RuntimeException("Cannot load system properties from " + systemPropertiesFilePath, e1);
+ }
+ if (in != null) {
+ try {
+ in.close();
+ } catch (Exception e) {
+ // silent
+ }
+ }
+ }
+
+ // Start main class
+ startMainClass();
+
+ // Start Equinox
+ BundleContext bundleContext = null;
+ try {
+ bundleContext = OsgiBootUtils.launch(OsgiBootUtils.equinoxArgsToConfiguration(args)).getBundleContext();
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot start Equinox.", e);
+ }
+
+ // OSGi bootstrap
+ OsgiBoot osgiBoot = new OsgiBoot(bundleContext);
+ osgiBoot.bootstrap();
+ }
+
+ protected static void startMainClass() {
+ String className = getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_APPCLASS);
+ if (className == null)
+ return;
+
+ String line = System.getProperty(OsgiBoot.PROP_ARGEO_OSGI_BOOT_APPARGS, "");
+
+ String[] uiArgs = readArgumentsFromLine(line);
+
+ try {
+ // 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);
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot start main class.", e);
+ }
+
+ }
+
+ /**
+ * 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
+ List<String> args = new ArrayList<String>();
+ 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();
+ }
+ return res;
+ }
+
+ public static String getProperty(String name, String defaultValue) {
+ final String value;
+ if (defaultValue != null)
+ value = System.getProperty(name, defaultValue);
+ else
+ value = System.getProperty(name);
+
+ if (value == null || value.equals(""))
+ return null;
+ else
+ return value;
+ }
+
+ public static String getProperty(String name) {
+ return getProperty(name, null);
+ }
+
+}