[ https://issues.apache.org/jira/browse/FELIX-3220?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Karl Pauls resolved FELIX-3220. ------------------------------- Resolution: Fixed Yes, I think you are correct. I commited a fix (actually, I did go over all hook callbacks and did find some more of this kind of problems). Thanks a lot. Can you please test with the latest trunk and close this issue if it works for you. > Multiple ClassCastException(s) when invoking OSGi Service-Hooks (EventHook, > FindHook) > ------------------------------------------------------------------------------------- > > Key: FELIX-3220 > URL: https://issues.apache.org/jira/browse/FELIX-3220 > Project: Felix > Issue Type: Bug > Components: Framework > Affects Versions: framework-4.0.1 > Environment: Enable OSGi Security, using Felix security bundle > version 2.0.0 > Reporter: Michael Hirsch > Assignee: Karl Pauls > Priority: Critical > Fix For: framework-4.2.0 > > > *Scenario:* > - Register a EventHook in the OSGi service registry as described in the OSGi > core specification 4.2. > - Run felix with a SecurityManager > - The framework is not calling the EventHook during framework service > (register, modify, and unregister service) operations. > *Expected Behavior* > - The framework code calls the EventHook during framework service (register, > modify, and unregister service) operations. > *Current Behavior:* > - A ClassCastException occurs in the framework code > org.apache.felix.framework.util.SecureAction:1628 > - Logged on "WARNING" Level > *Probably Caused By:* > The ClassCastException is caused by calling the wrong setter-method within > the org.apache.felix.framework.util.SecureAction:1135 class. > The ServiceEvent will never be set which causes that in line 1628 when > invoking the EventHook the ServiceEvent argument is missing and parameters > for the EventHook will be casted wrong. > Method: org.apache.felix.framework.util.SecureAction # invokeServiceEventHook > {code} > public void invokeServiceEventHook( > org.osgi.framework.hooks.service.EventHook eh, > ServiceEvent event, Collection<BundleContext> contexts) > throws Exception > { .... > actions.set(Actions.INVOKE_SERVICE_EVENT_HOOK, eh, contexts); > .... > } > {code} > Method: org.apache.felix.framework.util.SecureAction.Actions # run > has wrong arguments: > arg1 = EventHook > arg2 = Collection<BundleContext> > arg3 = null > {code} > case INVOKE_SERVICE_EVENT_HOOK: > ((org.osgi.framework.hooks.service.EventHook) arg1).event( > (ServiceEvent) arg2, (Collection<BundleContext>) > arg3); > return null; > {code} > *Solution:* > Changing the method of setting the arguments for the Action class. Set also > the ServiceEvent! > {code} > public void invokeServiceEventHook( > org.osgi.framework.hooks.service.EventHook eh, > ServiceEvent event, Collection<BundleContext> contexts) > throws Exception > { .... > actions.set(Actions.INVOKE_SERVICE_EVENT_HOOK, eh, event, contexts); > .... > } > {code} > *Additional:* > # Meanwhile investigating code I found that also invoking the > ServiceEventListenerHook has probably the same behavior! When calling the > setter-method for setting the arguments for the Action class there is missing > the ServiceEvent. > # Invoking FindHook using wrong action constant which causes a > ClassCastException! > Actions.INVOKE_SERVICE_EVENT_HOOK need to be changed to > Actions.INVOKE_SERVICE_FIND_HOOK > {code} > public void invokeServiceFindHook( > org.osgi.framework.hooks.service.FindHook fh, > BundleContext context, String name, String filter, > boolean allServices, Collection<ServiceReference<?>> references) > throws Exception > {.... > actions.set( > Actions.INVOKE_SERVICE_EVENT_HOOK, fh, context, name, filter, > (allServices) ? Boolean.TRUE : Boolean.FALSE, references); > ....} > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira