Volker Malzahn created TRINIDAD-2522:
----------------------------------------
Summary: 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)