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.StringReader;
20 import java.util.Enumeration;
21 import java.util.PropertyResourceBundle;
22 import java.util.ResourceBundle;
23
24 import javax.portlet.ActionRequest;
25 import javax.portlet.ActionResponse;
26 import javax.portlet.GenericPortlet;
27 import javax.portlet.Portlet;
28 import javax.portlet.PortletConfig;
29 import javax.portlet.PortletException;
30 import javax.portlet.PortletMode;
31 import javax.portlet.RenderRequest;
32 import javax.portlet.RenderResponse;
33 import javax.xml.transform.Templates;
34 import javax.xml.transform.Transformer;
35 import javax.xml.transform.TransformerConfigurationException;
36 import javax.xml.transform.TransformerException;
37 import javax.xml.transform.TransformerFactoryConfigurationError;
38 import javax.xml.transform.stream.StreamResult;
39 import javax.xml.transform.stream.StreamSource;
40
41 import org.portletbridge.ResourceException;
42 import org.xml.sax.SAXException;
43 import org.xml.sax.SAXNotRecognizedException;
44 import org.xml.sax.SAXNotSupportedException;
45 import org.xml.sax.XMLReader;
46 import org.xml.sax.helpers.XMLReaderFactory;
47
48 /***
49 * @author JMcCrindle
50 */
51 public class PortletBridgePortlet extends GenericPortlet {
52
53 private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
54 .getLog(PortletBridgePortlet.class);
55
56 private Portlet viewPortlet = null;
57 private Portlet editPortlet = null;
58 private Portlet helpPortlet = null;
59 private Templates errorTemplates = null;
60
61
62
63
64 public void init() throws PortletException {
65
66
67 TemplateFactory templateFactory = new DefaultTemplateFactory();
68
69
70 ResourceBundle resourceBundle = PropertyResourceBundle.getBundle("org.portletbridge.portlet.PortletBridgePortlet");
71
72
73 viewPortlet = createViewPortlet(resourceBundle, templateFactory);
74 editPortlet = createEditPortlet(resourceBundle, templateFactory);
75 helpPortlet = createHelpPortlet(resourceBundle, templateFactory);
76
77 createErrorTemplates(resourceBundle, templateFactory);
78
79 if(viewPortlet != null) {
80 viewPortlet.init(this.getPortletConfig());
81 }
82 if(editPortlet != null) {
83 editPortlet.init(this.getPortletConfig());
84 }
85 if(helpPortlet != null) {
86 helpPortlet.init(this.getPortletConfig());
87 }
88 }
89
90 /***
91 * @param resourceBundle
92 * @param templateFactory
93 * @throws PortletException
94 */
95 protected void createErrorTemplates(ResourceBundle resourceBundle, TemplateFactory templateFactory) throws PortletException {
96
97 String errorStylesheet = getPortletConfig().getInitParameter("errorStylesheet");
98 if (errorStylesheet == null) {
99 throw new PortletException(resourceBundle
100 .getString("error.error.stylesheet"));
101 }
102
103 try {
104 errorTemplates = templateFactory.getTemplatesFromUrl(errorStylesheet);
105 } catch (ResourceException e) {
106 throw new PortletException(e);
107 } catch (TransformerFactoryConfigurationError e) {
108 throw new PortletException(e);
109 }
110 }
111
112 protected BridgeEditPortlet createEditPortlet(ResourceBundle resourceBundle, TemplateFactory templateFactory) throws PortletException {
113 PortletConfig config = this.getPortletConfig();
114
115
116 String editStylesheet = config.getInitParameter("editStylesheet");
117 if (editStylesheet == null) {
118 throw new PortletException(resourceBundle
119 .getString("error.edit.stylesheet"));
120 }
121
122 BridgeEditPortlet bridgeEditPortlet = new BridgeEditPortlet();
123 try {
124 bridgeEditPortlet.setTemplates(templateFactory.getTemplatesFromUrl(editStylesheet));
125 } catch (ResourceException e) {
126 throw new PortletException(e);
127 } catch (TransformerFactoryConfigurationError e) {
128 throw new PortletException(e);
129 }
130 return bridgeEditPortlet;
131 }
132
133 protected BridgeHelpPortlet createHelpPortlet(ResourceBundle resourceBundle, TemplateFactory templateFactory) throws PortletException {
134 PortletConfig config = this.getPortletConfig();
135
136
137 String editStylesheet = config.getInitParameter("helpStylesheet");
138 if (editStylesheet == null) {
139 throw new PortletException(resourceBundle
140 .getString("error.help.stylesheet"));
141 }
142
143 BridgeHelpPortlet bridgeHelpPortlet = new BridgeHelpPortlet();
144 try {
145 bridgeHelpPortlet.setTemplates(templateFactory.getTemplatesFromUrl(editStylesheet));
146 } catch (ResourceException e) {
147 throw new PortletException(e);
148 } catch (TransformerFactoryConfigurationError e) {
149 throw new PortletException(e);
150 }
151 return bridgeHelpPortlet;
152 }
153
154 /***
155 * @return
156 * @throws PortletException
157 * @throws IllegalAccessException
158 * @throws
159 */
160 protected BridgeViewPortlet createViewPortlet(ResourceBundle resourceBundle, TemplateFactory templateFactory) throws PortletException {
161 PortletConfig config = this.getPortletConfig();
162
163
164 String mementoSessionKey = config.getInitParameter("mementoSessionKey");
165 if (mementoSessionKey == null) {
166 throw new PortletException(resourceBundle
167 .getString("error.mementoSessionKey"));
168 }
169
170 String servletName = config.getInitParameter("servletName");
171 if (servletName == null) {
172 throw new PortletException(resourceBundle
173 .getString("error.servletName"));
174 }
175
176 String parserClassName = config.getInitParameter("parserClassName");
177 if (parserClassName == null) {
178 throw new PortletException(resourceBundle
179 .getString("error.parserClassName"));
180 }
181
182 String authenticatorClassName = config.getInitParameter("authenticatorClassName");
183 if (authenticatorClassName == null) {
184 throw new PortletException(resourceBundle
185 .getString("error.authenticatorClassName"));
186 }
187 BridgeAuthenticator bridgeAuthenticator = null;
188 try {
189 Class authenticatorClass = Class.forName(authenticatorClassName);
190 bridgeAuthenticator = (BridgeAuthenticator) authenticatorClass.newInstance();
191 } catch (ClassNotFoundException e) {
192 log.warn(e, e);
193 throw new PortletException(resourceBundle
194 .getString("error.authenticator"));
195 } catch (InstantiationException e) {
196 log.warn(e, e);
197 throw new PortletException(resourceBundle
198 .getString("error.authenticator"));
199 } catch (IllegalAccessException e) {
200 log.warn(e, e);
201 throw new PortletException(resourceBundle
202 .getString("error.authenticator"));
203 }
204 String idParamKey = config.getInitParameter("idParamKey");
205
206 BridgeTransformer transformer = null;
207 try {
208 String cssRegex = config.getInitParameter("cssRegex");
209 String javascriptRegex = config.getInitParameter("jsRegex");
210 XMLReader parser = XMLReaderFactory.createXMLReader(parserClassName);
211 for(Enumeration names = config.getInitParameterNames(); names.hasMoreElements(); ) {
212 String name = (String) names.nextElement();
213 if(name.startsWith("parserFeature-")) {
214 parser.setFeature(name.substring("parserFeature-".length()), "true".equalsIgnoreCase(config.getInitParameter(name)));
215 } else if (name.startsWith("parserProperty-")) {
216 parser.setProperty(name.substring("parserProperty-".length()), config.getInitParameter(name));
217 }
218 }
219 IdGenerator idGenerator = DefaultIdGenerator.getInstance();
220 ContentRewriter javascriptRewriter = new RegexContentRewriter(javascriptRegex);
221 ContentRewriter cssRewriter = new RegexContentRewriter(cssRegex);
222 BridgeFunctionsFactory bridgeFunctionsFactory = new BridgeFunctionsFactory(idGenerator, javascriptRewriter, cssRewriter);
223 transformer = new AltBridgeTransformer(bridgeFunctionsFactory, templateFactory, parser, servletName);
224 } catch (SAXNotRecognizedException e) {
225 throw new PortletException(e);
226 } catch (SAXNotSupportedException e) {
227 throw new PortletException(e);
228 } catch (SAXException e) {
229 throw new PortletException(e);
230 }
231
232 BridgeViewPortlet bridgeViewPortlet = new BridgeViewPortlet();
233
234 bridgeViewPortlet.setHttpClientTemplate(new DefaultHttpClientTemplate());
235 bridgeViewPortlet.setTransformer(transformer);
236 bridgeViewPortlet.setMementoSessionKey(mementoSessionKey);
237 bridgeViewPortlet.setBridgeAuthenticator(bridgeAuthenticator);
238 if(idParamKey != null) {
239 bridgeViewPortlet.setIdParamKey(idParamKey);
240 }
241 return bridgeViewPortlet;
242 }
243
244
245
246
247 public void render(RenderRequest request, RenderResponse response)
248 throws PortletException, IOException {
249 try {
250 super.render(request, response);
251 } catch (Throwable exception) {
252
253
254 log.warn(exception, exception);
255 response.setContentType("text/html");
256 try {
257 Transformer transformer = errorTemplates.newTransformer();
258 transformer.setParameter("portlet", new PortletFunctions(request, response));
259 transformer.setParameter("exception", exception);
260 transformer.transform(new StreamSource(new StringReader("<xml/>")), new StreamResult(response.getWriter()));
261 } catch (TransformerConfigurationException e) {
262 throw new PortletException(e);
263 } catch (TransformerException e) {
264 throw new PortletException(e);
265 } catch (IOException e) {
266 throw new PortletException(e);
267 }
268 }
269 }
270
271
272
273
274 protected void doView(RenderRequest request, RenderResponse response)
275 throws PortletException, IOException {
276 if(viewPortlet != null) {
277 viewPortlet.render(request, response);
278 }
279 }
280
281
282
283
284 protected void doEdit(RenderRequest request, RenderResponse response)
285 throws PortletException, IOException {
286 if(editPortlet != null) {
287 editPortlet.render(request, response);
288 }
289 }
290
291
292
293
294 protected void doHelp(RenderRequest request, RenderResponse response)
295 throws PortletException, IOException {
296 if(helpPortlet != null) {
297 helpPortlet.render(request, response);
298 }
299 }
300
301
302
303
304 public void processAction(ActionRequest request, ActionResponse response)
305 throws PortletException, IOException {
306 PortletMode portletMode = request.getPortletMode();
307 if(portletMode.equals(PortletMode.VIEW)) {
308 viewPortlet.processAction(request, response);
309 } else if(portletMode.equals(PortletMode.EDIT)) {
310 editPortlet.processAction(request, response);
311 } else if (portletMode.equals(PortletMode.HELP)) {
312 helpPortlet.processAction(request, response);
313 }
314 }
315
316 public Portlet getEditPortlet() {
317 return editPortlet;
318 }
319
320 public void setEditPortlet(Portlet editPortlet) {
321 this.editPortlet = editPortlet;
322 }
323
324 public Portlet getHelpPortlet() {
325 return helpPortlet;
326 }
327
328 public void setHelpPortlet(Portlet helpPortlet) {
329 this.helpPortlet = helpPortlet;
330 }
331
332 public Portlet getViewPortlet() {
333 return viewPortlet;
334 }
335
336 public void setViewPortlet(Portlet viewPortlet) {
337 this.viewPortlet = viewPortlet;
338 }
339
340 }