[
https://issues.apache.org/jira/browse/FELIX-3220?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Karl Pauls reassigned FELIX-3220:
---------------------------------
Assignee: Karl Pauls
> 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