diff --git a/src/main/java/com/mousetech/gourmetj/JSFUtils.java b/src/main/java/com/mousetech/gourmetj/JSFUtils.java index 4398cca..536c6e4 100644 --- a/src/main/java/com/mousetech/gourmetj/JSFUtils.java +++ b/src/main/java/com/mousetech/gourmetj/JSFUtils.java @@ -92,10 +92,12 @@ public class JSFUtils { */ public static Object getFlash(String key) { Flash flash = flashScope(); - if ( flash == null ) { + try { + return flash.get(key); + } catch ( NullPointerException nex ) { + // If session is expired, flash.get() will fail! return null; } - return flashScope().get(key); } public static void putFlash(String key, Object value) { diff --git a/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java b/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java index e0bd569..769bd9f 100644 --- a/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java +++ b/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java @@ -21,7 +21,6 @@ import javax.inject.Named; import javax.servlet.http.Part; import org.apache.commons.lang3.StringUtils; -import org.primefaces.PrimeFaces; import org.primefaces.event.FileUploadEvent; import org.primefaces.model.UploadedFile; import org.slf4j.Logger; @@ -40,8 +39,6 @@ import com.mousetech.gourmetj.springweb.PictureController; * Backing bean for display/edit recipe detail * * @author timh - * @since Jun 28, 2012 TODO: Cross-reference ingredients to - * keylookup TODO: Cross-reference shopcats */ @Named @@ -616,7 +613,7 @@ public class RecipeDetailBean implements Serializable { if (recipeService.save(this.getRecipe())) { userSession.setRecipe(null); - return "main"; + return "recipeDetails"; } else { JSFUtils.addErrorMessage("Save recipe failed"); return null; @@ -1031,12 +1028,11 @@ public class RecipeDetailBean implements Serializable { * Add new group to bottom of model as AJAX operation. * @return null */ - public String doAddGroup() { + public void doAddGroup() { IngredientUI iui = new IngredientUI(null); iui.setIngGroup(true); iui.setItem(this.getNewGroupName()); List ingUIList = this.getWrappedIngredients(); ingUIList.add(iui); - return null; } } diff --git a/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java b/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java index 5f27b85..3a43fb3 100644 --- a/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java +++ b/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java @@ -1,5 +1,6 @@ package com.mousetech.gourmetj; +import javax.faces.application.ViewExpiredException; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -22,6 +23,7 @@ public class SpringPrimeFacesApplication { final String errorPage = "/error/error.html"; final String error404Page = "/error/error404.html"; + final String expiredPage = "/error/viewExpired.html"; public static void main(String[] args) { SpringApplication.run(SpringPrimeFacesApplication.class, @@ -59,6 +61,9 @@ public class SpringPrimeFacesApplication { ErrorPageRegistry registry) { registry.addErrorPages(new ErrorPage( HttpStatus.NOT_FOUND, error404Page)); + registry.addErrorPages(new ErrorPage( + ViewExpiredException.class, + expiredPage)); registry.addErrorPages(new ErrorPage( HttpStatus.INTERNAL_SERVER_ERROR, errorPage)); diff --git a/src/main/java/com/mousetech/gourmetj/UserSession.java b/src/main/java/com/mousetech/gourmetj/UserSession.java index 5fdc39b..eb21410 100644 --- a/src/main/java/com/mousetech/gourmetj/UserSession.java +++ b/src/main/java/com/mousetech/gourmetj/UserSession.java @@ -5,6 +5,10 @@ import java.io.Serializable; import javax.enterprise.context.SessionScoped; import javax.inject.Named; +import org.primefaces.PrimeFaces; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.mousetech.gourmetj.persistence.model.Category; import com.mousetech.gourmetj.persistence.model.Recipe; @@ -18,6 +22,12 @@ public class UserSession implements Serializable { private static final long serialVersionUID = 7449440266704831598L; + /* Logger */ + + private static final Logger log = + LoggerFactory.getLogger(UserSession.class); + + private String lastSearch = ""; /** @@ -112,7 +122,7 @@ public class UserSession implements Serializable { } return sb.toString(); } - + public String formatTime(Long ltime) { if (ltime == null) { return ""; @@ -145,4 +155,28 @@ public class UserSession implements Serializable { } return sb.toString().trim(); } + + // Primefaces handle session timeout + + /** + * Session timeout, msec. + */ + private long sessionTimeoutInterval = 300000; + + /** + * @return the sessionTimeoutInterval + */ + public long getSessionTimeoutInterval() { + return sessionTimeoutInterval; + } + + public void sessionIdleListener() { + log.warn("Session Idle Listener fired."); + PrimeFaces.current() + .executeScript("sessionExpiredConfirmation.show()"); + } + + public void logoutAction() { + log.warn("Session Idle listener logout"); + } } diff --git a/src/main/resources/META-INF/resources/WEB-INF/layout/layout.xhtml b/src/main/resources/META-INF/resources/WEB-INF/layout/layout.xhtml index 81e8ad0..b865631 100644 --- a/src/main/resources/META-INF/resources/WEB-INF/layout/layout.xhtml +++ b/src/main/resources/META-INF/resources/WEB-INF/layout/layout.xhtml @@ -29,6 +29,30 @@ href="http://www.apache.org/licenses/LICENSE-2.0" >Apache License, Version 2.0.

Based on Gourmet Recipe Manager by T. Hinkle

+ + + + + + + + diff --git a/src/main/resources/META-INF/resources/detailEdit.xhtml b/src/main/resources/META-INF/resources/detailEdit.xhtml index 6837053..f96d4a4 100644 --- a/src/main/resources/META-INF/resources/detailEdit.xhtml +++ b/src/main/resources/META-INF/resources/detailEdit.xhtml @@ -12,6 +12,7 @@ Gourmet Recipe Manager +