http://java.net/jira/browse/GLASSFISH-15632 was JAVASERVERFACES-1914 SECTION: Modified Files ---------------------------- M jsf-ri/src/main/java/com/sun/faces/application/ApplicationFactoryImpl.java M jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java SECTION: Diffs ---------------------------- Index: jsf-ri/src/main/java/com/sun/faces/application/ApplicationFactoryImpl.java =================================================================== --- jsf-ri/src/main/java/com/sun/faces/application/ApplicationFactoryImpl.java (revision 8818) +++ jsf-ri/src/main/java/com/sun/faces/application/ApplicationFactoryImpl.java (working copy) @@ -84,13 +84,16 @@ * for this web application.

*/ public Application getApplication() { - Application application = - (Application)FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get(ApplicationImpl.class.getName()); + Application application = null; + if (FacesContext.getCurrentInstance() != null) { + application = + (Application) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get(ApplicationImpl.class.getName()); + } if (application == null) { application = new ApplicationImpl(); if (logger.isLoggable(Level.FINE)) { logger.fine(MessageFormat.format("Created Application instance ''{0}''", - application)); + application)); } } return application; Index: jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java =================================================================== --- jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java (revision 8818) +++ jsf-ri/src/main/java/com/sun/faces/config/ConfigureListener.java (working copy) @@ -140,6 +140,7 @@ protected WebappLifecycleListener webAppListener; protected WebConfiguration webConfig; + private InitFacesContext initContext; // ------------------------------------------ ServletContextListener Methods @@ -198,7 +199,7 @@ // bootstrap of faces required webAppListener = new WebappLifecycleListener(context); webAppListener.contextInitialized(sce); - InitFacesContext initContext = new InitFacesContext(context); + initContext = new InitFacesContext(context); ReflectionUtils.initCache(Thread.currentThread().getContextClassLoader()); Throwable caughtThrowable = null; @@ -282,7 +283,9 @@ } finally { Verifier.setCurrentInstance(null); - initContext.release(); + + //don't release it yet since Servlet.init() might try to access it + // initContext.release(); if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "jsf.config.listener.version.complete"); @@ -301,9 +304,17 @@ public void contextDestroyed(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); - InitFacesContext initContext = null; + + //release the initContext created during contextInitialized() + //issue 1914 This context has'nt been destroyed yet since some of the + //servlets' init() method can try to access the FacesContext.getCurrentInstance() + //and that should not be null. + if (initContext != null) { + initContext.release(); + } + InitFacesContext initCtx = null; try { - initContext = new InitFacesContext(context); + initCtx = new InitFacesContext(context); if (webAppListener != null) { webAppListener.contextDestroyed(sce); @@ -326,11 +337,11 @@ } - ELContext elctx = new ELContextImpl(initContext.getApplication().getELResolver()); - elctx.putContext(FacesContext.class, initContext); - initContext.setELContext(elctx); - Application app = initContext.getApplication(); - app.publishEvent(initContext, + ELContext elctx = new ELContextImpl(initCtx.getApplication().getELResolver()); + elctx.putContext(FacesContext.class, initCtx); + initCtx.setELContext(elctx); + Application app = initCtx.getApplication(); + app.publishEvent(initCtx, PreDestroyApplicationEvent.class, Application.class, app); @@ -344,14 +355,14 @@ e); } } finally { - ApplicationAssociate.clearInstance(initContext.getExternalContext()); + ApplicationAssociate.clearInstance(initCtx.getExternalContext()); ApplicationAssociate.setCurrentInstance(null); - com.sun.faces.application.ApplicationImpl.clearInstance(initContext.getExternalContext()); - com.sun.faces.application.InjectionApplicationFactory.clearInstance(initContext.getExternalContext()); + com.sun.faces.application.ApplicationImpl.clearInstance(initCtx.getExternalContext()); + com.sun.faces.application.InjectionApplicationFactory.clearInstance(initCtx.getExternalContext()); // Release the initialization mark on this web application ConfigManager.getInstance().destory(context); - if (initContext != null) { - initContext.release(); + if (initCtx != null) { + initCtx.release(); } ReflectionUtils.clearCache(Thread.currentThread().getContextClassLoader()); WebConfiguration.clear(context);