The Hazelcast solution is quite ok and not to much effort. I like it.
Do the guys from Hazelcast know about it? They have an issue exactly for
that problem (http://code.google.com/p/hazelcast/issues/detail?id=161).
Thank you Kris.
Bye,
Andy


2009/12/1 Kris Pruden <[email protected]>

> On Dec 1, 2009, at 11:16 AM, Ziegenlippe wrote:
>
>  Nice. Does this mean I have to take care about serialization by my own? I
>> use great libs XStream and Hazelcast. Both of them are doing a good
>> serialization job. But I see without bundle-id+version there is no way.
>> Thanks for the answer,
>>
>
> Not necessarily.  Some libraries support the injection of custom hooks at
> various stages of the serialization/deserialization process.
>
> As an example, I was able to create OSGi-aware versions of
> Object{Output,Input}Stream by overriding the annotateClass() and
> resolveClass() methods, respectively.
>
> I'm not familiar with XStream, but it wouldn't surprise me if it offered
> some way to influence the class loading process..
>
> As for Hazelcast, I actually went down that path and got it to work by
> registering custom serializers which used the OSGi-aware object streams I
> talked about above.
>
> Here's the activator I used:
>
> package com.hazelcast.osgi;
>
> import org.osgi.framework.BundleActivator;
> import org.osgi.framework.BundleContext;
> import org.osgi.framework.ServiceReference;
> import org.osgi.service.packageadmin.PackageAdmin;
>
> import com.hazelcast.core.Hazelcast;
> import com.hazelcast.nio.Serializer;
>
> public class Activator implements BundleActivator {
>    public void start(BundleContext context) throws Exception {
>        ServiceReference ref =
> context.getServiceReference(PackageAdmin.class.getName());
>        PackageAdmin pkgAdmin = (PackageAdmin) context.getService(ref);
>        Serializer.registerTypeSerializer(new OsgiObjectSerializer());
>        Serializer.registerTypeSerializer(new OsgiDataSerializer(pkgAdmin));
>    }
>
>    public void stop(BundleContext context) throws Exception {
>        Serializer.registerTypeSerializer(new
> Serializer.ObjectSerializer());
>        Serializer.registerTypeSerializer(new Serializer.DataSerializer());
>        Hazelcast.shutdown();
>    }
> }
>
> The implementations of OsgiObjectSerializer and OsgiDataSerializer are
> pretty similar to the versions that come with Hazelcast; they simply inject
> a bundle name into the stream during serialization, and during
> deserialization use that name to lookup the bundle to use to load the
> class..
>
> Kris
>
>
>  Andy
>>
>>
>> Kris Pruden schrieb:
>>
>>> I had a similar problem.  The solution boils down to delegating to the
>>> "owning" bundle to load the class.  To do this you need of course to know
>>> the name of the bundle.  In my case I was able to solve this problem with a
>>> couple helper methods that wrap the PackageAdmin service provided by OSGi:
>>>
>>>   public String getBundleName(Class<?> cls) {
>>>       Bundle bundle = pkgAdmin.getBundle(cls);
>>>       if (bundle != null) {
>>>           return bundle.getSymbolicName();
>>>       } else {
>>>           return null;
>>>       }
>>>   }
>>>
>>>   public Class<?> loadClass(String className, String bundleName) throws
>>> ClassNotFoundException {
>>>       Bundle[] bundles = pkgAdmin.getBundles(bundleName, null);
>>>       if (bundles == null || bundles.length == 0) {
>>>           return null;
>>>       }
>>>       return bundles[0].loadClass(className);
>>>   }
>>>
>>> When serializing the object, you can use getBundleName to get the name of
>>> the bundle which "owns" the class being serialized.  This name needs to be
>>> included in the xml data you store.  Then on deserialization, loadClass
>>> looks up the bundle by the name specified, then uses that bundle to load the
>>> class.
>>>
>>> This code assumes that there will be only one version of the bundle with
>>> a given name present, but it would be fairly straightforward to extend this
>>> to look at bundle versions if needed...
>>>
>>> HTH...
>>>
>>> Kris
>>>
>>> On Dec 1, 2009, at 10:44 AM, Ziegenlippe wrote:
>>>
>>>  Hello,
>>>>
>>>> I cannot find a satisfying solution to a simple looking problem for
>>>> quite a while.
>>>>
>>>> The condensation of the problem:
>>>> Bundle A
>>>> the producer stores objects as xml files (e.g. with XStream)
>>>> it exports the /bundle.a/ package which contains the interface /Item/
>>>>  it contains a private implementation package /bundle.a.impl/ which 
>>>> contains
>>>> the item implementation class /ItemImpl/
>>>>
>>>> Bundle B
>>>> the consumer needs to load and process /Item/ instances
>>>> therefor it imports package /bundle.a/ which contains the /Item/
>>>> interface
>>>>
>>>> Problem: loading Item instances in bundle B leads always to
>>>> ClassNotFoundExceptions
>>>>
>>>> Even working with the last resort /DynamicImport-Package: * / does not
>>>> solve the problem since it imports only exported packages.
>>>>
>>>> From some hints in the internet I got the feeling that this issue is not
>>>> really solved for OSGI. Is there any solution known? How deal others with
>>>> that issue e.g. ActiveMq which claims to be OSGI compliant.
>>>> Or am I just on the wrong way?
>>>>
>>>> Thank you in advance,
>>>> Andy
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to