package org.jboss.seam.flex; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.*; import org.jboss.seam.*; import org.jboss.seam.annotations.*; import org.jboss.seam.annotations.intercept.*; import org.jboss.seam.deployment.AnnotationDeploymentHandler; import org.jboss.seam.deployment.DeploymentStrategy; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; import org.jboss.seam.web.AbstractFilter; @Scope(ScopeType.APPLICATION) @Name("org.jboss.seam.flex.flexFilter") @Startup @Install(precedence=Install.BUILT_IN, value=false) @BypassInterceptors @org.jboss.seam.annotations.web.Filter //within={"org.jboss.seam.????"} public class FlexFilter extends AbstractFilter { private static final LogProvider log = Logging.getLogProvider(FlexFilter.class); MessageBrokerManager messageBrokerManager; List<Class<?>> scanned = new ArrayList<Class<?>>(); private AnnotationDeploymentHandler annotationDeploymentHandler() { DeploymentStrategy deployment = (DeploymentStrategy) Component.getInstance("deploymentStrategy"); if (deployment != null) { return (AnnotationDeploymentHandler) deployment.getDeploymentHandlers().get(AnnotationDeploymentHandler.NAME); } return null; } private Collection<Class<?>> scannedClasses() { Collection<Class<?>> result = null; AnnotationDeploymentHandler handler = annotationDeploymentHandler(); if (handler !=null) { result = handler.getClassMap().get(FlexRemote.class.getName()); } return result != null ? result : new ArrayList<Class<?>>(0); } @Create public void seamInit() { // deployment handler only knows about scanned classes during startup // so we need to get them now and save them scanned.addAll(scannedClasses()); } @Override public void init(FilterConfig filterConfig) throws ServletException { super.init(filterConfig); messageBrokerManager = new MessageBrokerManager(); messageBrokerManager.init(new FlexServletConfig(filterConfig.getServletContext())); messageBrokerManager.addDestinations(scanned); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (isMappedToCurrentRequestPath(request)) { messageBrokerManager.service((HttpServletRequest)request, (HttpServletResponse)response); } else { chain.doFilter(request, response); } } private static class FlexServletConfig implements ServletConfig { Map<String,String> params; ServletContext context; public FlexServletConfig(ServletContext context) { this(context, null); } public FlexServletConfig(ServletContext context, Map<String,String> params) { this.context = context; this.params = (params!=null) ? params : new HashMap<String,String>(); } public ServletContext getServletContext() { return context; } public String getServletName() { return "FlexServlet"; } public String getInitParameter(String param) { String result = params.get(param); log.info("init param " + param + " is " + result); return result; } @SuppressWarnings("unchecked") public Enumeration getInitParameterNames() { return Collections.enumeration(params.keySet()); } } }