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.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      /* (non-Javadoc)
62       * @see javax.portlet.GenericPortlet#init()
63       */
64      public void init() throws PortletException {
65          
66          
67          TemplateFactory templateFactory = new DefaultTemplateFactory();
68          
69          // ResourceBundle resourceBundle = config.getResourceBundle(Locale.getDefault());
70          ResourceBundle resourceBundle = PropertyResourceBundle.getBundle("org.portletbridge.portlet.PortletBridgePortlet");
71  
72          // initialise portlets
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          // get the error stylesheet reference
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         // get the edit stylesheet reference
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         // get the help stylesheet reference
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         // get the memento session key
164         String mementoSessionKey = config.getInitParameter("mementoSessionKey");
165         if (mementoSessionKey == null) {
166             throw new PortletException(resourceBundle
167                     .getString("error.mementoSessionKey"));
168         }
169         // get the servlet name
170         String servletName = config.getInitParameter("servletName");
171         if (servletName == null) {
172             throw new PortletException(resourceBundle
173                     .getString("error.servletName"));
174         }
175         // get parserClassName
176         String parserClassName = config.getInitParameter("parserClassName");
177         if (parserClassName == null) {
178             throw new PortletException(resourceBundle
179                     .getString("error.parserClassName"));
180         }
181         // get authenticatorClassName
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         // setup parser
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     /* (non-Javadoc)
245      * @see javax.portlet.GenericPortlet#render(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
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             // getPortletConfig().getPortletContext().log(exception.getMessage(), exception);
253             // using this instead because pluto doesn't seem to print out portletcontext logs
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     /* (non-Javadoc)
272      * @see javax.portlet.GenericPortlet#doView(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
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     /* (non-Javadoc)
282      * @see javax.portlet.GenericPortlet#doEdit(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
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     /* (non-Javadoc)
292      * @see javax.portlet.GenericPortlet#doHelp(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
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     /* (non-Javadoc)
302      * @see javax.portlet.GenericPortlet#processAction(javax.portlet.ActionRequest, javax.portlet.ActionResponse)
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 }