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