You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2012/04/06 09:55:54 UTC

svn commit: r1310212 - /karaf/branches/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java

Author: gnodet
Date: Fri Apr  6 07:55:53 2012
New Revision: 1310212

URL: http://svn.apache.org/viewvc?rev=1310212&view=rev
Log:
[KARAF-1023] Add karaf activators for jars in the lib folder


Conflicts:

	main/src/main/java/org/apache/karaf/main/Main.java

Modified:
    karaf/branches/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java

Modified: karaf/branches/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java
URL: http://svn.apache.org/viewvc/karaf/branches/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java?rev=1310212&r1=1310211&r2=1310212&view=diff
==============================================================================
--- karaf/branches/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java (original)
+++ karaf/branches/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java Fri Apr  6 07:55:53 2012
@@ -39,12 +39,14 @@ import java.util.Properties;
 import java.util.Random;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
+import java.util.jar.Manifest;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
@@ -182,6 +184,10 @@ public class Main {
 
     public static final String OPTIONALS_PROPERTY = "${optionals}"; // optionals includes
 
+    public static final String KARAF_ACTIVATOR = "Karaf-Activator";
+
+    public static final String SECURITY_PROVIDERS = "org.apache.karaf.security.providers";
+
     Logger LOG = Logger.getLogger(this.getClass().getName());
 
     private File karafHome;
@@ -199,6 +205,8 @@ public class Main {
     private int shutdownTimeout = 5 * 60 * 1000;
     private boolean exiting = false;
     private ShutdownCallback shutdownCallback;
+    private List<BundleActivator> karafActivators = new ArrayList<BundleActivator>();
+
 
     public Main(String[] args) {
         this.args = args;
@@ -271,6 +279,8 @@ public class Main {
         loadStartupProperties(configProps);
         processAutoProperties(framework.getBundleContext());
         framework.start();
+        // Start custom activators
+        startKarafActivators(classLoader);
         // Start lock monitor
         new Thread() {
             public void run() {
@@ -279,6 +289,46 @@ public class Main {
         }.start();
     }
 
+    private void startKarafActivators(ClassLoader classLoader) throws IOException {
+        Enumeration<URL> urls = classLoader.getResources("META-INF/MANIFEST.MF");
+        while (urls != null && urls.hasMoreElements()) {
+            URL url = urls.nextElement();
+            String className = null;
+            InputStream is = url.openStream();
+            try {
+                Manifest mf = new Manifest(is);
+                className = mf.getMainAttributes().getValue(KARAF_ACTIVATOR);
+                if (className != null) {
+                    BundleActivator activator = (BundleActivator) classLoader.loadClass(className).newInstance();
+                    activator.start(framework.getBundleContext());
+                    karafActivators.add(activator);
+                }
+            } catch (Throwable e) {
+                if (className != null) {
+                    System.err.println("Error starting karaf activator " + className + ": " + e.getMessage());
+                    LOG.log(Level.WARNING, "Error starting karaf activator " + className + " from url " + url, e);
+                }
+            } finally {
+                if (is != null) {
+                    try {
+                        is.close();
+                    } catch (IOException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    private void stopKarafActivators() {
+        for (BundleActivator activator : karafActivators) {
+            try {
+                activator.stop(framework.getBundleContext());
+            } catch (Throwable e) {
+                LOG.log(Level.WARNING, "Error stopping karaf activator " + activator.getClass().getName(), e);
+            }
+        }
+    }
+
     public void awaitShutdown() throws Exception {
         if (framework == null) {
             return;
@@ -328,6 +378,7 @@ public class Main {
                 }
                 FrameworkEvent event = framework.waitForStop(step);
                 if (event.getType() != FrameworkEvent.WAIT_TIMEDOUT) {
+                    stopKarafActivators();
                     return true;
                 }
             }
@@ -447,7 +498,7 @@ public class Main {
                 }
             } catch (Throwable ex) {
                 main.setExitCode(-2);
-                System.err.println("Error occured shutting down framework: " + ex);
+                System.err.println("Error occurred shutting down framework: " + ex);
                 ex.printStackTrace();
             } finally {
                 if (!restart) {
@@ -458,7 +509,7 @@ public class Main {
     }
 
     private static void processSecurityProperties(Properties m_configProps) {
-        String prop = m_configProps.getProperty("org.apache.karaf.security.providers");
+        String prop = m_configProps.getProperty(SECURITY_PROVIDERS);
         if (prop != null) {
             String[] providers = prop.split(",");
             for (String provider : providers) {