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

Mike Kienenberger commented on TRINIDAD-2522:
---------------------------------------------

Would you be willing to create a patch with a solution for this issue?

> ThreadLocalResetter in GlobalConfiguratorImpl null in case of shared trinidad 
> jars
> ----------------------------------------------------------------------------------
>
>                 Key: TRINIDAD-2522
>                 URL: https://issues.apache.org/jira/browse/TRINIDAD-2522
>             Project: MyFaces Trinidad
>          Issue Type: Bug
>          Components: Components
>    Affects Versions: 2.1.0-core
>         Environment: Windows 7, JBoss 7, Java 7
>            Reporter: Volker Malzahn
>
> Issue: when deploying an ear file with trinidad jars in shared lib directory 
> and 2 (or more) embedded war files which use Trinidad sometimes user gets 
> following NullPointerException:
> 11:24:08,569 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] 
> (http-/0.0.0.0:1084-7) java.lang.NullPointerException
>       at org.apache.catalina.connector.Response.toAbsolute(Response.java:1676)
>       at org.apache.catalina.connector.Response.encodeURL(Response.java:1194)
>       at 
> org.apache.catalina.connector.ResponseFacade.encodeURL(ResponseFacade.java:354)
>       at 
> javax.servlet.http.HttpServletResponseWrapper.encodeURL(HttpServletResponseWrapper.java:114)
>       at 
> org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.encodeURL(SaveContextOnUpdateOrErrorResponseWrapper.java:114)
>       at 
> javax.servlet.http.HttpServletResponseWrapper.encodeURL(HttpServletResponseWrapper.java:114)
>       at 
> javax.servlet.http.HttpServletResponseWrapper.encodeURL(HttpServletResponseWrapper.java:114)
>       at 
> com.sun.faces.context.ExternalContextImpl.encodeResourceURL(ExternalContextImpl.java:544)
>       at 
> org.apache.myfaces.trinidad.util.ExternalContextURLEncoder.encodeResourceURL(ExternalContextURLEncoder.java:69)
>       at 
> org.apache.myfaces.trinidadinternal.config.URLEncoderExternalContext.encodeResourceURL(URLEncoderExternalContext.java:102)
>       at 
> javax.faces.context.ExternalContextWrapper.encodeResourceURL(ExternalContextWrapper.java:132)
>       at 
> javax.faces.context.ExternalContextWrapper.encodeResourceURL(ExternalContextWrapper.java:132)
>       at 
> javax.faces.context.ExternalContextWrapper.encodeResourceURL(ExternalContextWrapper.java:132)
>       at 
> org.apache.myfaces.trinidad.render.CoreRenderer.renderEncodedResourceURI(CoreRenderer.java:1103)
>       at 
> org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.StyleSheetRenderer.encodeAll(StyleSheetRenderer.java:128)
>       at 
> org.apache.myfaces.trinidad.render.CoreRenderer.delegateRenderer(CoreRenderer.java:679)
>       at 
> org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.HeadRenderer.encodeEnd(HeadRenderer.java:97)
>       at 
> org.apache.myfaces.trinidad.render.CoreRenderer.encodeEnd(CoreRenderer.java:538)
>       at 
> org.apache.myfaces.trinidad.component.UIXComponentBase.encodeEnd(UIXComponentBase.java:1210)
>       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1826)
> Reason for this NPE:
> URLEncoderFactory has static variable _local which stores a thread local 
> which points to URLEncoder to be used. If that thread local isn't cleared at 
> the end of a request an old URLEncoder (more concrete an old 
> ExternalContextURLEncoder) may be used at one of the next requests which has 
> a reference to an old ExternalContext which causes the NPE in 
> ((HttpServletResponse) response).encodeURL(url).
> Trinidad has ThreadLocalResetter in GlobalConfiguratorImpl (stored in 
> _threadResetter) which has responsibility to clean up thread locals at the 
> end of each request. But _threadResetter could be null in scenario "ear file 
> with trinidad jars in shared lib directory and 2 (or more) embedded war files 
> which use Trinidad".
> Reason:
> - GlobalConfiguratorImpl has static map _CONFIGURATORS        which is filled 
> in GlobalConfiguratorImpl.getInstance(), key is 
> Thread.currentThread().getContextClassLoader(). I.e. we have multiple 
> GlobalConfiguratorImpl instances if we have multiple ContextClassLoaders.
> - GlobalConfiguratorImpl ._threadResetter is initialized in 
> GlobalConfiguratorImpl.__setThreadLocalResetter() which is called by 
> ThreadLocalResetter.init() which is called by static method 
> ThreadLocalUtils._getThreadLocalManager(String) which stores result in its 
> static map _threadLocalManagers (independently of current ContextClassLoader).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to