[ https://issues.apache.org/jira/browse/FELIX-5570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15886987#comment-15886987 ]
David Jencks commented on FELIX-5570: ------------------------------------- I wonder if the most reliable and simplest fix would be to have an immediate component create the service instance by calling getService on the service reference on behalf of the bundle registering the service, and twiddling the deactivating counting to match. Otherwise I fear we might be unsuccessfully duplicating the frameworks "one at a time" getService logic. > Immediate service component that provides a WeavingHook results in an NPE > ------------------------------------------------------------------------- > > Key: FELIX-5570 > URL: https://issues.apache.org/jira/browse/FELIX-5570 > Project: Felix > Issue Type: Bug > Components: Declarative Services (SCR) > Affects Versions: scr-2.0.8 > Reporter: Thomas Watson > > If you have an immediate service component that provides a WeavingHook > service then an NPE will result. An example service component XML: > <?xml version="1.0" encoding="UTF-8"?> > <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" > enabled="true" immediate="true" name="Test Patches Weaver"> > <implementation class="test.patches.Weaver" /> > <service> > <provide interface="org.osgi.framework.hooks.weaving.WeavingHook"/> > </service> > </scr:component> > If you deploy this bundle along with SCR 2.0.8 on Felix Framework 5.6.2 the > following NPE happens: > ERROR: [Test Patches Weaver(0)] Error during instantiation of the > implementation object > java.lang.NullPointerException > at > org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:237) > at > org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:109) > at > org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906) > at > org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879) > at > org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823) > at > org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:347) > at > org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:247) > at > org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350) > at org.apache.felix.framework.Felix.getService(Felix.java:3720) > at > org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.transformClass(BundleWiringImpl.java:2359) > at > org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2052) > at > org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1518) > at > org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:79) > at > org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1958) > at java.lang.ClassLoader.loadClass(ClassLoader.java:357) > at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925) > at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978) > at > org.apache.felix.scr.impl.manager.AbstractComponentManager.initDependencyManagers(AbstractComponentManager.java:976) > at > org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1003) > at > org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:859) > at > org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:749) > at > org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:675) > at > org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:430) > at > org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:657) > at > org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:341) > at > org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:390) > at org.apache.felix.scr.impl.Activator.access$200(Activator.java:54) > at > org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:265) > at > org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:254) > at > org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:227) > at > org.apache.felix.utils.extender.AbstractExtender.addingBundle(AbstractExtender.java:187) > at > org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:469) > at > org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:415) > at > org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) > at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) > at > org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444) > at > org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915) > at > org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834) > at > org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516) > at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4562) > at org.apache.felix.framework.Felix.activateBundle(Felix.java:2229) > at org.apache.felix.framework.Felix.startBundle(Felix.java:2144) > at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371) > at > org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308) > at java.lang.Thread.run(Thread.java:745) > This is because SCR is invoking SingleComponentManager.getServiceInternal > after registering the WeavingHook service in order to get the service object > for immediate activation. This ends up trying to load the > test.patches.Weaver implementation class which then causes the framework to > look for WeavingHooks to call. Which causes a recursive call back into > SingleComponentManager.getServiceInternal for the same service component > which triggers another load of the implementation class. Here Felix > framework detects a recursive class load for the same class name and returns > null from Bundle.loadClass() (Something I think is not correct, I think > instead a CNFE must be thrown or some other class loader LinkageError). > This null class results in the above NPE. I found this bug while running SCR > on the Equinox framework. On Equinox a CNFE is thrown and logged by SCR and > things seem to recover from that but we are left with an error message in the > log making it look like things are not working. > Both Equinox and Felix seem to detect the recursive class load that SCR is > causing but handle the situation slightly different. In both cases I argue > that SCR should avoid recursive calls into > SingleComponentManager.getServiceInternal for the same service component. > The difficulty here is that SCR can depend on the framework to avoid > recursive calls into its ServiceFactory because the specification mandates > that (see org.osgi.framework.ServiceException.FACTORY_RECURSION). But here > SCR is invoking SingleComponentManager.getServiceInternal itself and an > internal implementation detail of an immediate service component. It seems > that for this internal call to SingleComponentManager.getServiceInternal > something should be done to prevent recurse calls so that this is consistent > with how non-immediate components work. > Also see https://bugs.eclipse.org/bugs/show_bug.cgi?id=512707 -- This message was sent by Atlassian JIRA (v6.3.15#6346)