1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
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
117
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
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
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 }