package org.jboss.weld.module.web.servlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletResponse;
/**
* This class provides support for cross-context dispatching to a web application that's using Weld.
* By default Weld assumes single context dispatching, and relies upon receiving events accordingly.
* <p></p>
* This filter is only required in special circumstances - i.e. within portlet applications.
* <p></p>
* To install add the following configuration to your portlet web archive's web.xml:
* <pre>
* <filter>
* <filter-name>WeldCrossContextFilter</filter-name>
* <filter-class>org.jboss.weld.servlet.WeldCrossContextFilter</filter-class>
* </filter>
*
* <filter-mapping>
* <filter-name>WeldCrossContextFilter</filter-name>
* <url-pattern>/*</url-pattern>
* <dispatcher>INCLUDE</dispatcher>
* <dispatcher>FORWARD</dispatcher>
* <dispatcher>ERROR</dispatcher>
* </filter-mapping>
* </pre>
*
*
* @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
*/
public class WeldCrossContextFilter implements Filter {
private static final String REQUEST_CONTEXT_KEY = "org.jboss.weld.context.http.HttpRequestContextImpl";
private volatile WeldInitialListener listener;
private FilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (listener == null) {
listener = (WeldInitialListener) request.getServletContext().getAttribute(WeldInitialListener.class.getName());
}
// cross-context means request is dispatched as INCLUDE or FORWARD or ERROR
boolean crossCtx = request.getAttribute("javax.servlet.include.request_uri") != null
|| request.getAttribute("javax.servlet.forward.request_uri") != null
|| request.getAttribute("javax.servlet.error.request_uri") != null;
boolean activated = false;
try {
if (crossCtx) {
if (request.getAttribute(REQUEST_CONTEXT_KEY) == null) {
listener.requestInitialized(new ServletRequestEvent(config.getServletContext(), request));
activated = true;
}
}
chain.doFilter(request, response);
} finally {
if (activated) {
listener.requestDestroyed(new ServletRequestEvent(config.getServletContext(), request));
}
}
}
@Override
public void destroy() {
}
}