Author: rmannibucau
Date: Sat Jun 23 10:10:17 2012
New Revision: 1353106
URL: http://svn.apache.org/viewvc?rev=1353106&view=rev
Log:
OPENEJB-1843 @BeforeXXX @AfterXXX doesn't use the test managed bean classloader
with embedded arquillian adapter
Modified:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java
Modified:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java?rev=1353106&r1=1353105&r2=1353106&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/TestObserver.java
Sat Jun 23 10:10:17 2012
@@ -25,16 +25,22 @@ import org.jboss.arquillian.core.api.ann
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.core.spi.EventContext;
import org.jboss.arquillian.test.spi.annotation.SuiteScoped;
+import org.jboss.arquillian.test.spi.event.suite.After;
+import org.jboss.arquillian.test.spi.event.suite.AfterClass;
+import org.jboss.arquillian.test.spi.event.suite.Before;
+import org.jboss.arquillian.test.spi.event.suite.BeforeClass;
+import org.jboss.arquillian.test.spi.event.suite.ClassLifecycleEvent;
import org.jboss.arquillian.test.spi.event.suite.Test;
+import org.jboss.arquillian.test.spi.event.suite.TestLifecycleEvent;
public class TestObserver {
@Inject
@SuiteScoped
private Instance<ClassLoader> classLoader;
- public void observe(@Observes EventContext<Test> event) {
+ private void setClassLoader(final Class<?> clazz, final Runnable run) {
final BeanContext context =
SystemInstance.get().getComponent(ContainerSystem.class)
-
.getBeanContext(event.getEvent().getTestClass().getJavaClass().getName());
+ .getBeanContext(clazz.getName());
ThreadContext oldCtx = null;
ClassLoader oldCl = null;
@@ -42,11 +48,13 @@ public class TestObserver {
oldCtx = ThreadContext.enter(new ThreadContext(context, null));
} else {
oldCl = Thread.currentThread().getContextClassLoader();
- setTCCL(classLoader.get());
+ if (classLoader.get() != null) {
+ setTCCL(classLoader.get());
+ }
}
try {
- event.proceed();
+ run.run();
} finally {
if (context != null) {
ThreadContext.exit(oldCtx);
@@ -56,7 +64,66 @@ public class TestObserver {
}
}
+ public void observe(@Observes final EventContext<Test> event) {
+ setClassLoader(event.getEvent().getTestClass().getJavaClass(), new
Runnable() {
+ @Override
+ public void run() {
+ event.proceed();
+ }
+ });
+ }
+
+ public void on(@Observes(precedence = 200) final BeforeClass event) throws
Throwable {
+ setClassLoader(event.getTestClass().getJavaClass(), new
CLassEventRunnable(event));
+ }
+
+ public void on(@Observes(precedence = 200) AfterClass event) throws
Throwable {
+ setClassLoader(event.getTestClass().getJavaClass(), new
CLassEventRunnable(event));
+ }
+
+ public void on(@Observes(precedence = 200) Before event) throws Throwable {
+ setClassLoader(event.getTestClass().getJavaClass(), new
LifeCycleEventRunnable(event));
+ }
+
+ public void on(@Observes(precedence = 200) After event) throws Throwable {
+ setClassLoader(event.getTestClass().getJavaClass(), new
LifeCycleEventRunnable(event));
+ }
+
private void setTCCL(final ClassLoader cl) {
Thread.currentThread().setContextClassLoader(cl);
}
+
+ private static class LifeCycleEventRunnable implements Runnable {
+ private final TestLifecycleEvent event;
+
+ public LifeCycleEventRunnable(final TestLifecycleEvent e) {
+ event = e;
+ }
+
+ @Override
+ public void run() {
+ try {
+ event.getExecutor().invoke();
+ } catch (Throwable throwable) {
+ throw new RuntimeException(throwable);
+ }
+ }
+ }
+
+ private static class CLassEventRunnable implements Runnable {
+ private final ClassLifecycleEvent event;
+
+ public CLassEventRunnable(final ClassLifecycleEvent e) {
+ event = e;
+ }
+
+ @Override
+ public void run() {
+ try {
+ event.getExecutor().invoke();
+ } catch (Throwable throwable) {
+ throw new RuntimeException(throwable);
+ }
+ }
+ }
}