Author: rmannibucau
Date: Tue Jan  8 19:54:35 2013
New Revision: 1430471

URL: http://svn.apache.org/viewvc?rev=1430471&view=rev
Log:
TOMEE-713 TOMEE-714 webcontext#inject cc cleanup + rest application cdi 
injections

Added:
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIApplicationTest.java
      - copied, changed from r1430364, 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java
Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java
    
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java
 Tue Jan  8 19:54:35 2013
@@ -371,6 +371,11 @@ public class WebappBeanManager extends B
     }
 
     @Override
+    public boolean isInUse() {
+        return super.isInUse() || getParentBm().isInUse();
+    }
+
+    @Override
     public Set<Bean<?>> getComponents() {
         if (deploymentBeans.isEmpty()) {
             // probably not yet merged (afterStart())

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Tue Jan  8 19:54:35 2013
@@ -1804,10 +1804,17 @@ public class AnnotationDeployer implemen
                         }
                         try {
                             Application app = 
Application.class.cast(clazz.newInstance());
-                            if (!app.getClasses().isEmpty()) {
-                                classes.addAll(app.getClasses());
-                            } else {
-                                addRestClassesToScannedClasses(webModule, 
classes, classLoader);
+                            try {
+                                if (!app.getClasses().isEmpty()) {
+                                    classes.addAll(app.getClasses());
+                                } else {
+                                    addRestClassesToScannedClasses(webModule, 
classes, classLoader);
+                                }
+                            } catch (NullPointerException npe) {
+                                if (app == null) {
+                                    throw npe;
+                                }
+                                // if app depends on cdi no need to do it
                             }
                         } catch (InstantiationException e) {
                             throw new OpenEJBException("Unable to instantiate 
Application class: " + application, e);

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Tue Jan  8 19:54:35 2013
@@ -679,8 +679,7 @@ public class DeploymentLoader implements
         addWebModule(webModule, appModule);
     }
 
-    @SuppressWarnings("unchecked")
-    public static void addWebModule(final WebModule webModule, final AppModule 
appModule) throws OpenEJBException {
+    public static EjbModule addWebModule(final WebModule webModule, final 
AppModule appModule) throws OpenEJBException {
         // create and add the WebModule
         appModule.getWebModules().add(webModule);
         if (appModule.isStandaloneModule()) {
@@ -740,6 +739,8 @@ public class DeploymentLoader implements
         }
 
         addWebservices(webEjbModule);
+
+        return webEjbModule;
     }
 
     /**

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckRestMethodArePublic.java
 Tue Jan  8 19:54:35 2013
@@ -74,11 +74,18 @@ public class CheckRestMethodArePublic im
                         continue; // managed elsewhere
                     }
 
-                    for (Class<?> rsClass : appInstance.getClasses()) {
-                        classes.add(rsClass.getName());
-                    }
-                    for (Object rsSingleton : appInstance.getSingletons()) {
-                        classes.add(rsSingleton.getClass().getName());
+                    try {
+                        for (Class<?> rsClass : appInstance.getClasses()) {
+                            classes.add(rsClass.getName());
+                        }
+                        for (Object rsSingleton : appInstance.getSingletons()) 
{
+                            classes.add(rsSingleton.getClass().getName());
+                        }
+                    } catch (NullPointerException npe) {
+                        if (appInstance == null) {
+                            throw npe;
+                        }
+                        // if app relies on cdi it is null here
                     }
                 }
 

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java
 Tue Jan  8 19:54:35 2013
@@ -16,10 +16,12 @@
  */
 package org.apache.openejb.core;
 
+import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.naming.Context;
 import javax.naming.InitialContext;
@@ -177,6 +179,12 @@ public class WebContext {
                 }
             }
 
+            // if the bean is dependent simply cleanup the creational context 
once it is created
+            final Class<? extends Annotation> scope = 
beanDefinition.getScope();
+            if (scope == null || Dependent.class.equals(scope)) {
+                creationalContext.release();
+            }
+
             return beanInstance;
         } catch (NamingException e) {
             throw new OpenEJBException(e);

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
 Tue Jan  8 19:54:35 2013
@@ -316,8 +316,10 @@ public final class ApplicationComposers 
             final org.apache.openejb.junit.Classes classesAnnotationOld = 
method.getAnnotation(org.apache.openejb.junit.Classes.class);
 
             Class<?>[] classes = null;
+            boolean cdi = false;
             if (classesAnnotation != null) {
                 classes = classesAnnotation.value();
+                cdi = classesAnnotation.cdi();
             } else if (classesAnnotationOld != null) {
                 classes = classesAnnotationOld.value();
             }
@@ -339,7 +341,10 @@ public final class ApplicationComposers 
                 if (classes != null) {
                     webModule.setFinder(finderFromClasses(classes));
                 }
-                DeploymentLoader.addWebModule(webModule, appModule);
+                final EjbModule ejbModule = 
DeploymentLoader.addWebModule(webModule, appModule);
+                if (cdi) {
+                    ejbModule.setBeans(new Beans());
+                }
             } else if (obj instanceof WebModule) { // will add the ejbmodule 
too
                 webModulesNb++;
 

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java
 Tue Jan  8 19:54:35 2013
@@ -25,4 +25,5 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Classes {
     Class<?>[] value() default {};
+    boolean cdi() default false;
 }

Copied: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIApplicationTest.java
 (from r1430364, 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java)
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIApplicationTest.java?p2=openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIApplicationTest.java&p1=openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java&r1=1430364&r2=1430471&rev=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/SimpleApplicationTest.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIApplicationTest.java
 Tue Jan  8 19:54:35 2013
@@ -16,81 +16,61 @@
  */
 package org.apache.openejb.server.cxf.rs;
 
-import org.apache.cxf.jaxrs.client.ServerWebApplicationException;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.junit.ApplicationComposer;
-import org.apache.openejb.server.cxf.rs.beans.MyExpertRestClass;
 import org.apache.openejb.server.cxf.rs.beans.MyFirstRestClass;
-import org.apache.openejb.server.cxf.rs.beans.MyRESTApplication;
-import org.apache.openejb.server.cxf.rs.beans.RestWithInjections;
-import org.apache.openejb.server.cxf.rs.beans.SimpleEJB;
 import org.apache.openejb.testing.Classes;
 import org.apache.openejb.testing.EnableServices;
 import org.apache.openejb.testing.Module;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import javax.servlet.http.HttpServletResponse;
+import javax.inject.Inject;
 import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-import java.io.StringWriter;
+import java.util.HashSet;
+import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 @EnableServices("jax-rs")
 @RunWith(ApplicationComposer.class)
-public class SimpleApplicationTest {
-    public static final String BASE_URL = "http://localhost:4204/foo/my-app";;
-
+public class CDIApplicationTest {
     @Module
-    @Classes({ RestWithInjections.class, SimpleEJB.class, 
MyExpertRestClass.class, MyFirstRestClass.class })
+    @Classes(cdi = true, value = { MyCdiRESTApplication.class, 
ACdiBeanInjectedInApp.class })
     public WebApp war() {
         return new WebApp()
                 .contextRoot("foo")
                 .addServlet("REST Application", Application.class.getName())
-                .addInitParam("REST Application", "javax.ws.rs.Application", 
MyRESTApplication.class.getName());
+                .addInitParam("REST Application", "javax.ws.rs.Application", 
MyCdiRESTApplication.class.getName());
     }
 
     @Test
-    public void first() {
-        String hi = 
WebClient.create(BASE_URL).path("/first/hi").get(String.class);
-        assertEquals("Hi from REST World!", hi);
+    public void isCdi() {
+        assertTrue(MyCdiRESTApplication.injection);
+        assertEquals("Hi from REST World!", 
WebClient.create("http://localhost:4204/foo/";).path("/first/hi").get(String.class));
     }
 
-    @Test
-    public void second() {
-        String hi = 
WebClient.create(BASE_URL).path("/second/hi2/2nd").get(String.class);
-        assertEquals("hi 2nd", hi);
-    }
+    public static class ACdiBeanInjectedInApp {}
 
-    @Test
-    public void expert() throws Exception {
-        Response response = 
WebClient.create(BASE_URL).path("/expert/still-hi").post("Pink Floyd");
-        assertEquals(HttpServletResponse.SC_OK, response.getStatus());
-
-        InputStream is = (InputStream) response.getEntity();
-        StringWriter writer = new StringWriter();
-        int c;
-        while ((c = is.read()) != -1) {
-            writer.write(c);
-        }
-        assertEquals("hi Pink Floyd", writer.toString());
-    }
+    public static class MyCdiRESTApplication extends Application {
+        public static boolean injection = false;
 
-    @Test(expected = ServerWebApplicationException.class)
-    public void nonListed() {
-        
WebClient.create(BASE_URL).path("/non-listed/yata/foo").get(String.class);
-    }
+        @Inject
+        private ACdiBeanInjectedInApp cdi;
 
-    @Test
-    public void hooked() {
-        assertEquals(true, 
WebClient.create(BASE_URL).path("/hooked/post").get(Boolean.class));
-    }
+        public Set<Class<?>> getClasses() {
+            injection = cdi != null;
 
-    @Test
-    public void injectEjb() {
-        assertEquals(true, 
WebClient.create(BASE_URL).path("/inject/ejb").get(Boolean.class));
+            if (cdi == null) {
+                throw new NullPointerException();
+            }
+
+            // if no class are returned we use scanning, since we don't test 
rest deployment we put a single class
+            final Set<Class<?>> clazz = new HashSet<Class<?>>();
+            clazz.add(MyFirstRestClass.class);
+            return clazz;
+        }
     }
 }

Modified: 
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1430471&r1=1430470&r2=1430471&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
 Tue Jan  8 19:54:35 2013
@@ -33,6 +33,7 @@ import org.apache.openejb.assembler.clas
 import 
org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed;
 import org.apache.openejb.assembler.classic.util.PojoUtil;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
+import org.apache.openejb.cdi.WebappBeanManager;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.WebContext;
 import org.apache.openejb.loader.SystemInstance;
@@ -147,6 +148,13 @@ public abstract class RESTService implem
                     try {
                         appClazz = classLoader.loadClass(app);
                         application = 
Application.class.cast(appClazz.newInstance());
+                        if (owbCtx.getBeanManagerImpl().isInUse()) {
+                            try {
+                                webContext.inject(application);
+                            } catch (Exception e) {
+                                // not important since not required by the spec
+                            }
+                        }
                     } catch (Exception e) {
                         throw new OpenEJBRestRuntimeException("can't create 
class " + app, e);
                     }
@@ -261,6 +269,13 @@ public abstract class RESTService implem
                     try {
                         appClazz = classLoader.loadClass(app);
                         appInstance = 
Application.class.cast(appClazz.newInstance());
+                        if (owbCtx.getBeanManagerImpl().isInUse()) {
+                            try {
+                                webContext.inject(appInstance);
+                            } catch (Exception e) {
+                                // not important since not required by the spec
+                            }
+                        }
                     } catch (Exception e) {
                         throw new OpenEJBRestRuntimeException("can't create 
class " + app, e);
                     }


Reply via email to