Index: core/src/main/java/org/icefaces/impl/application/WindowScopeManager.java =================================================================== --- core/src/main/java/org/icefaces/impl/application/WindowScopeManager.java (revision 23415) +++ core/src/main/java/org/icefaces/impl/application/WindowScopeManager.java (revision ) @@ -57,7 +57,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -public class WindowScopeManager extends ResourceHandlerWrapper implements PhaseListener { +public class WindowScopeManager extends SessionAwareResourceHandlerWrapper implements PhaseListener { public static final String ScopeName = "window"; private static final Logger log = Logger.getLogger(WindowScopeManager.class.getName()); private static final String seed = Integer.toString(new Random().nextInt(1000), 36); @@ -87,12 +87,7 @@ return wrapped; } - public void handleResourceRequest(FacesContext facesContext) throws IOException { - //a null session cannot have any window scope beans - if (null == facesContext.getExternalContext().getSession(false)) { - wrapped.handleResourceRequest(facesContext); - return; - } + public void handleSessionAwareResourceRequest(FacesContext facesContext) throws IOException { ExternalContext externalContext = facesContext.getExternalContext(); Map parameters = externalContext.getRequestParameterMap(); if (isDisposeWindowRequest(parameters)) { @@ -115,7 +110,7 @@ } } - public boolean isResourceRequest(FacesContext facesContext) { + public boolean isSessionAwareResourceRequest(FacesContext facesContext) { ExternalContext externalContext = facesContext.getExternalContext(); Map parameters = externalContext.getRequestParameterMap(); if (isDisposeWindowRequest(parameters)) { @@ -149,7 +144,8 @@ public static ScopeMap lookupWindowScope(FacesContext context) { String id = lookupAssociatedWindowID(context.getExternalContext().getRequestMap()); - return (ScopeMap) getState(context).windowScopedMaps.get(id); + State state = getState(context); + return state == null ? null : (ScopeMap) state.windowScopedMaps.get(id); } public static synchronized String determineWindowID(FacesContext context) { Index: core/src/main/java/org/icefaces/impl/application/SessionTimeoutMonitor.java =================================================================== --- core/src/main/java/org/icefaces/impl/application/SessionTimeoutMonitor.java (revision 23386) +++ core/src/main/java/org/icefaces/impl/application/SessionTimeoutMonitor.java (revision ) @@ -27,10 +27,11 @@ import javax.faces.application.ResourceHandlerWrapper; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; +import java.io.IOException; import java.util.Map; import java.util.logging.Logger; -public class SessionTimeoutMonitor extends ResourceHandlerWrapper { +public class SessionTimeoutMonitor extends SessionAwareResourceHandlerWrapper { private static final Logger Log = Logger.getLogger(SessionTimeoutMonitor.class.getName()); private ResourceHandler handler; @@ -42,20 +43,12 @@ return handler; } - public boolean isResourceRequest(FacesContext context) { - final ExternalContext externalContext = context.getExternalContext(); - //create session if non-ajax request - final Object session = externalContext.getSession(!context.getPartialViewContext().isAjaxRequest()); - //if session invalid or expired block other resource handlers from running - if (session == null) { - //return false to force JSF to run and throw ViewExpiredException which eventually will be captured - //and re-cast in a SessionExpiredException - return false; - } - + public boolean isSessionAwareResourceRequest(FacesContext context) { if (!EnvUtils.isStrictSessionTimeout(context)) { return handler.isResourceRequest(context); } + + ExternalContext externalContext = context.getExternalContext(); Map sessionMap = externalContext.getSessionMap(); Long lastAccessTime = (Long) sessionMap.get(SessionTimeoutMonitor.class.getName()); boolean isPushRelatedRequest = EnvUtils.isPushRequest(context); @@ -64,6 +57,7 @@ sessionMap.put(SessionTimeoutMonitor.class.getName(), System.currentTimeMillis()); } + Object session = externalContext.getSession(false); int maxInactiveInterval; if (EnvUtils.instanceofPortletSession(session)) { maxInactiveInterval = ((javax.portlet.PortletSession) session).getMaxInactiveInterval(); @@ -76,6 +70,10 @@ externalContext.invalidateSession(); } - return super.isResourceRequest(context); + return handler.isResourceRequest(context); } + + public void handleSessionAwareResourceRequest(FacesContext context) throws IOException { + handler.handleResourceRequest(context); -} + } +} Index: core/src/main/java/org/icefaces/util/EnvUtils.java =================================================================== --- core/src/main/java/org/icefaces/util/EnvUtils.java (revision 23371) +++ core/src/main/java/org/icefaces/util/EnvUtils.java (revision ) @@ -307,6 +307,18 @@ return EnvConfig.getEnvConfig(facesContext).mandatoryResourceConfig; } + public static void createSessionOnPageLoad(FacesContext context) { + final ExternalContext externalContext = context.getExternalContext(); + //create session if non-ajax request + externalContext.getSession(!context.getPartialViewContext().isAjaxRequest()); + } + + public static boolean isSessionInvalid(FacesContext context) { + final ExternalContext externalContext = context.getExternalContext(); + //if session invalid or expired block other resource handlers from running + return externalContext.getSession(false) == null; + } + public static boolean isICEfacesView(FacesContext facesContext) { //Check to see if the view is configured to use ICEfaces (default is to enable ICEfaces). UIViewRoot viewRoot = facesContext.getViewRoot(); Index: core/src/main/java/org/icefaces/impl/application/SessionAwareResourceHandlerWrapper.java =================================================================== --- core/src/main/java/org/icefaces/impl/application/SessionAwareResourceHandlerWrapper.java (revision ) +++ core/src/main/java/org/icefaces/impl/application/SessionAwareResourceHandlerWrapper.java (revision ) @@ -0,0 +1,53 @@ +/* + * Version: MPL 1.1 + * + * "The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations under + * the License. + * + * The Original Code is ICEfaces 1.5 open source software code, released + * November 5, 2006. The Initial Developer of the Original Code is ICEsoft + * Technologies Canada, Corp. Portions created by ICEsoft are Copyright (C) + * 2004-2009 ICEsoft Technologies Canada, Corp. All Rights Reserved. + * + * Contributor(s): _____________________. + */ + +package org.icefaces.impl.application; + +import org.icefaces.util.EnvUtils; + +import javax.faces.application.ResourceHandler; +import javax.faces.application.ResourceHandlerWrapper; +import javax.faces.context.FacesContext; +import java.io.IOException; + + +public abstract class SessionAwareResourceHandlerWrapper extends ResourceHandlerWrapper { + public boolean isResourceRequest(FacesContext context) { + EnvUtils.createSessionOnPageLoad(context); + if (EnvUtils.isSessionInvalid(context)) { + return getWrapped().isResourceRequest(context); + } else { + return isSessionAwareResourceRequest(context); + } + } + + public void handleResourceRequest(FacesContext context) throws IOException { + if (EnvUtils.isSessionInvalid(context)) { + getWrapped().handleResourceRequest(context); + } else { + handleSessionAwareResourceRequest(context); + } + } + + public abstract boolean isSessionAwareResourceRequest(FacesContext context); + + public abstract void handleSessionAwareResourceRequest(FacesContext context) throws IOException; +}