You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/09/21 23:17:41 UTC
svn commit: r1388684 - in /openejb/branches/openejb-4.5.0/server:
openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/
openejb-rest/src/main/java/org/apache/openejb/server/rest/
Author: rmannibucau
Date: Fri Sep 21 21:17:41 2012
New Revision: 1388684
URL: http://svn.apache.org/viewvc?rev=1388684&view=rev
Log:
@Context in Application.getClasses + fixing pojo custom @Context
Added:
openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java
Modified:
openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
Added: openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java?rev=1388684&view=auto
==============================================================================
(empty)
Modified: openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1388684&r1=1388683&r2=1388684&view=diff
==============================================================================
--- openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Fri Sep 21 21:17:41 2012
@@ -84,26 +84,26 @@ public class CxfRsHttpListener implement
@Override
public void deploySingleton(String fullContext, Object o, Application appInstance,
- Collection<Class<?>> additionalProviders, ServiceConfiguration configuration) {
+ Collection<Object> additionalProviders, ServiceConfiguration configuration) {
deploy(o.getClass(), fullContext, new SingletonResourceProvider(o), o, appInstance, null, additionalProviders, configuration);
}
@Override
public void deployPojo(String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections,
- Context context, WebBeansContext owbCtx, Collection<Class<?>> additionalProviders, ServiceConfiguration configuration) {
+ Context context, WebBeansContext owbCtx, Collection<Object> additionalProviders, ServiceConfiguration configuration) {
deploy(loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loadedClazz, injections, context, owbCtx),
null, app, null, additionalProviders, configuration);
}
@Override
- public void deployEJB(String fullContext, BeanContext beanContext, Collection<Class<?>> additionalProviders, ServiceConfiguration configuration) {
+ public void deployEJB(String fullContext, BeanContext beanContext, Collection<Object> additionalProviders, ServiceConfiguration configuration) {
final Object proxy = ProxyEJB.proxy(beanContext);
deploy(beanContext.getBeanClass(), fullContext, new NoopResourceProvider(beanContext.getBeanClass(), proxy),
proxy, null, new OpenEJBEJBInvoker(), additionalProviders, configuration);
}
private void deploy(Class<?> clazz, String address, ResourceProvider rp, Object serviceBean, Application app, Invoker invoker,
- Collection<Class<?>> additionalProviders, ServiceConfiguration configuration) {
+ Collection<Object> additionalProviders, ServiceConfiguration configuration) {
final String impl;
if (serviceBean != null) {
impl = serviceBean.getClass().getName();
@@ -159,18 +159,23 @@ public class CxfRsHttpListener implement
destination = (AbstractHTTPDestination) server.getDestination();
}
- private Collection<Object> providers(final Collection<ServiceInfo> services, final Collection<Class<?>> additionalProviders) {
+ private Collection<Object> providers(final Collection<ServiceInfo> services, final Collection<Object> additionalProviders) {
final Collection<Object> instances = new ArrayList<Object>();
- for (Class<?> clazz : additionalProviders) {
- final Object instance = ServiceInfos.resolve(services, clazz.getName());
- if (instance != null) {
- instances.add(instance);
- } else {
- try {
- instances.add(clazz.newInstance());
- } catch (Exception e) {
- LOGGER.error("can't instantiate " + clazz.getName(), e);
+ for (Object o : additionalProviders) {
+ if (o instanceof Class<?>) {
+ final Class<?> clazz = (Class<?>) o;
+ final Object instance = ServiceInfos.resolve(services, clazz.getName());
+ if (instance != null) {
+ instances.add(instance);
+ } else {
+ try {
+ instances.add(clazz.newInstance());
+ } catch (Exception e) {
+ LOGGER.error("can't instantiate " + clazz.getName(), e);
+ }
}
+ } else {
+ instances.add(o);
}
}
return instances;
Modified: openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java?rev=1388684&r1=1388683&r2=1388684&view=diff
==============================================================================
--- openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java (original)
+++ openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java Fri Sep 21 21:17:41 2012
@@ -17,86 +17,18 @@
package org.apache.openejb.server.cxf.rs;
import org.apache.cxf.jaxrs.JAXRSInvoker;
-import org.apache.cxf.jaxrs.ext.ContextProvider;
-import org.apache.cxf.jaxrs.model.ClassResourceInfo;
-import org.apache.cxf.jaxrs.model.OperationResourceInfo;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
-import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.message.Exchange;
-import org.apache.cxf.message.Message;
import org.apache.openejb.InvalidateReferenceException;
import org.apache.openejb.rest.ThreadLocalContextManager;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.HttpHeaders;
-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.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.rmi.RemoteException;
-import java.util.HashMap;
-import java.util.Map;
public class OpenEJBEJBInvoker extends JAXRSInvoker {
@Override
public Object invoke(final Exchange exchange, final Object request, final Object resourceObject) {
- final ClassResourceInfo cri = exchange.get(OperationResourceInfo.class).getClassResourceInfo();
-
- // binding context fields
- for (Field field : cri.getContextFields()) {
- Class<?> type = field.getType();
- if (Request.class.equals(type)) {
- Request binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, Request.class);
- ThreadLocalContextManager.REQUEST.set(binding);
- } else if (UriInfo.class.equals(type)) {
- UriInfo binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, UriInfo.class);
- ThreadLocalContextManager.URI_INFO.set(binding);
- } else if (HttpHeaders.class.equals(type)) {
- HttpHeaders binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, HttpHeaders.class);
- ThreadLocalContextManager.HTTP_HEADERS.set(binding);
- } else if (SecurityContext.class.equals(type)) {
- SecurityContext binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, SecurityContext.class);
- ThreadLocalContextManager.SECURITY_CONTEXT.set(binding);
- } 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);
- } else if (ServletRequest.class.equals(type)) {
- ServletRequest servletRequest = JAXRSUtils.createContextValue(exchange.getInMessage(), null, ServletRequest.class);
- ThreadLocalContextManager.SERVLET_REQUEST.set(servletRequest);
- } else if (HttpServletRequest.class.equals(type)) {
- HttpServletRequest httpServletRequest = JAXRSUtils.createContextValue(exchange.getInMessage(), null, HttpServletRequest.class);
- ThreadLocalContextManager.HTTP_SERVLET_REQUEST.set(httpServletRequest);
- } else if (HttpServletResponse.class.equals(type)) {
- HttpServletResponse httpServletResponse = JAXRSUtils.createContextValue(exchange.getInMessage(), null, HttpServletResponse.class);
- ThreadLocalContextManager.HTTP_SERVLET_RESPONSE.set(httpServletResponse);
- } else if (ServletConfig.class.equals(type)) {
- ServletConfig servletConfig = JAXRSUtils.createContextValue(exchange.getInMessage(), null, ServletConfig.class);
- ThreadLocalContextManager.SERVLET_CONFIG.set(servletConfig);
- } else {
- final Message message = exchange.getInMessage();
- final ContextProvider<?> provider = ProviderFactory.getInstance(message).createContextProvider(type, message);
- if (provider != null) {
- final Object value = provider.createContext(message);
- Map<String, Object> map = ThreadLocalContextManager.OTHERS.get();
- if (map == null) {
- map = new HashMap<String, Object>();
- ThreadLocalContextManager.OTHERS.set(map);
- }
- map.put(type.getName(), value);
- }
- }
- }
-
+ Contexts.bind(exchange);
try {
return super.invoke(exchange, request, resourceObject);
} finally {
Modified: openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java?rev=1388684&r1=1388683&r2=1388684&view=diff
==============================================================================
--- openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java (original)
+++ openejb/branches/openejb-4.5.0/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java Fri Sep 21 21:17:41 2012
@@ -39,6 +39,7 @@ import org.apache.cxf.message.Message;
import org.apache.openejb.Injection;
import org.apache.openejb.InjectionProcessor;
import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.rest.ThreadLocalContextManager;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.inject.OWBInjector;
@@ -69,6 +70,8 @@ public class OpenEJBPerRequestPojoResour
@Override
public Object getInstance(Message m) {
+ Contexts.bind(m.getExchange());
+
final BeanManagerImpl bm = webbeansContext.getBeanManagerImpl();
if (bm.isInUse()) {
creator = new CdiBeanCreator(bm);
@@ -89,6 +92,7 @@ public class OpenEJBPerRequestPojoResour
if (creator != null) {
creator.release();
}
+ ThreadLocalContextManager.reset();
}
@Override
Modified: openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1388684&r1=1388683&r2=1388684&view=diff
==============================================================================
--- openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original)
+++ openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Fri Sep 21 21:17:41 2012
@@ -44,12 +44,14 @@ import org.apache.openejb.spi.ContainerS
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.xbean.finder.MetaAnnotatedClass;
import javax.naming.Context;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -111,7 +113,7 @@ public abstract class RESTService implem
context = webContext.getAppContext().getAppJndiContext();
}
- final Collection<Class<?>> additionalProviders = new HashSet<Class<?>>();
+ final Collection<Object> additionalProviders = new HashSet<Object>();
if (useDiscoveredProviders()) {
for (String name : webApp.jaxRsProviders) {
try {
@@ -167,7 +169,21 @@ public abstract class RESTService implem
}
}
+ Set<Class<?>> classes = appInstance.getClasses();
Set<Object> singletons = appInstance.getSingletons();
+
+ // look for providers
+ for (Class<?> clazz : classes) {
+ if (isProvider(clazz)) {
+ additionalProviders.add(clazz);
+ }
+ }
+ for (Object obj : singletons) {
+ if (obj != null && isProvider(obj.getClass())) {
+ additionalProviders.add(obj);
+ }
+ }
+
for (Object o : singletons) {
if (o == null) {
continue;
@@ -182,8 +198,12 @@ public abstract class RESTService implem
new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, o.getClass().getName()), appInfo.services));
}
}
- Set<Class<?>> classes = appInstance.getClasses();
+
for (Class<?> clazz : classes) {
+ if (additionalProviders.contains(clazz)) {
+ continue;
+ }
+
if (hasEjbAndIsNotAManagedBean(restEjbs, clazz.getName())) {
deployEJB(appPrefix, restEjbs.get(clazz.getName()).context, additionalProviders, appInfo.services);
} else {
@@ -230,6 +250,10 @@ public abstract class RESTService implem
}
}
+ private static <T> boolean isProvider(final Class<T> clazz) {
+ return new MetaAnnotatedClass<T>(clazz).isAnnotationPresent(Provider.class);
+ }
+
private boolean hasEjbAndIsNotAManagedBean(final Map<String, EJBRestServiceInfo> restEjbs, final String clazz) {
return restEjbs.containsKey(clazz) && !BeanType.MANAGED.equals(restEjbs.get(clazz).context.getComponentType());
}
@@ -238,8 +262,8 @@ public abstract class RESTService implem
return SystemInstance.get().getOptions().get(OPENEJB_JAXRS_PROVIDERS_AUTO_PROP, false);
}
- private Collection<Class<?>> appProviders(final AppInfo appInfo, final ClassLoader classLoader) {
- final Collection<Class<?>> additionalProviders = new HashSet<Class<?>>();
+ private Collection<Object> appProviders(final AppInfo appInfo, final ClassLoader classLoader) {
+ final Collection<Object> additionalProviders = new HashSet<Object>();
for (String name : appInfo.jaxRsProviders) {
try {
additionalProviders.add(classLoader.loadClass(name));
@@ -255,11 +279,11 @@ public abstract class RESTService implem
if (deployedApplications.add(appInfo)) {
if (appInfo.webApps.size() == 0) {
final Map<String, EJBRestServiceInfo> restEjbs = getRestEjbs(appInfo);
- final Collection<Class<?>> providers;
+ final Collection<Object> providers;
if (useDiscoveredProviders()) {
providers = appProviders(appInfo, containerSystem.getAppContext(appInfo.appId).getClassLoader());
} else {
- providers = new ArrayList<Class<?>>();
+ providers = new ArrayList<Object>();
}
for (Map.Entry<String, EJBRestServiceInfo> ejb : restEjbs.entrySet()) {
@@ -324,7 +348,7 @@ public abstract class RESTService implem
}
private void deploySingleton(String contextRoot, Object o, Application appInstance, ClassLoader classLoader,
- Collection<Class<?>> additionalProviders, ServiceConfiguration configuration) {
+ Collection<Object> additionalProviders, ServiceConfiguration configuration) {
final String nopath = getAddress(contextRoot, o.getClass());
final RsHttpListener listener = createHttpListener();
final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(contextRoot, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost);
@@ -336,7 +360,7 @@ public abstract class RESTService implem
}
private void deployPojo(String contextRoot, Class<?> loadedClazz, Application app, ClassLoader classLoader, Collection<Injection> injections,
- Context context, WebBeansContext owbCtx, Collection<Class<?>> additionalProviders, ServiceConfiguration config) {
+ Context context, WebBeansContext owbCtx, Collection<Object> additionalProviders, ServiceConfiguration config) {
if (loadedClazz.isInterface()) {
return;
}
@@ -352,7 +376,7 @@ public abstract class RESTService implem
LOGGER.info("REST Service: " + address.complete + " -> Pojo " + loadedClazz.getName());
}
- private void deployEJB(String context, BeanContext beanContext, Collection<Class<?>> additionalProviders, Collection<ServiceInfo> serviceInfos) {
+ private void deployEJB(String context, BeanContext beanContext, Collection<Object> additionalProviders, Collection<ServiceInfo> serviceInfos) {
final String nopath = getAddress(context, beanContext.getBeanClass());
final RsHttpListener listener = createHttpListener();
final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(context, listener, beanContext.getClassLoader(), nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost);
Modified: openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java?rev=1388684&r1=1388683&r2=1388684&view=diff
==============================================================================
--- openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java (original)
+++ openejb/branches/openejb-4.5.0/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java Fri Sep 21 21:17:41 2012
@@ -29,12 +29,12 @@ import java.util.Collection;
public interface RsHttpListener extends HttpListener {
void deploySingleton(String fullContext, Object o, Application appInstance,
- Collection<Class<?>> additionalProviders, ServiceConfiguration serviceInfos);
+ Collection<Object> additionalProviders, ServiceConfiguration serviceInfos);
void deployPojo(String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections,
- Context context, WebBeansContext owbCtx, Collection<Class<?>> additionalProviders, ServiceConfiguration serviceInfos);
+ Context context, WebBeansContext owbCtx, Collection<Object> additionalProviders, ServiceConfiguration serviceInfos);
- void deployEJB(String fullContext, BeanContext beanContext, Collection<Class<?>> additionalProviders, ServiceConfiguration serviceInfos);
+ void deployEJB(String fullContext, BeanContext beanContext, Collection<Object> additionalProviders, ServiceConfiguration serviceInfos);
void undeploy();
}