Hi,

The error is ‘expected’ as interceptors are dealing with transformed service 
references and not (genuine) service references. Try to use 
`transformed.getWrappedReference()` to retrieve the original reference.

Regards,

Clement

On 3 déc. 2013, at 10:57, Bengt Rodehav <[email protected]> wrote:

> I've tried something like this:
> 
> BundleContext bundleContext =
> FrameworkUtil.getBundle(IRouteExtender.class).getBundleContext();
> 
> for (ServiceReference ref : theMatchingRefs) {
>  IRouteExtender extender = (IRouteExtender) bundleContext.getService(ref);
> // Causes exception
>  System.out.println("Found extender with id: " + extender.getExtenderId());
> }
> 
> But I get the following exception:
> 
> ERROR: Bundle se.digia.connect.services.generic.service [164]
> EventDispatcher: Error during dispatch. (java.lang.ClassCastException:
> org.apache.felix.ipojo.dependency.impl.TransformedServiceReferenceImpl
> cannot be cast to
> org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl)
> java.lang.ClassCastException:
> org.apache.felix.ipojo.dependency.impl.TransformedServiceReferenceImpl
> cannot be cast to
> org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl
>        at
> org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:250)
>        at org.apache.felix.framework.Felix.getService(Felix.java:3420)
>        at
> org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468)
>        at
> se.digia.connect.service.generic.service.ExtenderInterceptor.__M_calculateExtenders(ExtenderInterceptor.java:104)
>        at
> se.digia.connect.service.generic.service.ExtenderInterceptor.calculateExtenders(ExtenderInterceptor.java)
>        at
> se.digia.connect.service.generic.service.ExtenderInterceptor.__M_getServiceReferences(ExtenderInterceptor.java:84)
>        at
> se.digia.connect.service.generic.service.ExtenderInterceptor.getServiceReferences(ExtenderInterceptor.java)
>        at
> org.apache.felix.ipojo.dependency.interceptors.DefaultServiceRankingInterceptor.onServiceArrival(DefaultServiceRankingInterceptor.java:61)
>        at
> org.apache.felix.ipojo.dependency.impl.ServiceReferenceManager.applyRankingOnArrival(ServiceReferenceManager.java:559)
>        at
> org.apache.felix.ipojo.dependency.impl.ServiceReferenceManager.onNewMatchingService(ServiceReferenceManager.java:510)
>        at
> org.apache.felix.ipojo.dependency.impl.ServiceReferenceManager.addedService(ServiceReferenceManager.java:496)
>        at
> org.apache.felix.ipojo.util.Tracker$Tracked.trackAdding(Tracker.java:711)
>        at
> org.apache.felix.ipojo.util.Tracker$Tracked.track(Tracker.java:672)
>        at
> org.apache.felix.ipojo.util.Tracker$Tracked.serviceChanged(Tracker.java:633)
>        at
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
>        at
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
>        at
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
>        at
> org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
>        at org.apache.felix.framework.Felix.registerService(Felix.java:3275)
>        at
> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
>        at
> org.apache.felix.ipojo.IPojoContext.registerService(IPojoContext.java:395)
>        at
> org.apache.felix.ipojo.handlers.providedservice.ProvidedService.registerService(ProvidedService.java:338)
>        at
> org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.__M_stateChanged(ProvidedServiceHandler.java:484)
>        at
> org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.stateChanged(ProvidedServiceHandler.java)
>        at
> org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)
>        at
> org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)
>        at
> org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)
>        at
> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)
>        at
> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)
>        at
> org.apache.felix.ipojo.IPojoFactory.updated(IPojoFactory.java:737)
>        at
> org.apache.felix.ipojo.ConfigurationTracker.registerFactory(ConfigurationTracker.java:100)
>        at
> org.apache.felix.ipojo.IPojoFactory.computeFactoryState(IPojoFactory.java:846)
>        at
> org.apache.felix.ipojo.ComponentFactory.addedService(ComponentFactory.java:400)
>        at
> org.apache.felix.ipojo.util.Tracker$Tracked.trackAdding(Tracker.java:711)
>        at
> org.apache.felix.ipojo.util.Tracker$Tracked.trackInitialServices(Tracker.java:596)
>        at org.apache.felix.ipojo.util.Tracker.open(Tracker.java:210)
>        at
> org.apache.felix.ipojo.ComponentFactory.starting(ComponentFactory.java:249)
>        at org.apache.felix.ipojo.IPojoFactory.start(IPojoFactory.java:671)
>        at
> org.apache.felix.ipojo.extender.internal.linker.ManagedType$ExtensionSupport$1.call(ManagedType.java:229)
>        at
> org.apache.felix.ipojo.extender.internal.linker.ManagedType$ExtensionSupport$1.call(ManagedType.java:216)
>        at
> org.apache.felix.ipojo.extender.internal.queue.JobInfoCallable.call(JobInfoCallable.java:114)
>        at
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>        at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>        at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>        at java.lang.Thread.run(Thread.java:662)
> 
> Any ideas?
> 
> BTW, the exception is only logged in the console - not in any log files.
> 
> /Bengt
> 
> 
> 
> 
> 2013/12/3 Bengt Rodehav <[email protected]>
> 
>> I've now tested against trunk and I've come a lot further. Another
>> question for you...
>> 
>> I need access to my service object in the getServiceReferences() method.
>> It is possible if I have the BundleContext. In the accept() method I get
>> the BundleContext passed as a parameter but not in the
>> getServiceReferences(). Why is that?
>> 
>> How can I access the service object from the ServiceReference in the
>> getServiceReferences() method? Perhaps the signature of the
>> getServiceReferences() method should be changed to take a BundleContext as
>> well?
>> 
>> /Bengt
>> 
>> 
>> 2013/11/29 Bengt Rodehav <[email protected]>
>> 
>>> Thanks Clement. I'll check out trunk and see how far I'll get.
>>> 
>>> /Bengt
>>> 
>>> 
>>> 2013/11/29 Clement Escoffier <[email protected]>
>>> 
>>>> Hi,
>>>> On 29 nov. 2013, at 16:21, Bengt Rodehav <[email protected]> wrote:
>>>> 
>>>>> Thanks Clement!
>>>>> 
>>>>> I compared our code it turns out I had a type: I had specified the
>>>> handler
>>>>> to "org.apache.felix.ipojo.properties" instead of
>>>>> "org.apache.felix.ipojo:properties".. I had a period instead of a
>>>> colon.
>>>>> That explains my NPE.
>>>> 
>>>> I probably did a mistake while explaining. The syntax is
>>>> namespace:handlername.
>>>> 
>>>>> 
>>>>> Now I can also retrieve the property. I can also call the getValue()
>>>> method
>>>>> that returns the value in "toString" format. Can't get the
>>>> getObjectValue()
>>>>> to work though. Looking forward to the new getCurrentValue() method.
>>>> 
>>>> Unfortunately the getObjectValue only work for immutable properties.
>>>> 
>>>>> 
>>>>> Is it just the org.apache.felix.ipojo artifact I need to check out and
>>>>> build on trunk?
>>>> 
>>>> The following version contains the new method:
>>>> 
>>>> https://repository.apache.org/content/repositories/snapshots/org/apache/felix/org.apache.felix.ipojo/1.11.1-SNAPSHOT/org.apache.felix.ipojo-1.11.1-20131129.182110-3.jar
>>>> 
>>>> Clement
>>>> 
>>>>> 
>>>>> /Bengt
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 2013/11/29 Clement Escoffier <[email protected]>
>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> I’ve done some testing:
>>>>>> 
>>>>>> 1) I’m able to retrieve the properties
>>>>>> 2) I’m not able to retrieve the value
>>>>>> 
>>>>>> Here is my accept method:
>>>>>> 
>>>>>>   @Override
>>>>>>   public <S> TransformedServiceReference<S> accept(DependencyModel
>>>>>> dependency, BundleContext context, TransformedServiceReference<S>
>>>> ref) {
>>>>>>       ConfigurationHandlerDescription h =
>>>>>> (ConfigurationHandlerDescription)
>>>>>> dependency.getComponentInstance().getInstanceDescription()
>>>>>> 
>>>>>> .getHandlerDescription("org.apache.felix.ipojo:properties");
>>>>>> 
>>>>>>       if (h == null) {
>>>>>>           return null;
>>>>>>       }
>>>>>> 
>>>>>>       PropertyDescription description =
>>>> h.getPropertyByName(“extenders");
>>>>>>       if (description == null) {
>>>>>>           return null;
>>>>>>       }
>>>>>> 
>>>>>>       System.out.println(description.getValue() + " / " +
>>>>>> Arrays.toString(
>>>>>>               (String[]) description.getCurrentValue()));
>>>>>> 
>>>>>>       return ref;
>>>>>>   }
>>>>>> 
>>>>>> I’ve added the getCurrentValue() to PropertyDescription to retrieve
>>>> the
>>>>>> current property value (gonna commit this ASAP).
>>>>>> (full code here: https://gist.github.com/cescoffier/7705901)
>>>>>> 
>>>>>> Clement
>>>>>> 
>>>>>> On 28 nov. 2013, at 15:06, Bengt Rodehav <[email protected]> wrote:
>>>>>> 
>>>>>>> Thanks!
>>>>>>> 
>>>>>>> 
>>>>>>> 2013/11/28 Clement Escoffier <[email protected]>
>>>>>>> 
>>>>>>>> 
>>>>>>>> On 28 nov. 2013, at 14:36, Bengt Rodehav <[email protected]> wrote:
>>>>>>>> 
>>>>>>>>> Hello Clement,
>>>>>>>>> 
>>>>>>>>> I changed to the following line:
>>>>>>>>> 
>>>>>>>>>     PropertyDescription[] propDescs =
>>>>>>>>> configHandlerDescription.getProperties();
>>>>>>>>> 
>>>>>>>>> But I still get an NPE. Have you tried to call these methods from
>>>>>> within
>>>>>>>> an
>>>>>>>>> interceptor?
>>>>>>>> 
>>>>>>>> Not this method, but I did something pretty similar. Will
>>>> investigate to
>>>>>>>> see why you get an NPE.
>>>>>>>> 
>>>>>>>> Clement
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> /Bengt
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 2013/11/28 Clement Escoffier <[email protected]>
>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On 28 nov. 2013, at 12:17, Bengt Rodehav <[email protected]>
>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> Hello again Clement!
>>>>>>>>>>> 
>>>>>>>>>>> I was away on business yesterday which is why I'm late replying.
>>>>>>>>>>> 
>>>>>>>>>>> I've come a bit further now but still have problems accessing my
>>>>>>>>>>> component's "extenders" property. Here is what my code looks like
>>>>>> now:
>>>>>>>>>>> 
>>>>>>>>>>> *  public List<ServiceReference>
>>>> getServiceReferences(DependencyModel
>>>>>>>>>>> theDependencyModel,*
>>>>>>>>>>> *      List<ServiceReference> theMatching) {*
>>>>>>>>>>> 
>>>>>>>>>>> *    ComponentInstance instance =
>>>>>>>>>>> theDependencyModel.getComponentInstance();*
>>>>>>>>>>> *    InstanceDescription instanceDescription =
>>>>>>>>>>> instance.getInstanceDescription();*
>>>>>>>>>>> *    ComponentTypeDescription componentTypeDescription =
>>>>>>>>>>> instanceDescription.getComponentDescription();*
>>>>>>>>>>> *    String factoryName =
>>>>>>>>>>> componentTypeDescription.getFactory().getFactoryName();*
>>>>>>>>>>> 
>>>>>>>>>>> *    if (FACTORY_NAME.equals(factoryName)) {*
>>>>>>>>>>> *      System.out.println("Found a GenericService2");*
>>>>>>>>>>> *      ConfigurationHandlerDescription configHandlerDescription =
>>>>>>>>>>> (ConfigurationHandlerDescription) instanceDescription*
>>>>>>>>>>> *
>>>>>>>> .getHandlerDescription("org.apache.felix.ipojo.properties");*
>>>>>>>>>>> *      int state = instanceDescription.getState();*
>>>>>>>>>>> *      System.out.println("State: " + state);*
>>>>>>>>>>> *      if(ComponentInstance.VALID ==
>>>> instanceDescription.getState())
>>>>>> {*
>>>>>>>>>>> *        PropertyDescription propDesc =
>>>>>>>>>>> configHandlerDescription.getPropertyByName("extenders"); // NPE*
>>>>>>>>>>> *        if(propDesc != null) {*
>>>>>>>>>>> *          String extenders = propDesc.getValue();*
>>>>>>>>>>> *          System.out.println("Extenders: " + extenders);*
>>>>>>>>>>> *        }*
>>>>>>>>>>> *        else {*
>>>>>>>>>>> *          System.out.println("Extenders is null");*
>>>>>>>>>>> *        }*
>>>>>>>>>>> *      }*
>>>>>>>>>>> *    }*
>>>>>>>>>>> 
>>>>>>>>>>> I check the factory name to determine if this is a component
>>>> that I
>>>>>>>>>> should
>>>>>>>>>>> intercept. Presently I wait until the component is valid but I'm
>>>> not
>>>>>>>> sure
>>>>>>>>>>> if I can wait since my interceptor has to kick in before that.
>>>>>>>> Presently
>>>>>>>>>> I
>>>>>>>>>>> get a null pointer exception when I try to retrieve my property.
>>>> Do
>>>>>> you
>>>>>>>>>>> have any idea why? It doesn't seem possible to retrieve
>>>> properties at
>>>>>>>>>> this
>>>>>>>>>>> pont.
>>>>>>>>>> 
>>>>>>>>>> Did you try to inter ate over the set of properties and see what
>>>> are
>>>>>>>> they ?
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> I also noticed that the method PropertyDescription.getValue()
>>>> always
>>>>>>>>>>> returns a String. In my case the underlying object is an array of
>>>>>>>> String
>>>>>>>>>>> (String[]). Is it possible to get the value in the correct type?
>>>>>>>>>> 
>>>>>>>>>> Yes, there is a getObjectValue(BundleContext context) method, but
>>>> you
>>>>>>>> need
>>>>>>>>>> to give a bundle context object used if it needs to load classes.
>>>>>>>>>> 
>>>>>>>>>> Clement
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> /Bengt
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 2013/11/27 Clement Escoffier <[email protected]>
>>>>>>>>>>> 
>>>>>>>>>>>> Hi,
>>>>>>>>>>>> 
>>>>>>>>>>>> On 26 nov. 2013, at 16:00, Bengt Rodehav <[email protected]>
>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>>> I'm getting a bit closer regarding the interceptors. Still two
>>>>>>>> problems
>>>>>>>>>>>> for
>>>>>>>>>>>>> me:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> a) I still don't understand how to get hold of my intercepted
>>>>>>>> instance
>>>>>>>>>>>> from
>>>>>>>>>>>>> within my interceptor. I get a reference to a DependencyModel
>>>> from
>>>>>>>>>> which
>>>>>>>>>>>> I
>>>>>>>>>>>>> can get a ComponentInstance. But how do I go from there to my
>>>>>>>>>> ComponentA
>>>>>>>>>>>>> class. I need to access the property "extenders" in order for
>>>> my
>>>>>>>>>>>>> interceptor to do its job.
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> It depends how how is managed the extender property, let’s
>>>> imagine
>>>>>>>> it’s
>>>>>>>>>> a
>>>>>>>>>>>> @Property. In this case, from the Dependency Model, you can
>>>> retrieve
>>>>>>>> the
>>>>>>>>>>>> component instance. From the instance, you have access to the
>>>>>>>>>> introspection
>>>>>>>>>>>> layer (getInstanceDescription()), which let you analyze the
>>>> iPOJO
>>>>>>>>>> container.
>>>>>>>>>>>> 
>>>>>>>>>>>> To be a bit more clear, let’s see some code:
>>>>>>>>>>>> 
>>>>>>>>>>>> //First retrieve the configuration handler description from the
>>>>>>>> instance
>>>>>>>>>>>> container:
>>>>>>>>>>>> ConfigurationHandlerDescription description =
>>>>>>>>>>>> (ConfigurationHandlerDescription)
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> model.getComponentInstance().getInstanceDescription().getHandlerDescription("org.apache.felix.ipojo.properties”);
>>>>>>>>>>>> // Find the extenders property
>>>>>>>>>>>> String extenders =
>>>>>>>>>> description.getPropertyByName("extenders").getValue();
>>>>>>>>>>>> // You have your value !
>>>>>>>>>>>> 
>>>>>>>>>>>>> b) Also, when the property "extenders" is changed, I need to
>>>> force
>>>>>>>> the
>>>>>>>>>>>>> interceptor to recalculate the dependencies. How can I
>>>> accomplish
>>>>>>>> that?
>>>>>>>>>>>> 
>>>>>>>>>>>> It also depends on how this reconfiguration happen. Let’s say
>>>> that
>>>>>> the
>>>>>>>>>>>> instance is reconfigured from the configuration admin or iPOJO
>>>>>>>>>>>> reconfiguration abilities. In these case being notified is quite
>>>>>>>>>> simple, as
>>>>>>>>>>>> you can register a ConfigurationListener on the
>>>>>>>>>>>> ConfigurationHandlerDescription object:
>>>>>>>>>>>> 
>>>>>>>>>>>> description.addListener(new ConfigurationListener() {
>>>>>>>>>>>>        public void configurationChanged(ComponentInstance
>>>>>> instance,
>>>>>>>>>>>> Map<String, Object> configuration) {
>>>>>>>>>>>>            // The extender property may have been modified
>>>>>>>>>>>>        }
>>>>>>>>>>>>    });
>>>>>>>>>>>> 
>>>>>>>>>>>> Don’t forget to unregister the listener when the interceptor is
>>>>>>>>>> unplugged
>>>>>>>>>>>> from the instance.
>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Getting deeper into iPojo than I've been before…
>>>>>>>>>>>> 
>>>>>>>>>>>> It’s just the beginning…. (contributions are welcome if you see
>>>> some
>>>>>>>>>>>> dark(er) area)
>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 2013/11/26 Bengt Rodehav <[email protected]>
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Thanks Clement!
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 2013/11/26 Clement Escoffier <[email protected]>
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On 25 nov. 2013, at 20:19, Bengt Rodehav <[email protected]>
>>>>>>>> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Hello Clement and as always thanks for your detailed answer!
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> You’re welcome.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> It does seem a bit complicated to "require" an interceptor.
>>>>>>>> Perhaps
>>>>>>>>>> an
>>>>>>>>>>>>>>>> easier way of doing this might be possible in the future.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I think it would be a good addition. Thinking about it.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Anyway, I'm not
>>>>>>>>>>>>>>>> exactly sure that I understood what you meant. Just to
>>>> clarify:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> My Component A (the component to be intercepted) has the
>>>>>> following
>>>>>>>>>>>> code:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> @Property(name = "extenders", mandatory = false)
>>>>>>>>>>>>>>>> private String[] mExtenderIds;
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> @Requires(optional = true, id = "extenders")
>>>>>>>>>>>>>>>> private IExtender[] mExtenders;
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Do you mean that I should put a filter on the @Requires with
>>>>>>>>>>>>>>> id="extenders"
>>>>>>>>>>>>>>>> (the intercepted = true) so that it can only be satisfied
>>>> if my
>>>>>>>>>>>>>>> interceptor
>>>>>>>>>>>>>>>> has added that property?
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Exactly.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> But how do I then handle the situation where my Component A
>>>> does
>>>>>>>> not
>>>>>>>>>>>>>>>> require any extenders? In that case I was planning on
>>>> setting
>>>>>> the
>>>>>>>>>>>>>>>> dependency to optional to make my instance valid without any
>>>>>>>>>>>> extenders.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Or, perhaps I could first set the @Requires to mandatory
>>>> (with
>>>>>> the
>>>>>>>>>>>>>>> filter):
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> @Requires(optional = false, id = "extenders",
>>>>>>>>>>>>>>> filter="(intercepted=true)")
>>>>>>>>>>>>>>>> private IExtender[] mExtenders;
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Then, if my interceptor sees that the instance does not
>>>> require
>>>>>>>> any
>>>>>>>>>>>>>>>> extenders it can set the dependency to become optional. This
>>>>>> way I
>>>>>>>>>>>> both
>>>>>>>>>>>>>>>> require the interceptor (via the filter) and I ensure that
>>>> the
>>>>>>>> only
>>>>>>>>>>>> way
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>> allow the instance to be valid without the dependency is if
>>>> the
>>>>>>>>>>>>>>> interceptor
>>>>>>>>>>>>>>>> has explicitly set the dependency to optional.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> That would work. You can change the optionality status of the
>>>>>>>>>>>> dependency
>>>>>>>>>>>>>>> from the dependency model you get in the interceptor.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 2013/11/25 Clement Escoffier <[email protected]>
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> On 25 nov. 2013, at 11:04, Bengt Rodehav <
>>>> [email protected]>
>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I've started to investigate using iPojo interceptors. I'm
>>>>>> using
>>>>>>>>>>>> iPojo
>>>>>>>>>>>>>>>>>> version 1.11.0. I want to accomplish the following:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Component A can be "extended" by specifying a list of
>>>>>> (required)
>>>>>>>>>>>>>>>>>> "extenders" (actually their id's), like this:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> @Property(name = "extenders", mandatory = false)
>>>>>>>>>>>>>>>>>> private String[] mExtenderIds;
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> @Requires(optional = true, id = "extenders")
>>>>>>>>>>>>>>>>>> private IExtender[] mExtenders;
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> The property is optional but if any extenderId's are
>>>> listed
>>>>>> then
>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> @Requires should require that IExtender's with the
>>>>>> corresponding
>>>>>>>>>>>>>>>>> extenderId
>>>>>>>>>>>>>>>>>> is started.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> The IExtender interface contains the following method:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> public String getExtenderId();
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Thus, every extender has an extenderId and if that id is
>>>>>> listed
>>>>>>>>>> in a
>>>>>>>>>>>>>>>>>> components "extender" property then the corresponding
>>>> service
>>>>>>>>>> should
>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>> required, otherwise not.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> My idea (actually Clement's idea from a previous
>>>> conversation
>>>>>> on
>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>> list). is to use a RankingInterceptor that returns an
>>>> empty
>>>>>>>> array
>>>>>>>>>>>>>>> until
>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>> required services are present.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I think this is doable but in order for my
>>>> RankingInterceptor
>>>>>> to
>>>>>>>>>>>>>>> work, it
>>>>>>>>>>>>>>>>>> must have access to the component's "extenders" property.
>>>> It
>>>>>>>> would
>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>> go
>>>>>>>>>>>>>>>>>> through all the services implementing the IExtender
>>>> interface
>>>>>>>> and
>>>>>>>>>> if
>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>> are extenders corresponding to the required extenderId's
>>>> it
>>>>>>>> would
>>>>>>>>>>>>>>> return
>>>>>>>>>>>>>>>>>> all of those, otherwise it would return an empty list.
>>>> Also,
>>>>>> if
>>>>>>>> a
>>>>>>>>>>>>>>> list of
>>>>>>>>>>>>>>>>>> extenderId's was specified, then the service dependency
>>>> is set
>>>>>>>> to
>>>>>>>>>>>>>>>>>> mandatory, otherwise to optional.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> My problem is how to gain access to the configuration
>>>> property
>>>>>>>>>> (the
>>>>>>>>>>>>>>>>>> "extenders" property) of my component from the
>>>> interceptor.
>>>>>> How
>>>>>>>>>> can
>>>>>>>>>>>> I
>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>> this?
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> When the interceptor is hooked to a dependency, it
>>>> receives the
>>>>>>>>>>>>>>> dependency
>>>>>>>>>>>>>>>>> model object. From this object you can retrieve the
>>>> component
>>>>>>>>>>>> instance
>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>> get the introspection metadata.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Another question I have is how to make sure that the
>>>>>> interceptor
>>>>>>>>>> is
>>>>>>>>>>>>>>>>> active.
>>>>>>>>>>>>>>>>>> If the interceptor is not active then my component could
>>>>>> become
>>>>>>>>>>>>>>>>> erroneously
>>>>>>>>>>>>>>>>>> valid. Would it be feasible to have a mandatory
>>>> dependency on
>>>>>>>> the
>>>>>>>>>>>>>>>>>> interceptor?
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Unfortunately not, at least not easily. What you can do is
>>>> a
>>>>>>>>>>>>>>> combination
>>>>>>>>>>>>>>>>> between a filter and two interceptors: the ranking
>>>> interceptors
>>>>>>>> as
>>>>>>>>>>>> you
>>>>>>>>>>>>>>> did,
>>>>>>>>>>>>>>>>> and a tracking interceptor. Let me explain:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Let’s imagine your consumer with your service dependency.
>>>> Add a
>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>> that will be resolved only if your interceptor is there,
>>>>>>>> something
>>>>>>>>>>>>>>> like:
>>>>>>>>>>>>>>>>> (intercepted=true).
>>>>>>>>>>>>>>>>> Your interceptor implement both tracking and ranking
>>>>>>>> interceptors.
>>>>>>>>>>>> When
>>>>>>>>>>>>>>>>> the accept method is called on your interceptor, it  can
>>>>>>>>>> ‘transform’
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> original service reference to add the ‘intercepted’
>>>> property
>>>>>>>>>>>>>>>>> (ref.addProperty(“intercepted”, true);) This modified
>>>> service
>>>>>>>>>>>> reference
>>>>>>>>>>>>>>>>> matches your filter. Then, do your ranking policy are we
>>>>>>>> discussed.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> This solution ensure that your dependency can only be
>>>> resolved
>>>>>> if
>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>> interceptor is there. Indeed without the interceptor, the
>>>>>> filter
>>>>>>>>>> does
>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>> match.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>> 
>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>> 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]
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>> ---------------------------------------------------------------------
>>>>>>>>>> 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]
>>>> 
>>>> 
>>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to