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    
087                    try {
088                            if (portalRequestDataSample != null) {
089                                    portalRequestDataSample.prepare();
090                            }
091    
092                            processFilter(
093                                    MonitoringFilter.class, request, response, filterChain);
094    
095                            if (portalRequestDataSample != null) {
096                                    portalRequestDataSample.capture(RequestStatus.SUCCESS);
097                            }
098                    }
099                    catch (Exception e) {
100                            if (portalRequestDataSample != null) {
101                                    portalRequestDataSample.capture(RequestStatus.ERROR);
102                            }
103    
104                            if (e instanceof IOException) {
105                                    throw (IOException)e;
106                            }
107                            else if (e instanceof ServletException) {
108                                    throw (ServletException)e;
109                            }
110                            else {
111                                    throw new ServletException("Unable to execute request", e);
112                            }
113                    }
114                    finally {
115                            if (portalRequestDataSample != null) {
116                                    DataSampleThreadLocal.addDataSample(portalRequestDataSample);
117                            }
118    
119                            MessageBusUtil.sendMessage(
120                                    DestinationNames.MONITORING,
121                                    DataSampleThreadLocal.getDataSamples());
122                    }
123            }
124    
125            private static boolean _monitoringPortalRequest =
126                    PropsValues.MONITORING_PORTAL_REQUEST;
127    
128    }