Servlet Event to CDI event bus PE
nickarls Nov 23, 2009 8:58 AMHere is a trivial class that pushes the Servlet Listener events to the CDI event bus so that you can do a
public void here(@Observes @Created HttpSessionEvent e) { // session created, do work }
@WebListener public class ServletListener implements ServletContextListener, ServletContextAttributeListener, HttpSessionListener, HttpSessionAttributeListener, HttpSessionActivationListener, HttpSessionBindingListener, ServletRequestAttributeListener { private BeanManager beanManager; public ServletListener() { try { beanManager = (BeanManager) new InitialContext().lookup("java:app/BeanManager"); } catch (NamingException e) { e.printStackTrace(); } } private void fireEvent(Object payload, Annotation... qualifiers) { beanManager.fireEvent(payload, qualifiers); } public void contextDestroyed(ServletContextEvent e) { fireEvent(e, new AnnotationLiteral<Destroyed>() {}); } public void contextInitialized(ServletContextEvent e) { fireEvent(e, new AnnotationLiteral<Initialized>() {}); } public void attributeAdded(ServletContextAttributeEvent e) { fireEvent(e, new AnnotationLiteral<AttributeAdded>() {}); } public void attributeRemoved(ServletContextAttributeEvent e) { fireEvent(e, new AnnotationLiteral<AttributeRemoved>() {}); } public void attributeReplaced(ServletContextAttributeEvent e) { fireEvent(e, new AnnotationLiteral<AttributeReplaced>() {}); } public void sessionCreated(HttpSessionEvent e) { fireEvent(e, new AnnotationLiteral<Created>() {}); } public void sessionDestroyed(HttpSessionEvent e) { fireEvent(e, new AnnotationLiteral<Destroyed>() {}); } public void attributeAdded(HttpSessionBindingEvent e) { fireEvent(e, new AnnotationLiteral<AttributeAdded>() {}); } public void attributeRemoved(HttpSessionBindingEvent e) { fireEvent(e, new AnnotationLiteral<AttributeRemoved>() {}); } public void attributeReplaced(HttpSessionBindingEvent e) { fireEvent(e, new AnnotationLiteral<AttributeReplaced>() {}); } public void sessionDidActivate(HttpSessionEvent e) { fireEvent(e, new AnnotationLiteral<DidActivate>() {}); } public void sessionWillPassivate(HttpSessionEvent e) { fireEvent(e, new AnnotationLiteral<WillPassivate>() {}); } public void valueBound(HttpSessionBindingEvent e) { fireEvent(e, new AnnotationLiteral<ValueBound>() {}); } public void valueUnbound(HttpSessionBindingEvent e) { fireEvent(e, new AnnotationLiteral<ValueUnbound>() {}); } public void attributeAdded(ServletRequestAttributeEvent e) { fireEvent(e, new AnnotationLiteral<AttributeAdded>() {}); } public void attributeRemoved(ServletRequestAttributeEvent e) { fireEvent(e, new AnnotationLiteral<AttributeRemoved>() {}); } public void attributeReplaced(ServletRequestAttributeEvent e) { fireEvent(e, new AnnotationLiteral<AttributeReplaced>() {}); } }
and the qualifiers
@Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface AttributeAdded {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface AttributeRemoved {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface AttributeReplaced {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface Created {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface Destroyed {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface DidActivate {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface Initialized {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface ValueBound {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface ValueUnbound {} @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface WillPassivate {}
Notes:
- For a pre-Servlet-3 appserver, register the listener yourself
- For a spec-compliant server, use the correct JNDI URL for beanmanager ;-)
- Servlet 3 asynch listeners not yet included, didn't find any JBoss branch where they would be present
This is just a proof-of-concept, I'll package it better and put it on in.relation.to. Perhaps a JSF-CDI event bridge, too(?)
Hopefully in Java EE 7, the servlet spec would just state what CDI-events it would broadcast and there would be no listeners ;-)