You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/12/26 13:26:50 UTC

[1/2] tomee git commit: basic AsyncContext impl - mainly mock + openejb.http.default-content-type to be able to switch default content type response - against servlet spec but useless for very simple cases

Repository: tomee
Updated Branches:
  refs/heads/develop 765bb1d0c -> f09c41bd2


basic AsyncContext impl - mainly mock + openejb.http.default-content-type to be able to switch default content type response - against servlet spec but useless for very simple cases


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/6f0b4ed5
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/6f0b4ed5
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/6f0b4ed5

Branch: refs/heads/develop
Commit: 6f0b4ed557bd280541c9d326af6d0a3af651f46b
Parents: 765bb1d
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Fri Dec 26 12:54:56 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Fri Dec 26 12:54:56 2014 +0100

----------------------------------------------------------------------
 .../server/httpd/HttpListenerRegistry.java      |  2 +-
 .../openejb/server/httpd/HttpRequestImpl.java   | 12 ++--
 .../openejb/server/httpd/HttpResponseImpl.java  |  4 +-
 .../openejb/server/httpd/OpenEJBHttpServer.java | 60 +++++++++++---------
 .../httpejbd                                    |  5 ++
 .../org/apache/openejb/server/ServicePool.java  | 26 ++++++---
 tck/cdi-embedded/pom.xml                        |  1 +
 tck/cdi-embedded/src/test/resources/failing.xml |  6 +-
 8 files changed, 75 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
index 414c8e7..4b6ccac 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
@@ -64,7 +64,6 @@ public class HttpListenerRegistry implements HttpListener {
 
     @Override
     public void onMessage(final HttpRequest request, final HttpResponse response) throws Exception {
-        final HttpRequest registered = this.request.get();
         final String path;
         if (!HttpRequestImpl.class.isInstance(request)) {
             path = request.getRequestURI();
@@ -80,6 +79,7 @@ public class HttpListenerRegistry implements HttpListener {
             filters = new HashMap<>(filterRegistry);
         }
 
+        final HttpRequest registered = this.request.get();
         final boolean reset = registered == null;
         try {
             if (reset) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index c04cb61..f923575 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -943,7 +943,8 @@ public class HttpRequestImpl implements HttpRequest {
 
     @Override
     public AsyncContext getAsyncContext() {
-        return null;
+        setAttribute("openejb_async", "true");
+        return new OpenEJBAsyncContext(this /* TODO */, HttpResponse.class.cast(getAttribute("openejb_response")), contextPath);
     }
 
     public Object getAttribute(String name) {
@@ -971,12 +972,15 @@ public class HttpRequestImpl implements HttpRequest {
 
     @Override
     public AsyncContext startAsync() {
-        return null;
+        return startAsync(this, HttpResponse.class.cast(getAttribute("openejb_response")));
     }
 
     @Override
-    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) {
-        return null;
+    public AsyncContext startAsync(final ServletRequest servletRequest, final ServletResponse servletResponse) {
+        setAttribute("openejb_async", "true");
+        final OpenEJBAsyncContext asyncContext = new OpenEJBAsyncContext(this /* TODO */, servletResponse, contextPath);
+        asyncContext.internalStartAsync();
+        return asyncContext;
     }
 
     public String getParameter(String name) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
index 5212519..a30f020 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.server.httpd;
 
+import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.OpenEjbVersion;
@@ -45,6 +46,7 @@ import java.util.StringTokenizer;
  */
 public class HttpResponseImpl implements HttpResponse {
     private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_SERVER, HttpResponseImpl.class.getName());
+    private static final String DEFAULT_CONTENT_TYPE = SystemInstance.get().getProperty("openejb.http.default-content-type", "text/html");
 
     /**
      * Response string
@@ -375,7 +377,7 @@ public class HttpResponseImpl implements HttpResponse {
      * creates a new instance of HttpResponseImpl with default values
      */
     protected HttpResponseImpl() {
-        this(200, "OK", "text/html");
+        this(200, "OK", DEFAULT_CONTENT_TYPE);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
index c8ee822..1b9d8de 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
@@ -99,6 +99,7 @@ public class OpenEJBHttpServer implements HttpServer {
          */
         OutputStream out = null;
 
+        boolean close = true;
         try {
             RequestInfos.initRequestInfo(socket);
 
@@ -107,37 +108,39 @@ public class OpenEJBHttpServer implements HttpServer {
 
             //TODO: if ssl change to https
             final URI socketURI = new URI("http://" + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort());
-            processRequest(socketURI, in, out);
+            close = processRequest(socket, socketURI, in, out);
 
-        } catch (Throwable e) {
+        } catch (final Throwable e) {
             log.error("Unexpected error", e);
         } finally {
-            if (out != null) {
-                try {
-                    out.flush();
-                } catch (Throwable e) {
-                    //Ignore
+            if (close) {
+                if (out != null) {
+                    try {
+                        out.flush();
+                    } catch (Throwable e) {
+                        //Ignore
+                    }
+                    try {
+                        out.close();
+                    } catch (Throwable e) {
+                        //Ignore
+                    }
                 }
-                try {
-                    out.close();
-                } catch (Throwable e) {
-                    //Ignore
+
+                if (in != null) {
+                    try {
+                        in.close();
+                    } catch (Throwable e) {
+                        //Ignore
+                    }
                 }
-            }
 
-            if (in != null) {
                 try {
-                    in.close();
+                    socket.close();
                 } catch (Throwable e) {
-                    //Ignore
+                    log.error("Encountered problem while closing connection with client: " + e.getMessage());
                 }
             }
-
-            try {
-                socket.close();
-            } catch (Throwable e) {
-                log.error("Encountered problem while closing connection with client: " + e.getMessage());
-            }
         }
     }
 
@@ -166,6 +169,7 @@ public class OpenEJBHttpServer implements HttpServer {
 
     @Override
     public void stop() throws ServiceException {
+        OpenEJBAsyncContext.destroy();
     }
 
     @Override
@@ -189,13 +193,14 @@ public class OpenEJBHttpServer implements HttpServer {
      * @param in  the input stream from the browser
      * @param out the output stream to the browser
      */
-    private void processRequest(final URI socketURI, final InputStream in, final OutputStream out) {
+    private boolean processRequest(final Socket socket, final URI socketURI, final InputStream in, final OutputStream out) {
         HttpResponseImpl response = null;
         try {
-            response = process(socketURI, in);
-
+            response = process(socket, socketURI, in);
+            return response != null;
         } catch (Throwable t) {
             response = HttpResponseImpl.createError(t.getMessage(), t);
+            return true;
         } finally {
             try {
                 if (response != null) {
@@ -219,7 +224,7 @@ public class OpenEJBHttpServer implements HttpServer {
         }
     }
 
-    private HttpResponseImpl process(final URI socketURI, final InputStream in) throws OpenEJBException {
+    private HttpResponseImpl process(final Socket socket, final URI socketURI, final InputStream in) throws OpenEJBException {
         final HttpRequestImpl req = new HttpRequestImpl(socketURI);
         final HttpResponseImpl res = new HttpResponseImpl();
 
@@ -258,12 +263,15 @@ public class OpenEJBHttpServer implements HttpServer {
         }
 
         try {
+            req.setAttribute("openejb_response", res);
+            req.setAttribute("openejb_socket", socket);
             listener.onMessage(req, res);
         } catch (Throwable t) {
             throw new OpenEJBException("Error occurred while executing the module " + location + "\n" + t.getClass().getName() + ":\n" + t.getMessage(), t);
         }
 
-        return res;
+        final boolean async = "true".equals(req.getAttribute("openejb_async"));
+        return !async ? res : null;
     }
 
     public static String reformat(final String raw) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/server/openejb-http/src/main/resources/META-INF/org.apache.openejb.server.ServerService/httpejbd
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/resources/META-INF/org.apache.openejb.server.ServerService/httpejbd b/server/openejb-http/src/main/resources/META-INF/org.apache.openejb.server.ServerService/httpejbd
index 1a51b98..1fcdd29 100644
--- a/server/openejb-http/src/main/resources/META-INF/org.apache.openejb.server.ServerService/httpejbd
+++ b/server/openejb-http/src/main/resources/META-INF/org.apache.openejb.server.ServerService/httpejbd
@@ -3,4 +3,9 @@ bind        = 127.0.0.1
 port        = 4204
 disabled    = ${openejb.profile.custom}
 threads     = 200
+
+# if possible use jetty
 useJetty    = true
+
+# ServicePool shouldn't force socket.close() for AsyncContext handling, HttpServer does it well already in any case
+forceSocketClose = false

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
----------------------------------------------------------------------
diff --git a/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java b/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
index 70d0467..3396858 100644
--- a/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
+++ b/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
@@ -43,6 +43,7 @@ public class ServicePool extends ServerServiceFilter {
 
     private final ThreadPoolExecutor threadPool;
     private final AtomicBoolean stop = new AtomicBoolean();
+    private boolean forceSocketClose = true;
 
     public ServicePool(final ServerService next, final Properties properties) {
         /**Defaults.
@@ -52,20 +53,28 @@ public class ServicePool extends ServerServiceFilter {
          * a slot for up to 10 seconds before rejecting the runnable.
          * If a thread remains idle for more than 1 minute then it will be removed.
          */
-        this(next, new Options(properties).get("threadsCore", 10), new Options(properties).get("threads", 150), new Options(properties).get("queue", 0), new Options(properties).get("block", true), new Options(properties).get("keepAliveTime", KEEP_ALIVE_TIME));
+        this(next, new Options(properties));
+    }
+    public ServicePool(final ServerService next, final Options properties) {
+        this(next, properties.get("threadsCore", 10), properties.get("threads", 150),
+                properties.get("queue", 0), properties.get("block", true),
+                properties.get("keepAliveTime", KEEP_ALIVE_TIME),
+                properties.get("forceSocketClose", true));
     }
 
     public ServicePool(final ServerService next, final int threads) {
-        this(next, threads, threads, 0, true, KEEP_ALIVE_TIME);
+        this(next, threads, threads, 0, true, KEEP_ALIVE_TIME, true);
     }
 
     public ServicePool(final ServerService next, final int threads, final int queue, final boolean block) {
-        this(next, threads, threads, queue, block, KEEP_ALIVE_TIME);
+        this(next, threads, threads, queue, block, KEEP_ALIVE_TIME, true);
     }
 
-    public ServicePool(final ServerService next, int threadCore, int threads, int queue, final boolean block, long keepAliveTime) {
+    public ServicePool(final ServerService next, int threadCore, int threads, int queue, final boolean block, long keepAliveTime, boolean forceClose) {
         super(next);
 
+        this.forceSocketClose = forceClose;
+
         if (keepAliveTime <= 0) {
             keepAliveTime = KEEP_ALIVE_TIME;
         }
@@ -187,9 +196,10 @@ public class ServicePool extends ServerServiceFilter {
 
                 ClassLoader cl = null;
 
+                final Thread thread = Thread.currentThread();
                 try {
-                    cl = Thread.currentThread().getContextClassLoader();
-                    Thread.currentThread().setContextClassLoader(tccl);
+                    cl = thread.getContextClassLoader();
+                    thread.setContextClassLoader(tccl);
 
                     if (stop.get()) {
                         return;
@@ -224,7 +234,7 @@ public class ServicePool extends ServerServiceFilter {
                     //Ensure delegated socket is closed here
 
                     try {
-                        if (socket != null) {
+                        if (forceSocketClose && socket != null) {
                             socket.close();
                         }
                     } catch (Throwable t) {
@@ -234,7 +244,7 @@ public class ServicePool extends ServerServiceFilter {
                         }
                     }
 
-                    Thread.currentThread().setContextClassLoader(cl);
+                    thread.setContextClassLoader(cl);
                 }
             }
         };

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/tck/cdi-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/pom.xml b/tck/cdi-embedded/pom.xml
index a276d3e..d2e230a 100644
--- a/tck/cdi-embedded/pom.xml
+++ b/tck/cdi-embedded/pom.xml
@@ -189,6 +189,7 @@
             <openejb.cdi.filter.classloader>false</openejb.cdi.filter.classloader>
 
             <openejb.http.mock-request>true</openejb.http.mock-request>
+            <openejb.http.default-content-type>text/plain</openejb.http.default-content-type>
             <openejb.deploymentId.format>{appId}/{ejbJarId}/{ejbName}</openejb.deploymentId.format>
             <org.apache.openejb.assembler.classic.WebAppBuilder>org.apache.openejb.web.LightweightWebAppBuilder</org.apache.openejb.assembler.classic.WebAppBuilder>
           </systemPropertyVariables>

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f0b4ed5/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index 956b46e..9cf0646 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -18,7 +18,11 @@
 <suite name="CDI TCK" verbose="0">
   <test name="CDI TCK">
     <!-- runner helping properties
-    -Dopenejb.cdi.filter.classloader=false -Dorg.apache.openejb.assembler.classic.WebAppBuilder=org.apache.openejb.web.LightweightWebAppBuilder -Dopenejb.cdi.debug=true -Dopenejb.http.mock-request=true
+    -Dorg.apache.openejb.assembler.classic.WebAppBuilder=org.apache.openejb.web.LightweightWebAppBuilder
+    -Dopenejb.cdi.debug=true
+    -Dopenejb.cdi.filter.classloader=false
+    -Dopenejb.http.mock-request=true
+    -Dopenejb.http.default-content-type=text/plain
     -->
     <classes>
       <class name="org.jboss.cdi.tck.tests.context.application.async.ApplicationContextAsyncListenerTest" />


[2/2] tomee git commit: basic support of session/request http listeners in openejb-http

Posted by rm...@apache.org.
basic support of session/request http listeners in openejb-http


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/f09c41bd
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/f09c41bd
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/f09c41bd

Branch: refs/heads/develop
Commit: f09c41bd2a95f2b5083ebcd405c17caeba4fdc8d
Parents: 6f0b4ed
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Fri Dec 26 13:25:29 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Fri Dec 26 13:25:29 2014 +0100

----------------------------------------------------------------------
 .../openejb/web/LightweightWebAppBuilder.java   | 10 ++++++++
 .../openejb/server/httpd/HttpRequestImpl.java   | 18 +++++++++++++-
 .../openejb/server/httpd/HttpSessionImpl.java   | 26 ++++++++++++++++++--
 tck/cdi-embedded/src/test/resources/failing.xml |  2 +-
 4 files changed, 52 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/f09c41bd/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
index 7a9176b..3befe49 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/web/LightweightWebAppBuilder.java
@@ -62,6 +62,7 @@ import javax.ws.rs.core.Application;
 import java.io.File;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -287,6 +288,15 @@ public class LightweightWebAppBuilder implements WebAppBuilder {
         }
     }
 
+    public Collection<Object> listenersFor(final String context) {
+        for (final Map.Entry<WebAppInfo, List<Object>> info : listeners.entrySet()) {
+            if (context != null && context.replace("/", "").equals(info.getKey().contextRoot.replace("/", ""))) {
+                return info.getValue();
+            }
+        }
+        return null;
+    }
+
     private static Class<?> loadFromUrls(final ClassLoader loader, final String url, final String path) throws ClassNotFoundException {
         final String classname;
         if (path.startsWith("archive:") && path.contains(".war/")) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/f09c41bd/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index f923575..91eddc3 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -30,6 +30,7 @@ import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
@@ -151,6 +152,7 @@ public class HttpRequestImpl implements HttpRequest {
     private ServletContext context = null;
     private String contextPath = "";
     private String servletPath = null;
+    private Collection<ServletRequestListener> listeners;
 
     public HttpRequestImpl(URI socketURI) {
         this.socketURI = socketURI;
@@ -854,7 +856,7 @@ public class HttpRequestImpl implements HttpRequest {
 
     public HttpSession getSession(boolean create) {
         if (session == null && create) {
-            session = new HttpSessionImpl(SESSIONS);
+            session = new HttpSessionImpl(SESSIONS, contextPath);
             if (begin != null) {
                 begin.sessionCreated(new HttpSessionEvent(session));
                 session = new SessionInvalidateListener(session, end);
@@ -1139,9 +1141,23 @@ public class HttpRequestImpl implements HttpRequest {
         if (begin != null) {
             begin.requestInitialized(new ServletRequestEvent(getServletContext(), this));
         }
+
+        listeners = LightweightWebAppBuilderListenerExtractor.findByTypeForContext(contextPath, ServletRequestListener.class);
+        if (!listeners.isEmpty()) {
+            final ServletRequestEvent event = new ServletRequestEvent(getServletContext(), this);
+            for (final ServletRequestListener listener : listeners) {
+                listener.requestInitialized(event);
+            }
+        }
     }
 
     public void destroy() {
+        if (listeners != null && !listeners.isEmpty()) {
+            final ServletRequestEvent event = new ServletRequestEvent(getServletContext(), this);
+            for (final ServletRequestListener listener : listeners) {
+                listener.requestDestroyed(event);
+            }
+        }
         if (end != null) {
             end.requestDestroyed(new ServletRequestEvent(getServletContext(), this));
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/f09c41bd/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
index 940f9fa..b2e80c7 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
@@ -21,7 +21,10 @@ import org.apache.openejb.loader.SystemInstance;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpSessionContext;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -30,16 +33,28 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentMap;
 
 public class HttpSessionImpl implements HttpSession {
+    private Collection<HttpSessionListener> listeners;
     private String sessionId = UUID.randomUUID().toString();
     private Map<String, Object> attributes = new HashMap<String, Object>();
     private final ConcurrentMap<String, HttpSession> mapToClean;
 
-    public HttpSessionImpl(final ConcurrentMap<String, HttpSession> sessions) {
+    public HttpSessionImpl(final ConcurrentMap<String, HttpSession> sessions, final String contextPath) {
         mapToClean = sessions;
+        if (contextPath == null) {
+            return;
+        }
+
+        listeners = LightweightWebAppBuilderListenerExtractor.findByTypeForContext(contextPath, HttpSessionListener.class);
+        if (!listeners.isEmpty()) {
+            final HttpSessionEvent event = new HttpSessionEvent(this);
+            for (final HttpSessionListener o : listeners) {
+                HttpSessionListener.class.cast(o).sessionCreated(event);
+            }
+        }
     }
 
     public HttpSessionImpl() {
-        this(null);
+        this(null, null);
     }
 
     public void newSessionId() {
@@ -64,6 +79,13 @@ public class HttpSessionImpl implements HttpSession {
 
     @Override
     public void invalidate() {
+        if (!listeners.isEmpty()) {
+            final HttpSessionEvent event = new HttpSessionEvent(this);
+            for (final HttpSessionListener o : listeners) {
+                HttpSessionListener.class.cast(o).sessionDestroyed(event);
+            }
+        }
+
         attributes.clear();
         if (mapToClean != null) {
             mapToClean.remove(sessionId);

http://git-wip-us.apache.org/repos/asf/tomee/blob/f09c41bd/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index 9cf0646..ad1d852 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -25,7 +25,7 @@
     -Dopenejb.http.default-content-type=text/plain
     -->
     <classes>
-      <class name="org.jboss.cdi.tck.tests.context.application.async.ApplicationContextAsyncListenerTest" />
+      <class name="org.jboss.cdi.tck.tests.context.application.ApplicationContextTest" />
     </classes>
   </test>
 </suite>