/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This 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 software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.webapp;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.richfaces.log.Logger;
import org.richfaces.log.RichfacesLogger;
import com.google.common.collect.Iterators;
import com.google.common.collect.Sets;
/**
*
* @author Nick Belaevski
*/
public class PushFilter implements Filter {
private static final long serialVersionUID = 7616370505508715222L;
private static final Logger LOGGER = RichfacesLogger.WEBAPP.getLogger();
private PushServlet pushServlet;
private ServletConfigFacade servletConfig;
public void init(FilterConfig filterConfig) throws ServletException {
logPushFilterWarning(filterConfig.getServletContext());
servletConfig = new ServletConfigFacade(filterConfig);
}
private void logPushFilterWarning(ServletContext servletContext) {
String message;
if (servletContext.getMajorVersion() >= 3) {
message = "PushFilter has been deprecated, you can remove its declaration in Servlets 3 environment";
} else {
message = "PushFilter has been deprecated, you should use PushServlet instead";
}
LOGGER.warn(message);
}
/*
* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpResp = (HttpServletResponse) response;
if ("GET".equals(httpReq.getMethod()) && httpReq.getQueryString() != null
&& httpReq.getQueryString().contains("__richfacesPushAsync")) {
if (pushServlet == null) {
pushServlet = new PushServlet();
pushServlet.init(servletConfig);
}
pushServlet.doGet(httpReq, httpResp);
return;
}
}
chain.doFilter(request, response);
}
/*
* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy() {
if (pushServlet != null) {
pushServlet.destroy();
pushServlet = null;
}
}
private final class ServletConfigFacade implements ServletConfig {
private final FilterConfig filterConfig;
private ServletConfigFacade(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public String getServletName() {
return filterConfig.getFilterName();
}
public ServletContext getServletContext() {
return filterConfig.getServletContext();
}
public String getInitParameter(String name) {
String result = filterConfig.getInitParameter(name);
if (result == null) {
result = filterConfig.getServletContext().getInitParameter(name);
}
return result;
}
public Enumeration<String> getInitParameterNames() {
Set<String> result = Sets.newLinkedHashSet();
result.addAll(Collections.list(filterConfig.getInitParameterNames()));
result.addAll(Collections.list(filterConfig.getServletContext().getInitParameterNames()));
return Iterators.asEnumeration(result.iterator());
}
}
}