Author: jonesde
Date: Wed Mar 4 11:49:27 2009
New Revision: 749970
URL: http://svn.apache.org/viewvc?rev=749970&view=rev
Log:
Some improvements to the last view and view save code to handle request
attributes and more parameters, safe since they are never going int he URL or
anything; this resolves the issues I was running into before with this, and
hopefully with no side effects other than a few CPU cycles here and there; made
sure that the stuff is serializable before putting into the session
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilMisc.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilMisc.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilMisc.java?rev=749970&r1=749969&r2=749970&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilMisc.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilMisc.java Wed Mar 4
11:49:27 2009
@@ -18,6 +18,7 @@
*******************************************************************************/
package org.ofbiz.base.util;
+import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;
@@ -30,6 +31,8 @@
import java.util.TreeMap;
import java.util.TreeSet;
+import javax.servlet.ServletContext;
+
import javolution.util.FastList;
import javolution.util.FastMap;
import javolution.util.FastSet;
@@ -193,6 +196,34 @@
if (col != null) result.addAll(col);
return result;
}
+
+ /**
+ * This change a Map to be Serializable by removing all entries with
values that are not Serializable.
+ *
+ * @param <K>
+ * @param <V>
+ * @param map
+ * @return
+ */
+ public static <K, V> void makeMapSerializable(Map<K, V> map) {
+ // now filter out all non-serializable values
+ Set<K> keysToRemove = FastSet.newInstance();
+ for (Map.Entry<K, V> mapEntry: map.entrySet()) {
+ Object entryValue = mapEntry.getValue();
+ if (entryValue != null && !(entryValue instanceof Serializable)) {
+ keysToRemove.add(mapEntry.getKey());
+ //Debug.logInfo("Found Map value that is not Serializable: " +
mapEntry.getKey() + "=" + mapEntry.getValue(), module);
+ }
+ // this is very admittedly a hack, but this object seems to
implement Serializable and may not really be, without this keep getting the
error: "java.io.NotSerializableException:
org.apache.catalina.core.ApplicationContextFacade"
+ if (entryValue != null && !(entryValue instanceof ServletContext))
{
+ keysToRemove.add(mapEntry.getKey());
+ }
+ }
+ for (K keyToRemove: keysToRemove) { map.remove(keyToRemove); }
+ //if (!(map instanceof Serializable)) {
+ // Debug.logInfo("Parameter Map is not Serializable!", module);
+ //}
+ }
/**
* Sort a List of Maps by specified consistent keys.
Modified:
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=749970&r1=749969&r2=749970&view=diff
==============================================================================
---
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
(original)
+++
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
Wed Mar 4 11:49:27 2009
@@ -28,6 +28,7 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
@@ -35,6 +36,7 @@
import javax.servlet.http.HttpSession;
import javolution.util.FastMap;
+import javolution.util.FastSet;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.SSLUtil;
@@ -453,7 +455,7 @@
// if the request has the save-last-view attribute set, save it now
before the view can be rendered or other chain done so that the _LAST* session
attributes will represent the previous request
if (nextRequestResponse.saveLastView) {
session.setAttribute("_SAVED_VIEW_NAME_",
session.getAttribute("_LAST_VIEW_NAME_"));
- session.setAttribute("_SAVED_VIEW_URL_PARAMS_",
session.getAttribute("_LAST_VIEW_URL_PARAMS_"));
+ session.setAttribute("_SAVED_VIEW_PARAMS_",
session.getAttribute("_LAST_VIEW_PARAMS_"));
}
if (nextRequestResponse != null &&
"request".equals(nextRequestResponse.type)) {
@@ -505,10 +507,10 @@
Map<String, Object> urlParams = null;
if (session.getAttribute("_SAVED_VIEW_NAME_") != null) {
viewName = (String)
session.getAttribute("_SAVED_VIEW_NAME_");
- urlParams = (Map<String, Object>)
session.getAttribute("_SAVED_VIEW_URL_PARAMS_");
+ urlParams = (Map<String, Object>)
session.getAttribute("_SAVED_VIEW_PARAMS_");
} else if (session.getAttribute("_LAST_VIEW_NAME_") != null) {
viewName = (String)
session.getAttribute("_LAST_VIEW_NAME_");
- urlParams = (Map<String, Object>)
session.getAttribute("_LAST_VIEW_URL_PARAMS_");
+ urlParams = (Map<String, Object>)
session.getAttribute("_LAST_VIEW_PARAMS_");
}
if (urlParams != null) {
for (Map.Entry<String, Object> urlParamEntry:
urlParams.entrySet()) {
@@ -645,10 +647,13 @@
// before mapping the view, set a request attribute so we know where
we are
req.setAttribute("_CURRENT_VIEW_", view);
- // save the view in the session for the last view, plus the URL
parameters Map; note that this is saved after the request/view processing has
finished so when those run they will get the value from the previous request
- Map<String, Object> queryStringParamMap =
UtilHttp.getQueryStringOnlyParameterMap(req);
+ // save the view in the session for the last view, plus the parameters
Map (can use all parameters as they will never go into a URL, will only stay in
the session and extra data will be ignored as we won't go to the original
request just the view); note that this is saved after the request/view
processing has finished so when those run they will get the value from the
previous request
+ Map<String, Object> paramMap = UtilHttp.getParameterMap(req);
+ // add in the attributes as well so everything needed for the
rendering context will be in place if/when we get back to this view
+ paramMap.putAll(UtilHttp.getAttributeMap(req));
+ UtilMisc.makeMapSerializable(paramMap);
req.getSession().setAttribute("_LAST_VIEW_NAME_", view);
- req.getSession().setAttribute("_LAST_VIEW_URL_PARAMS_",
queryStringParamMap);
+ req.getSession().setAttribute("_LAST_VIEW_PARAMS_", paramMap);
ConfigXMLReader.ViewMap viewMap = (view == null ? null :
getControllerConfig().viewMapMap.get(view));
if (viewMap == null) {