View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.jetspeed.container;
18  
19  import java.io.IOException;
20  import java.util.Map;
21  
22  import javax.portlet.PortletMode;
23  import javax.portlet.WindowState;
24  import javax.servlet.http.HttpServletRequest;
25  import javax.servlet.http.HttpServletResponse;
26  
27  import org.apache.pluto.PortletContainer;
28  import org.apache.pluto.PortletContainerImpl;
29  import org.apache.pluto.core.InternalActionResponse;
30  import org.apache.pluto.om.window.PortletWindow;
31  import org.apache.pluto.services.information.DynamicInformationProvider;
32  import org.apache.pluto.services.information.InformationProviderAccess;
33  import org.apache.pluto.services.information.PortletURLProvider;
34  
35  import org.apache.jetspeed.desktop.JetspeedDesktop;
36  
37  /***
38   * Desktop Portlet Container implementation. This implementation 
39   * redirects only if the query paramater encoder=desktop is NOT specified.
40   * When the encoder=desktop parameter is specified, the 'redirect' URL 
41   * is returned in the response body for use by desktop javascript code.
42   * 
43   * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
44   * @version $Id: $
45   */
46  public class DesktopPortletContainerImpl extends PortletContainerImpl implements PortletContainer
47  {
48      private String desktopPipelinePath = null;
49      private String desktopActionPipelinePath = null;
50      private String desktopRenderPipelinePath = null;
51      
52      public DesktopPortletContainerImpl( String desktopPipelinePath, String desktopActionPipelinePath, String desktopRenderPipelinePath )
53      {
54          if ( desktopPipelinePath == null || desktopPipelinePath.length() == 0 )
55              desktopPipelinePath = JetspeedDesktop.DEFAULT_DESKTOP_PIPELINE_PATH;
56          if ( desktopPipelinePath.charAt( 0 ) != '/' )
57              desktopPipelinePath = "/" + desktopPipelinePath;
58          if ( desktopPipelinePath.charAt( desktopPipelinePath.length() -1 ) != '/' )
59              desktopPipelinePath = desktopPipelinePath + "/";
60          
61          if ( desktopActionPipelinePath == null || desktopActionPipelinePath.length() == 0 )
62              desktopActionPipelinePath = JetspeedDesktop.DEFAULT_DESKTOP_ACTION_PIPELINE_PATH;
63          if ( desktopActionPipelinePath.charAt( 0 ) != '/' )
64              desktopActionPipelinePath = "/" + desktopActionPipelinePath;
65          if ( desktopActionPipelinePath.charAt( desktopActionPipelinePath.length() -1 ) != '/' )
66              desktopActionPipelinePath = desktopActionPipelinePath + "/";
67  
68          if ( desktopRenderPipelinePath == null || desktopRenderPipelinePath.length() == 0 )
69              desktopRenderPipelinePath = JetspeedDesktop.DEFAULT_DESKTOP_RENDER_PIPELINE_PATH;
70          if ( desktopRenderPipelinePath.charAt( 0 ) != '/' )
71              desktopRenderPipelinePath = "/" + desktopRenderPipelinePath;
72          if ( desktopRenderPipelinePath.charAt( desktopRenderPipelinePath.length() -1 ) != '/' )
73              desktopRenderPipelinePath = desktopRenderPipelinePath + "/";
74          
75          this.desktopPipelinePath = desktopPipelinePath;
76          this.desktopActionPipelinePath = desktopActionPipelinePath;
77          this.desktopRenderPipelinePath = desktopRenderPipelinePath;
78      }
79  
80      /***
81       * This redirect does not redirect, instead returns the redirect URL in the response
82       */
83      protected void redirect(String location, PortletWindow portletWindow,
84              HttpServletRequest servletRequest,
85              HttpServletResponse servletResponse,
86              InternalActionResponse _actionResponse) throws IOException
87      {
88          if (location == null && _actionResponse != null)
89          {
90              DynamicInformationProvider provider = InformationProviderAccess
91                      .getDynamicProvider(servletRequest);
92  
93              // TODO: don't send changes in case of exception -> PORTLET:SPEC:17
94  
95              PortletMode portletMode = provider.getPortletMode(portletWindow);
96              WindowState windowState = provider.getWindowState(portletWindow);
97  
98              // get the changings of this portlet entity that might be set during
99              // action handling
100             // change portlet mode
101             if (_actionResponse.getChangedPortletMode() != null)
102             {
103                 portletMode = _actionResponse.getChangedPortletMode();
104                 InformationProviderAccess.getDynamicProvider(servletRequest)
105                         .getPortletActionProvider(portletWindow)
106                         .changePortletMode(portletMode);
107             }
108             // change window state
109             if (_actionResponse.getChangedWindowState() != null)
110             {
111                 windowState = _actionResponse.getChangedWindowState();
112                 InformationProviderAccess.getDynamicProvider(servletRequest)
113                         .getPortletActionProvider(portletWindow)
114                         .changePortletWindowState(windowState);
115             }
116             // get render parameters
117             Map renderParameter = _actionResponse.getRenderParameters();
118 
119             PortletURLProvider redirectURL = provider
120                     .getPortletURLProvider(portletWindow);
121 
122             if (provider.getPortletMode(portletWindow) != null)
123             {
124                 redirectURL.setPortletMode(portletMode);
125             }
126             if (provider.getWindowState(portletWindow) != null)
127             {
128                 redirectURL.setWindowState(windowState);
129             }
130             if (servletRequest.isSecure())
131             {
132                 redirectURL.setSecure(); // TBD
133             }
134             redirectURL.clearParameters();
135             redirectURL.setParameters(renderParameter);
136 
137             location = servletResponse
138                     .encodeRedirectURL(redirectURL.toString());
139         }
140 
141         javax.servlet.http.HttpServletResponse redirectResponse = servletResponse;
142         while (redirectResponse instanceof javax.servlet.http.HttpServletResponseWrapper)
143         {
144             redirectResponse = (javax.servlet.http.HttpServletResponse) ((javax.servlet.http.HttpServletResponseWrapper) redirectResponse)
145                     .getResponse();
146         }
147 
148         String encoding = servletRequest.getParameter( JetspeedDesktop.DESKTOP_ENCODER_REQUEST_PARAMETER );
149         if ( encoding != null && encoding.equals( JetspeedDesktop.DESKTOP_ENCODER_REQUEST_PARAMETER_VALUE ) )
150         {
151             location = location.replaceAll( this.desktopActionPipelinePath, this.desktopRenderPipelinePath );
152             redirectResponse.getWriter().print( location );
153         }
154         else
155         {
156             location = location.replaceAll( this.desktopActionPipelinePath, this.desktopPipelinePath );
157             location = location.replaceAll( this.desktopRenderPipelinePath, this.desktopPipelinePath);
158             redirectResponse.sendRedirect(location);
159         }
160         // System.out.println("+++ >>>> location is " + location);
161         
162     }
163 
164 }