/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.monitoring.internal.portlet; import aQute.bnd.annotation.ProviderType; import com.liferay.portal.kernel.monitoring.DataSample; import com.liferay.portal.kernel.monitoring.DataSampleFactory; import com.liferay.portal.kernel.monitoring.DataSampleThreadLocal; import com.liferay.portal.kernel.monitoring.PortletMonitoringControl; import com.liferay.portal.kernel.monitoring.PortletRequestType; import com.liferay.portal.kernel.monitoring.RequestStatus; import com.liferay.portal.kernel.portlet.InvokerFilterContainer; import com.liferay.portal.kernel.portlet.InvokerPortlet; import com.liferay.portal.kernel.portlet.LiferayPortletConfig; import java.io.IOException; import java.util.List; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.EventRequest; import javax.portlet.EventResponse; import javax.portlet.Portlet; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import javax.portlet.filter.ActionFilter; import javax.portlet.filter.EventFilter; import javax.portlet.filter.RenderFilter; import javax.portlet.filter.ResourceFilter; /** * @author Michael C. Han * @author Karthik Sudarshan * @author Raymond Augé * @author Philip Jones */ @ProviderType public class MonitoringInvokerPortlet implements InvokerFilterContainer, InvokerPortlet { public MonitoringInvokerPortlet( InvokerPortlet invokerPortlet, DataSampleFactory dataSampleFactory, PortletMonitoringControl portletMonitoringControl) { _invokerPortlet = invokerPortlet; _dataSampleFactory = dataSampleFactory; _portletMonitoringControl = portletMonitoringControl; } @Override public void destroy() { _invokerPortlet.destroy(); } @Override public List<ActionFilter> getActionFilters() { InvokerFilterContainer invokerFilterContainer = (InvokerFilterContainer)_invokerPortlet; return invokerFilterContainer.getActionFilters(); } @Override public List<EventFilter> getEventFilters() { InvokerFilterContainer invokerFilterContainer = (InvokerFilterContainer)_invokerPortlet; return invokerFilterContainer.getEventFilters(); } @Override public Integer getExpCache() { return _invokerPortlet.getExpCache(); } @Override public Portlet getPortlet() { return _invokerPortlet.getPortlet(); } @Override public ClassLoader getPortletClassLoader() { return _invokerPortlet.getPortletClassLoader(); } @Override public PortletConfig getPortletConfig() { return _invokerPortlet.getPortletConfig(); } @Override public PortletContext getPortletContext() { return _invokerPortlet.getPortletContext(); } @Override public Portlet getPortletInstance() { return _invokerPortlet.getPortletInstance(); } @Override public List<RenderFilter> getRenderFilters() { InvokerFilterContainer invokerFilterContainer = (InvokerFilterContainer)_invokerPortlet; return invokerFilterContainer.getRenderFilters(); } @Override public List<ResourceFilter> getResourceFilters() { InvokerFilterContainer invokerFilterContainer = (InvokerFilterContainer)_invokerPortlet; return invokerFilterContainer.getResourceFilters(); } @Override public void init(PortletConfig portletConfig) throws PortletException { LiferayPortletConfig liferayPortletConfig = (LiferayPortletConfig)portletConfig; _invokerPortlet.init(liferayPortletConfig); com.liferay.portal.kernel.model.Portlet portletModel = liferayPortletConfig.getPortlet(); _actionTimeout = portletModel.getActionTimeout(); _renderTimeout = portletModel.getRenderTimeout(); } @Override public boolean isCheckAuthToken() { return _invokerPortlet.isCheckAuthToken(); } @Override public boolean isFacesPortlet() { return _invokerPortlet.isFacesPortlet(); } @Override public boolean isStrutsBridgePortlet() { return _invokerPortlet.isStrutsBridgePortlet(); } @Override public boolean isStrutsPortlet() { return _invokerPortlet.isStrutsPortlet(); } @Override public void processAction( ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException { DataSample dataSample = null; try { if (_portletMonitoringControl.isMonitorPortletActionRequest()) { dataSample = _dataSampleFactory.createPortletRequestDataSample( PortletRequestType.ACTION, actionRequest, actionResponse); dataSample.setTimeout(_actionTimeout); dataSample.prepare(); DataSampleThreadLocal.initialize(); } _invokerPortlet.processAction(actionRequest, actionResponse); if (_portletMonitoringControl.isMonitorPortletActionRequest() && (dataSample != null)) { dataSample.capture(RequestStatus.SUCCESS); } } catch (Exception e) { _processException( _portletMonitoringControl.isMonitorPortletActionRequest(), dataSample, e); } finally { if (dataSample != null) { DataSampleThreadLocal.addDataSample(dataSample); } } } @Override public void processEvent( EventRequest eventRequest, EventResponse eventResponse) throws IOException, PortletException { DataSample dataSample = null; try { if (_portletMonitoringControl.isMonitorPortletEventRequest()) { dataSample = _dataSampleFactory.createPortletRequestDataSample( PortletRequestType.EVENT, eventRequest, eventResponse); dataSample.prepare(); DataSampleThreadLocal.initialize(); } _invokerPortlet.processEvent(eventRequest, eventResponse); if (_portletMonitoringControl.isMonitorPortletEventRequest() && (dataSample != null)) { dataSample.capture(RequestStatus.SUCCESS); } } catch (Exception e) { _processException( _portletMonitoringControl.isMonitorPortletEventRequest(), dataSample, e); } finally { if (dataSample != null) { DataSampleThreadLocal.addDataSample(dataSample); } } } @Override public void render( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { DataSample dataSample = null; try { if (_portletMonitoringControl.isMonitorPortletRenderRequest()) { dataSample = _dataSampleFactory.createPortletRequestDataSample( PortletRequestType.RENDER, renderRequest, renderResponse); dataSample.setTimeout(_renderTimeout); dataSample.prepare(); DataSampleThreadLocal.initialize(); } _invokerPortlet.render(renderRequest, renderResponse); if (_portletMonitoringControl.isMonitorPortletRenderRequest() && (dataSample != null)) { dataSample.capture(RequestStatus.SUCCESS); } } catch (Exception e) { _processException( _portletMonitoringControl.isMonitorPortletRenderRequest(), dataSample, e); } finally { if (dataSample != null) { DataSampleThreadLocal.addDataSample(dataSample); } } } @Override public void serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException { DataSample dataSample = null; try { if (_portletMonitoringControl.isMonitorPortletResourceRequest()) { dataSample = _dataSampleFactory.createPortletRequestDataSample( PortletRequestType.RESOURCE, resourceRequest, resourceResponse); dataSample.prepare(); DataSampleThreadLocal.initialize(); } _invokerPortlet.serveResource(resourceRequest, resourceResponse); if (_portletMonitoringControl.isMonitorPortletResourceRequest() && (dataSample != null)) { dataSample.capture(RequestStatus.SUCCESS); } } catch (Exception e) { _processException( _portletMonitoringControl.isMonitorPortletResourceRequest(), dataSample, e); } finally { if (dataSample != null) { DataSampleThreadLocal.addDataSample(dataSample); } } } public void setInvokerPortlet(InvokerPortlet invokerPortlet) { _invokerPortlet = invokerPortlet; } @Override public void setPortletFilters() throws PortletException { _invokerPortlet.setPortletFilters(); } private void _processException( boolean monitorPortletRequest, DataSample dataSample, Exception e) throws IOException, PortletException { if (monitorPortletRequest && (dataSample != null)) { dataSample.capture(RequestStatus.ERROR); } if (e instanceof IOException) { throw (IOException)e; } else if (e instanceof PortletException) { throw (PortletException)e; } else { throw new PortletException("Unable to process portlet", e); } } private long _actionTimeout; private final DataSampleFactory _dataSampleFactory; private InvokerPortlet _invokerPortlet; private final PortletMonitoringControl _portletMonitoringControl; private long _renderTimeout; }