Hi Guillaume,

just out of curiosity why do we introduce a new non OSGi manifest element
Karaf-Activator, instead of using the Bundle-Activator
for it?

Regards, Achim

2011/11/22 <[email protected]>

> Author: gnodet
> Date: Tue Nov 22 13:06:00 2011
> New Revision: 1204967
>
> URL: http://svn.apache.org/viewvc?rev=1204967&view=rev
> Log:
> [KARAF-1023] Add karaf activators for jars in the lib folder
>
> Modified:
>    karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
>
> Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
> URL:
> http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java?rev=1204967&r1=1204966&r2=1204967&view=diff
>
> ==============================================================================
> --- karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
> (original)
> +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java Tue Nov
> 22 13:06:00 2011
> @@ -48,6 +48,7 @@ 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;
> @@ -59,6 +60,7 @@ import org.apache.karaf.main.util.Bootst
>  import org.apache.karaf.main.util.StringMap;
>  import org.apache.karaf.main.util.Utils;
>  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;
> @@ -193,6 +195,10 @@ public class Main {
>
>     public static final String INCLUDES_PROPERTY = "${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;
> @@ -210,6 +216,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;
> @@ -281,6 +289,8 @@ public class Main {
>         loadStartupProperties(configProps);
>         processAutoProperties(framework.getBundleContext());
>         framework.start();
> +        // Start custom activators
> +        startKarafActivators(classLoader);
>         // Start lock monitor
>         new Thread() {
>             public void run() {
> @@ -289,6 +299,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;
> @@ -338,6 +388,7 @@ public class Main {
>                 }
>                 FrameworkEvent event = framework.waitForStop(step);
>                 if (event.getType() != FrameworkEvent.WAIT_TIMEDOUT) {
> +                    stopKarafActivators();
>                     return true;
>                 }
>             }
> @@ -457,7 +508,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) {
> @@ -468,7 +519,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) {
> @@ -1072,7 +1123,6 @@ public class Main {
>      * Returns a path for an srtifact.
>      * Input: path (no ':') returns path
>      * Input: mvn:<groupId>/<artifactId>/<version>/<type>/<classifier>
> converts to default repo location path
> -//     * Input:  <groupId>:<artifactId>:<version>:<type>:<classifier>
> converts to default repo location path
>      * type and classifier are optional.
>      *
>      *
>
>
>


-- 

Apache Karaf <http://karaf.apache.org/> Committer & PMC
OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer &
Project Lead
blog <http://notizblog.nierbeck.de/>

Reply via email to