]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/AppLauncher.java
Move org.argeo.slc.detached
[gpl/argeo-slc.git] / runtime / org.argeo.slc.detached / src / main / java / org / argeo / slc / detached / AppLauncher.java
diff --git a/runtime/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/AppLauncher.java b/runtime/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/AppLauncher.java
new file mode 100644 (file)
index 0000000..d2e1ff5
--- /dev/null
@@ -0,0 +1,62 @@
+package org.argeo.slc.detached;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+public class AppLauncher {
+       private Properties systemProperties = new Properties();
+       private String mainClass = null;
+       private List arguments = new ArrayList();
+
+       public void launch() {
+
+               Properties base = System.getProperties();
+               Properties fake = new Properties(base);
+
+               try {
+                       if (mainClass == null)
+                               throw new DetachedException(
+                                               "A main class name has to be specified.");
+
+                       System.getProperties().putAll(systemProperties);
+
+                       ClassLoader cl = Thread.currentThread().getContextClassLoader();
+                       Class clss = cl.loadClass(mainClass);
+
+                       String[] args = new String[arguments.size()];
+                       for (int i = 0; i < arguments.size(); i++) {
+                               args[i] = arguments.get(i).toString();
+                       }
+
+                       Class[] mainArgsClasses = new Class[] { args.getClass() };
+                       Object[] mainArgs = { args };
+                       Method mainMethod = clss.getMethod("main", mainArgsClasses);
+
+                       System.setProperties(fake);
+
+                       mainMethod.invoke(null, mainArgs);
+
+               } catch (Exception e) {
+                       throw new DetachedException("Unexpected exception while launching "
+                                       + mainClass, e);
+               } finally {
+                       System.setProperties(base);
+               }
+
+       }
+
+       public void setSystemProperties(Properties systemProperties) {
+               this.systemProperties = systemProperties;
+       }
+
+       public void setMainClass(String mainClass) {
+               this.mainClass = mainClass;
+       }
+
+       public void setArguments(List arguments) {
+               this.arguments = arguments;
+       }
+
+}