001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet;
016    
017    import com.liferay.portal.kernel.messaging.sender.SingleDestinationMessageSender;
018    import com.liferay.portal.kernel.monitoring.RequestStatus;
019    import com.liferay.portal.kernel.monitoring.statistics.DataSampleThreadLocal;
020    import com.liferay.portal.monitoring.statistics.portlet.PortletRequestDataSample;
021    import com.liferay.portal.monitoring.statistics.portlet.PortletRequestType;
022    import com.liferay.portal.util.PropsValues;
023    
024    import java.io.IOException;
025    
026    import javax.portlet.ActionRequest;
027    import javax.portlet.ActionResponse;
028    import javax.portlet.EventRequest;
029    import javax.portlet.EventResponse;
030    import javax.portlet.Portlet;
031    import javax.portlet.PortletConfig;
032    import javax.portlet.PortletContext;
033    import javax.portlet.PortletException;
034    import javax.portlet.RenderRequest;
035    import javax.portlet.RenderResponse;
036    import javax.portlet.ResourceRequest;
037    import javax.portlet.ResourceResponse;
038    
039    /**
040     * @author Michael C. Han
041     * @author Karthik Sudarshan
042     */
043    public class MonitoringPortlet implements InvokerPortlet {
044    
045            public static boolean isMonitoringPortletActionRequest() {
046                    return _monitoringPortletActionRequest;
047            }
048    
049            public static boolean isMonitoringPortletEventRequest() {
050                    return _monitoringPortletEventRequest;
051            }
052    
053            public static boolean isMonitoringPortletRenderRequest() {
054                    return _monitoringPortletRenderRequest;
055            }
056    
057            public static boolean isMonitoringPortletResourceRequest() {
058                    return _monitoringPortletResourceRequest;
059            }
060    
061            public static void setMonitoringPortletActionRequest(
062                    boolean monitoringPortletActionRequest) {
063    
064                    _monitoringPortletActionRequest = monitoringPortletActionRequest;
065            }
066    
067            public static void setMonitoringPortletEventRequest(
068                    boolean monitoringPortletEventRequest) {
069    
070                    _monitoringPortletEventRequest = monitoringPortletEventRequest;
071            }
072    
073            public static void setMonitoringPortletRenderRequest(
074                    boolean monitoringPortletRenderRequest) {
075    
076                    _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
077            }
078    
079            public static void setMonitoringPortletResourceRequest(
080                    boolean monitoringPortletResourceRequest) {
081    
082                    _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
083            }
084    
085            public MonitoringPortlet() {
086            }
087    
088            public MonitoringPortlet(
089                    InvokerPortlet invokerPortlet,
090                    SingleDestinationMessageSender singleDestinationMessageSender) {
091    
092                    _invokerPortlet = invokerPortlet;
093                    _singleDestinationMessageSender = singleDestinationMessageSender;
094            }
095    
096            public InvokerPortlet create(
097                            com.liferay.portal.model.Portlet portletModel, Portlet portlet,
098                            PortletConfig portletConfig, PortletContext portletContext,
099                            boolean checkAuthToken, boolean facesPortlet, boolean strutsPortlet,
100                            boolean strutsBridgePortlet)
101                    throws PortletException {
102    
103                    InvokerPortlet invokerPortlet = _invokerPortlet.create(
104                            portletModel, portlet, portletContext);
105    
106                    MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
107                            invokerPortlet, _singleDestinationMessageSender);
108    
109                    monitoringPortlet.prepare(
110                            portletModel, portlet, portletConfig, portletContext,
111                            checkAuthToken, facesPortlet, strutsPortlet, strutsBridgePortlet);
112    
113                    return monitoringPortlet;
114            }
115    
116            public InvokerPortlet create(
117                            com.liferay.portal.model.Portlet portletModel, Portlet portlet,
118                            PortletContext portletContext)
119                    throws PortletException {
120    
121                    InvokerPortlet invokerPortlet = _invokerPortlet.create(
122                            portletModel, portlet, portletContext);
123    
124                    MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
125                            invokerPortlet, _singleDestinationMessageSender);
126    
127                    monitoringPortlet.prepare(portletModel, portlet, portletContext);
128    
129                    return monitoringPortlet;
130            }
131    
132            public void destroy() {
133                    _invokerPortlet.destroy();
134            }
135    
136            public Integer getExpCache() {
137                    return _invokerPortlet.getExpCache();
138            }
139    
140            public Portlet getPortlet() {
141                    return _invokerPortlet.getPortlet();
142            }
143    
144            public ClassLoader getPortletClassLoader() {
145                    return _invokerPortlet.getPortletClassLoader();
146            }
147    
148            public PortletConfig getPortletConfig() {
149                    return _invokerPortlet.getPortletConfig();
150            }
151    
152            public PortletContext getPortletContext() {
153                    return _invokerPortlet.getPortletContext();
154            }
155    
156            public Portlet getPortletInstance() {
157                    return _invokerPortlet.getPortletInstance();
158            }
159    
160            public void init(PortletConfig portletConfig) throws PortletException {
161                    PortletConfigImpl portletConfigImpl = (PortletConfigImpl)portletConfig;
162    
163                    _invokerPortlet.init(portletConfigImpl);
164    
165                    com.liferay.portal.model.Portlet portletModel =
166                            portletConfigImpl.getPortlet();
167    
168                    _actionTimeout = portletModel.getActionTimeout();
169                    _renderTimeout = portletModel.getRenderTimeout();
170            }
171    
172            public boolean isCheckAuthToken() {
173                    return _invokerPortlet.isCheckAuthToken();
174            }
175    
176            public boolean isDestroyable() {
177                    return _invokerPortlet.isDestroyable();
178            }
179    
180            public boolean isFacesPortlet() {
181                    return _invokerPortlet.isFacesPortlet();
182            }
183    
184            public boolean isStrutsBridgePortlet() {
185                    return _invokerPortlet.isStrutsBridgePortlet();
186            }
187    
188            public boolean isStrutsPortlet() {
189                    return _invokerPortlet.isStrutsPortlet();
190            }
191    
192            public void prepare(
193                            com.liferay.portal.model.Portlet portletModel, Portlet portlet,
194                            PortletConfig portletConfig, PortletContext portletContext,
195                            boolean checkAuthToken, boolean facesPortlet, boolean strutsPortlet,
196                            boolean strutsBridgePortlet)
197                    throws PortletException {
198    
199                    _invokerPortlet.prepare(
200                            portletModel, portlet, portletConfig, portletContext,
201                            checkAuthToken, facesPortlet, strutsPortlet, strutsBridgePortlet);
202            }
203    
204            public void prepare(
205                            com.liferay.portal.model.Portlet portletModel, Portlet portlet,
206                            PortletContext portletContext)
207                    throws PortletException {
208    
209                    _invokerPortlet.prepare(portletModel, portlet, portletContext);
210            }
211    
212            public void processAction(
213                            ActionRequest actionRequest, ActionResponse actionResponse)
214                    throws IOException, PortletException {
215    
216                    PortletRequestDataSample portletRequestDataSample = null;
217    
218                    try {
219                            if (_monitoringPortletActionRequest) {
220                                    portletRequestDataSample = new PortletRequestDataSample(
221                                            PortletRequestType.ACTION, actionRequest, actionResponse);
222    
223                                    portletRequestDataSample.setTimeout(_actionTimeout);
224    
225                                    portletRequestDataSample.prepare();
226                            }
227    
228                            _invokerPortlet.processAction(actionRequest, actionResponse);
229    
230                            if (_monitoringPortletActionRequest) {
231                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
232                            }
233                    }
234                    catch (Exception e) {
235                            _processException(
236                                    _monitoringPortletActionRequest, portletRequestDataSample, e);
237                    }
238                    finally {
239                            if (portletRequestDataSample != null) {
240                                    _singleDestinationMessageSender.send(portletRequestDataSample);
241    
242                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
243                            }
244                    }
245            }
246    
247            public void processEvent(
248                            EventRequest eventRequest, EventResponse eventResponse)
249                    throws IOException, PortletException {
250    
251                    PortletRequestDataSample portletRequestDataSample = null;
252    
253                    try {
254                            if (_monitoringPortletEventRequest) {
255                                    portletRequestDataSample = new PortletRequestDataSample(
256                                            PortletRequestType.EVENT, eventRequest, eventResponse);
257    
258                                    portletRequestDataSample.prepare();
259                            }
260    
261                            _invokerPortlet.processEvent(eventRequest, eventResponse);
262    
263                            if (_monitoringPortletEventRequest) {
264                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
265                            }
266                    }
267                    catch (Exception e) {
268                            _processException(
269                                    _monitoringPortletEventRequest, portletRequestDataSample, e);
270                    }
271                    finally {
272                            if (portletRequestDataSample != null) {
273                                    _singleDestinationMessageSender.send(portletRequestDataSample);
274    
275                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
276                            }
277                    }
278            }
279    
280            public void render(
281                            RenderRequest renderRequest, RenderResponse renderResponse)
282                    throws IOException, PortletException {
283    
284                    PortletRequestDataSample portletRequestDataSample = null;
285    
286                    try {
287                            if (_monitoringPortletRenderRequest) {
288                                    portletRequestDataSample = new PortletRequestDataSample(
289                                            PortletRequestType.RENDER, renderRequest, renderResponse);
290    
291                                    portletRequestDataSample.setTimeout(_renderTimeout);
292    
293                                    portletRequestDataSample.prepare();
294                            }
295    
296                            _invokerPortlet.render(renderRequest, renderResponse);
297    
298                            if (_monitoringPortletRenderRequest) {
299                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
300                            }
301                    }
302                    catch (Exception e) {
303                            _processException(
304                                    _monitoringPortletRenderRequest, portletRequestDataSample, e);
305                    }
306                    finally {
307                            if (portletRequestDataSample != null) {
308                                    _singleDestinationMessageSender.send(portletRequestDataSample);
309    
310                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
311                            }
312                    }
313            }
314    
315            public void serveResource(
316                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
317                    throws IOException, PortletException {
318    
319                    PortletRequestDataSample portletRequestDataSample = null;
320    
321                    try {
322                            if (_monitoringPortletResourceRequest) {
323                                    portletRequestDataSample = new PortletRequestDataSample(
324                                            PortletRequestType.RESOURCE, resourceRequest,
325                                            resourceResponse);
326    
327                                    portletRequestDataSample.prepare();
328                            }
329    
330                            _invokerPortlet.serveResource(resourceRequest, resourceResponse);
331    
332                            if (_monitoringPortletResourceRequest) {
333                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
334                            }
335                    }
336                    catch (Exception e) {
337                            _processException(
338                                    _monitoringPortletResourceRequest, portletRequestDataSample, e);
339                    }
340                    finally {
341                            if (portletRequestDataSample != null) {
342                                    _singleDestinationMessageSender.send(portletRequestDataSample);
343    
344                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
345                            }
346                    }
347            }
348    
349            public void setInvokerPortlet(InvokerPortlet invokerPortlet) {
350                    _invokerPortlet = invokerPortlet;
351            }
352    
353            public void setPortletFilters() throws PortletException {
354                    _invokerPortlet.setPortletFilters();
355            }
356    
357            public void setSingleDestinationMessageSender(
358                    SingleDestinationMessageSender singleDestinationMessageSender) {
359    
360                    _singleDestinationMessageSender = singleDestinationMessageSender;
361            }
362    
363            private void _processException(
364                            boolean monitoringPortletRequest,
365                            PortletRequestDataSample portletRequestDataSample, Exception e)
366                    throws IOException, PortletException {
367    
368                    if (monitoringPortletRequest) {
369                            portletRequestDataSample.capture(RequestStatus.ERROR);
370                    }
371    
372                    if (e instanceof IOException) {
373                            throw (IOException)e;
374                    }
375                    else if (e instanceof PortletException) {
376                            throw (PortletException)e;
377                    }
378                    else {
379                            throw new PortletException("Unable to process portlet", e);
380                    }
381            }
382    
383            private static boolean _monitoringPortletActionRequest =
384                    PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
385            private static boolean _monitoringPortletEventRequest =
386                    PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
387            private static boolean _monitoringPortletRenderRequest =
388                    PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
389            private static boolean _monitoringPortletResourceRequest =
390                    PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
391    
392            private long _actionTimeout;
393            private InvokerPortlet _invokerPortlet;
394            private long _renderTimeout;
395            private SingleDestinationMessageSender _singleDestinationMessageSender;
396    
397    }