Author: rmannibucau
Date: Tue Jul 24 19:16:35 2012
New Revision: 1365233
URL: http://svn.apache.org/viewvc?rev=1365233&view=rev
Log:
TOMEE-339 @Context Providers
Added:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalProviders.java
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?rev=1365233&r1=1365232&r2=1365233&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
Tue Jul 24 19:16:35 2012
@@ -67,6 +67,7 @@ import javax.ws.rs.core.Request;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Providers;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceContext;
import java.io.Serializable;
@@ -291,6 +292,8 @@ public class JndiEncBuilder {
reference = new
ObjectReference(ThreadLocalContextManager.SECURITY_CONTEXT);
} else if (ContextResolver.class.equals(type)) {
reference = new
ObjectReference(ThreadLocalContextManager.CONTEXT_RESOLVER);
+ } else if (Providers.class.equals(type)) {
+ reference = new
ObjectReference(ThreadLocalContextManager.PROVIDERS);
} else if (referenceInfo.resourceID != null) {
String jndiName = "openejb/Resource/" +
referenceInfo.resourceID;
reference = new IntraVmJndiReference(jndiName);
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1365233&r1=1365232&r2=1365233&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
Tue Jul 24 19:16:35 2012
@@ -74,6 +74,7 @@ import javax.ws.rs.core.Request;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Providers;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
@@ -131,6 +132,7 @@ public class AutoConfig implements Dynam
ignoredReferenceTypes.add(SecurityContext.class.getName());
ignoredReferenceTypes.add(ContextResolver.class.getName());
ignoredReferenceTypes.add(Application.class.getName());
+ ignoredReferenceTypes.add(Providers.class.getName());
}
private final ConfigurationFactory configFactory;
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java?rev=1365233&r1=1365232&r2=1365233&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/junit/ApplicationComposer.java
Tue Jul 24 19:16:35 2012
@@ -19,6 +19,9 @@ package org.apache.openejb.junit;
import org.apache.openejb.AppContext;
import org.apache.openejb.BeanContext;
import org.apache.openejb.InjectionProcessor;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.OpenEjbContainer;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.config.AppModule;
@@ -45,6 +48,7 @@ import org.apache.openejb.jee.oejb3.Open
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.spi.ContainerSystem;
import org.apache.openejb.util.Join;
+import org.apache.openejb.util.ServiceManagerProxy;
import org.apache.webbeans.inject.OWBInjector;
import org.apache.xbean.finder.AnnotationFinder;
import org.apache.xbean.finder.archive.ClassesArchive;
@@ -68,6 +72,7 @@ public class ApplicationComposer extends
public static final String OPENEJB_APPLICATION_COMPOSER_CONTEXT =
"openejb.application.composer.context";
private final TestClass testClass;
+ private ServiceManagerProxy serviceManager = null;
public ApplicationComposer(Class<?> klass) throws InitializationError {
super(klass);
@@ -286,6 +291,17 @@ public class ApplicationComposer extends
config.init(SystemInstance.get().getProperties());
Assembler assembler = new Assembler();
+ SystemInstance.get().setComponent(Assembler.class, assembler);
+
+ if
("true".equals(configuration.getProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE,
"false"))) {
+ try {
+ serviceManager = new ServiceManagerProxy();
+ serviceManager.start();
+ } catch (ServiceManagerProxy.AlreadyStartedException e) {
+ throw new OpenEJBRuntimeException(e);
+ }
+ }
+
assembler.buildContainerSystem(config.getOpenEjbConfiguration());
final AppInfo appInfo = config.configureApplication(appModule);
@@ -333,6 +349,14 @@ public class ApplicationComposer extends
assembler.destroyApplication(appInfo.path);
}
} finally {
+ if (serviceManager != null) {
+ try {
+ serviceManager.stop();
+ } catch (RuntimeException ignored) {
+ // no-op
+ }
+ }
+ OpenEJB.destroy();
SystemInstance.reset();
}
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java?rev=1365233&r1=1365232&r2=1365233&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
Tue Jul 24 19:16:35 2012
@@ -25,6 +25,7 @@ public class ThreadLocalContextManager {
public static final ThreadLocalHttpHeaders HTTP_HEADERS = new
ThreadLocalHttpHeaders();
public static final ThreadLocalSecurityContext SECURITY_CONTEXT = new
ThreadLocalSecurityContext();
public static final ThreadLocalContextResolver CONTEXT_RESOLVER = new
ThreadLocalContextResolver();
+ public static final ThreadLocalProviders PROVIDERS = new
ThreadLocalProviders();
public static final ThreadLocal<Application> APPLICATION = new
ThreadLocal<Application>();
public static void reset() {
@@ -33,6 +34,7 @@ public class ThreadLocalContextManager {
HTTP_HEADERS.remove();
SECURITY_CONTEXT.remove();
CONTEXT_RESOLVER.remove();
+ PROVIDERS.remove();
APPLICATION.remove();
}
}
Added:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalProviders.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalProviders.java?rev=1365233&view=auto
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalProviders.java
(added)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalProviders.java
Tue Jul 24 19:16:35 2012
@@ -0,0 +1,34 @@
+package org.apache.openejb.rest;
+
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Providers;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+public class ThreadLocalProviders extends AbstractThreadLocalProxy<Providers>
implements Providers {
+ @Override
+ public <T> ContextResolver<T> getContextResolver(Class<T> rawType,
MediaType mediaType) {
+ return get().getContextResolver(rawType, mediaType);
+ }
+
+ @Override
+ public <T extends Throwable> ExceptionMapper<T>
getExceptionMapper(Class<T> rawType) {
+ return get().getExceptionMapper(rawType);
+ }
+
+ @Override
+ public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> rawType,
Type genericType, Annotation[] annotations, MediaType mediaType) {
+ return get().getMessageBodyReader(rawType, genericType, annotations,
mediaType);
+ }
+
+ @Override
+ public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> rawType,
Type genericType, Annotation[] annotations, MediaType mediaType) {
+ return get().getMessageBodyWriter(rawType, genericType, annotations,
mediaType);
+ }
+}
Modified:
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java?rev=1365233&r1=1365232&r2=1365233&view=diff
==============================================================================
---
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
(original)
+++
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
Tue Jul 24 19:16:35 2012
@@ -26,6 +26,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Providers;
+
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.jaxrs.JAXRSInvoker;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
@@ -83,6 +85,9 @@ public class OpenEJBEJBInvoker extends J
} else if (ContextResolver.class.equals(type)) {
ContextResolver<?> binding =
JAXRSUtils.createContextValue(exchange.getInMessage(), type,
ContextResolver.class);
ThreadLocalContextManager.CONTEXT_RESOLVER.set(binding);
+ } else if (Providers.class.equals(type)) {
+ Providers providers =
JAXRSUtils.createContextValue(exchange.getInMessage(), null, Providers.class);
+ ThreadLocalContextManager.PROVIDERS.set(providers);
}
}
Added:
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java?rev=1365233&view=auto
==============================================================================
---
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java
(added)
+++
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java
Tue Jul 24 19:16:35 2012
@@ -0,0 +1,55 @@
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.openejb.OpenEjbContainer;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Configuration;
+import org.apache.openejb.junit.Module;
+import org.apache.openejb.loader.IO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.Singleton;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.ext.Providers;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(ApplicationComposer.class)
+public class RsInjectionTest {
+ @Module
+ public static SingletonBean service() throws Exception {
+ return (SingletonBean) new
SingletonBean(RsInjection.class).localBean();
+ }
+
+ @Configuration
+ public static Properties configuration() throws Exception {
+ final Properties properties = new Properties();
+ properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE,
"true");
+ return properties;
+ }
+
+ @Test
+ public void rest() throws IOException {
+ final String response = IO.slurp(new
URL("http://127.0.0.1:4204/RsInjectionTest/injections/check"));
+ assertEquals("true", response);
+ }
+
+ @Singleton
+ @Path("/injections")
+ public static class RsInjection {
+ @Context
+ private Providers providers;
+
+ @GET
+ @Path("/check")
+ public boolean check() {
+ return providers != null;
+ }
+ }
+}