package org.jboss.weld.environment.jetty7; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.log.Log; import org.jboss.weld.environment.jetty.JettyWeldInjector; import org.jboss.weld.environment.servlet.Listener; import org.jboss.weld.manager.api.WeldManager; import javax.servlet.Filter; import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletException; import java.util.EventListener; /** * Jetty 7 ServletContextHandler Decorator that performs the injection of weld resources */ public class WeldDecorator implements ServletContextHandler.Decorator { private ServletContext sco; private JettyWeldInjector injector; public WeldDecorator(ServletContext sco) { this.sco = sco; } @Override public T decorateFilterInstance(T filter) throws ServletException { return inject(filter); } @Override public T decorateServletInstance(T servlet) throws ServletException { return inject(servlet); } @Override public T decorateListenerInstance(T listener) throws ServletException { // preemptively invoke the Weld Listener if (listener instanceof Listener) { return initializeWeld(listener); } else { return inject(listener); } } @Override public void decorateFilterHolder(FilterHolder filter) throws ServletException { } @Override public void decorateServletHolder(ServletHolder servlet) throws ServletException { } @Override public void destroyServletInstance(Servlet s) { release(s); } @Override public void destroyFilterInstance(Filter f) { release(f); } @Override public void destroyListenerInstance(EventListener f) { release(f); } protected T inject(T injectable) { if (injector == null) { initializeInjector(); } if (injector == null) { Log.warn("Can't find WeldManager in the servlet context; injection is not available for Servlet component: " + injectable); } else { injector.inject(injectable); } return injectable; } protected void initializeInjector() { WeldManager manager = (WeldManager) sco.getAttribute(org.jboss.weld.environment.servlet.Listener.BEAN_MANAGER_ATTRIBUTE_NAME); if (manager != null) { injector = new JettyWeldInjector(manager); } } protected T initializeWeld(T weldListener) { ((Listener) weldListener).contextInitialized(new ServletContextEvent(sco)); return weldListener; } protected void release(Object injectable) { if (injector != null) { injector.release(injectable); } } }