Hi everyone;

I would like to test a multi versioned service using declarative service
(I'm using latest SCR from trunk: 1.6.1.SNAPSHOT + fwk 3.0.1.
So, I have a first bundle service-1.0.0.jar which exports a Service whose
package is exported using version=1.0.0
I then have another bundle service-2.0.0.jar which exports the same Service
(same package), but with version = 2.0.0;
and the Service interface is incompatible (that's why the version major
number is different).
Each bundle have its implementation included in a private package.

Now, I have a third bundle (client.jar), which imports the Service API,
using the version range "[1.0.0, 2)"
and the client is referencing the Service like this:

<?xml version='1.0' encoding='utf-8'?>
<component name='com.alcatel_lucent.samples.multiversion.client.Client'
xmlns='http://www.osgi.org/xmlns/scr/v1.1.0' immediate='true'
activate='start'>
  <implementation
class='com.alcatel_lucent.samples.multiversion.client.Client'/>
  <reference name='service'
interface='com.alcatel_lucent.samples.multiversion.Service'
bind='bindService'/>
</component>

The problem is that when I start my two versioned Service bundles (v1.0.0 +
v2.0.0), the v2.0.0 bundle is started first, and SCR seems to try to inject
it to my client bundle,
even if the client bundle imports the v1.0.0 API ...
So, SCR logs the following exception, when attempting to invoke the
bindService(Service) method :

DEBUG: com.alcatel_lucent.samples.multiversion.client1.0.0 (11):
[com.alcatel_lucent.samples.multiversion.client.Client] invoking bind:
bindService
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] getting
activate: activate
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] Locating method
activate in class com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] Declared Method
com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl.activate([interface
org.osgi.service.component.ComponentContext]) not found
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] Locating method
activate in class java.lang.Object
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] Declared Method
java.lang.Object.activate([interface
org.osgi.service.component.ComponentContext]) not found
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] activate method
[activate] not found, ignoring
DEBUG: com.alcatel_lucent.samples.multiversion2.0.0 (10):
[com.alcatel_lucent.samples.multiversion.implv2.ServiceImpl] State
transition : Registered -> Active
ERROR: com.alcatel_lucent.samples.multiversion.client1.0.0 (11):
[com.alcatel_lucent.samples.multiversion.client.Client] The bindService
method has thrown an exception
java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at
org.apache.felix.scr.impl.helper.BaseMethod.invokeMethod(BaseMethod.java:227)
        at
org.apache.felix.scr.impl.helper.BaseMethod.access$500(BaseMethod.java:38)
        at
org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:591)
        at
org.apache.felix.scr.impl.helper.BaseMethod$NotResolved.invoke(BaseMethod.java:548)
        at
org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:472)
        at
org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:1028)
        at
org.apache.felix.scr.impl.manager.DependencyManager.bind(DependencyManager.java:944)
        at
org.apache.felix.scr.impl.manager.DependencyManager.open(DependencyManager.java:868)
        at
org.apache.felix.scr.impl.manager.ImmediateComponentManager.createImplementationObject(ImmediateComponentManager.java:200)
        at
org.apache.felix.scr.impl.manager.ImmediateComponentManager.createComponent(ImmediateComponentManager.java:118)
        at
org.apache.felix.scr.impl.manager.AbstractComponentManager$Unsatisfied.activate(AbstractComponentManager.java:997)
        at
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:333)
        at
org.apache.felix.scr.impl.manager.DependencyManager.serviceAdded(DependencyManager.java:283)
        at
org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:170)
        at
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:864)
        at
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:732)
        at
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)


Did I come across I bug ?
Indeed, so far, I was thinking that SCR does not inject a Service whose
class loader is not compatible with the requesting client ?
Am I correct ? or should my two Services be provided with a specific service
property, in order to distinguish the two versions ?
I mean: should the client do a Reference with a filter like
"(serviceVersion=2.0.0)" ?


Thanks in advance;
/pierre

Reply via email to