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>
