You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Pierre De Rop (JIRA)" <ji...@apache.org> on 2011/09/15 10:26:08 UTC

[jira] [Commented] (FELIX-3090) SCR factory components ignore reference target filters

    [ https://issues.apache.org/jira/browse/FELIX-3090?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13105201#comment-13105201 ] 

Pierre De Rop commented on FELIX-3090:
--------------------------------------

oops, Felix; it seems that I forgot to attach the sample code in the previous post; so, I'm reattaching it.
By the way, I simplified the sample code: now I have a component "A" which declares factory="A", and which also depends on the "B" service 
but with the filter "(foo=bar)". And I then have a "BImpl" service which implements B, but with the service properties "foo=zoo".
So, according to the specification, the ComponentFactory for "A" should not be registered, but it is, and I then run into the following exception:

AFactory bind(Component: test.scr.factory.A (0))
org.osgi.service.component.ComponentException: Failed activating component
        at org.apache.felix.scr.impl.manager.ComponentFactoryImpl.newInstance(ComponentFactoryImpl.java:120)
        at test.scr.factory.AFactory.bind(AFactory.java:15)
        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:1013)
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:333)
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:157)
        at org.apache.felix.scr.impl.config.ImmediateComponentHolder.enableComponents(ImmediateComponentHolder.java:313)
        at org.apache.felix.scr.impl.BundleComponentActivator.loadDescriptor(BundleComponentActivator.java:253)
        at org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:147)
        at org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:111)
        at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:274)
        at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:192)
        at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:807)
        at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:729)
        at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:610)
        at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:3879)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1850)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1192)
        at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:266)
        at java.lang.Thread.run(Thread.java:662)

Please notice that another dev post seems to also report the same problem:

http://www.mail-archive.com/dev@felix.apache.org/msg22899.html

... Felix, don't you think that this issue should be reopened ?

thanks
/Pierre


> SCR factory components ignore reference target filters
> ------------------------------------------------------
>
>                 Key: FELIX-3090
>                 URL: https://issues.apache.org/jira/browse/FELIX-3090
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions:  scr-1.6.0
>            Reporter: Pierre De Rop
>            Assignee: Felix Meschberger
>         Attachments: test-scr-factory.tgz, test-scr-factory.tgz
>
>
> This issue is described in the following post:
> http://www.mail-archive.com/users@felix.apache.org/msg10925.html
> Basically, when a component is declaring a factory (in order to register a ComponentFactory in the registry), 
> then any extra Reference' target filters are not taken into acount.
> This is a problem because the ComponentFactory is registered in the registry even if some References are not satisfied.
> Consider the following example (It uses the BND SCR annotations):
> @Component(factory = "AFactory")
> public class A {
>     @Reference(name="YDependency", target = "(name=Z)")
>     void bind(Y y) {
>         System.out.println("A.bind(" + y + ")");
>     }
>     @Activate
>     void start() {
>         System.out.println("A.start");
>     }
> }
> public interface Y {
> }
> @Component(properties = { "name=ZZZZZ" })
> public class YImpl implements Y {
> }
> @Component
> public class AFactory {
>     @Reference(target = "(component.factory=AFactory)")
>     void bind(ComponentFactory AFactory) {
>         System.out.println("AFactory.bind(" + AFactory + ")");
>         try {
>             ComponentInstance ci = AFactory.newInstance(null);
>             A a = (A) ci.getInstance();
>             System.out.println("Created " + a);
>         }
>         catch (Throwable t) {
>             t.printStackTrace();
>         }
>     }
> }
> Here, the "YDependency" Reference of the "A" component is not satisfied, but the ComponentFactory for the
> "A" component is somehow registered, and when the "AFactory" component catches it, then it get the following exception,
> when trying to instantiate the "A" component instance:
> org.osgi.service.component.ComponentException: Failed activating component
>         at org.apache.felix.scr.impl.manager.ComponentFactoryImpl.newInstance(ComponentFactoryImpl.java:120)
>         at test.scr.factory.AFactory.bind(AFactory.java:15)
>         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$1(BaseMethod.java:219)
>         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:1013)
>         at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:333)
>         at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:157)
>         at org.apache.felix.scr.impl.config.ImmediateComponentHolder.enableComponents(ImmediateComponentHolder.java:313)
>         at org.apache.felix.scr.impl.BundleComponentActivator.loadDescriptor(BundleComponentActivator.java:253)
>         at org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:147)
>         at org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:111)
>         at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:274)
>         at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:192)
>         at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:807)
>         at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:729)
>         at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:610)
>         at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:3879)
>         at org.apache.felix.framework.Felix.startBundle(Felix.java:1850)
>         at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1192)
>         at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:266)
>         at java.lang.Thread.run(Thread.java:662)

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira