ok, thanks for clarifying :)
I anticipated the first reason,
and wondered about the second :)

2011/11/22 Guillaume Nodet <[email protected]>

> I use a non standard header for two reasons:
>  * the jar does not need to be a bundle (i.e. it most certainly does not
> contain any osgi metadata and is not deployed as a bundle)
>  * this is a karaf specific feature (even if reusing the osgi api, i could
> have written a new interface for it, but that did not bring any value to
> me)
>
> That use case was handled by Felix using a custom configuration property
> that one could set to a list / array of BundleActivator, but Equinox does
> not support such a mechanism.  So given, it's specific to Karaf I thought
> it made more sense to use a different header.
>
> On Tue, Nov 22, 2011 at 14:19, Achim Nierbeck <[email protected]
> >wrote:
>
> > 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/>
> >
>
>
>
> --
> ------------------------
> Guillaume Nodet
> ------------------------
> Blog: http://gnodet.blogspot.com/
> ------------------------
> Open Source SOA
> http://fusesource.com
>



-- 

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