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

Rob Walker commented on FELIX-5802:
-----------------------------------

Sorry to resurrect this one - but I am not sure I fully agree with it.

The specification states:

"Otherwise, if the *registered service object implements* 
[ServiceFactory|https://osgi.org/specification/osgi.core/7.0.0/framework.api.html#org.osgi.framework.ServiceFactory],
 then the value must be 
[SCOPE_BUNDLE|https://osgi.org/specification/osgi.core/7.0.0/framework.api.html#org.osgi.framework.Constants.SCOPE_BUNDLE].

The important point here seems to me to be whether the service object being 
registered is a ServiceFactory - so shouldn't we be testing the service object 
to see if it's an instanceof ServiceFactory to make the decision. The fact that 
SCR uses a ServiceFactory internally to do the registering doesn't really seem 
relevant here.

Without the above, how do we ensure services are singletons and not created 
multiple times for different bundles requesting the service?

 

> Service Component created via xml defines scope='singleton' and service 
> specifies property with scope='bundle'
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: FELIX-5802
>                 URL: https://issues.apache.org/jira/browse/FELIX-5802
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-5.6.10
>            Reporter: Matt Pavlovich
>            Priority: Major
>
> Component with scope='singleton' created via xml or annotation has the 
> service registered with a property of service.scope='bundle'
> Project reproducing the issue is available here: 
> [https://github.com/mattrpav/felix-5802] 
> Steps to reproduce:
>  # Define a serviceComponent via xml (or osgi ds annotation)
>  # Deploy bundle
>  # run scr:info (observe Service Scope: singleton)
>  # run service:list (observe service.scope = bundle)
> Investigation:
>  * Service registers with property of 'service.scope=bundle' here: 
> [https://github.com/apache/felix/blob/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java#L327]
>  * Debugging in felix.scr confirms that the xml is being parsed correctly and 
> the returned component metadata shows the 'scope' = 'singleton' correctly 
> [o.a.felix.scr.impl.xml.XmlHandler#L362|https://github.com/apache/felix/blob/trunk/scr/src/main/java/org/apache/felix/scr/impl/xml/XmlHandler.java#L362]
>  * Debugging confirms that felix.scr is detecting DS13 namespace
>  scr:info output:
> {noformat}
> karaf@root()> scr:info TestModule
> *** Bundle: com.foo.test-module (124)
> Component Description:
> Name: BundleModule
> Implementation Class: com.foo.TestModule
> Default State: enabled
> Activation: immediate
> Configuration Policy: optional
> Activate Method: activate
> Deactivate Method: deactivate
> Modified Method: -
> Configuration Pid: [TestModule]
> Services: 
> com.foo.api.Module
> Service Scope: singleton
> Component Description Properties:
> Component Configuration:
> ComponentId: 4
> State: active 
> Component Configuration Properties:
> component.id = 4
> component.name = TestModule{noformat}
> service:list output
> {noformat}
> karaf@root()> service:list
> [com.foo.api.Module]
> ------------------------
> component.id = 4
> component.name = TestModule
> service.bundleid = 124
> service.id = 141 
> service.scope = bundle
> Provided by :
> Company :: Foo :: TestModule (124){noformat}
> OSGI-INF/serviceComponent.xml
> {noformat}
> <?xml version="1.0" encoding="utf-8"?>
> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0";      
> name="TestModule" immediate="true">
>     <service scope="singleton">
>         <provide interface="com.foo.api.Module" />
>     </service>
>     <implementation class="com.foo.TestModule" />
> </scr:component>{noformat}
>  
> Note: When the same impl class is reconfigured to register as a service via 
> BundleActivator, the service has a service.scope = 'singleton' 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to