Hi Pierre,

Without looking at the code right now, this looks very much like a bug
in the ConfigurationFactory support part ....

I would assume that the ConfigurationFactory service should actually
only be registered if there would in fact be configuration for the
components.

I will try to look into this tomorrow; would you be so kind creating a
JIRA ? Thanks alot.

Regards
Felix

Pierre De Rop schrieb:
> Hello everyone,
> 
> I have a SCR component which defines the following xml configuration:
> 
> <?xml version='1.0' encoding='utf-8'?>
> <component name='EnglishDictionary'
> xmlns='http://www.osgi.org/xmlns/scr/v1.1.0' factory='true'
> configuration-policy='require' modified='updated'>
>  <implementation
> class='com.alcatel_lucent.samples.scr.dictionary.english.EnglishDictionary'/>
> 
>  <service>
>    <provide
> interface='com.alcatel_lucent.samples.scr.dictionary.DictionaryService'/>
>  </service>
> </component>
> 
> -> as you can see,  the component "EnglishDictionary" has the factory
> flag, telling that another factory component will activate it.
> -> and the configuration policy is "require", meaning that the component
> must not be activated if the corresponding Configuration object is not
> yet available
> 
> ----------------------------------------------------------------------------------
> 
> 
> Now, here is my factory component:
> 
> <?xml version='1.0' encoding='utf-8'?>
> <component name='EnglishDictionaryFactory'>
>  <implementation
> class='com.alcatel_lucent.samples.scr.dictionary.english.EnglishDictionaryFactory'/>
> 
>  <reference name='bind'
> interface='org.osgi.service.component.ComponentFactory' bind='bind'
> unbind='unbind' target='(component.name=EnglishDictionary)'/>
> </component>
> 
> -> so, this factory component will track the "ComponentFactory" object
> with the target "component.name" == "EnglishDictionary".
> Here is the corresponding bind method:
> 
> class EnglishDictionaryFactory {
>  public void bind(ComponentFactory factory) {
>    factory.newInstance(new Hashtable());
>  }
> }
> 
> -> The issue is that, when the factory.newInstance() method is invoked,
> I then get the following exception:
> 
> 2009-12-06 18:00:50,226 SCR Component Actor ERROR osgi config/ca -
> [EnglishDictionaryFactory] The bind method has thrown an exception
> 
> org.osgi.service.component.ComponentException: Failed activating component
>        at
> org.apache.felix.scr.impl.manager.ComponentFactoryImpl.newInstance(ComponentFactoryImpl.java:118)
> 
>        at
> com.alcatel_lucent.samples.scr.dictionary.english.EnglishDictionaryFactory.bind(EnglishDictionaryFactory.java:19)
> 
>        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:213)
> 
>        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:542)
> 
>        at
> org.apache.felix.scr.impl.helper.BaseMethod$NotResolved.invoke(BaseMethod.java:500)
> 
>        at
> org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:434)
>        at
> org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:997)
> 
>        at
> org.apache.felix.scr.impl.manager.DependencyManager.bind(DependencyManager.java:908)
> 
>        at
> org.apache.felix.scr.impl.manager.DependencyManager.open(DependencyManager.java:832)
> 
>        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:982)
> 
>        at
> org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:297)
> 
>        at
> org.apache.felix.scr.impl.manager.AbstractComponentManager$1.doRun(AbstractComponentManager.java:137)
> 
>        at
> org.apache.felix.scr.impl.ComponentActivatorTask.run(ComponentActivatorTask.java:67)
> 
>        at
> org.apache.felix.scr.impl.ComponentActorThread.run(ComponentActorThread.java:96)
> 
>        at java.lang.Thread.run(Thread.java:619)
> 
> 
> 
> Now, If I remove the configuration-policy='require' parameter from the
> EnglishDictionary component, then I don't have the exception anymore.
> So, am I doing something very bad or is it a bug regarding factory
> components and "require" configuration policy ?
> 
> thanks for your help;
> /pierre
> 

Reply via email to