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.kernel.servlet;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.servlet.filters.invoker.FilterMapping;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.PropsKeys;
021    import com.liferay.portal.kernel.util.PropsUtil;
022    import com.liferay.portal.kernel.util.StringPool;
023    
024    import java.io.IOException;
025    
026    import java.util.ArrayList;
027    
028    import javax.servlet.FilterChain;
029    import javax.servlet.FilterConfig;
030    import javax.servlet.ServletContext;
031    import javax.servlet.ServletException;
032    import javax.servlet.ServletRequest;
033    import javax.servlet.ServletResponse;
034    import javax.servlet.http.HttpServletRequest;
035    import javax.servlet.http.HttpServletResponse;
036    
037    /**
038     * @author Raymond Aug??
039     * @author Eduardo Lundgren
040     */
041    public abstract class BaseFilter implements LiferayFilter {
042    
043            @Override
044            public void destroy() {
045                    LiferayFilterTracker.removeLiferayFilter(this);
046            }
047    
048            @Override
049            public void doFilter(
050                            ServletRequest servletRequest, ServletResponse servletResponse,
051                            FilterChain filterChain)
052                    throws IOException, ServletException {
053    
054                    try {
055                            HttpServletRequest request = (HttpServletRequest)servletRequest;
056                            HttpServletResponse response = (HttpServletResponse)servletResponse;
057    
058                            if (_invokerEnabled) {
059                                    processFilter(request, response, filterChain);
060                            }
061                            else {
062                                    String uri = request.getRequestURI();
063    
064                                    if (isFilterEnabled() && isFilterEnabled(request, response) &&
065                                            _filterMapping.isMatchURLRegexPattern(request, uri)) {
066    
067                                            processFilter(request, response, filterChain);
068                                    }
069                                    else {
070                                            filterChain.doFilter(servletRequest, servletResponse);
071                                    }
072                            }
073                    }
074                    catch (IOException ioe) {
075                            throw ioe;
076                    }
077                    catch (ServletException se) {
078                            throw se;
079                    }
080                    catch (Exception e) {
081                            Log log = getLog();
082    
083                            log.error(e, e);
084                    }
085            }
086    
087            public FilterConfig getFilterConfig() {
088                    return _filterConfig;
089            }
090    
091            @Override
092            public void init(FilterConfig filterConfig) {
093                    _filterConfig = filterConfig;
094    
095                    if (_TCK_URL) {
096                            ServletContext servletContext = _filterConfig.getServletContext();
097    
098                            _invokerEnabled = GetterUtil.get(
099                                    servletContext.getInitParameter("liferay-invoker-enabled"),
100                                    true);
101    
102                            if (!_invokerEnabled) {
103                                    _filterMapping = new FilterMapping(
104                                            this, filterConfig, new ArrayList<String>(0),
105                                            new ArrayList<String>(0));
106                            }
107                    }
108    
109                    LiferayFilterTracker.addLiferayFilter(this);
110            }
111    
112            @Override
113            public boolean isFilterEnabled() {
114                    return _filterEnabled;
115            }
116    
117            @Override
118            public boolean isFilterEnabled(
119                    HttpServletRequest request, HttpServletResponse response) {
120    
121                    return _filterEnabled;
122            }
123    
124            @Override
125            public void setFilterEnabled(boolean filterEnabled) {
126                    _filterEnabled = filterEnabled;
127            }
128    
129            protected abstract Log getLog();
130    
131            protected void processFilter(
132                            Class<?> filterClass, HttpServletRequest request,
133                            HttpServletResponse response, FilterChain filterChain)
134                    throws Exception {
135    
136                    long startTime = 0;
137    
138                    String threadName = null;
139                    String depther = null;
140                    String path = null;
141    
142                    Log log = getLog();
143    
144                    if (log.isDebugEnabled()) {
145                            startTime = System.currentTimeMillis();
146    
147                            Thread currentThread = Thread.currentThread();
148    
149                            threadName = currentThread.getName();
150    
151                            depther = (String)request.getAttribute(_DEPTHER);
152    
153                            if (depther == null) {
154                                    depther = StringPool.BLANK;
155                            }
156                            else {
157                                    depther += StringPool.EQUAL;
158                            }
159    
160                            request.setAttribute(_DEPTHER, depther);
161    
162                            path = request.getRequestURI();
163    
164                            log.debug(
165                                    "[" + threadName + "]" + depther + "> " +
166                                            filterClass.getName() + " " + path);
167                    }
168    
169                    filterChain.doFilter(request, response);
170    
171                    if (!log.isDebugEnabled()) {
172                            return;
173                    }
174    
175                    long endTime = System.currentTimeMillis();
176    
177                    depther = (String)request.getAttribute(_DEPTHER);
178    
179                    if (depther == null) {
180                            return;
181                    }
182    
183                    log.debug(
184                            "[" + threadName + "]" + depther + "< " +
185                                    filterClass.getName() + " " + path + " " +
186                                            (endTime - startTime) + " ms");
187    
188                    if (depther.length() > 0) {
189                            depther = depther.substring(1);
190                    }
191    
192                    request.setAttribute(_DEPTHER, depther);
193            }
194    
195            protected void processFilter(
196                            HttpServletRequest request, HttpServletResponse response,
197                            FilterChain filterChain)
198                    throws Exception {
199    
200                    throw new UnsupportedOperationException(
201                            "Please implement processFilter(HttpServletRequest, " +
202                                    "HttpServletResponse, FilterChain)");
203            }
204    
205            private static final String _DEPTHER = "DEPTHER";
206    
207            private static final boolean _TCK_URL = GetterUtil.getBoolean(
208                    PropsUtil.get(PropsKeys.TCK_URL));
209    
210            private FilterConfig _filterConfig;
211            private boolean _filterEnabled = true;
212            private FilterMapping _filterMapping;
213            private boolean _invokerEnabled = true;
214    
215    }