Hi Jeff, You're welcome. If it causes any problems for you please post them here. I think it's OK but I'm no portlet expert so it could break something! Ate will be able to tell us for sure.
Colin. > -----Original Message----- > From: Jeff Sheets [mailto:[EMAIL PROTECTED] > Sent: 09 March 2005 14:13 > To: Jetspeed Users List > Subject: Re: Struts bridge, lost request parameters > > > Hey Colin, > > I'll try out your "quick fix" for the edit page bug. We have really > needed this fixed, and I was stumped on what was wrong, so thank you > very much! > > -- Jeff > > On Wed, 9 Mar 2005 10:44:22 -0000, Colin O'Toole > <[EMAIL PROTECTED]> wrote: > > Hi Ate, > > > > This is OT, but there is another problem I have fixed locally. > This is the > > edit page problem reported originally reported by Jeff Sheets. > The problem > > is that when a submit is performed from an edit page, pressing > the button to > > change to view mode doesn't work anymore. > > > > The problem occurs in StrutsPortlet when the defaultPage (from the > > portlet.xml) is overridden by the pageURL value from the > StrutsPortletURL. > > This mechanism doesn't take into account the fact that the > portlet mode may > > have changed. So what happens is that clicking the icon to go > to VIEW mode > > issues a doView(), which calls processRequest(), which pulls > the _edit_ url > > from the StrutsPortletURL and uses it instead of the ViewPage > url specified > > in portlet.xml. > > > > I needed a fix for a demo, so what I did was: > > > > (1) In StrutsPortletURL v1.4. Add a portlet mode. > > > > public static final String PORTLETMODE = "_mode"; > > > > - Line 61 changes from this: > > > > if (actionURL) > > { > > String originURL = request.getParameter(PAGE); > > if (originURL != null) > > portletURL.setParameter(ORIGIN, originURL); > > } > > return portletURL; > > } > > > > - To this: > > > > if (actionURL) > > { > > String originURL = request.getParameter(PAGE); > > if (originURL != null) > > portletURL.setParameter(ORIGIN, originURL); > > } > > > > // Add the portlet mode to the request, we will only > use the pageURL param > > to override the > > // default page if the portlet mode for this URL is the > same as the current > > mode when > > // StrutsPortlet.processRequest() is executed > > PortletRequest portletRequest = > > (PortletRequest)request.getAttribute("javax.portlet.request"); > > String portletMode = portletRequest.getPortletMode().toString(); > > log.debug("portletMode is: " + portletMode); > > portletURL.setParameter(PORTLETMODE, portletMode); > > > > return portletURL; > > } > > > > (2) In StrutsPortlet v1.12. If there is a pageURL in the > request, only use > > it if the mode associated with it is the same as the current > portlet mode: > > > > - Line 313 changes from > > > > String path = null; > > String pageURL = request.getParameter(StrutsPortletURL.PAGE); > > if (pageURL == null) > > path = defaultPage > > else > > { > > path = pageURL; > > } > > > > - To: > > > > String path = null; > > String pageURL = request.getParameter(StrutsPortletURL.PAGE); > > String portletModeFromURL = > > request.getParameter(StrutsPortletURL.PORTLETMODE); > > String portletModeCurrent = request.getPortletMode().toString(); > > log.debug("portletModeFromURL: " + portletModeFromURL + ", > > portletModeCurrent: " + portletModeCurrent); > > if (pageURL == null) { > > log.debug("pageURL from request is null, using default page: " + > > defaultPage); > > path = defaultPage; > > } > > else { > > // only use the pageURL if the portlet mode associated > with it is the same > > as the > > // portlet mode for the current request > > if(( portletModeFromURL != null) && > > (portletModeFromURL.equalsIgnoreCase(portletModeCurrent))) { > > log.debug("pageURL from request is:" + pageURL); > > path = pageURL; > > } > > else { > > log.debug("Not using pageURL as portlet mode has changed from " > > + portletModeFromURL + " to " + portletModeCurrent); > > path = defaultPage; > > } > > } > > > > - Line 394 changes from: > > > > if (pageURL != null) > > { > > if (renderURL == null && log.isWarnEnabled()) > > log.warn("Warning: Using the original action URL for > render URL: " > > +pageURL+".\nA redirect should have been issued."); > > ((ActionResponse) > response).setRenderParameter(StrutsPortletURL.PAGE, > > pageURL); > > } > > > > - To: > > > > if (pageURL != null) > > { > > if (renderURL == null && log.isWarnEnabled()) > > log.warn("Warning: Using the original action URL for > render URL: " > > +pageURL+".\nA redirect should have been issued."); > > ((ActionResponse) > response).setRenderParameter(StrutsPortletURL.PAGE, > > pageURL); > > > > // NEW - add portletMode to render response > > ((ActionResponse) > > response).setRenderParameter(StrutsPortletURL.PORTLETMODE, > > portletModeFromURL); > > } > > > > As I said this is a quick fix. I'd like to keep in sync with your > > 'official' releases if possible. Can you tell me if this bug > is on your hit > > list for the next release? > > > > Colin. > > > > > -----Original Message----- > > > From: Colin O'Toole [mailto:[EMAIL PROTECTED] > > > Sent: 09 March 2005 10:08 > > > To: Jetspeed Users List > > > Subject: RE: Struts bridge, lost request parameters > > > > > > > > > Hi Ate, > > > > > > I had some time to take a look at this yesterday and the situation is: > > > > > > PortletServletRequestWrapper now extends > HttpServletRequestWrapper rather > > > than DispatchedHttpServletRequestWrapper. The > > > DispatchedHttpServletRequestWrapper constructor accepts the > > > queryString from > > > the path and the parameters were parsed into a map. The > params could then > > > be retrieved by calling getParameter(), getParameterNames() etc. > > > HttpServletRequestWrapper doesn't make the original params > > > available in the > > > same way. > > > > > > I modified the code from the head to make PortletServletRequestWrapper > > > extend DispatchedHttpServletRequestWrapper once more (and > > > obviously restore > > > DispatchedHttpServletRequestWrapper to the > > > org.apache.portals.bridges.struts.util package from where it > was deleted). > > > My app now works correctly as before. > > > > > > I'm sure DispatchedHttpServletRequestWrapper was removed for > a reason, so > > > this is likely no more than a temporary solution. > > > > > > Hope this helps, > > > > > > Colin. > > > > > > > > > > > Colin, I will try to look at you problem later this evening or > > > > otherwise tomorrow evening. > > > > > > > > Ate > > > > > > > > Colin O'Toole wrote: > > > > > Hi all, > > > > > > > > > > I was using Struts portlet 0.2 with my app and it was working > > > fine, I've > > > > > upgraded to the latest version from CVS and I'm now losing request > > > > > parameters. > > > > > > > > > > I have a action that is returning an ActionRedirect (a subclass of > > > > > ActionForward used for redirects) to a new action. Some > > > parameters are > > > > > being added to the ActionRedirect. So it looks like this: > > > > > > > > > > (1) ViewAction.do has a submit to Filter.do (This is a portlet > > > > action URL) > > > > > (2) Filter.do does a redirect (with parameters) to ViewAction.do > > > > > (3) PopulateForm in ViewAction.do calls getParameter(XXX) > > > which returns > > > > > null. > > > > > > > > > > In Struts-portlet 0.2, the PortletRequestObject object in Step > > > > (3) contains: > > > > > > > > > > - An ApplicationContextFacade > > > > > - A Map of parameters containing the params from the redirect. > > > > > - A ServletRequestImpl > > > > > > > > > > In The latest version, the PortletRequestObject object in Step > > > > (3) contains: > > > > > > > > > > - An ApplicationContextFacade > > > > > - No parameter map! > > > > > - A ServletRequestImpl. This contains a > > > > ApplicationHttpRequestObject. The > > > > > queryParamString member of the ApplicationHttpRequestObject > > > > holds the params > > > > > from the redirect. In Struts-portlet 0.2 this > > > QueryParamString is null. > > > > > > > > > > So something has changed between 0.2 and now that has broken my > > > > app - I'm > > > > > unsure if this is a struts-portlet bug or whether I need to > > > do something > > > > > extra to make this work. > > > > > > > > > > Any help would be appreciated, > > > > > > > > > > Colin. > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > To unsubscribe, e-mail: > [EMAIL PROTECTED] > > > > > For additional commands, e-mail: > [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > For additional commands, e-mail: > [EMAIL PROTECTED] > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
