[ 
https://issues.apache.org/jira/browse/FELIX-3840?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Karl Pauls resolved FELIX-3840.
-------------------------------

    Resolution: Fixed

As I said, the problem was that we didn't use the getDeclaredMethod. That was a 
problem since the classes are loaded by different classloaders. Now, we get the 
service even so the methods are not public.

Furthermore, there was a bug in the proxy (the nullpointer you did see). I 
fixed this as well. Please close this issue if it works for you (or reopen if 
not).
                
> problem with URLHandlers when running 2 frameworks in one jvm in separate 
> class loaders
> ---------------------------------------------------------------------------------------
>
>                 Key: FELIX-3840
>                 URL: https://issues.apache.org/jira/browse/FELIX-3840
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-4.0.2, framework-4.0.3
>         Environment: windows 7 64bit
>            Reporter: itay hindy
>            Assignee: Karl Pauls
>             Fix For: framework-4.2.0
>
>
> This bug happens with 4.0.2 and 4.1.0-SNAPSHOT framework versions.
> Run embedded felix with tomcat as describe in 
> http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html
>  and as shown in http://heapdump.wordpress.com/2010/03/25/osgi-enabled-war/
> One war activate Felix and works great. Adding another war gives the below 
> error :
> "Unable to update the bundle. (java.net.MalformedURLException: Unknown 
> protocol: obr"
> After debugging I saw the problem is generally in the URLHandlers classes 
> implementation.
> In URLHandlersStreamHandlerProxy class the getStreamHandlerService function 
> does not return the correct value. The below code fails since framework is 
> from current webapp class loader and Felix is from first webapp class loader
> if (framework instanceof Felix)
> {
>       service = ((Felix) framework).getStreamHandlerService(m_protocol);
> }
> so we try to execute the below code and fail with method not recognize error
> service = m_action.invoke(
> m_action.getMethod(framework.getClass(), "getStreamHandlerService", 
> STRING_TYPES), 
> framework, new Object[]{m_protocol});
> After I set getStreamHandlerService function to public in Felix class it 
> works.
> Then in URLHandlersStreamHandlerProxy  class the below function fails (for 
> the setURL method) since m_service is null
> public Object invoke(Object obj, Method method, Object[] params)
>       throws Throwable
> {
>       try
>       {
>               Class[] types = method.getParameterTypes();
>               if ("parseURL".equals(method.getName()))
>               {
>                       types[0] = 
> m_service.getClass().getClassLoader().loadClass(
>                               URLStreamHandlerSetter.class.getName());
>                       params[0] = Proxy.newProxyInstance(
>                               m_service.getClass().getClassLoader(), new 
> Class[]{types[0]}, 
>                               (URLHandlersStreamHandlerProxy) params[0]);
>               }
>               return 
> m_action.invokeDirect(m_action.getMethod(m_service.getClass(), 
>                       method.getName(), types), m_service, params);
>       } 
>       catch (Exception ex)
>       {
>               throw ex;
>       }
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to