[
https://issues.apache.org/jira/browse/FELIX-4575?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Malte Burkert resolved FELIX-4575.
----------------------------------
Resolution: Not a Problem
I managed to get the scenario working by deleting the listener in the event of
EventListenerHook. This way the registered event for the non-proxied services
is not delivered to the listeners, but instead the registered event for the
proxy keeps being delivered as wanted.
> Unexpected behavior using proxies in declarative services
> ---------------------------------------------------------
>
> Key: FELIX-4575
> URL: https://issues.apache.org/jira/browse/FELIX-4575
> Project: Felix
> Issue Type: Bug
> Components: Declarative Services (SCR)
> Environment: Operating System: Windows 8
> Software platform: Java 1.7.0_45 with
> - org.eclipse.osgi (3.9.1.v20140110-1610)
> - org.apache.felix.scr (1.8.2)
> Reporter: Malte Burkert
> Labels: proxy, references, scr
>
> I have created the following setup which always shows the wrong and
> unexpected behavior, which I describe after the setup.
> ===Setup===
> .Hook-Bundle consisting of:
> - Hook implementing EventListenerHook and FindHook
> > overridden event(event, listeners): creates new proxy instance with
> > InvocationHandlerProxy and registers the service (only services with a
> > MANAGED property become proxied)
> > overridden find(bundleContext, name, filter, allServices, references):
> > removes non-proxied services with a MANAGED property from references
> - InvocationHandlerProxy implementing InvocationHandler
> > overriden invoke(proxy, method, args): logging invocation to system.out and
> > invokes the passed method on the passed service
> .Dateservice-Bundle
> registers Service which returns current date; has component property MANAGED
> defined in the related component description
> .Multiplyservice-Bundle
> returns the product of the numbers; has component property MANAGED defined in
> the related component description
> .Test-Bundle consisting of:
> - Test implementing CommandProvider
> > _test(commandInterpreter): gives an command line interface for executing
> > the test by using the command "test"; test consists of calling the
> > Dateservice and Multiplyservice and prints the results with the callee's
> > classes (to check if proxy is called or not)
> > setter for Dateservice and Multiplyservice, which get called as soon as
> > service references are fulfilled (both are described as static 1..1 service
> > references by the component description)
> > unsetter for Dateservice and Multiplyservice, which get called as soon as
> > at least on of the service references is not fulfilled any more
> ===Test Scenarios showing the unexpected behavior===
> -Test-Scenario 1:
> 1. Start Hook-Bundle
> 2. Start Test-Bundle
> 3. Start Multiplyservice-Bundle
> 4. Start Dateservice-Bundle
> 5. Execute "test"
> >Expected result: Dateservice and Multiplyservice become proxied, test calls
> >methods on proxies
> >Observed result: Both proxies are created, but only the Dateservice-Proxy is
> >passed to the corresponding setter in the Test-class; test calls method on
> >Dateservice's Proxy and Multiplyservice
> -Test-Scenario 2:
> 1. Start Hook-Bundle
> 2. Start Test-Bundle
> 3. Start Dateservice-Bundle
> 4. Start Multiplyservice-Bundle
> 5. Execute "test"
> >Expected result: Dateservice and Multiplyservice become proxied, test calls
> >methods on proxies
> >Observed result: Both proxies are created, but only the
> >Multiplyservice-Proxy is passed to the corresponding setter in the
> >Test-class; test calls method on Multiplyservice's Proxy and Dateservice
> -Test-Scenario 3:
> 1. Start Hook-Bundle
> 2. Start Dateservice-Bundle
> 3. Start Multiplyservice-Bundle
> 4. Start Test-Bundle
> 5. Execute "test"
> 6. Stop Multiplyservice-Bundle
> 7. Start Multiplyservice-Bundle
> 8. Execute "test"
> 9. Stop Dateservice-Bundle
> 10. Start Dateservice-Bundle
> 11. Execute "test"
> 12. Stop Multiplyservice-Bundle
> 13. Start Multiplyservice-Bundle
> 14. Execute "test"
> 15. Stop Test-Bundle
> 16. Start Test-Bundle
> 17. Execute "test"
> >Expected result: whenever Dateservice-, Multiplyservice- or Test-Bundle are
> >started executing test should make calls on the Proxies of Dateservice and
> >Multiplyservice
> >Observed results in executing test in step:
> 5: everything as expected
> 8. everything as expected
> 11. only proxy for Dateservice called
> 14. only proxy for Multiplyservice called
> 17. everything as expected
--
This message was sent by Atlassian JIRA
(v6.2#6252)