Excuse the pre post but my comment is somewhat general. Overall the Felix
and general OSGi community considers fragments as a problematic construct in
the specification: something they recommend you avoid but if stuck you can
use. It's use is discouraged.


On Wed, Oct 19, 2011 at 6:36 PM, Pierre-Arnaud Marcelot 
<p...@marcelot.net>wrote:

> Hi Dev,
>
> Following our efforts on the OSGI side, I took some time to think about
> (and experiment) how we could solve our extensibility issue on the LDAP API,
> where we want our users to be able to provide their own custom
> implementation of various schema objects like comparators, normalizers, etc.
>
> After a quick discussion with Emmanuel and Guillaume Nodet, it turned out
> using OSGI fragments bundles could probably be our best solution.
>
> Here's a definition of what an OSGI fragment bundle is (more information
> available at [1]):
> "An OSGi fragment is a Java archive file with specific manifest headers
> that enable it to attach to a specified host bundle or specified host
> bundles in order to function.
> Fragments are treated as part of the host bundles. Relevant definitions of
> the fragment are merged with the host bundles definitions before the host is
> resolved, as long as the information does not conflict.
> Fragment dependencies are resolved if possible. If the fragment
> dependencies can not be resolved, the fragment does not attach to the host
> bundle.
> A fragment can not have its own class loader or bundle activator. It can
> not override the information present in the host bundles. Fragments extend
> bundles with resources, classes, and permitted headers enabling you to
> customize your bundles."
>
> The great thing about fragments is that they *share* the same class loader
> as their host bundle. Which was pretty much the kind of issue we were having
> with classloaders being differents from one bundle to the other.
>
> The other great thing I see with this approach, it that it would also work
> great outside of an OSGI container application (which is a strong
> requirement for the LDAP API). A fragment bundle is nothing else than a
> regular bundle with a specific OSGI directive (Fragment-Host) added to its
> MANIFEST.MF file, and a bundle behaves exactly like a plain jar file when
> it's not included in an OSGI container. Thus, it would allow us to support
> third parties extensions.
>
> I have done a small experiment in my Eclipse workspace with two bundles
> (one being the host and the other being the fragment ) and I was able to
> classload, without any classloader issue, a class defined in the fragment
> bundle from another class inside the host bundle.
>
> I'd like to go a step further and experiment this on the API itself.
>
> Ideally, I'd like to use the 'shared-ldap-model' module
> ('org.apache.directory.shared.ldap.model' bundle) as a host for all our
> schema objects implementations and move these implementations into a
> specific fragment bundle containing them all.
> Users would have to do the same to include their extensions. A simple
> fragment bundle with the 'org.apache.directory.shared.ldap.model' bundle as
> host and it works.
>
> One other thing that should be done, is to let the 'shared-ldap-model'
> module do the instanciation of the schema elements. At the moment, two
> classes from the 'shared-ldap-schema-data' module are responsible for this,
> 'org.apache.directory.shared.ldap.schemaloader.SchemaEntityFactory' and
> 'org.apache.directory.shared.ldap.schemaloader.AttributeClassLoader'. We
> would need to move these classes to the 'shared-ldap-model' module, for them
> to have access to the right class loader.
>
> All in all, I think that's the only things we need to do to get the
> extensibility we wanted inside and outside an OSGI container.
>
> What do you think of this plan?
>
> Regards,
> Pierre-Arnaud
>
> [1] -
> http://publib.boulder.ibm.com/infocenter/radhelp/v8/index.jsp?topic=/com.ibm.osgi.common.doc/topics/cbundlefragment.html
>



-- 
Best Regards,
-- Alex

Reply via email to