diff --git a/pom.xml b/pom.xml
index 095566f..38ba1c5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
com.mousetech.gourmet
gourmetj
- 0.2.7
+ 0.2.8
jar
GourmetJ
diff --git a/src/main/java/com/mousetech/gourmetj/AdminMainBean.java b/src/main/java/com/mousetech/gourmetj/AdminMainBean.java
index 24ddd91..2b2bc7e 100644
--- a/src/main/java/com/mousetech/gourmetj/AdminMainBean.java
+++ b/src/main/java/com/mousetech/gourmetj/AdminMainBean.java
@@ -68,7 +68,8 @@ public class AdminMainBean implements Serializable {
}
/**
- * @param cookieBean the cookieBean to set
+ * @param cookieBean the cookieBean to set.
+ * @deprecated Not invoked by @Inject
*/
public void setCookieBean(CookieBean cookieBean) {
this.cookieBean = cookieBean;
@@ -210,13 +211,6 @@ public class AdminMainBean implements Serializable {
}
searchText = searchText.trim();
- // Persist current settings
- try {
- cookieBean.saveCookies();
- } catch (UnsupportedEncodingException e) {
- // Something is really wrong if we can't create UTF-8!
- log.error("Unable to save cookies!", e);
- }
RecipeSearchType st = searchtypeEnum();
switch (st) {
case rst_BY_NAME:
diff --git a/src/main/java/com/mousetech/gourmetj/CookieBean.java b/src/main/java/com/mousetech/gourmetj/CookieBean.java
index c18399e..9abe55e 100644
--- a/src/main/java/com/mousetech/gourmetj/CookieBean.java
+++ b/src/main/java/com/mousetech/gourmetj/CookieBean.java
@@ -17,7 +17,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.annotation.PostConstruct;
-import jakarta.enterprise.context.RequestScoped;
+import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
/**
@@ -28,7 +28,7 @@ import jakarta.inject.Named;
* @since Jan 31, 2024
*/
@Named
-@RequestScoped
+@ViewScoped
public class CookieBean {
private static final String KEY_DISPLAY_ROWS = "displayRows";
@@ -44,10 +44,15 @@ public class CookieBean {
private Map cookieMap;
+ final Map properties = new HashMap<>();
+
/**
* Constructor.
*/
public CookieBean() {
+ properties.put("maxAge", 31536000);
+ properties.put("path", "/");
+ properties.put("SameSite", "Strict");
}
@PostConstruct
@@ -63,11 +68,6 @@ public class CookieBean {
*/
public void saveCookies()
throws UnsupportedEncodingException {
- final Map properties = new HashMap<>();
- properties.put("maxAge", 31536000);
- properties.put("path", "/");
- properties.put("SameSite", "Strict");
-
for (Entry e : cookieMap.entrySet()) {
JSFUtils.outputCookie(e.getKey(), e.getValue(),
properties);
@@ -86,6 +86,13 @@ public class CookieBean {
public void setCookieValue(String name, String value) {
cookieMap.put(name, value);
+ try {
+ JSFUtils.outputCookie(name, value, properties);
+ } catch (UnsupportedEncodingException e) {
+ // Should never happen. But...
+ log.error("Unable to encode cookie", e);
+ e.printStackTrace();
+ }
}
// ************************
@@ -97,7 +104,7 @@ public class CookieBean {
}
public void setSearchText(String value) {
- cookieMap.put(KEY_SEARCH_FOR, value);
+ setCookieValue(KEY_SEARCH_FOR, value);
}
// **
@@ -110,7 +117,8 @@ public class CookieBean {
}
public void setSearchType(Integer value) {
- cookieMap.put(KEY_SEARCH_TYPE, String.valueOf(value));
+ String st = String.valueOf(value);
+ setCookieValue(KEY_SEARCH_TYPE, st);
}
// **
@@ -123,11 +131,13 @@ public class CookieBean {
}
public void setDisplayListSize(Integer value) {
- cookieMap.put(KEY_DISPLAY_ROWS, String.valueOf(value));
+ setCookieValue(KEY_DISPLAY_ROWS, String.valueOf(value));
}
/**
* IdleMonitor backing methods (session/View timeout)
+ * Todo: move to a more general location. Currently
+ * only used by view editor, not Main!
*/
public void sessionIdleListener() {
log.info("Session Idle Listener fired.");
diff --git a/src/main/java/com/mousetech/gourmetj/JSFUtils.java b/src/main/java/com/mousetech/gourmetj/JSFUtils.java
index c2f4027..ed7e0aa 100644
--- a/src/main/java/com/mousetech/gourmetj/JSFUtils.java
+++ b/src/main/java/com/mousetech/gourmetj/JSFUtils.java
@@ -3,6 +3,7 @@
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import java.net.http.HttpResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
@@ -12,6 +13,7 @@ import jakarta.faces.context.ExternalContext;
import jakarta.faces.context.FacesContext;
import jakarta.faces.context.Flash;
import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.slf4j.Logger;
@@ -126,29 +128,52 @@ public class JSFUtils {
/**
* Get cookie values.
*/
- public static Map getCookies(){
- Map m0 = getExternalContext().getRequestCookieMap();
- Mapm1 = new HashMap();
- m1 = m0.entrySet()
- .stream()
- .collect(Collectors.toMap(
- e -> e.getKey(),
- e -> ((Cookie)e.getValue()).getValue()));
+ public static Map getCookies() {
+ Map m0 =
+ getExternalContext().getRequestCookieMap();
+ Map m1 = new HashMap();
+ m1 = m0.entrySet().stream()
+ .collect(Collectors.toMap(e -> e.getKey(),
+ e -> ((Cookie) e.getValue()).getValue()));
return m1;
}
+ public static String getCookie(String cookieName) {
+ Map map =
+ getExternalContext().getRequestCookieMap();
+ if (map == null) {
+ return null; // no cookies at all
+ }
+ Cookie cookie = (Cookie) map.get(cookieName);
+ if (cookie == null) {
+ return null;
+ }
+ return cookie.getValue();
+ }
+
/**
* Set a cookie value in Response.
- * @param name Cookie name
- * @param value Cookie value
- * @param properties Cookie property Map (timeout, etc.)
- * @throws UnsupportedEncodingException
+ *
+ * @param name Cookie name
+ * @param value Cookie value
+ * @param properties Cookie property Map (timeout,
+ * etc.)
+ * @throws UnsupportedEncodingException
*/
- public static void outputCookie(String name,
- String value, Map properties) throws UnsupportedEncodingException {
- getExternalContext().addResponseCookie(name,
- URLEncoder.encode(value, "UTF-8"),
- properties);
+ public static void outputCookie(String name, String value,
+ Map properties)
+ throws UnsupportedEncodingException {
+// getExternalContext().addResponseCookie(name,
+// URLEncoder.encode(value, "UTF-8"),
+// properties);
+
+ Cookie cookie = new Cookie(name, value);
+ cookie.setMaxAge(31536000);
+ cookie.setPath("/");
+ jakarta.servlet.http.HttpServletResponse resp =
+ (HttpServletResponse) getExternalContext()
+ .getResponse();
+ resp.addCookie(cookie);
}
/**
diff --git a/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java b/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java
index 2c3cde0..d13d518 100644
--- a/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java
+++ b/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java
@@ -720,7 +720,6 @@ public class RecipeDetailBean implements Serializable {
}
if (recipeService.save(this.getRecipe())) {
- ////////////userSession.setRecipe(null);
return "recipeDetails?faces-redirect=true";
} else {
JSFUtils.addErrorMessage("Save recipe failed");
diff --git a/src/main/resources/META-INF/resources/main.xhtml b/src/main/resources/META-INF/resources/main.xhtml
index 1bf70d3..8629dbd 100644
--- a/src/main/resources/META-INF/resources/main.xhtml
+++ b/src/main/resources/META-INF/resources/main.xhtml
@@ -1,4 +1,5 @@
+