You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Jacques Le Roux <ja...@les7arts.com> on 2009/03/05 19:23:45 UTC

Re: svn commit: r749959 - in /ofbiz/trunk: applications/ecommerce/webapp/ecommerce/WEB-INF/ framework/common/webcommon/WEB-INF/ framework/common/webcommon/includes/ framework/webapp/dtd/ framework/webapp/src/org/ofbiz/webapp/control/

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="<@o...@ofbizUrl>?newLocale=${availableLocale.toString()}">${availableLocale.getDisplayName(availableLocale)}</a>
> +                <a 
> href="<@o...@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) {
>
> 



Re: svn commit: r749959 - in /ofbiz/trunk: applications/ecommerce/webapp/ecommerce/WEB-INF/ framework/common/webcommon/WEB-INF/ framework/common/webcommon/includes/ framework/webapp/dtd/ framework/webapp/src/org/ofbiz/webapp/control/

Posted by Jacques Le Roux <ja...@les7arts.com>.
It works great!

Jacques

From: "David E Jones" <da...@hotwaxmedia.com>
>
> 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="<@o...@ofbizUrl>? newLocale=${availableLocale.toString()}">$ 
>>>> {availableLocale.getDisplayName(availableLocale)}</a>
>>>> +                <a href="<@o...@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) {
>>>>
>>>
>>>
>>
> 



Re: svn commit: r749959 - in /ofbiz/trunk: applications/ecommerce/webapp/ecommerce/WEB-INF/ framework/common/webcommon/WEB-INF/ framework/common/webcommon/includes/ framework/webapp/dtd/ framework/webapp/src/org/ofbiz/webapp/control/

Posted by David E Jones <da...@hotwaxmedia.com>.
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="<@o...@ofbizUrl>? 
>>> newLocale=${availableLocale.toString()}">$ 
>>> {availableLocale.getDisplayName(availableLocale)}</a>
>>> +                <a href="<@o...@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) {
>>>
>>
>>
>


Re: svn commit: r749959 - in /ofbiz/trunk: applications/ecommerce/webapp/ecommerce/WEB-INF/ framework/common/webcommon/WEB-INF/ framework/common/webcommon/includes/ framework/webapp/dtd/ framework/webapp/src/org/ofbiz/webapp/control/

Posted by David E Jones <da...@hotwaxmedia.com>.
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="<@o...@ofbizUrl>? 
>> newLocale=${availableLocale.toString()}">$ 
>> {availableLocale.getDisplayName(availableLocale)}</a>
>> +                <a href="<@o...@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) {
>>
>
>