Author: rmannibucau
Date: Mon Jun 25 12:16:55 2012
New Revision: 1353487

URL: http://svn.apache.org/viewvc?rev=1353487&view=rev
Log:
OPENEJB-1843 better handling for classloader swapping, thanks aslak for the tip

Modified:
    
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java
    
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/OpenEJBInjectionEnricher.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java?rev=1353487&r1=1353486&r2=1353487&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBInjectionEnricher.java
 Mon Jun 25 12:16:55 2012
@@ -28,15 +28,11 @@ import org.apache.openejb.core.Operation
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.spi.ContainerSystem;
 import org.apache.webbeans.inject.OWBInjector;
-import org.apache.webbeans.util.InjectionExceptionUtils;
 import org.jboss.arquillian.container.spi.context.annotation.ContainerScoped;
 import org.jboss.arquillian.container.spi.context.annotation.DeploymentScoped;
 import org.jboss.arquillian.core.api.Instance;
 import org.jboss.arquillian.core.api.annotation.Inject;
-import org.jboss.arquillian.core.api.annotation.Observes;
-import org.jboss.arquillian.core.spi.EventContext;
 import org.jboss.arquillian.test.spi.TestEnricher;
-import org.jboss.arquillian.test.spi.event.suite.SuiteEvent;
 
 public class OpenEJBInjectionEnricher implements TestEnricher {
     @Inject
@@ -47,10 +43,6 @@ public class OpenEJBInjectionEnricher im
     @ContainerScoped
     private Instance<ContainerSystem> containerSystem;
 
-    public void createSuiteContext(@Observes(precedence=100) 
EventContext<SuiteEvent> context) {
-
-    }
-
     @Override
     public void enrich(final Object testInstance) {
         final AppContext ctx = appContext.get();

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=1353487&r1=1353486&r2=1353487&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
 Mon Jun 25 12:16:55 2012
@@ -25,25 +25,32 @@ import org.jboss.arquillian.core.api.Ins
 import org.jboss.arquillian.core.api.annotation.Inject;
 import org.jboss.arquillian.core.api.annotation.Observes;
 import org.jboss.arquillian.core.spi.EventContext;
+import org.jboss.arquillian.core.spi.event.Event;
 import org.jboss.arquillian.test.spi.LifecycleMethodExecutor;
+import org.jboss.arquillian.test.spi.TestClass;
+import org.jboss.arquillian.test.spi.annotation.ClassScoped;
 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.ClassEvent;
 import org.jboss.arquillian.test.spi.event.suite.LifecycleEvent;
 import org.jboss.arquillian.test.spi.event.suite.Test;
-import org.jboss.arquillian.test.spi.event.suite.TestLifecycleEvent;
+import org.jboss.arquillian.test.spi.event.suite.TestEvent;
 
 public class TestObserver {
     @Inject
     @SuiteScoped
     private Instance<ClassLoader> classLoader;
 
-    private void setClassLoader(final Class<?> clazz, final Runnable run) {
+    @Inject
+    @ClassScoped
+    private Instance<TestClass> testClass;
+
+    private void setClassLoader(final EventContext<ClassEvent> event) {
         final BeanContext context = 
SystemInstance.get().getComponent(ContainerSystem.class)
-                .getBeanContext(clazz.getName());
+                .getBeanContext(testClass.get().getName());
         ThreadContext oldCtx = null;
         ClassLoader oldCl = null;
 
@@ -57,7 +64,7 @@ public class TestObserver {
         }
 
         try {
-            run.run();
+            event.proceed();
         } finally {
             if (context != null) {
                 ThreadContext.exit(oldCtx);
@@ -67,80 +74,11 @@ public class TestObserver {
         }
     }
 
-    public void observe(@Observes final EventContext<Test> event) {
-        setClassLoader(event.getEvent().getTestClass().getJavaClass(), new 
Runnable() {
-            @Override
-            public void run() {
-                event.proceed();
-            }
-        });
-    }
-
-    // after enrichement
-    public void on(@Observes(precedence = -1) 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));
-    }
-
-    // shouldn't be needed
-    public void on(@Observes(precedence = 200) final BeforeClass event) throws 
Throwable {
-        setClassLoader(event.getTestClass().getJavaClass(), new 
LifeCycleEventRunnable(event));
-    }
-
-    // shouldn't be needed
-    public void on(@Observes(precedence = 200) AfterClass event) throws 
Throwable {
-        setClassLoader(event.getTestClass().getJavaClass(), new 
LifeCycleEventRunnable(event));
+    public void observes(@Observes final EventContext<ClassEvent> event) {
+        setClassLoader(event);
     }
 
     private void setTCCL(final ClassLoader cl) {
         Thread.currentThread().setContextClassLoader(cl);
     }
-
-    private static class LifeCycleEventRunnable implements Runnable {
-        private final LifecycleEvent event;
-
-        public LifeCycleEventRunnable(final LifecycleEvent e) {
-            event = e;
-        }
-
-        @Override
-        public void run() {
-            try {
-                event.getExecutor().invoke();
-            } catch (Throwable throwable) {
-                throw new RuntimeException(throwable);
-            } finally {
-                resetEventExecutor();
-            }
-        }
-
-        private void resetEventExecutor() {
-            Class<?> current = event.getClass();
-            Field field = null;
-            while (field == null && !Object.class.equals(current) && current 
!= null) {
-                try {
-                    field = current.getDeclaredField("executor");
-                } catch (NoSuchFieldException e) {
-                    // ignored
-                }
-                current = current.getSuperclass();
-            }
-            if (field != null) {
-                field.setAccessible(true);
-                try {
-                    field.set(event, new LifecycleMethodExecutor() {
-                        @Override
-                        public void invoke() throws Throwable {
-                            // no-op: already done
-                        }
-                    });
-                } catch (IllegalAccessException e) {
-                    // ignored
-                }
-            }
-        }
-    }
 }


Reply via email to