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

Felix Meschberger commented on FELIX-3296:
------------------------------------------

> The idea is that if there is a previous urlhandlersfactory, we should 
> delegate to that one. If it
> isn't doing that, there is a bug in there. Caching the null value is what 
> should happen.

Event the platform is not expecting the URLStreamHandlerFactory to be 
"complete". If the factory does not return anything, it checks with its known 
handler classes (see URL.getURLStreamHandler(String); at least in the Sun VM).

> Caching the null value is what should happen

That's still happening, if there is a null situation after all.

> Thing is, somebody on the outside doesn't want us to see the classes, so we 
> shouldn't try to get them from some place else

Agreed. But then that somebody (URLStreamHandlerFactory) should provide the 
handlers. Particularly the jar: handler but probably also the other ones, at 
least http: and https: would be helpful.

> but the URLHandlers are a very tricky hack to begin with so lets see whether 
> there is a different way. 

I'd love to have a better solution ;-)

> Am I correct in saying that jboss installs its own urlhandlersfactory which 
> will give us the required protocols? 

It installs, but does not give the missing handlers, which is why I did that 
trickery.

BTW: The patch implements exactly the three steps: trying the factory, falling 
back to known packages in framework class loader, falling back to known 
packages in system class loader.
                
> URLHandlers caches null as values for common protocols
> ------------------------------------------------------
>
>                 Key: FELIX-3296
>                 URL: https://issues.apache.org/jira/browse/FELIX-3296
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-3.0.8
>         Environment: Apache Sling     org.apache.sling.launchpad-6.war 
> running in build of current master branch of JBoss Application Server 7 
> (https://github.com/jbossas/jboss-as). I'm reporting this against 
> framework-3.0.8 as that seems to be what's included in Sling, but a review of 
> the code in 4.0.2 shows the class is the same.
>            Reporter: Brian Stansberry
>            Assignee: Karl Pauls
>             Fix For: framework-4.2.0
>
>         Attachments: FELIX-3296.patch
>
>
> A JBoss AS7 user has reported being unable to run the Apache Sling web app in 
> AS 7. I determined that the issue is once 
> org.apache.felix.framework.URLHandlers is installed as the JVM's 
> URLStreamHandlerFactory, URLs with protocol "jar" can no longer be parsed.[1]
> Here's the problem. Line references are to [2]:
> 1) The singleton of this URLHandlers class gets instantiated. It attempts to 
> load and cache standard handlers for common protocols. At L148 it does this 
> for "jar".
> 2) At L353 it's trying to load one of the standard URLStreamHandler impls for 
> the "jar" protocol, e.g. sun.net.www.protocol.jar.Handler. It uses 
> Class.forName("sun.net.www.protocol.jar.Handler"). This fails (returns null) 
> because the JBoss Modules module for this deployment does not have visibility 
> to this class.
> 3) At L367 it stores "null" for this protocol in its m_builtIn map under key 
> "jar".
> 4) Thereafter any call to createURLStreamHandler (L390) will call into 
> getBuiltInStreamHandler (L413). That will return null because it will find 
> the null in m_builtIn stored in step 3) above (L330 & L332).
> A fairly simple fix is to at L148 test the result of the 
> getBuiltInStreamHandler call and if null remove the entry from m_builtIn. It 
> should probably do the same kind of thing in the init(String) method (L120).
> An alternative is to do all the step 1) stuff between L142 and L148 after the 
> try/catch block at L157. At that point a ref to the standard AS7 
> URLStreamHandlerFactory will be available in field m_streamHandlerFactory and 
> can be used to load the standard handlers rather than relying on 
> Class.forName.
> [1] http://lists.jboss.org/pipermail/jboss-as7-dev/2012-January/004956.html
> [2] 
> http://grepcode.com/file/repo1.maven.org/maven2/org.apache.felix/org.apache.felix.framework/2.0.5/org/apache/felix/framework/URLHandlers.java

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