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