Repository: tomee
Updated Branches:
  refs/heads/master 45b6a81ce -> d428b72bd


cdi scope for async listenrr + serialization of managed datasource


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

Branch: refs/heads/master
Commit: d428b72bd2cf9cce773ae896a56582aee3b9363f
Parents: 45b6a81
Author: Romain Manni-Bucau <[email protected]>
Authored: Fri Mar 20 12:06:50 2015 +0100
Committer: Romain Manni-Bucau <[email protected]>
Committed: Fri Mar 20 12:06:50 2015 +0100

----------------------------------------------------------------------
 .../jdbc/managed/local/ManagedDataSource.java   | 11 ++-
 .../openejb/server/httpd/WebBeansFilter.java    | 84 ++++++++++++++++++--
 tck/cdi-tomee/src/test/resources/failing.xml    |  3 +-
 3 files changed, 87 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/d428b72b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
index 0c074f9..196fae7 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedDataSource.java
@@ -22,14 +22,16 @@ import org.apache.openejb.util.reflection.Reflections;
 import javax.sql.CommonDataSource;
 import javax.sql.DataSource;
 import javax.transaction.TransactionManager;
+import java.io.ObjectStreamException;
 import java.io.PrintWriter;
+import java.io.Serializable;
 import java.lang.reflect.Proxy;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.logging.Logger;
 
-public class ManagedDataSource implements DataSource {
+public class ManagedDataSource implements DataSource, Serializable {
     private static final Class<?>[] CONNECTION_CLASS = new 
Class<?>[]{Connection.class};
 
     protected final DataSource delegate;
@@ -113,4 +115,11 @@ public class ManagedDataSource implements DataSource {
     public int hashCode() {
         return hashCode;
     }
+
+    Object writeReplace() throws ObjectStreamException {
+        if (Serializable.class.isInstance(delegate)) {
+            return delegate; // we don't care about the wrapping delegate will 
do another lookup when unserialized so it is magic :)
+        }
+        throw new ObjectStreamException(delegate + " not serializable") {};
+    }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/d428b72b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansFilter.java
----------------------------------------------------------------------
diff --git 
a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansFilter.java
 
b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansFilter.java
index 5040072..a219e9e 100644
--- 
a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansFilter.java
+++ 
b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansFilter.java
@@ -16,11 +16,13 @@
  */
 package org.apache.openejb.server.httpd;
 
+import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.spi.ContextsService;
 
 import javax.enterprise.context.RequestScoped;
 import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
 import javax.servlet.AsyncListener;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -72,17 +74,21 @@ public class WebBeansFilter implements Filter { // its 
pupose is to start/stop r
 
     public static class AsynContextWrapper implements AsyncContext {
         private final AsyncContext delegate;
-        private final ContextsService service;
+        private final CdiAppContextsService service;
         private volatile ServletRequestEvent event;
 
         public AsynContextWrapper(final AsyncContext asyncContext) {
             this.delegate = asyncContext;
-            this.service = 
WebBeansContext.currentInstance().getService(ContextsService.class);
+            this.service = 
CdiAppContextsService.class.cast(WebBeansContext.currentInstance().getService(ContextsService.class));
             this.event = null;
         }
 
-        private void startRequestScope() {
-            service.startContext(RequestScoped.class, getEvent());
+        private boolean startRequestScope() {
+            if (service.getRequestContext(false) == null) {
+                service.startContext(RequestScoped.class, getEvent());
+                return true;
+            }
+            return false;
         }
 
         private void stopRequestScope() {
@@ -133,11 +139,13 @@ public class WebBeansFilter implements Filter { // its 
pupose is to start/stop r
 
         @Override
         public void complete() {
-            startRequestScope();
+            final boolean created = startRequestScope();
             try {
                 delegate.complete();
             } finally {
-                stopRequestScope();
+                if (created) {
+                    stopRequestScope();
+                }
             }
         }
 
@@ -158,12 +166,16 @@ public class WebBeansFilter implements Filter { // its 
pupose is to start/stop r
 
         @Override
         public void addListener(final AsyncListener asyncListener) {
-            delegate.addListener(asyncListener);
+            delegate.addListener(wrapListener(asyncListener));
+        }
+
+        private AsyncListener wrapListener(final AsyncListener asyncListener) {
+            return new ScopeAwareListener(asyncListener);
         }
 
         @Override
         public void addListener(final AsyncListener asyncListener, final 
ServletRequest servletRequest, final ServletResponse servletResponse) {
-            delegate.addListener(asyncListener, servletRequest, 
servletResponse);
+            delegate.addListener(wrapListener(asyncListener), servletRequest, 
servletResponse);
         }
 
         @Override
@@ -180,5 +192,61 @@ public class WebBeansFilter implements Filter { // its 
pupose is to start/stop r
         public long getTimeout() {
             return delegate.getTimeout();
         }
+
+        private class ScopeAwareListener implements AsyncListener {
+            private final AsyncListener delegate;
+
+            public ScopeAwareListener(final AsyncListener asyncListener) {
+                this.delegate = asyncListener;
+            }
+
+            @Override
+            public void onComplete(final AsyncEvent event) throws IOException {
+                final boolean created = startRequestScope();
+                try {
+                    delegate.onComplete(event);
+                } finally {
+                    if (created) {
+                        stopRequestScope();
+                    }
+                }
+            }
+
+            @Override
+            public void onTimeout(final AsyncEvent event) throws IOException {
+                final boolean created = startRequestScope();
+                try {
+                    delegate.onTimeout(event);
+                } finally {
+                    if (created) {
+                        stopRequestScope();
+                    }
+                }
+            }
+
+            @Override
+            public void onError(final AsyncEvent event) throws IOException {
+                final boolean created = startRequestScope();
+                try {
+                    delegate.onError(event);
+                } finally {
+                    if (created) {
+                        stopRequestScope();
+                    }
+                }
+            }
+
+            @Override
+            public void onStartAsync(final AsyncEvent event) throws 
IOException {
+                final boolean created = startRequestScope();
+                try {
+                    delegate.onStartAsync(event);
+                } finally {
+                    if (created) {
+                        stopRequestScope();
+                    }
+                }
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/d428b72b/tck/cdi-tomee/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-tomee/src/test/resources/failing.xml 
b/tck/cdi-tomee/src/test/resources/failing.xml
index d691a8e..3495506 100644
--- a/tck/cdi-tomee/src/test/resources/failing.xml
+++ b/tck/cdi-tomee/src/test/resources/failing.xml
@@ -24,7 +24,6 @@
   <test name="CDI TCK">
     <classes>
       <!--
-  
ConversationDeterminationTest>Arquillian.run:164->testConversationDetermination:78
 expected [true] but found [false]
   ConversationFilterTest>Arquillian.run:164->testConversationBusy:133 expected 
[BusyConversationException] but found [500]
   DataSourcePassivationDependencyTest>Arquillian.run:164->testDataSource:68 » 
IllegalProduct
   
RequestContextTest>Arquillian.run:164->testRequestScopeActiveDuringServiceMethod:62
 » FailingHttpStatusCode
@@ -55,7 +54,7 @@
   
DisabledProducerMethodInjectionNotAvailableTest>Arquillian.arquillianBeforeClass:109
 » Runtime
   
DisabledSessionBeanInjectionNotAvailableTest>Arquillian.arquillianBeforeClass:109
 » Runtime
   -->
-      <class 
name="org.jboss.cdi.tck.tests.context.alterable.AlterableContextTest" />
+      <class 
name="org.jboss.cdi.tck.tests.context.passivating.dependency.resource.persistence.DataSourcePassivationDependencyTest"
 />
     </classes>
   </test>
 </suite>

Reply via email to