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