View Javadoc

1    /*
2    * Copyright 2001-2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.portletbridge.portlet;
17  
18  import java.io.IOException;
19  import java.io.InputStreamReader;
20  import java.io.StringReader;
21  import java.net.URI;
22  import java.text.MessageFormat;
23  import java.util.ResourceBundle;
24  
25  import javax.portlet.ActionRequest;
26  import javax.portlet.ActionResponse;
27  import javax.portlet.GenericPortlet;
28  import javax.portlet.PortletException;
29  import javax.portlet.PortletPreferences;
30  import javax.portlet.PortletSession;
31  import javax.portlet.RenderRequest;
32  import javax.portlet.RenderResponse;
33  import javax.portlet.WindowState;
34  
35  import org.apache.commons.httpclient.HttpMethodBase;
36  import org.apache.commons.httpclient.methods.GetMethod;
37  import org.portletbridge.ResourceException;
38  
39  /***
40   * The portlet that renders the portlet view mode. Renders
41   * content from the downstream site after transforming it.
42   * 
43   * @author JMcCrindle
44   * @author rickard
45   */
46  public class BridgeViewPortlet extends GenericPortlet {
47      
48      private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
49              .getLog(BridgeViewPortlet.class);
50  
51      private String mementoSessionKey = null;
52  
53      private HttpClientTemplate httpClientTemplate = null;
54  
55      private BridgeTransformer transformer = null;
56      
57      private String idParamKey = "id";
58      
59      private BridgeAuthenticator bridgeAuthenticator = null;
60  
61      /***
62       * Does nothing. All requests are passed through the portlet bridge servlet
63       * 
64       * @see PortletBridgeServlet
65       */
66      public void processAction(ActionRequest request, ActionResponse response)
67              throws PortletException, IOException {
68          // noop
69      }
70  
71      /***
72       * Writes out the transformed content from the downstream site.
73       */
74      public void doView(final RenderRequest request,
75              final RenderResponse response) throws PortletException, IOException {
76  
77          ResourceBundle resourceBundle = getPortletConfig().getResourceBundle(request
78                  .getLocale());
79          
80          // noop if window is minimised
81          if(request.getWindowState().equals(WindowState.MINIMIZED)) {
82              return;
83          }
84          
85          response.setContentType("text/html");
86          
87          try {
88              PortletSession session = request.getPortletSession();
89              PortletPreferences preferences = request.getPreferences();
90              String portletId = response.getNamespace();
91              PortletBridgeMemento tempMemento = (PortletBridgeMemento) session
92                      .getAttribute(mementoSessionKey,
93                              PortletSession.APPLICATION_SCOPE);
94              if (tempMemento == null) {
95                  tempMemento = new DefaultPortletBridgeMemento(idParamKey, bridgeAuthenticator);
96                  session.setAttribute(mementoSessionKey, tempMemento, PortletSession.APPLICATION_SCOPE);
97              }
98              final PortletBridgeMemento memento = tempMemento;
99              final PerPortletMemento perPortletMemento = memento
100                     .getPerPortletMemento(portletId);
101             perPortletMemento.setPreferences(request);
102             String urlId = request.getParameter(idParamKey);
103 
104             
105             final BridgeRequest bridgeRequest;
106             
107             if(urlId != null) { 
108                 bridgeRequest = memento
109                     .getBridgeRequest(urlId);
110             } else {
111                 log.warn("no bridge request found for " + urlId);
112                 bridgeRequest = null;
113             }
114 
115             if (urlId == null || bridgeRequest == null) {
116                 // this is the default start page for the portlet so go and
117                 // fetch it
118                 final URI initUrl = perPortletMemento.getInitUrl();
119                 httpClientTemplate.service(new GetMethod(initUrl.toString()), perPortletMemento,
120                         new HttpClientCallback() {
121                             public Object doInHttpClient(int statusCode,
122                                     HttpMethodBase method) throws Throwable {
123                                 transformer.transform(memento, perPortletMemento, initUrl, 
124                                         request, response,
125                                         new InputStreamReader(method
126                                                 .getResponseBodyAsStream(),
127                                                 method.getResponseCharSet()));
128                                 return null;
129                             }
130                         });
131             } else {
132                 PortletBridgeContent content = perPortletMemento.dequeueContent(bridgeRequest.getId());
133                 if (content == null) {
134                     // we're rerending
135                     httpClientTemplate.service(new GetMethod(bridgeRequest.getUrl().toString()),
136                             perPortletMemento, new HttpClientCallback() {
137                                 public Object doInHttpClient(int statusCode,
138                                         HttpMethodBase method) throws Throwable {
139                                     transformer.transform(
140                                             memento,
141                                             perPortletMemento, 
142                                             bridgeRequest.getUrl(),
143                                             request,
144                                             response,
145                                             new InputStreamReader(method
146                                                     .getResponseBodyAsStream(),
147                                                     method.getResponseCharSet()));
148                                     return null;
149                                 }
150                             });
151                 } else {
152                     // we have content, transform that
153                     transformer.transform(memento, perPortletMemento, bridgeRequest.getUrl(), request,
154                             response, new StringReader(content.getContent()));
155                 }
156             }
157 
158         } catch (ResourceException resourceException) {
159             String format = MessageFormat.format(resourceBundle
160                     .getString(resourceException.getMessage()),
161                     resourceException.getArgs());
162             throw new PortletException(format, resourceException.getCause());
163         }
164     }
165 
166 
167     public void destroy() {
168         super.destroy();
169     }
170 
171     public void setHttpClientTemplate(HttpClientTemplate httpClientTemplate) {
172         this.httpClientTemplate = httpClientTemplate;
173     }
174 
175     public void setTransformer(BridgeTransformer transformer) {
176         this.transformer = transformer;
177     }
178     public void setMementoSessionKey(String mementoSessionKey) {
179         this.mementoSessionKey = mementoSessionKey;
180     }
181 
182     public void setIdParamKey(String idParamKey) {
183         this.idParamKey = idParamKey;
184     }
185 
186     public void setBridgeAuthenticator(BridgeAuthenticator bridgeAuthenticator) {
187         this.bridgeAuthenticator = bridgeAuthenticator;
188     }
189 }