001    /**
002     * Copyright (c) 2000-2013 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.kernel.portlet.LiferayPortletConfig;
021    import com.liferay.portal.monitoring.statistics.portlet.PortletRequestDataSample;
022    import com.liferay.portal.monitoring.statistics.portlet.PortletRequestType;
023    import com.liferay.portal.util.PropsValues;
024    
025    import java.io.IOException;
026    
027    import javax.portlet.ActionRequest;
028    import javax.portlet.ActionResponse;
029    import javax.portlet.EventRequest;
030    import javax.portlet.EventResponse;
031    import javax.portlet.Portlet;
032    import javax.portlet.PortletConfig;
033    import javax.portlet.PortletContext;
034    import javax.portlet.PortletException;
035    import javax.portlet.RenderRequest;
036    import javax.portlet.RenderResponse;
037    import javax.portlet.ResourceRequest;
038    import javax.portlet.ResourceResponse;
039    
040    /**
041     * @author Michael C. Han
042     * @author Karthik Sudarshan
043     * @author Raymond Augé
044     */
045    public class MonitoringPortlet implements InvokerPortlet {
046    
047            public static boolean isMonitoringPortletActionRequest() {
048                    return _monitoringPortletActionRequest;
049            }
050    
051            public static boolean isMonitoringPortletEventRequest() {
052                    return _monitoringPortletEventRequest;
053            }
054    
055            public static boolean isMonitoringPortletRenderRequest() {
056                    return _monitoringPortletRenderRequest;
057            }
058    
059            public static boolean isMonitoringPortletResourceRequest() {
060                    return _monitoringPortletResourceRequest;
061            }
062    
063            public static void setMonitoringPortletActionRequest(
064                    boolean monitoringPortletActionRequest) {
065    
066                    _monitoringPortletActionRequest = monitoringPortletActionRequest;
067            }
068    
069            public static void setMonitoringPortletEventRequest(
070                    boolean monitoringPortletEventRequest) {
071    
072                    _monitoringPortletEventRequest = monitoringPortletEventRequest;
073            }
074    
075            public static void setMonitoringPortletRenderRequest(
076                    boolean monitoringPortletRenderRequest) {
077    
078                    _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
079            }
080    
081            public static void setMonitoringPortletResourceRequest(
082                    boolean monitoringPortletResourceRequest) {
083    
084                    _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
085            }
086    
087            public MonitoringPortlet() {
088            }
089    
090            public MonitoringPortlet(
091                    InvokerPortlet invokerPortlet,
092                    SingleDestinationMessageSender singleDestinationMessageSender) {
093    
094                    _invokerPortlet = invokerPortlet;
095                    _singleDestinationMessageSender = singleDestinationMessageSender;
096            }
097    
098            public void destroy() {
099                    _invokerPortlet.destroy();
100            }
101    
102            public Integer getExpCache() {
103                    return _invokerPortlet.getExpCache();
104            }
105    
106            public Portlet getPortlet() {
107                    return _invokerPortlet.getPortlet();
108            }
109    
110            public ClassLoader getPortletClassLoader() {
111                    return _invokerPortlet.getPortletClassLoader();
112            }
113    
114            public PortletConfig getPortletConfig() {
115                    return _invokerPortlet.getPortletConfig();
116            }
117    
118            public PortletContext getPortletContext() {
119                    return _invokerPortlet.getPortletContext();
120            }
121    
122            public Portlet getPortletInstance() {
123                    return _invokerPortlet.getPortletInstance();
124            }
125    
126            public void init(PortletConfig portletConfig) throws PortletException {
127                    LiferayPortletConfig liferayPortletConfig =
128                            (LiferayPortletConfig)portletConfig;
129    
130                    _invokerPortlet.init(liferayPortletConfig);
131    
132                    com.liferay.portal.model.Portlet portletModel =
133                            liferayPortletConfig.getPortlet();
134    
135                    _actionTimeout = portletModel.getActionTimeout();
136                    _renderTimeout = portletModel.getRenderTimeout();
137            }
138    
139            public boolean isCheckAuthToken() {
140                    return _invokerPortlet.isCheckAuthToken();
141            }
142    
143            public boolean isFacesPortlet() {
144                    return _invokerPortlet.isFacesPortlet();
145            }
146    
147            public boolean isStrutsBridgePortlet() {
148                    return _invokerPortlet.isStrutsBridgePortlet();
149            }
150    
151            public boolean isStrutsPortlet() {
152                    return _invokerPortlet.isStrutsPortlet();
153            }
154    
155            public void processAction(
156                            ActionRequest actionRequest, ActionResponse actionResponse)
157                    throws IOException, PortletException {
158    
159                    PortletRequestDataSample portletRequestDataSample = null;
160    
161                    try {
162                            if (_monitoringPortletActionRequest) {
163                                    portletRequestDataSample = new PortletRequestDataSample(
164                                            PortletRequestType.ACTION, actionRequest, actionResponse);
165    
166                                    portletRequestDataSample.setTimeout(_actionTimeout);
167    
168                                    portletRequestDataSample.prepare();
169                            }
170    
171                            _invokerPortlet.processAction(actionRequest, actionResponse);
172    
173                            if (_monitoringPortletActionRequest) {
174                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
175                            }
176                    }
177                    catch (Exception e) {
178                            _processException(
179                                    _monitoringPortletActionRequest, portletRequestDataSample, e);
180                    }
181                    finally {
182                            if (portletRequestDataSample != null) {
183                                    _singleDestinationMessageSender.send(portletRequestDataSample);
184    
185                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
186                            }
187                    }
188            }
189    
190            public void processEvent(
191                            EventRequest eventRequest, EventResponse eventResponse)
192                    throws IOException, PortletException {
193    
194                    PortletRequestDataSample portletRequestDataSample = null;
195    
196                    try {
197                            if (_monitoringPortletEventRequest) {
198                                    portletRequestDataSample = new PortletRequestDataSample(
199                                            PortletRequestType.EVENT, eventRequest, eventResponse);
200    
201                                    portletRequestDataSample.prepare();
202                            }
203    
204                            _invokerPortlet.processEvent(eventRequest, eventResponse);
205    
206                            if (_monitoringPortletEventRequest) {
207                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
208                            }
209                    }
210                    catch (Exception e) {
211                            _processException(
212                                    _monitoringPortletEventRequest, portletRequestDataSample, e);
213                    }
214                    finally {
215                            if (portletRequestDataSample != null) {
216                                    _singleDestinationMessageSender.send(portletRequestDataSample);
217    
218                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
219                            }
220                    }
221            }
222    
223            public void render(
224                            RenderRequest renderRequest, RenderResponse renderResponse)
225                    throws IOException, PortletException {
226    
227                    PortletRequestDataSample portletRequestDataSample = null;
228    
229                    try {
230                            if (_monitoringPortletRenderRequest) {
231                                    portletRequestDataSample = new PortletRequestDataSample(
232                                            PortletRequestType.RENDER, renderRequest, renderResponse);
233    
234                                    portletRequestDataSample.setTimeout(_renderTimeout);
235    
236                                    portletRequestDataSample.prepare();
237                            }
238    
239                            _invokerPortlet.render(renderRequest, renderResponse);
240    
241                            if (_monitoringPortletRenderRequest) {
242                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
243                            }
244                    }
245                    catch (Exception e) {
246                            _processException(
247                                    _monitoringPortletRenderRequest, portletRequestDataSample, e);
248                    }
249                    finally {
250                            if (portletRequestDataSample != null) {
251                                    _singleDestinationMessageSender.send(portletRequestDataSample);
252    
253                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
254                            }
255                    }
256            }
257    
258            public void serveResource(
259                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
260                    throws IOException, PortletException {
261    
262                    PortletRequestDataSample portletRequestDataSample = null;
263    
264                    try {
265                            if (_monitoringPortletResourceRequest) {
266                                    portletRequestDataSample = new PortletRequestDataSample(
267                                            PortletRequestType.RESOURCE, resourceRequest,
268                                            resourceResponse);
269    
270                                    portletRequestDataSample.prepare();
271                            }
272    
273                            _invokerPortlet.serveResource(resourceRequest, resourceResponse);
274    
275                            if (_monitoringPortletResourceRequest) {
276                                    portletRequestDataSample.capture(RequestStatus.SUCCESS);
277                            }
278                    }
279                    catch (Exception e) {
280                            _processException(
281                                    _monitoringPortletResourceRequest, portletRequestDataSample, e);
282                    }
283                    finally {
284                            if (portletRequestDataSample != null) {
285                                    _singleDestinationMessageSender.send(portletRequestDataSample);
286    
287                                    DataSampleThreadLocal.addDataSample(portletRequestDataSample);
288                            }
289                    }
290            }
291    
292            public void setInvokerPortlet(InvokerPortlet invokerPortlet) {
293                    _invokerPortlet = invokerPortlet;
294            }
295    
296            public void setPortletFilters() throws PortletException {
297                    _invokerPortlet.setPortletFilters();
298            }
299    
300            public void setSingleDestinationMessageSender(
301                    SingleDestinationMessageSender singleDestinationMessageSender) {
302    
303                    _singleDestinationMessageSender = singleDestinationMessageSender;
304            }
305    
306            private void _processException(
307                            boolean monitoringPortletRequest,
308                            PortletRequestDataSample portletRequestDataSample, Exception e)
309                    throws IOException, PortletException {
310    
311                    if (monitoringPortletRequest) {
312                            portletRequestDataSample.capture(RequestStatus.ERROR);
313                    }
314    
315                    if (e instanceof IOException) {
316                            throw (IOException)e;
317                    }
318                    else if (e instanceof PortletException) {
319                            throw (PortletException)e;
320                    }
321                    else {
322                            throw new PortletException("Unable to process portlet", e);
323                    }
324            }
325    
326            private static boolean _monitoringPortletActionRequest =
327                    PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
328            private static boolean _monitoringPortletEventRequest =
329                    PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
330            private static boolean _monitoringPortletRenderRequest =
331                    PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
332            private static boolean _monitoringPortletResourceRequest =
333                    PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
334    
335            private long _actionTimeout;
336            private InvokerPortlet _invokerPortlet;
337            private long _renderTimeout;
338            private SingleDestinationMessageSender _singleDestinationMessageSender;
339    
340    }