Index: jsf-ri/src/main/java/com/sun/faces/config/InitFacesContext.java =================================================================== --- jsf-ri/src/main/java/com/sun/faces/config/InitFacesContext.java (revision 9183) +++ jsf-ri/src/main/java/com/sun/faces/config/InitFacesContext.java (working copy) @@ -40,6 +40,7 @@ package com.sun.faces.config; +import com.sun.faces.RIConstants; import javax.faces.context.FacesContext; import javax.faces.context.ExternalContext; import javax.faces.context.ResponseStream; @@ -65,6 +66,7 @@ import com.sun.faces.context.ApplicationMap; import com.sun.faces.context.InitParameterMap; +import javax.faces.event.PhaseId; /** * A special, minimal implementation of FacesContext used at application initialization time. @@ -72,7 +74,7 @@ */ public class InitFacesContext extends FacesContext { - private ExternalContext ec; + private ServletContextAdapter ec; private UIViewRoot viewRoot; private FacesContext orig; private Map attributes; @@ -94,7 +96,19 @@ ec = new ServletContextAdapter(sc); orig = FacesContext.getCurrentInstance(); setCurrentInstance(this); + sc.setAttribute(INIT_FACES_CONTEXT_ATTR_NAME, this); } + + private static final String INIT_FACES_CONTEXT_ATTR_NAME = RIConstants.FACES_PREFIX + "InitFacesContext"; + + static InitFacesContext getInstance(ServletContext sc) { + InitFacesContext result = (InitFacesContext) sc.getAttribute(INIT_FACES_CONTEXT_ATTR_NAME); + if (null != result) { + result.callSetCurrentInstance(); + } + + return result; + } void callSetCurrentInstance() { setCurrentInstance(this); @@ -197,10 +211,23 @@ public void release() { setCurrentInstance(orig); + getExternalContext().getApplicationMap().remove(INIT_FACES_CONTEXT_ATTR_NAME); if (null != attributes) { attributes.clear(); attributes = null; } + ec.release(); + ec = null; + elContext = null; + if (null != viewRoot) { + Map viewMap = viewRoot.getViewMap(false); + if (null != viewMap) { + viewMap.clear(); + } + } + viewRoot = null; + orig = null; + } public void renderResponse() { } @@ -231,6 +258,12 @@ public void dispatch(String path) throws IOException { } + + private void release() { + servletContext = null; + applicationMap = null; + initMap = null; + } public String encodeActionURL(String url) { return null; Index: jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java =================================================================== --- jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java (revision 9183) +++ jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java (working copy) @@ -299,7 +299,10 @@ ServletContext context = sce.getServletContext(); InitFacesContext initContext = null; try { - initContext = new InitFacesContext(context); + initContext = InitFacesContext.getInstance(context); + if (null == initContext) { + initContext = new InitFacesContext(context); + } if (webAppListener != null) { webAppListener.contextDestroyed(sce); Index: jsf-test/build.xml =================================================================== --- jsf-test/build.xml (revision 9183) +++ jsf-test/build.xml (working copy) @@ -79,7 +79,8 @@ JAVASERVERFACES-2079, JAVASERVERFACES-2065, JAVASERVERFACES-1995, - JAVASERVERFACES_SPEC_PUBLIC-762" /> + JAVASERVERFACES_SPEC_PUBLIC-762, + GLASSFISH-16917" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +