You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/06/02 21:06:54 UTC

cvs commit: jakarta-tapestry/portlet/src/java/org/apache/tapestry/portlet RenderService.java

hlship      2005/06/02 12:06:54

  Modified:    portlet/src/descriptor/META-INF
                        tapestry.portlet.services.xml
               portlet/src/java/org/apache/tapestry/portlet
                        RenderService.java
  Added:       portlet/src/test/org/apache/tapestry/portlet
                        TestRenderService.java
  Log:
  Properly identify when portal mode or window state has changed.
  
  Revision  Changes    Path
  1.1                  jakarta-tapestry/portlet/src/test/org/apache/tapestry/portlet/TestRenderService.java
  
  Index: TestRenderService.java
  ===================================================================
  package org.apache.tapestry.portlet;
  
  import javax.portlet.PortletMode;
  import javax.portlet.PortletRequest;
  import javax.portlet.WindowState;
  
  import org.apache.hivemind.test.HiveMindTestCase;
  import org.apache.tapestry.IRequestCycle;
  import org.apache.tapestry.services.ServiceConstants;
  import org.easymock.MockControl;
  
  /**
   * Test for {@link org.apache.tapestry.portlet.RenderService}.
   * 
   * @author Howard M. Lewis Ship
   * @since 4.0
   */
  public class TestRenderService extends HiveMindTestCase
  {
      public void testGetLinkUnsupported()
      {
          RenderService rs = new RenderService();
  
          try
          {
              rs.getLink(null, null);
              unreachable();
          }
          catch (UnsupportedOperationException ex)
          {
              // Hm. Not actually the best message!
              assertEquals("Method getLink() is not supported for portlet requests.", ex.getMessage());
          }
      }
  
      public void testNormal() throws Exception
      {
          MockControl cyclec = newControl(IRequestCycle.class);
          IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
  
          MockControl requestc = newControl(PortletRequest.class);
          PortletRequest request = (PortletRequest) requestc.getMock();
  
          PortletRenderer renderer = (PortletRenderer) newMock(PortletRenderer.class);
  
          trainGetParameter(cyclec, cycle, PortletConstants.PORTLET_MODE, "view");
          trainGetParameter(cyclec, cycle, PortletConstants.WINDOW_STATE, "normal");
  
          trainGetPortletMode(requestc, request, PortletMode.VIEW);
          trainGetWindowState(requestc, request, WindowState.NORMAL);
  
          trainGetParameter(cyclec, cycle, ServiceConstants.PAGE, "Fred");
  
          renderer.renderPage(cycle, "Fred");
  
          replayControls();
  
          RenderService rs = new RenderService();
          rs.setPortletRenderer(renderer);
          rs.setRequest(request);
  
          rs.service(cycle);
  
          verifyControls();
      }
  
      public void testPortletModeChanged() throws Exception
      {
          MockControl cyclec = newControl(IRequestCycle.class);
          IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
  
          MockControl requestc = newControl(PortletRequest.class);
          PortletRequest request = (PortletRequest) requestc.getMock();
  
          PortletRenderer renderer = (PortletRenderer) newMock(PortletRenderer.class);
  
          PortletPageResolver resolver = newResolver(cycle, "Barney");
  
          trainGetParameter(cyclec, cycle, PortletConstants.PORTLET_MODE, "view");
          trainGetParameter(cyclec, cycle, PortletConstants.WINDOW_STATE, "normal");
  
          trainGetPortletMode(requestc, request, PortletMode.EDIT);
  
          renderer.renderPage(cycle, "Barney");
  
          replayControls();
  
          RenderService rs = new RenderService();
          rs.setPortletRenderer(renderer);
          rs.setRequest(request);
          rs.setPageResolver(resolver);
  
          rs.service(cycle);
  
          verifyControls();
      }
  
      public void testWindowStateChanged() throws Exception
      {
          MockControl cyclec = newControl(IRequestCycle.class);
          IRequestCycle cycle = (IRequestCycle) cyclec.getMock();
  
          MockControl requestc = newControl(PortletRequest.class);
          PortletRequest request = (PortletRequest) requestc.getMock();
  
          PortletRenderer renderer = (PortletRenderer) newMock(PortletRenderer.class);
  
          PortletPageResolver resolver = newResolver(cycle, "Wilma");
  
          trainGetParameter(cyclec, cycle, PortletConstants.PORTLET_MODE, "view");
          trainGetParameter(cyclec, cycle, PortletConstants.WINDOW_STATE, "normal");
  
          trainGetPortletMode(requestc, request, PortletMode.VIEW);
          trainGetWindowState(requestc, request, WindowState.MAXIMIZED);
  
          renderer.renderPage(cycle, "Wilma");
  
          replayControls();
  
          RenderService rs = new RenderService();
          rs.setPortletRenderer(renderer);
          rs.setRequest(request);
          rs.setPageResolver(resolver);
  
          rs.service(cycle);
  
          verifyControls();
      }
  
      private PortletPageResolver newResolver(IRequestCycle cycle, String pageName)
      {
          MockControl control = newControl(PortletPageResolver.class);
          PortletPageResolver resolver = (PortletPageResolver) control.getMock();
  
          resolver.getPageNameForRequest(cycle);
          control.setReturnValue(pageName);
  
          return resolver;
      }
  
      private void trainGetWindowState(MockControl control, PortletRequest request, WindowState state)
      {
          request.getWindowState();
          control.setReturnValue(state);
      }
  
      private void trainGetPortletMode(MockControl control, PortletRequest request, PortletMode mode)
      {
          request.getPortletMode();
          control.setReturnValue(mode);
      }
  
      private void trainGetParameter(MockControl control, IRequestCycle cycle, String name,
              String value)
      {
          cycle.getParameter(name);
          control.setReturnValue(value);
      }
  }
  
  
  
  1.14      +2 -0      jakarta-tapestry/portlet/src/descriptor/META-INF/tapestry.portlet.services.xml
  
  Index: tapestry.portlet.services.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/portlet/src/descriptor/META-INF/tapestry.portlet.services.xml,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- tapestry.portlet.services.xml	2 Jun 2005 13:35:10 -0000	1.13
  +++ tapestry.portlet.services.xml	2 Jun 2005 19:06:54 -0000	1.14
  @@ -95,6 +95,8 @@
     <invoke-factory>
       <construct class="RenderService">
         <set-service property="portletRenderer" service-id="PortletRenderer"/>
  +      <set-service property="request" service-id="tapestry.portlet.PortletRequest"/>
  +      <set-service property="pageResolver" service-id="tapestry.portlet.resolver.PortletPageResolver"/>
       </construct>
     </invoke-factory>  
    </service-point>
  
  
  
  1.5       +53 -2     jakarta-tapestry/portlet/src/java/org/apache/tapestry/portlet/RenderService.java
  
  Index: RenderService.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tapestry/portlet/src/java/org/apache/tapestry/portlet/RenderService.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- RenderService.java	18 Apr 2005 17:08:38 -0000	1.4
  +++ RenderService.java	2 Jun 2005 19:06:54 -0000	1.5
  @@ -16,6 +16,8 @@
   
   import java.io.IOException;
   
  +import javax.portlet.PortletRequest;
  +
   import org.apache.tapestry.IRequestCycle;
   import org.apache.tapestry.engine.IEngineService;
   import org.apache.tapestry.engine.ILink;
  @@ -23,7 +25,19 @@
   
   /**
    * Responsible for rendering out a page; a Portlet render URL is built during action processing that
  - * stores the active page; this is the page that will be rendered.
  + * stores the active page; this is the page that will be rendered. The render service is (typically)
  + * the only service that operates during a portlet RenderRequest. All other services will be an
  + * ActionRequest that (via {@link org.apache.tapestry.portlet.PortletResponseRenderer}, writes
  + * query parameters to activate this service during the render request.
  + * <p>
  + * Problematic is is anything related to the portlet mode or window state. As per the Portlet spec,
  + * when the user clicks the "help" or "edit" buttons (or the minimize, maximize, etc.), this causes
  + * a new RenderRequest, but explicitly keeps the render parameters set by the most recent
  + * ActionRequest. But what Tapestry needs is to detect that the mode or state has changed and select
  + * a different page to render the response. So we store the mode and state in effect when the
  + * ActionRequest executed as two more query parameters, and detect changes to mode and state that
  + * way. If there is a change, then we ignore the page query parameter and use the
  + * {@link PortletPageResolver} to figure out the correct page to display instead.
    * 
    * @author Howard M. Lewis Ship
    * @since 4.0
  @@ -31,8 +45,12 @@
    */
   public class RenderService implements IEngineService
   {
  +    private PortletRequest _request;
  +
       private PortletRenderer _portletRenderer;
   
  +    private PortletPageResolver _pageResolver;
  +
       public ILink getLink(IRequestCycle cycle, Object parameter)
       {
           throw new UnsupportedOperationException(PortletMessages.unsupportedMethod("getLink"));
  @@ -40,11 +58,34 @@
   
       public void service(IRequestCycle cycle) throws IOException
       {
  -        String pageName = cycle.getParameter(ServiceConstants.PAGE);
  +        String pageName = getPageNameToRender(cycle);
   
           _portletRenderer.renderPage(cycle, pageName);
       }
   
  +    private String getPageNameToRender(IRequestCycle cycle)
  +    {
  +        if (isStateChange(cycle))
  +            return _pageResolver.getPageNameForRequest(cycle);
  +
  +        return cycle.getParameter(ServiceConstants.PAGE);
  +    }
  +
  +    /**
  +     * Returns true if the portlet mode or the window state has changed since. The values stored
  +     * previously (during an action request) are compared to the current values.
  +     */
  +
  +    boolean isStateChange(IRequestCycle cycle)
  +    {
  +        String expectedPortletMode = cycle.getParameter(PortletConstants.PORTLET_MODE);
  +        String expectedWindowState = cycle.getParameter(PortletConstants.WINDOW_STATE);
  +
  +        return !(_request.getPortletMode().toString().equals(expectedPortletMode) && _request
  +                .getWindowState().toString().equals(expectedWindowState));
  +
  +    }
  +
       public String getName()
       {
           return PortletConstants.RENDER_SERVICE;
  @@ -54,4 +95,14 @@
       {
           _portletRenderer = portletRenderer;
       }
  +
  +    public void setRequest(PortletRequest request)
  +    {
  +        _request = request;
  +    }
  +
  +    public void setPageResolver(PortletPageResolver pageResolver)
  +    {
  +        _pageResolver = pageResolver;
  +    }
   }
  \ No newline at end of file
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org