[ 
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

        

Reply via email to