I agree that DynamicImport-Package: * is evil :-).

In Tuscany, we adopt the extension/extension point pattern (inspired by Eclipse) to solve similar problems without a hard dependency on the OSGi service registry APIs [1]. We register implementation classes of a service provider interface in a file named as META-INF/services/<service provider interface name>. The content of the file is the name of the implementation class.

If the code is executed without OSGi, we use the classloader to discover the META-INF/services/<service provider interface name> resources and then load the implementation class by name. With OSGi, we discover bundles that contain the META-INF/services/<service provider interface name> resources and use the owning bundle to load the implementation class. This way, we don't have to export the implementation classes and they are accessed via service provider interfaces and the extension points.

There is also an interesting article that compares the Eclipse extension/extension point pattern and the OSGi service registry. See [2].

[1] https://svn.apache.org/repos/asf/tuscany/java/sca/modules/extensibility/
[2] http://www.eclipsezone.com/articles/extensions-vs-services/

Thanks,
Raymond
--------------------------------------------------
From: "David Illsley" <[email protected]>
Sent: Monday, January 05, 2009 9:41 AM
To: <[email protected]>
Subject: Re: Using Axis2 Java with OSGi - some help appreciated

Urgh, DynamicImport-Package: * is pretty evil. It is a pretty simple
way to retrofit existing code into OSGI, but using it essentially
throws away the potential benefits. I *think* the best way is for the
Tuscany MessageReceiver objects to be registered as OSGI services. It
looks like the existing Axis2 osgi module hooks up registered
MessageReceiver services to act as the default message receiver for a
given MEP. I don't know if that would be enough for you? If not, I'd
think that it wouldn't be too hard to extend the existing code in the
osgi module to register in non-default MessageReceiver objects.

David

On Mon, Jan 5, 2009 at 4:06 AM, Sameera Jayasoma
<[email protected]> wrote:


On Sat, Jan 3, 2009 at 12:56 PM, Mike Edwards
<[email protected]> wrote:

Folks,

I am writing as a developer on the Apache Tuscany project.

We are building a version of Tuscany that runs on OSGi - and we use Axis2
in our codebase.

We're experiencing some problems associated with running Axis2 with
Tuscany under OSGi and I'd
appreciate any help you can give us.

The problem we've run into relates to user-provided Message Receiver
classes that are part of the
Tuscany code and which are configured into axis2.xml as follows:

   <messageReceivers>

      <!-- Added by Tuscany -->
       <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only";


class="org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInMessageReceiver"/>

       <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only";

class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
       <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out";

class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>

      <!-- Added by Tuscany -->
       <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out";


class="org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInOutSyncMessageReceiver"/>

      <!-- Added by Tuscany -->
       <messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-only";


class="org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInMessageReceiver"/>

       <messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-only";

class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
       <messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-out";

class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>

      <!-- Added by Tuscany -->
       <messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-out";


class="org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInOutSyncMessageReceiver"/>

   </messageReceivers>

When we run the code using OSGi, we get class loading exceptions for those
Tuscany message receiver
classes, since the code that loads those classes is in the Axis2 code
(AxisConfigBuilder) - but that
code has no declared dependencies on the Tuscany packages containing the
message receivers - so that
we get class not found exceptions.

Do you have a solution for this problem?

Yes.  As you have mentioned the problem here is, The class loader which
loads Axis2 classes does not see the Tuscany classes.  You can use
DynamicaImport-Package OSGi manifest header for the Axis2 bundle.

DynamicImport-Package: *

This allows Axis2 bundle to dynamically load classes from other bundles
which are not wired during the Resolving process performed by the OSGi
framework implementation. At the same time, you need to export the package
in which message receiver classes reside.




I got the code working with the Eclipse/Equinox version of OSGi by
patching the following into the
manifest for the axis2-kernel jar:

Eclipse-BuddyPolicy: dependent

...and then declaring the relevant Tuscany jar files as being buddies of
the axis2-kernel bundle in
thier manifests.

Seems like your implementation works only with Equinox, since you have used
Equinox specific constructs.



However, I know that this is really a sticking-plaster solution and will
only currently work for the
Equinox version of OSGi. Do you have a nice neat solution that will work
for all the OSGi
implementations?

Yes.  We, in WSO2 have built WSO2 Carbon [1]  which runs on OSGi. WSO2
Carbon is the base platform for all the WSO2 java projects. Carbon uses
Axis2 and we have solved most of these problems.




Yours,  Mike.


[1] http://wso2.org/projects/carbon

--
Sameera Jayasoma
Software Engineer
WSO2 Inc.
Oxygenating the Web Service Platform.
http://wso2.org/

blog:http://tech.jayasoma.org/

Reply via email to