1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portlet;
16  
17  import com.liferay.portal.kernel.messaging.sender.SingleDestinationMessageSender;
18  import com.liferay.portal.monitoring.RequestStatus;
19  import com.liferay.portal.monitoring.statistics.DataSampleThreadLocal;
20  import com.liferay.portal.monitoring.statistics.portlet.PortletRequestDataSample;
21  import com.liferay.portal.monitoring.statistics.portlet.PortletRequestType;
22  import com.liferay.portal.util.PropsValues;
23  
24  import java.io.IOException;
25  
26  import javax.portlet.ActionRequest;
27  import javax.portlet.ActionResponse;
28  import javax.portlet.EventRequest;
29  import javax.portlet.EventResponse;
30  import javax.portlet.Portlet;
31  import javax.portlet.PortletConfig;
32  import javax.portlet.PortletContext;
33  import javax.portlet.PortletException;
34  import javax.portlet.RenderRequest;
35  import javax.portlet.RenderResponse;
36  import javax.portlet.ResourceRequest;
37  import javax.portlet.ResourceResponse;
38  
39  /**
40   * <a href="MonitoringPortlet.java.html"><b><i>View Source</i></b></a>
41   *
42   * @author Michael C. Han
43   * @author Karthik Sudarshan
44   */
45  public class MonitoringPortlet implements InvokerPortlet {
46  
47      public static boolean isMonitoringPortletActionRequest() {
48          return _monitoringPortletActionRequest;
49      }
50  
51      public static boolean isMonitoringPortletEventRequest() {
52          return _monitoringPortletEventRequest;
53      }
54  
55      public static boolean isMonitoringPortletRenderRequest() {
56          return _monitoringPortletRenderRequest;
57      }
58  
59      public static boolean isMonitoringPortletResourceRequest() {
60          return _monitoringPortletResourceRequest;
61      }
62  
63      public static void setMonitoringPortletActionRequest(
64          boolean monitoringPortletActionRequest) {
65  
66          _monitoringPortletActionRequest = monitoringPortletActionRequest;
67      }
68  
69      public static void setMonitoringPortletEventRequest(
70          boolean monitoringPortletEventRequest) {
71  
72          _monitoringPortletEventRequest = monitoringPortletEventRequest;
73      }
74  
75      public static void setMonitoringPortletRenderRequest(
76          boolean monitoringPortletRenderRequest) {
77  
78          _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
79      }
80  
81      public static void setMonitoringPortletResourceRequest(
82          boolean monitoringPortletResourceRequest) {
83  
84          _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
85      }
86  
87      public MonitoringPortlet() {
88      }
89  
90      public MonitoringPortlet(
91          InvokerPortlet invokerPortlet,
92          SingleDestinationMessageSender singleDestinationMessageSender) {
93  
94          _invokerPortlet = invokerPortlet;
95          _singleDestinationMessageSender = singleDestinationMessageSender;
96      }
97  
98      public InvokerPortlet create(
99              com.liferay.portal.model.Portlet portletModel, Portlet portlet,
100             PortletConfig portletConfig, PortletContext portletContext,
101             boolean checkAuthToken, boolean facesPortlet, boolean strutsPortlet,
102             boolean strutsBridgePortlet)
103         throws PortletException {
104 
105         InvokerPortlet invokerPortlet = _invokerPortlet.create(
106             portletModel, portlet, portletContext);
107 
108         MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
109             invokerPortlet, _singleDestinationMessageSender);
110 
111         monitoringPortlet.prepare(
112             portletModel, portlet, portletConfig, portletContext,
113             checkAuthToken, facesPortlet, strutsPortlet, strutsBridgePortlet);
114 
115         return monitoringPortlet;
116     }
117 
118     public InvokerPortlet create(
119             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
120             PortletContext portletContext)
121         throws PortletException {
122 
123         InvokerPortlet invokerPortlet = _invokerPortlet.create(
124             portletModel, portlet, portletContext);
125 
126         MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
127             invokerPortlet, _singleDestinationMessageSender);
128 
129         monitoringPortlet.prepare(portletModel, portlet, portletContext);
130 
131         return monitoringPortlet;
132     }
133 
134     public void destroy() {
135         _invokerPortlet.destroy();
136     }
137 
138     public Integer getExpCache() {
139         return _invokerPortlet.getExpCache();
140     }
141 
142     public Portlet getPortlet() {
143         return _invokerPortlet.getPortlet();
144     }
145 
146     public ClassLoader getPortletClassLoader() {
147         return _invokerPortlet.getPortletClassLoader();
148     }
149 
150     public PortletConfig getPortletConfig() {
151         return _invokerPortlet.getPortletConfig();
152     }
153 
154     public PortletContext getPortletContext() {
155         return _invokerPortlet.getPortletContext();
156     }
157 
158     public Portlet getPortletInstance() {
159         return _invokerPortlet.getPortletInstance();
160     }
161 
162     public void init(PortletConfig portletConfig) throws PortletException {
163         _invokerPortlet.init(portletConfig);
164     }
165 
166     public boolean isCheckAuthToken() {
167         return _invokerPortlet.isCheckAuthToken();
168     }
169 
170     public boolean isDestroyable() {
171         return _invokerPortlet.isDestroyable();
172     }
173 
174     public boolean isFacesPortlet() {
175         return _invokerPortlet.isFacesPortlet();
176     }
177 
178     public boolean isStrutsBridgePortlet() {
179         return _invokerPortlet.isStrutsBridgePortlet();
180     }
181 
182     public boolean isStrutsPortlet() {
183         return _invokerPortlet.isStrutsPortlet();
184     }
185 
186     public void prepare(
187             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
188             PortletConfig portletConfig, PortletContext portletContext,
189             boolean checkAuthToken, boolean facesPortlet, boolean strutsPortlet,
190             boolean strutsBridgePortlet)
191         throws PortletException {
192 
193         _invokerPortlet.prepare(
194             portletModel, portlet, portletConfig, portletContext,
195             checkAuthToken, facesPortlet, strutsPortlet, strutsBridgePortlet);
196     }
197 
198     public void prepare(
199             com.liferay.portal.model.Portlet portletModel, Portlet portlet,
200             PortletContext portletContext)
201         throws PortletException {
202 
203         _invokerPortlet.prepare(portletModel, portlet, portletContext);
204     }
205 
206     public void processAction(
207             ActionRequest actionRequest, ActionResponse actionResponse)
208         throws IOException, PortletException {
209 
210         PortletRequestDataSample portletRequestDataSample = null;
211 
212         try {
213             if (_monitoringPortletActionRequest) {
214                 portletRequestDataSample = new PortletRequestDataSample(
215                     PortletRequestType.ACTION, actionRequest, actionResponse);
216 
217                 portletRequestDataSample.prepare();
218             }
219 
220             _invokerPortlet.processAction(actionRequest, actionResponse);
221 
222             if (_monitoringPortletActionRequest) {
223                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
224             }
225         }
226         catch (Exception e) {
227             _processException(
228                 _monitoringPortletActionRequest, portletRequestDataSample, e);
229         }
230         finally {
231             if (portletRequestDataSample != null) {
232                 _singleDestinationMessageSender.send(portletRequestDataSample);
233 
234                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
235             }
236         }
237     }
238 
239     public void processEvent(
240             EventRequest eventRequest, EventResponse eventResponse)
241         throws IOException, PortletException {
242 
243         PortletRequestDataSample portletRequestDataSample = null;
244 
245         try {
246             if (_monitoringPortletEventRequest) {
247                 portletRequestDataSample = new PortletRequestDataSample(
248                     PortletRequestType.EVENT, eventRequest, eventResponse);
249 
250                 portletRequestDataSample.prepare();
251             }
252 
253             _invokerPortlet.processEvent(eventRequest, eventResponse);
254 
255             if (_monitoringPortletEventRequest) {
256                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
257             }
258         }
259         catch (Exception e) {
260             _processException(
261                 _monitoringPortletEventRequest, portletRequestDataSample, e);
262         }
263         finally {
264             if (portletRequestDataSample != null) {
265                 _singleDestinationMessageSender.send(portletRequestDataSample);
266 
267                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
268             }
269         }
270     }
271 
272     public void render(
273             RenderRequest renderRequest, RenderResponse renderResponse)
274         throws IOException, PortletException {
275 
276         PortletRequestDataSample portletRequestDataSample = null;
277 
278         try {
279             if (_monitoringPortletRenderRequest) {
280                 portletRequestDataSample = new PortletRequestDataSample(
281                     PortletRequestType.RENDER, renderRequest, renderResponse);
282 
283                 portletRequestDataSample.prepare();
284             }
285 
286             _invokerPortlet.render(renderRequest, renderResponse);
287 
288             if (_monitoringPortletRenderRequest) {
289                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
290             }
291         }
292         catch (Exception e) {
293             _processException(
294                 _monitoringPortletRenderRequest, portletRequestDataSample, e);
295         }
296         finally {
297             if (portletRequestDataSample != null) {
298                 _singleDestinationMessageSender.send(portletRequestDataSample);
299 
300                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
301             }
302         }
303     }
304 
305     public void serveResource(
306             ResourceRequest resourceRequest, ResourceResponse resourceResponse)
307         throws IOException, PortletException {
308 
309         PortletRequestDataSample portletRequestDataSample = null;
310 
311         try {
312             if (_monitoringPortletResourceRequest) {
313                 portletRequestDataSample = new PortletRequestDataSample(
314                     PortletRequestType.RESOURCE, resourceRequest,
315                     resourceResponse);
316 
317                 portletRequestDataSample.prepare();
318             }
319 
320             _invokerPortlet.serveResource(resourceRequest, resourceResponse);
321 
322             if (_monitoringPortletResourceRequest) {
323                 portletRequestDataSample.capture(RequestStatus.SUCCESS);
324             }
325         }
326         catch (Exception e) {
327             _processException(
328                 _monitoringPortletResourceRequest, portletRequestDataSample, e);
329         }
330         finally {
331             if (portletRequestDataSample != null) {
332                 _singleDestinationMessageSender.send(portletRequestDataSample);
333 
334                 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
335             }
336         }
337     }
338 
339     public void setInvokerPortlet(InvokerPortlet invokerPortlet) {
340         _invokerPortlet = invokerPortlet;
341     }
342 
343     public void setPortletFilters() throws PortletException {
344         _invokerPortlet.setPortletFilters();
345     }
346 
347     public void setSingleDestinationMessageSender(
348         SingleDestinationMessageSender singleDestinationMessageSender) {
349 
350         _singleDestinationMessageSender = singleDestinationMessageSender;
351     }
352 
353     private void _processException(
354             boolean monitoringPortletRequest,
355             PortletRequestDataSample portletRequestDataSample, Exception e)
356         throws IOException, PortletException {
357 
358         if (monitoringPortletRequest) {
359             portletRequestDataSample.capture(RequestStatus.ERROR);
360         }
361 
362         if (e instanceof IOException) {
363             throw (IOException)e;
364         }
365         else if (e instanceof PortletException) {
366             throw (PortletException)e;
367         }
368         else {
369             throw new PortletException("Unable to process portlet", e);
370         }
371     }
372 
373     private static boolean _monitoringPortletActionRequest =
374         PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
375     private static boolean _monitoringPortletEventRequest =
376         PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
377     private static boolean _monitoringPortletRenderRequest =
378         PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
379     private static boolean _monitoringPortletResourceRequest =
380         PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
381 
382     private InvokerPortlet _invokerPortlet;
383     private SingleDestinationMessageSender _singleDestinationMessageSender;
384 
385 }