After looking into this more, I think I found what you were running into. If you go to the product detail page, ie something like:

http://localhost:8080/ecommerce/catalog/PROMOTIONS/p_GZ-2644

and then change the locale using the drop-down in the "Language" box on the right, then you'll get that error message.

Looking back this would not have worked for either of my earlier commits. It did work in between, in fact it was the main test case I used (which is part of why what you described didn't make sense, along with the fact that I was having trouble figuring out what in the UI you were referring to).

The code I added later to "fix" the serialization problem had a ! in the wrong place so it was removing everything from the Map. The problem turned out to be that the RequestHandler implemented the Serializable interface, but it wasn't really even close to serializable, and after playing with it and trying to make it serializable I decided that it didn't make any sense for it to be given what it does and the objects it depends on... so it isn't any more.

This is now fixed, and with no startup or shutdown exceptions, as of rev 750572.

-David


On Mar 5, 2009, at 11:35 AM, David E Jones wrote:


I wrote this stuff and what you wrote still doesn't make any sense to me...

Are you saying this is an issue with the latest version? Are you using the second commit which fixed these issues or are you saying that somehow you don't want to use that and we should fix it in a different way?

-David


On Mar 5, 2009, at 11:23 AM, Jacques Le Roux wrote:

I like this feature. In eCommerce it works well in simple cases, but not when you have selected a product and want to change language (we get "Product not found for Product ID !") and suppose to get right back to the selected product. I 1st thought it was because we have no productId in the URL, so I reverted 743985. As it was not working, I traced a bit and saw that _LAST_VIEW_PARAMS_ was empty when "view-last" is executed (in RequestHandler.doRequest()). This is because UtilMisc.makeMapSerializable(paramMap); remove the URL parameters (only present if you revert 743985).

I'd like to allow this feature in thid case. I'd appreciate advises

Thanks

Jacques

Author: jonesde
Date: Wed Mar  4 10:27:52 2009
New Revision: 749959

URL: http://svn.apache.org/viewvc?rev=749959&view=rev
Log:
Simple implementation of feature discussed on the mailing list to facilitate getting back to a view after some generic action, like schanging the locale which this commit has use the new feature as a test case; I'm not sure I like this approach, will send message to dev list about it

Modified:
ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ controller.xml ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml
 ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl
 ofbiz/trunk/framework/webapp/dtd/site-conf.xsd
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ ConfigXMLReader.java ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ RequestHandler.java

Modified: ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB- INF/controller.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml?rev=749959&r1=749958&r2=749959&view=diff
= = = = = = = = = = ==================================================================== --- ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ controller.xml (original) +++ ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ controller.xml Wed Mar 4 10:27:52 2009
@@ -140,7 +140,7 @@
  <request-map uri="setSessionLocale">
      <security https="false" auth="false"/>
<event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionLocale"/>
-        <response name="success" type="view" value="main"/>
+        <response name="success" type="view-last" value="main"/>
      <response name="error" type="view" value="main"/>
  </request-map>


Modified: ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml?rev=749959&r1=749958&r2=749959&view=diff
= = = = = = = = = = ==================================================================== --- ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml (original) +++ ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml Wed Mar 4 10:27:52 2009
@@ -88,26 +88,20 @@
  </request-map>

  <!-- Common Mappings used for locales and timezones -->
+ <request-map uri="LookupLocales"><security https="true" auth="false"/><response name="success" type="view" value="LookupLocales" save-last-view="true"/></request-map>
  <request-map uri="setSessionLocale">
      <security https="true" auth="false"/>
<event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionLocale"/>
-        <response name="success" type="request" value="main"/>
+        <response name="success" type="view-last" value="main"/>
      <response name="error" type="request" value="main"/>
  </request-map>
+ <request-map uri="LookupTimezones"><security https="true" auth="false"/><response name="success" type="view" value="LookupTimezones"/></request-map>
  <request-map uri="setSessionTimeZone">
      <security https="true" auth="false"/>
<event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionTimeZone"/>
      <response name="success" type="request" value="main"/>
      <response name="error" type="request" value="main"/>
  </request-map>
-    <request-map uri="LookupLocales">
-        <security https="true" auth="false" />
- <response name="success" type="view" value="LookupLocales" />
-    </request-map>
-    <request-map uri="LookupTimezones">
-        <security https="true" auth="false" />
- <response name="success" type="view" value="LookupTimezones" />
-    </request-map>

  <!-- User preference mapping -->
  <request-map uri="setUserPreference">

Modified: ofbiz/trunk/framework/common/webcommon/includes/ listLocales.ftl
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl?rev=749959&r1=749958&r2=749959&view=diff
= = = = = = = = = = ==================================================================== --- ofbiz/trunk/framework/common/webcommon/includes/ listLocales.ftl (original) +++ ofbiz/trunk/framework/common/webcommon/includes/ listLocales.ftl Wed Mar 4 10:27:52 2009
@@ -51,7 +51,7 @@
      </#if>
      <tr <#if altRow>class="alternate-row"</#if>>
          <td lang="${langAttr}" dir="${langDir}">
- <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? newLocale=${availableLocale.toString()}">$ {availableLocale.getDisplayName(availableLocale)}</a> + <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? newLocale=${availableLocale.toString()}">$ {availableLocale.getDisplayName(availableLocale)} [$ {availableLocale.toString()}]</a>
          </td>
      </tr>
  </#list>

Modified: ofbiz/trunk/framework/webapp/dtd/site-conf.xsd
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?rev=749959&r1=749958&r2=749959&view=diff
= = = = = = = = = = ====================================================================
--- ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original)
+++ ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Wed Mar 4 10:27:52 2009
@@ -217,9 +217,9 @@
      </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="attlist.event">
-        <xs:attribute type="xs:string" name="type" use="required"/>
-        <xs:attribute type="xs:string" name="path"/>
-        <xs:attribute type="xs:string" name="invoke"/>
+        <xs:attribute name="type" type="xs:string" use="required"/>
+        <xs:attribute name="path" type="xs:string"/>
+        <xs:attribute name="invoke" type="xs:string"/>
      <xs:attribute name="global-transaction" default="true">
          <xs:simpleType>
              <xs:restriction base="xs:token">
@@ -238,12 +238,13 @@
      </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="attlist.response">
-        <xs:attribute type="xs:string" name="name" use="required"/>
+        <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="type" use="required">
          <xs:simpleType>
              <xs:restriction base="xs:token">
                  <xs:enumeration value="none"/>
                  <xs:enumeration value="view"/>
+ <xs:enumeration value="view- last"><xs:annotation><xs:documentation>Will use the view from the last request unless there is a saved from some previous request (using the save-last-view attribute).</xs:documentation></ xs:annotation></xs:enumeration>
                  <xs:enumeration value="request"/>
                  <xs:enumeration value="request-redirect"/>
                  <xs:enumeration value="request-redirect-noparam"/>
@@ -251,7 +252,16 @@
              </xs:restriction>
          </xs:simpleType>
      </xs:attribute>
-        <xs:attribute type="xs:string" name="value"/>
+        <xs:attribute name="value" type="xs:string"/>
+        <xs:attribute name="save-last-view" default="false">
+ <xs:annotation><xs:documentation>Saves the last (previous) request's view for future use, generally with the view- last type of response.</xs:documentation></xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
  </xs:attributeGroup>
  <xs:element name="redirect-parameter">
<xs:annotation><xs:documentation>Adds a parameter with the given name to the redirect. Finds value in a request attribute if exists, or a request parameter if no attribute is found.</ xs:documentation></xs:annotation>

Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ control/ConfigXMLReader.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=749959&r1=749958&r2=749959&view=diff
= = = = = = = = = = ==================================================================== --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ ConfigXMLReader.java (original) +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ ConfigXMLReader.java Wed Mar 4 10:27:52 2009
@@ -425,12 +425,14 @@
      public String name;
      public String type;
      public String value;
+        public boolean saveLastView = false;
public Map<String, String> redirectParameterMap = FastMap.newInstance();

      public RequestResponse(Element responseElement) {
          this.name = responseElement.getAttribute("name");
          this.type = responseElement.getAttribute("type");
          this.value = responseElement.getAttribute("value");
+ this.saveLastView = "true".equals(responseElement.getAttribute("save-last-view")); for (Element redirectParameterElement: UtilXml.childElementList(responseElement, "redirect-parameter")) { String from = redirectParameterElement.getAttribute("from"); if (UtilValidate.isEmpty(from)) from = redirectParameterElement.getAttribute("name");

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=749959&r1=749958&r2=749959&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 10:27:52 2009
@@ -448,7 +448,14 @@

if (Debug.verboseOn()) Debug.logVerbose("[Event Response Selected] type=" + nextRequestResponse.type + ", value=" + nextRequestResponse.value + ", sessionId=" + UtilHttp.getSessionId(request), module);

-        // Handle the responses - chains/views
+ // ========== Handle the responses - chains/views ==========
+
+ // 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_"));
+        }
+
if (nextRequestResponse != null && "request".equals(nextRequestResponse.type)) {
          // chained request
Debug.logInfo("[RequestHandler.doRequest]: Response is a chained request." + " sessionId=" + UtilHttp.getSessionId(request), module);
@@ -488,6 +495,28 @@
// check for an override view, only used if "success" = eventReturn String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value; renderView(viewName, requestMap.securityExternalView, request, response); + } else if ("view- last".equals(nextRequestResponse.type)) { + if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." + " sessionId=" + UtilHttp.getSessionId(request), module);
+
+ // check for an override view, only used if "success" = eventReturn + String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value;
+
+ // as a further override, look for the _SAVED and then _LAST session attributes
+                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_"); + } 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_");
+                }
+                if (urlParams != null) {
+ for (Map.Entry<String, Object> urlParamEntry: urlParams.entrySet()) { + request.setAttribute(urlParamEntry.getKey(), urlParamEntry.getValue());
+                    }
+                }
+
+ renderView(viewName, requestMap.securityExternalView, request, response);
          } else if ("none".equals(nextRequestResponse.type)) {
// no view to render (meaning the return was processed by the event) if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is handled by the event." + " sessionId=" + UtilHttp.getSessionId(request), module);
@@ -613,8 +642,13 @@

if (Debug.verboseOn()) Debug.logVerbose("[Getting View Map]: " + view + " sessionId=" + UtilHttp.getSessionId(req), module);

- // before mapping the view, set a session attribute so we know where we are + // 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);
+        req.getSession().setAttribute("_LAST_VIEW_NAME_", view);
+ req.getSession().setAttribute("_LAST_VIEW_URL_PARAMS_", queryStringParamMap);

ConfigXMLReader.ViewMap viewMap = (view == null ? null : getControllerConfig().viewMapMap.get(view));
      if (viewMap == null) {





Reply via email to