felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Miguel Ángel Pastor Olivar (JIRA) <j...@apache.org>
Subject [jira] [Comment Edited] (FELIX-3696) Extension Bundle system adds loader to the classloader which can make other libraries to fail
Date Tue, 02 Oct 2012 14:23:07 GMT

    [ https://issues.apache.org/jira/browse/FELIX-3696?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13467745#comment-13467745
] 

Miguel Ángel Pastor Olivar edited comment on FELIX-3696 at 10/3/12 1:21 AM:
----------------------------------------------------------------------------

Let me add some more light

The WeppAppClassloader delegates on its parent to load the class
{code}
Resource res = ucp.getResource(path, false); (line 209 on java.net.URLClassloader)
{code}

The previous line ends up at 

{code}
 public Resource getResource(String name, boolean check) {
        if (DEBUG) {
            System.err.println("URLClassPath.getResource(\"" + name + "\")");
        }

        Loader loader;
        for (int i = 0; (loader = getLoader(i)) != null; i++) {
            Resource res = loader.getResource(name, check);
            if (res != null) {
                return res;
            }
        }
        return null;
    }
}
{code}

In the previous loop; when the getLoader(i) returns the loader that the ExtensionManager has
already injected into the classloader (http://felix.extensions:9/) and try to execute the
getResourceMethod on that Loader, I am getting a IllegalArgumentException becuase the name
is "java:org.portletbridge.portlet.BridgeFunctions"

If I disable the embedded OSGI container my code works smoothly (the same code works if I
use Equinox instead of Felix).

I have tried with the trunk version (I have updated my local copy a couple of hours ago) and
I am getting the same error (debugging the source code shows me the same scenario described
in the previous comments)

Thx!
                
      was (Author: migue):
    Let me add some more light

The WeppAppClassloader delegates on its parent to load the class
{code}
Resource res = ucp.getResource(path, false); (line 209 on java.net.URLClassloader)
{code}

The previous line ends up at 

{code}
 public Resource getResource(String name, boolean check) {
        if (DEBUG) {
            System.err.println("URLClassPath.getResource(\"" + name + "\")");
        }

        Loader loader;
        for (int i = 0; (loader = getLoader(i)) != null; i++) {
            Resource res = loader.getResource(name, check);
            if (res != null) {
                return res;
            }
        }
        return null;
    }
}
{code}

In the previous loop; when the getLoader(i) returns the loader that the ExtensionManager has
already injected into the classloader (http://felix.extensions:9/) and try to execute the
getResourceMethod on that Loader, I am getting a IllegalArgumentException becuase the name
is "java:org.portletbridge.portlet.BridgeFunctions"

If I disable the embedded OSGI container my code works smoothly (the same code works if I
use Equinox instead of Felix).

I have tried with the trunk version (I have updated my local copy a couple of hours ago) and
I am getting the same error (debugging the source code shows me the same scenario described
in the previous comments)

Thx!
                  
> Extension Bundle system adds loader to the classloader which can make other libraries
to fail
> ---------------------------------------------------------------------------------------------
>
>                 Key: FELIX-3696
>                 URL: https://issues.apache.org/jira/browse/FELIX-3696
>             Project: Felix
>          Issue Type: Bug
>    Affects Versions: framework-4.0.2
>            Reporter: Miguel Ángel Pastor Olivar
>
> I am embedding Apache Felix (and Equinox because I would like to switch depending on
the application server I am running on).
> * The xalan ExtensionHandler executes something like this: ObjectFactory.findProviderClass(className,
ObjectFactory.findClassLoader(), true)
> * The className has the format "java:org.portletbridge.portlet.BridgeFunctions" ( I am
embedding the OSGI container into Liferay portal :) )
> * The extension manager have already added the extension loader to the classloader
> {code}
>   Felix.m_secureAction.addURLToURLClassLoader(Felix.m_secureAction.createURL(Felix.m_secureAction.createURL(null,
"http:", extensionManager),"http://felix.extensions:9/", extensionManager),Felix.class.getClassLoader());
> {code}
> * When the classloader try to resolve the "java:org.portletbridge.portlet.BridgeFunctions"
the previous loader added by the ExtensionManager cause an unhandled error.
> In sun.misc.URL
> {code}
>     public Resource getResource(String name, boolean check) {
>         if (DEBUG) {
>             System.err.println("URLClassPath.getResource(\"" + name + "\")");
>         }
>         Loader loader;
>         for (int i = 0; (loader = getLoader(i)) != null; i++) {
>             Resource res = loader.getResource(name, check);
>             if (res != null) {
>                 return res;
>             }
>         }
>         return null;
>     }
> {code}
> In the previous code, the loader injected by the framework is causing an IllegalArgumentException
here:
> Resource res = loader.getResource(name, check); (instead of returning null)
> Let me know if you need some more details.

--
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

Mime
View raw message