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);
}