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.portal.servlet.filters.monitoring;
016    
017    import com.liferay.portal.kernel.messaging.DestinationNames;
018    import com.liferay.portal.kernel.messaging.MessageBusUtil;
019    import com.liferay.portal.kernel.monitoring.RequestStatus;
020    import com.liferay.portal.kernel.monitoring.statistics.DataSampleThreadLocal;
021    import com.liferay.portal.kernel.util.GetterUtil;
022    import com.liferay.portal.monitoring.statistics.portal.PortalRequestDataSample;
023    import com.liferay.portal.monitoring.statistics.service.ServiceMonitorAdvice;
024    import com.liferay.portal.servlet.filters.BasePortalFilter;
025    import com.liferay.portal.util.PortalUtil;
026    import com.liferay.portal.util.PropsValues;
027    import com.liferay.portlet.MonitoringPortlet;
028    
029    import java.io.IOException;
030    
031    import javax.servlet.FilterChain;
032    import javax.servlet.ServletException;
033    import javax.servlet.http.HttpServletRequest;
034    import javax.servlet.http.HttpServletResponse;
035    
036    /**
037     * @author Rajesh Thiagarajan
038     * @author Michael C. Han
039     */
040    public class MonitoringFilter extends BasePortalFilter {
041    
042            public static boolean isMonitoringPortalRequest() {
043                    return _monitoringPortalRequest;
044            }
045    
046            public static void setMonitoringPortalRequest(
047                    boolean monitoringPortalRequest) {
048    
049                    _monitoringPortalRequest = monitoringPortalRequest;
050            }
051    
052            @Override
053            public boolean isFilterEnabled() {
054                    if (!super.isFilterEnabled()) {
055                            return false;
056                    }
057    
058                    if (!_monitoringPortalRequest &&
059                            !MonitoringPortlet.isMonitoringPortletActionRequest() &&
060                            !MonitoringPortlet.isMonitoringPortletEventRequest() &&
061                            !MonitoringPortlet.isMonitoringPortletRenderRequest() &&
062                            !MonitoringPortlet.isMonitoringPortletResourceRequest() &&
063                            !ServiceMonitorAdvice.isActive()) {
064    
065                            return false;
066                    }
067    
068                    return true;
069            }
070    
071            @Override
072            protected void processFilter(
073                            HttpServletRequest request, HttpServletResponse response,
074                            FilterChain filterChain)
075                    throws IOException, ServletException {
076    
077                    long companyId = PortalUtil.getCompanyId(request);
078    
079                    PortalRequestDataSample portalRequestDataSample = null;
080    
081                    if (_monitoringPortalRequest) {
082                            portalRequestDataSample = new PortalRequestDataSample(
083                                    companyId, request.getRemoteUser(), request.getRequestURI(),
084                                    GetterUtil.getString(request.getRequestURL()));
085    
086                            DataSampleThreadLocal.initialize();
087                    }
088    
089                    try {
090                            if (portalRequestDataSample != null) {
091                                    portalRequestDataSample.prepare();
092                            }
093    
094                            processFilter(
095                                    MonitoringFilter.class, request, response, filterChain);
096    
097                            if (portalRequestDataSample != null) {
098                                    portalRequestDataSample.capture(RequestStatus.SUCCESS);
099                            }
100                    }
101                    catch (Exception e) {
102                            if (portalRequestDataSample != null) {
103                                    portalRequestDataSample.capture(RequestStatus.ERROR);
104                            }
105    
106                            if (e instanceof IOException) {
107                                    throw (IOException)e;
108                            }
109                            else if (e instanceof ServletException) {
110                                    throw (ServletException)e;
111                            }
112                            else {
113                                    throw new ServletException("Unable to execute request", e);
114                            }
115                    }
116                    finally {
117                            if (portalRequestDataSample != null) {
118                                    DataSampleThreadLocal.addDataSample(portalRequestDataSample);
119                            }
120    
121                            MessageBusUtil.sendMessage(
122                                    DestinationNames.MONITORING,
123                                    DataSampleThreadLocal.getDataSamples());
124                    }
125            }
126    
127            private static boolean _monitoringPortalRequest =
128                    PropsValues.MONITORING_PORTAL_REQUEST;
129    
130    }