Add functionality to launcher in StarterServiceDeployer to run main(String[] 
args) - mainly for client modules.

Project: http://git-wip-us.apache.org/repos/asf/river-container/repo
Commit: http://git-wip-us.apache.org/repos/asf/river-container/commit/8d8d2c4e
Tree: http://git-wip-us.apache.org/repos/asf/river-container/tree/8d8d2c4e
Diff: http://git-wip-us.apache.org/repos/asf/river-container/diff/8d8d2c4e

Branch: refs/heads/master
Commit: 8d8d2c4e295866120f7f2527c9c7e9a50a49021f
Parents: 457ae74
Author: Greg Trasuk <[email protected]>
Authored: Fri Nov 29 23:20:02 2013 -0500
Committer: Greg Trasuk <[email protected]>
Committed: Fri Nov 29 23:20:02 2013 -0500

----------------------------------------------------------------------
 .../deployer/StarterServiceDeployer.java        | 104 +++++++++++++++----
 1 file changed, 85 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/river-container/blob/8d8d2c4e/river-container-core/src/main/java/org/apache/river/container/deployer/StarterServiceDeployer.java
----------------------------------------------------------------------
diff --git 
a/river-container-core/src/main/java/org/apache/river/container/deployer/StarterServiceDeployer.java
 
b/river-container-core/src/main/java/org/apache/river/container/deployer/StarterServiceDeployer.java
index 61766e1..3f33689 100644
--- 
a/river-container-core/src/main/java/org/apache/river/container/deployer/StarterServiceDeployer.java
+++ 
b/river-container-core/src/main/java/org/apache/river/container/deployer/StarterServiceDeployer.java
@@ -207,7 +207,7 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
         }
     }
 
-    public void launchService(final ApplicationEnvironment env, Properties 
startProps, final String[] args) {
+    public void launchService(final ApplicationEnvironment env, Properties 
startProps, final String[] args) throws ClassNotFoundException {
         final String startClassName = 
startProps.getProperty(Strings.START_CLASS);
         /*
          Launch the service.
@@ -215,16 +215,33 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
         log.log(Level.FINE, MessageNames.CALLING_MAIN, new Object[]{
             startClassName, Utils.format(args)
         });
-        Runnable task = new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    
env.setServiceInstance(instantiateService(env.getClassLoader(), startClassName, 
args));
-                } catch (Exception ex) {
-                    throw new RuntimeException(ex);
+        Runnable task=null;
+        if (hasServiceStarterConstructor(env.getClassLoader(), 
startClassName)) {
+            task = new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        
env.setServiceInstance(instantiateService(env.getClassLoader(), startClassName, 
args));
+                    } catch (Exception ex) {
+                        throw new RuntimeException(ex);
+                    }
                 }
-            }
-        };
+            };
+        } else if (hasMain(env.getClassLoader(), startClassName)) {
+            task = new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        callMain(env.getClassLoader(), startClassName, args);
+                    } catch (Exception ex) {
+                        throw new RuntimeException(ex);
+                    }
+                }
+            };
+            
+        } else {
+            throw new UnsupportedOperationException();
+        }
         
env.getWorkingContext().getWorkManager().queueTask(env.getClassLoader(), task);
     }
 
@@ -258,7 +275,7 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
                 workingDir = new File(serviceRoot.getURL().toURI());
 
             }
-           
+
             grantPermissions(cl,
                     new Permission[]{new 
FilePermission(workingDir.getAbsolutePath(), Strings.READ)});
             Utils.logClassLoaderHierarchy(log, Level.FINE, this.getClass());
@@ -370,7 +387,7 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
         
env.setWorkingContext(contextualWorkManager.createContext(env.getServiceName()));
     }
 
-    void launchService(ApplicationEnvironment env, String[] serviceArgs) 
throws FileSystemException, IOException {
+    void launchService(ApplicationEnvironment env, String[] serviceArgs) 
throws FileSystemException, IOException, ClassNotFoundException {
         Properties startProps = readStartProperties(env.getServiceRoot());
         String argLine = startProps.getProperty(Strings.START_PARAMETERS);
         final String[] args = constructArgs(argLine, serviceArgs);
@@ -428,7 +445,7 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
 
     private void grantPermissions(ClassLoader cl, Permission[] perms) {
         try {
-            perms=expandUmbrella(perms);
+            perms = expandUmbrella(perms);
             Class clazz = 
Class.forName(VirtualFileSystemConfiguration.class.getName(), true, cl);
             securityPolicy.grant(clazz, new Principal[0], perms);
 
@@ -438,9 +455,9 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
     }
 
     private static Permission[] expandUmbrella(Permission[] perms) {
-        PermissionCollection pc=new Permissions();
-        
-        for (Permission p: perms) {
+        PermissionCollection pc = new Permissions();
+
+        for (Permission p : perms) {
             pc.add(p);
         }
         if (pc.implies(new UmbrellaGrantPermission())) {
@@ -448,14 +465,63 @@ public class StarterServiceDeployer implements 
StarterServiceDeployerMXBean {
             pc.add(new GrantPermission(
                     (Permission[]) l.toArray(new Permission[l.size()])));
         }
-        List<Permission> permList=new ArrayList<Permission>();
-        
-        for (Enumeration<Permission> en=pc.elements(); en.hasMoreElements();) {
+        List<Permission> permList = new ArrayList<Permission>();
+
+        for (Enumeration<Permission> en = pc.elements(); 
en.hasMoreElements();) {
             permList.add(en.nextElement());
         }
         return permList.toArray(new Permission[0]);
     }
 
+    private boolean hasServiceStarterConstructor(ClassLoader cl, String 
className) throws ClassNotFoundException {
+        Class clazz = Class.forName(className, true, cl);
+        log.log(Level.FINE, MessageNames.CLASSLOADER_IS,
+                new Object[]{clazz.getName(), 
clazz.getClassLoader().toString()});
+
+        // Get this through dynamic lookup becuase it won't be in the parent
+        // classloader!
+        Class lifeCycleClass = Class.forName(Strings.LIFECYCLE_CLASS, true, 
cl);
+        try {
+            Constructor constructor = clazz.getDeclaredConstructor(new 
Class[]{String[].class, lifeCycleClass});
+            return true;
+        } catch(NoSuchMethodException nsme) {
+            return false;
+        }
+    }
+    
+    private boolean hasMain(ClassLoader cl, String className) throws 
ClassNotFoundException {
+        Class clazz = Class.forName(className, true, cl);
+        log.log(Level.FINE, MessageNames.CLASSLOADER_IS,
+                new Object[]{clazz.getName(), 
clazz.getClassLoader().toString()});
+
+        // Get this through dynamic lookup becuase it won't be in the parent
+        // classloader!
+        
+        try {
+            Method main = clazz.getMethod(Strings.MAIN, new 
Class[]{String[].class});
+            return true;
+        } catch(NoSuchMethodException nsme) {
+            return false;
+        }
+    }
+    
+    private void callMain(ClassLoader cl, String className, String[] args) 
throws ClassNotFoundException, IllegalAccessException, 
IllegalArgumentException, InvocationTargetException {
+        Class clazz = Class.forName(className, true, cl);
+        log.log(Level.FINE, MessageNames.CLASSLOADER_IS,
+                new Object[]{clazz.getName(), 
clazz.getClassLoader().toString()});
+
+        // Get this through dynamic lookup becuase it won't be in the parent
+        // classloader!
+        
+        try {
+            Method main = clazz.getMethod(Strings.MAIN, new 
Class[]{String[].class});
+            main.invoke(null, new Object[] {args});
+        } catch(NoSuchMethodException nsme) {
+            throw new RuntimeException(nsme);
+        }
+        
+    }
+    
     private Object instantiateService(ClassLoader cl, String className, 
String[] parms)
             throws ClassNotFoundException, IllegalAccessException, 
IllegalArgumentException, InvocationTargetException, NoSuchMethodException, 
InstantiationException {
         Class clazz = Class.forName(className, true, cl);

Reply via email to