Author: sergeyb
Date: Fri May 25 22:23:44 2012
New Revision: 1342824

URL: http://svn.apache.org/viewvc?rev=1342824&view=rev
Log:
[CXF-4343] Removing static maps from AbstractResourceInfo

Modified:
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
 Fri May 25 22:23:44 2012
@@ -73,10 +73,6 @@ public class AbstractJAXRSFactoryBean ex
     protected JAXRSServiceFactoryBean serviceFactory;
     protected List<?> entityProviders;
     
-    protected AbstractJAXRSFactoryBean() {
-        this(new JAXRSServiceFactoryBean());
-    }
-    
     protected AbstractJAXRSFactoryBean(JAXRSServiceFactoryBean serviceFactory) 
{
         this.serviceFactory = serviceFactory;
         setBindingId(JAXRSBindingFactory.JAXRS_BINDING_ID);
@@ -116,6 +112,7 @@ public class AbstractJAXRSFactoryBean ex
     public void setBus(Bus bus) {
         super.setBus(bus);
         checkBindingFactory(bus);
+        serviceFactory.setBus(bus);
     }
     
     /*
@@ -314,7 +311,7 @@ public class AbstractJAXRSFactoryBean ex
     }
     
     protected ProviderFactory setupFactory(Endpoint ep) { 
-        ProviderFactory factory = ProviderFactory.getInstance(); 
+        ProviderFactory factory = ProviderFactory.getInstance(getBus()); 
         if (entityProviders != null) {
             factory.setUserProviders(entityProviders); 
         }

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
 Fri May 25 22:23:44 2012
@@ -93,7 +93,7 @@ public class JAXRSServerFactoryBean exte
      * @param app
      */
     public void setApplication(Application app) {
-        appProvider = new ProviderInfo<Application>(app);    
+        appProvider = new ProviderInfo<Application>(app, getBus());    
     }
     
     /**

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
 Fri May 25 22:23:44 2012
@@ -30,6 +30,8 @@ import java.util.concurrent.Executor;
 import javax.ws.rs.Path;
 import javax.xml.namespace.QName;
 
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.util.ClassHelper;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
@@ -60,6 +62,17 @@ public class JAXRSServiceFactoryBean ext
     public JAXRSServiceFactoryBean() {
     }
 
+    public Bus getBus() {
+        Bus bus = super.getBus();
+        return bus == null ? BusFactory.getThreadDefaultBus() : bus;
+    }
+
+    public void setBus(Bus bus) {
+        if (super.getBus() == null) {
+            super.setBus(bus);
+        }
+    }
+    
     public void setServiceName(QName name) {
         this.serviceName = name;
     }
@@ -159,7 +172,8 @@ public class JAXRSServiceFactoryBean ext
         Map<String, UserResource> map = userResourcesAsMap(resources);
         for (UserResource ur : resources) {
             if (ur.getPath() != null) {
-                ClassResourceInfo cri = 
ResourceUtils.createClassResourceInfo(map, ur, true, enableStatic);
+                ClassResourceInfo cri = 
ResourceUtils.createClassResourceInfo(map, ur, true, enableStatic,
+                                                                              
getBus());
                 if (cri != null) {
                     classResourceInfos.add(cri);
                 }
@@ -171,7 +185,7 @@ public class JAXRSServiceFactoryBean ext
         Map<String, UserResource> map = userResourcesAsMap(resources);
         for (Class<?> sClass : sClasses) {
             ClassResourceInfo cri = 
ResourceUtils.createServiceClassResourceInfo(
-                map, map.get(sClass.getName()), sClass, true, enableStatic);
+                map, map.get(sClass.getName()), sClass, true, enableStatic, 
getBus());
             if (cri != null) {
                 classResourceInfos.add(cri);
             }
@@ -188,7 +202,7 @@ public class JAXRSServiceFactoryBean ext
     
     protected ClassResourceInfo createResourceInfo(Class<?> cls, boolean 
isRoot) {
         ClassResourceInfo classResourceInfo = 
-            ResourceUtils.createClassResourceInfo(cls, cls, isRoot, 
enableStatic);
+            ResourceUtils.createClassResourceInfo(cls, cls, isRoot, 
enableStatic, getBus());
         if (classResourceInfo != null) {
             classResourceInfos.add(classResourceInfo);
         }
@@ -215,7 +229,8 @@ public class JAXRSServiceFactoryBean ext
                 continue;
             }
             
-            cri = ResourceUtils.createClassResourceInfo(bean.getClass(), 
realClass, true, enableStatic);
+            cri = ResourceUtils.createClassResourceInfo(bean.getClass(), 
realClass, true, enableStatic,
+                                                        getBus());
             if (cri != null) {
                 classResourceInfos.add(cri);
                 cri.setResourceProvider(

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
 Fri May 25 22:23:44 2012
@@ -33,31 +33,30 @@ import javax.annotation.Resource;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Context;
 
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
 import org.apache.cxf.jaxrs.impl.tl.ThreadLocalProxy;
 import org.apache.cxf.jaxrs.utils.AnnotationUtils;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
 
 public abstract class AbstractResourceInfo {
-    private static Map<Class<?>, Map<Field, ThreadLocalProxy<?>>> fieldProxyMap
-        = new ConcurrentHashMap<Class<?>, Map<Field, ThreadLocalProxy<?>>>(2);
-    private static Map<Class<?>, Map<Field, ThreadLocalProxy<?>>> 
resourceProxyMap
-        = new ConcurrentHashMap<Class<?>, Map<Field, ThreadLocalProxy<?>>>(2);
-    private static Map<Class<?>, Map<Method, ThreadLocalProxy<?>>> 
setterProxyMap
-        = new ConcurrentHashMap<Class<?>, Map<Method, ThreadLocalProxy<?>>>(2);
+    private static final String FIELD_PROXY_MAP = "jaxrs-field-proxy-map";
+    private static final String SETTER_PROXY_MAP = "jaxrs-setter-proxy-map";
     
     protected boolean root;
     protected Class<?> resourceClass;
     protected Class<?> serviceClass;
 
     private Map<Class<?>, List<Field>> contextFields;
-    private Map<Class<?>, List<Field>> resourceFields;
     private Map<Class<?>, Map<Class<?>, Method>> contextMethods;
+    private Bus bus;
     
-    protected AbstractResourceInfo() {
-        
+    protected AbstractResourceInfo(Bus bus) {
+        this.bus = bus;
     }
 
-    protected AbstractResourceInfo(Class<?> resourceClass, Class<?> 
serviceClass, boolean isRoot) {
+    protected AbstractResourceInfo(Class<?> resourceClass, Class<?> 
serviceClass, boolean isRoot, Bus bus) {
+        this.bus = bus;
         this.serviceClass = serviceClass;
         this.resourceClass = resourceClass;
         root = isRoot;
@@ -67,6 +66,10 @@ public abstract class AbstractResourceIn
         }
     }
     
+    public Bus getBus() {
+        return bus;
+    }
+    
     public void setResourceClass(Class<?> rClass) {
         resourceClass = rClass;
         if (serviceClass.isInterface() && resourceClass != null && 
!resourceClass.isInterface()) {
@@ -85,26 +88,36 @@ public abstract class AbstractResourceIn
         }
         for (Field f : cls.getDeclaredFields()) {
             for (Annotation a : f.getAnnotations()) {
-                if (a.annotationType() == Context.class) {
+                if (a.annotationType() == Context.class || a.annotationType() 
== Resource.class 
+                    && AnnotationUtils.isContextClass(f.getType())) {
                     contextFields = addContextField(contextFields, f);
                     if (f.getType() != Application.class) {
-                        fieldProxyMap = getProxyMap(Field.class, 
fieldProxyMap);
-                        addToMap(fieldProxyMap, f, 
InjectionUtils.createThreadLocalProxy(f.getType()));
+                        addToMap(getFieldProxyMap(), f, 
InjectionUtils.createThreadLocalProxy(f.getType()));
                     }
-                } else if (a.annotationType() == Resource.class 
-                           && AnnotationUtils.isContextClass(f.getType())) {
-                    resourceFields = addContextField(resourceFields, f);
-                    resourceProxyMap = getProxyMap(Field.class, 
resourceProxyMap);
-                    addToMap(resourceProxyMap, f, 
InjectionUtils.createThreadLocalProxy(f.getType()));
                 }
             }
         }
         findContextFields(cls.getSuperclass());
     }
     
-    private <T> Map<Class<?>, Map<T, ThreadLocalProxy<?>>> 
getProxyMap(Class<T> keyClass,
-        Map<Class<?>, Map<T, ThreadLocalProxy<?>>> map) {
-        return map == null ? new HashMap<Class<?>, Map<T, 
ThreadLocalProxy<?>>>() : map;
+    @SuppressWarnings("unchecked")
+    private <T> Map<Class<?>, Map<T, ThreadLocalProxy<?>>> 
getProxyMap(Class<T> keyCls, String prop) {
+        Object property = bus.getProperty(prop);
+        if (property == null) {
+            Map<Class<?>, Map<T, ThreadLocalProxy<?>>> map
+                = new ConcurrentHashMap<Class<?>, Map<T, 
ThreadLocalProxy<?>>>(2);
+            bus.setProperty(prop, map);
+            property = map;
+        }
+        return (Map<Class<?>, Map<T, ThreadLocalProxy<?>>>)property;
+    }
+    
+    private Map<Class<?>, Map<Field, ThreadLocalProxy<?>>> getFieldProxyMap() {
+        return getProxyMap(Field.class, FIELD_PROXY_MAP);
+    }
+    
+    private Map<Class<?>, Map<Method, ThreadLocalProxy<?>>> 
getSetterProxyMap() {
+        return getProxyMap(Method.class, SETTER_PROXY_MAP);
     }
     
     private void findContextSetterMethods(Class<?> cls) {
@@ -147,8 +160,7 @@ public abstract class AbstractResourceIn
         }
         addToMap(contextMethods, contextClass, m);
         if (m.getParameterTypes()[0] != Application.class) {
-            setterProxyMap = getProxyMap(Method.class, setterProxyMap);
-            addToMap(setterProxyMap, m, 
+            addToMap(getSetterProxyMap(), m, 
                      
InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0]));
         }
     }
@@ -165,34 +177,34 @@ public abstract class AbstractResourceIn
         return getList(contextFields);
     }
     
-    public List<Field> getResourceFields() {
-        return getList(resourceFields);
-    }
-    
     public ThreadLocalProxy<?> getContextFieldProxy(Field f) {
-        return getProxy(fieldProxyMap, f);
-    }
-    
-    public ThreadLocalProxy<?> getResourceFieldProxy(Field f) {
-        return getProxy(resourceProxyMap, f);
+        return getProxy(getFieldProxyMap(), f);
     }
     
     public ThreadLocalProxy<?> getContextSetterProxy(Method m) {
-        return getProxy(setterProxyMap, m);
+        return getProxy(getSetterProxyMap(), m);
     }
     
     public abstract boolean isSingleton();
 
+    @SuppressWarnings("rawtypes")
     public static void clearAllMaps() {
-        fieldProxyMap.clear();
-        resourceProxyMap.clear();
-        setterProxyMap.clear();
+        Bus bus = BusFactory.getThreadDefaultBus(false);
+        if (bus != null) {
+            Object property = bus.getProperty(FIELD_PROXY_MAP);
+            if (property != null) {
+                ((Map)property).clear();
+            }
+            property = bus.getProperty(SETTER_PROXY_MAP);
+            if (property != null) {
+                ((Map)property).clear();
+            }
+        }
     }
     
     public void clearThreadLocalProxies() {
-        clearProxies(fieldProxyMap);
-        clearProxies(resourceProxyMap);
-        clearProxies(setterProxyMap);
+        clearProxies(getFieldProxyMap());
+        clearProxies(getSetterProxyMap());
     }
     
     private <T> void clearProxies(Map<Class<?>, Map<T, ThreadLocalProxy<?>>> 
tlps) {

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
 Fri May 25 22:23:44 2012
@@ -35,6 +35,8 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.utils.AnnotationUtils;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
@@ -56,12 +58,8 @@ public class ClassResourceInfo extends A
     private String consumesTypes;
     private String producesTypes;
     
-    public ClassResourceInfo(Class<?> theResourceClass) {
-        this(theResourceClass, false);
-    }
-    
     public ClassResourceInfo(ClassResourceInfo cri) {
-        
+        super(cri.getBus());       
         if (cri.isCreatedFromModel() && 
!InjectionUtils.isConcreteClass(cri.getServiceClass())) {
             this.root = cri.root;
             this.serviceClass = cri.serviceClass;
@@ -77,21 +75,9 @@ public class ClassResourceInfo extends A
         
     }
     
-    public ClassResourceInfo(Class<?> theResourceClass, boolean theRoot) {
-        this(theResourceClass, theResourceClass, theRoot);
-    }
-    
-    public ClassResourceInfo(Class<?> theResourceClass, Class<?> 
theServiceClass) {
-        this(theResourceClass, theServiceClass, false);
-    }
-    
-    public ClassResourceInfo(Class<?> theResourceClass, Class<?> 
theServiceClass, boolean theRoot) {
-        this(theResourceClass, theServiceClass, theRoot, false);
-    }
-    
     public ClassResourceInfo(Class<?> theResourceClass, Class<?> 
theServiceClass, 
-                             boolean theRoot, boolean enableStatic) {
-        super(theResourceClass, theServiceClass, theRoot);
+                             boolean theRoot, boolean enableStatic, Bus bus) {
+        super(theResourceClass, theServiceClass, theRoot, bus);
         this.enableStatic = enableStatic;
         if (root && resourceClass != null) {
             setParamField(serviceClass);
@@ -100,19 +86,37 @@ public class ClassResourceInfo extends A
     }
     
     public ClassResourceInfo(Class<?> theResourceClass, Class<?> 
theServiceClass, 
-                             boolean theRoot, boolean enableStatic, boolean 
createdFromModel) {
-        this(theResourceClass, theServiceClass, theRoot, enableStatic);
+                             boolean theRoot, boolean enableStatic, boolean 
createdFromModel, Bus bus) {
+        this(theResourceClass, theServiceClass, theRoot, enableStatic, bus);
         this.createdFromModel = createdFromModel;
     }
-    
+    //CHECKSTYLE:OFF
     public ClassResourceInfo(Class<?> theResourceClass, Class<?> c, 
-                             boolean theRoot, boolean enableStatic,  boolean 
createdFromModel,
-                             String consumesTypes, String producesTypes) {
-        this(theResourceClass, theResourceClass, theRoot, enableStatic, 
createdFromModel);
+                             boolean theRoot, boolean enableStatic, boolean 
createdFromModel,
+                             String consumesTypes, String producesTypes, Bus 
bus) {
+    //CHECKSTYLE:ON    
+        this(theResourceClass, theResourceClass, theRoot, enableStatic, 
createdFromModel, bus);
         this.consumesTypes = consumesTypes;
         this.producesTypes = producesTypes;
     }
     
+    // The following constructors are used by tests only
+    public ClassResourceInfo(Class<?> theResourceClass) {
+        this(theResourceClass, false);
+    }
+    
+    public ClassResourceInfo(Class<?> theResourceClass, boolean theRoot) {
+        this(theResourceClass, theResourceClass, theRoot);
+    }
+    
+    public ClassResourceInfo(Class<?> theResourceClass, Class<?> 
theServiceClass) {
+        this(theResourceClass, theServiceClass, false);
+    }
+
+    public ClassResourceInfo(Class<?> theResourceClass, Class<?> 
theServiceClass, boolean theRoot) {
+        this(theResourceClass, theServiceClass, theRoot, false, 
BusFactory.getDefaultBus(true));
+    }
+    
     public ClassResourceInfo findResource(Class<?> typedClass, Class<?> 
instanceClass) {
         instanceClass = enableStatic ? typedClass : instanceClass;
         SubresourceKey key = new SubresourceKey(typedClass, instanceClass);
@@ -126,7 +130,8 @@ public class ClassResourceInfo extends A
         SubresourceKey key = new SubresourceKey(typedClass, instanceClass);
         ClassResourceInfo cri = subResources.get(key);
         if (cri == null && !enableStatic) {
-            cri = ResourceUtils.createClassResourceInfo(typedClass, 
instanceClass, false, enableStatic);
+            cri = ResourceUtils.createClassResourceInfo(typedClass, 
instanceClass, false, enableStatic,
+                                                        getBus());
             if (cri != null) {
                 subResources.putIfAbsent(key, cri);
             }

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
 Fri May 25 22:23:44 2012
@@ -19,12 +19,14 @@
 
 package org.apache.cxf.jaxrs.model;
 
+import org.apache.cxf.Bus;
+
 public class ProviderInfo<T> extends AbstractResourceInfo {
 
     private T provider;
     
-    public ProviderInfo(T provider) {
-        super(provider.getClass(), provider.getClass(), true);
+    public ProviderInfo(T provider, Bus bus) {
+        super(provider.getClass(), provider.getClass(), true, bus);
         this.provider = provider;
     }
     

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
 Fri May 25 22:23:44 2012
@@ -43,6 +43,7 @@ import javax.ws.rs.ext.MessageBodyReader
 import javax.ws.rs.ext.MessageBodyWriter;
 
 import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.ClassHelper;
@@ -66,7 +67,7 @@ import org.apache.cxf.message.MessageUti
 
 public final class ProviderFactory {
     private static final Logger LOG = 
LogUtils.getL7dLogger(ProviderFactory.class);
-    private static final ProviderFactory SHARED_FACTORY = new 
ProviderFactory();
+    private static final ProviderFactory SHARED_FACTORY = getInstance();
     
     private static final String JAXB_PROVIDER_NAME = 
"org.apache.cxf.jaxrs.provider.JAXBElementProvider";
     private static final String JSON_PROVIDER_NAME = 
"org.apache.cxf.jaxrs.provider.json.JSONProvider";
@@ -108,7 +109,10 @@ public final class ProviderFactory {
     private List<ProviderInfo<MessageBodyWriter<?>>> jaxbWriters = 
         new ArrayList<ProviderInfo<MessageBodyWriter<?>>>();
     
-    private ProviderFactory() {
+    private Bus bus;
+    
+    private ProviderFactory(Bus bus) {
+        this.bus = bus;
         initJaxbProviders();
     }
     
@@ -119,13 +123,13 @@ public final class ProviderFactory {
     private void initJaxbProviders() {
         Object jaxbProvider = createProvider(JAXB_PROVIDER_NAME);
         if (jaxbProvider != null) {
-            jaxbReaders.add(new 
ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)jaxbProvider));
-            jaxbWriters.add(new 
ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)jaxbProvider));
+            jaxbReaders.add(new 
ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)jaxbProvider, bus));
+            jaxbWriters.add(new 
ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)jaxbProvider, bus));
         }
         Object jsonProvider = createProvider(JSON_PROVIDER_NAME);
         if (jsonProvider != null) {
-            jaxbReaders.add(new 
ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)jsonProvider));
-            jaxbWriters.add(new 
ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)jsonProvider));
+            jaxbReaders.add(new 
ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)jsonProvider, bus));
+            jaxbWriters.add(new 
ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)jsonProvider, bus));
         }
         injectContextProxies(jaxbReaders, jaxbWriters);
     }
@@ -149,7 +153,11 @@ public final class ProviderFactory {
     }
     
     public static ProviderFactory getInstance() {
-        return new ProviderFactory();
+        return new ProviderFactory(BusFactory.getThreadDefaultBus());
+    }
+    
+    public static ProviderFactory getInstance(Bus bus) {
+        return new ProviderFactory(bus);
     }
     
     public static ProviderFactory getInstance(Message m) {
@@ -480,39 +488,39 @@ public final class ProviderFactory {
             Class<?> oClass = ClassHelper.getRealClass(o);
             
             if (MessageBodyReader.class.isAssignableFrom(oClass)) {
-                messageReaders.add(new 
ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)o)); 
+                messageReaders.add(new 
ProviderInfo<MessageBodyReader<?>>((MessageBodyReader<?>)o, bus)); 
             }
             
             if (MessageBodyWriter.class.isAssignableFrom(oClass)) {
-                messageWriters.add(new 
ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)o)); 
+                messageWriters.add(new 
ProviderInfo<MessageBodyWriter<?>>((MessageBodyWriter<?>)o, bus)); 
             }
             
             if (ContextResolver.class.isAssignableFrom(oClass)) {
-                contextResolvers.add(new 
ProviderInfo<ContextResolver<?>>((ContextResolver<?>)o)); 
+                contextResolvers.add(new 
ProviderInfo<ContextResolver<?>>((ContextResolver<?>)o, bus)); 
             }
             
             if (ContextProvider.class.isAssignableFrom(oClass)) {
-                contextProviders.add(new 
ProviderInfo<ContextProvider<?>>((ContextProvider<?>)o)); 
+                contextProviders.add(new 
ProviderInfo<ContextProvider<?>>((ContextProvider<?>)o, bus)); 
             }
             
             if (RequestHandler.class.isAssignableFrom(oClass)) {
-                requestHandlers.add(new 
ProviderInfo<RequestHandler>((RequestHandler)o)); 
+                requestHandlers.add(new 
ProviderInfo<RequestHandler>((RequestHandler)o, bus)); 
             }
             
             if (ResponseHandler.class.isAssignableFrom(oClass)) {
-                responseHandlers.add(new 
ProviderInfo<ResponseHandler>((ResponseHandler)o)); 
+                responseHandlers.add(new 
ProviderInfo<ResponseHandler>((ResponseHandler)o, bus)); 
             }
             
             if (ExceptionMapper.class.isAssignableFrom(oClass)) {
-                exceptionMappers.add(new 
ProviderInfo<ExceptionMapper<?>>((ExceptionMapper<?>)o)); 
+                exceptionMappers.add(new 
ProviderInfo<ExceptionMapper<?>>((ExceptionMapper<?>)o, bus)); 
             }
             
             if (ResponseExceptionMapper.class.isAssignableFrom(oClass)) {
-                responseExceptionMappers.add(new 
ProviderInfo<ResponseExceptionMapper<?>>((ResponseExceptionMapper<?>)o)); 
+                responseExceptionMappers.add(new 
ProviderInfo<ResponseExceptionMapper<?>>((ResponseExceptionMapper<?>)o, bus)); 
             }
             
             if (ParameterHandler.class.isAssignableFrom(oClass)) {
-                paramHandlers.add(new 
ProviderInfo<ParameterHandler<?>>((ParameterHandler<?>)o)); 
+                paramHandlers.add(new 
ProviderInfo<ParameterHandler<?>>((ParameterHandler<?>)o, bus)); 
             }
         }
         sortReaders();

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
 Fri May 25 22:23:44 2012
@@ -918,11 +918,6 @@ public final class InjectionUtils {
             Object value = f.getType() == Application.class ? app : 
cri.getContextFieldProxy(f);
             InjectionUtils.injectFieldValue(f, instance, value);
         }
-        
-        for (Field f : cri.getResourceFields()) {
-            ThreadLocalProxy<?> proxy = cri.getResourceFieldProxy(f);
-            InjectionUtils.injectFieldValue(f, instance, proxy);
-        }
     }
     
     public static void injectContextProxies(AbstractResourceInfo cri, Object 
instance) {
@@ -931,14 +926,11 @@ public final class InjectionUtils {
     
     @SuppressWarnings("unchecked")
     public static void injectContextField(AbstractResourceInfo cri, 
-                                          Field f, Object o, Object value,
-                                          boolean resource) {
+                                          Field f, Object o, Object value) {
         if (!cri.isSingleton()) {
             InjectionUtils.injectFieldValue(f, o, value);
         } else {
-            ThreadLocalProxy<Object> proxy =  (ThreadLocalProxy<Object>)(
-                    resource ? cri.getResourceFieldProxy(f)
-                        : cri.getContextFieldProxy(f));
+            ThreadLocalProxy<Object> proxy = 
(ThreadLocalProxy<Object>)cri.getContextFieldProxy(f);
             if (proxy != null) {
                 proxy.set(value);
             }
@@ -950,7 +942,6 @@ public final class InjectionUtils {
                                  Message message) {
         injectContextMethods(requestObject, resource, message);
         injectContextFields(requestObject, resource, message);
-        injectResourceFields(requestObject, resource, message);
     }
     
     @SuppressWarnings("unchecked")
@@ -993,17 +984,7 @@ public final class InjectionUtils {
                 continue;
             }
             Object value = JAXRSUtils.createContextValue(m, 
f.getGenericType(), f.getType());
-            InjectionUtils.injectContextField(cri, f, o, value, false);
-        }
-    }
-    
-    public static void injectResourceFields(Object o,
-                                            AbstractResourceInfo cri,
-                                            Message m) {
-        
-        for (Field f : cri.getResourceFields()) {
-            Object value = JAXRSUtils.createResourceValue(m, 
f.getGenericType(), f.getType());
-            InjectionUtils.injectContextField(cri, f, o, value, true);
+            InjectionUtils.injectContextField(cri, f, o, value);
         }
     }
     

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
 Fri May 25 22:23:44 2012
@@ -143,22 +143,29 @@ public final class ResourceUtils {
         return null;
     }
     
+    public static ClassResourceInfo createClassResourceInfo(Map<String, 
UserResource> resources, 
+                                                            UserResource 
model, boolean isRoot, boolean enableStatic) {
+        return createClassResourceInfo(resources, model, isRoot, enableStatic, 
+                                       BusFactory.getThreadDefaultBus());
+    }
+    
     public static ClassResourceInfo createClassResourceInfo(
-        Map<String, UserResource> resources, UserResource model, boolean 
isRoot, boolean enableStatic) {
+        Map<String, UserResource> resources, UserResource model, boolean 
isRoot, boolean enableStatic,
+        Bus bus) {
         
         Class<?> sClass = loadClass(model.getName());
-        return createServiceClassResourceInfo(resources, model, sClass, 
isRoot, enableStatic);
+        return createServiceClassResourceInfo(resources, model, sClass, 
isRoot, enableStatic, bus);
     }
     
     public static ClassResourceInfo createServiceClassResourceInfo(
         Map<String, UserResource> resources, UserResource model, 
-        Class<?> sClass, boolean isRoot, boolean enableStatic) {
+        Class<?> sClass, boolean isRoot, boolean enableStatic, Bus bus) {
         if (model == null) {
             throw new RuntimeException("Resource class " + sClass.getName() + 
" has no model info");
         }
         ClassResourceInfo cri = 
             new ClassResourceInfo(sClass, sClass, isRoot, enableStatic, true,
-                                  model.getConsumes(), model.getProduces());
+                                  model.getConsumes(), model.getProduces(), 
bus);
         URITemplate t = URITemplate.createTemplate(model.getPath());
         cri.setURITemplate(t);
         MethodDispatcher md = new MethodDispatcher();
@@ -178,7 +185,7 @@ public final class ResourceUtils {
                 if (resources.containsKey(rClassName)) {
                     ClassResourceInfo subCri = 
rClassName.equals(model.getName()) ? cri 
                         : createServiceClassResourceInfo(resources, 
resources.get(rClassName),
-                                                         m.getReturnType(), 
false, enableStatic);
+                                                         m.getReturnType(), 
false, enableStatic, bus);
                     if (subCri != null) {
                         cri.addSubClassResourceInfo(subCri);
                         md.bind(ori, m);
@@ -193,10 +200,20 @@ public final class ResourceUtils {
 
     }
     
+    public static ClassResourceInfo createClassResourceInfo(final Class<?> 
rClass, 
+                                                            final Class<?> 
sClass,
+                                                            boolean root, 
+                                                            boolean 
enableStatic) {
+        return createClassResourceInfo(rClass, sClass, root, enableStatic, 
BusFactory.getThreadDefaultBus());
+        
+    }
     
-    public static ClassResourceInfo createClassResourceInfo(
-        final Class<?> rClass, final Class<?> sClass, boolean root, boolean 
enableStatic) {
-        ClassResourceInfo cri  = new ClassResourceInfo(rClass, sClass, root, 
enableStatic);
+    public static ClassResourceInfo createClassResourceInfo(final Class<?> 
rClass, 
+                                                            final Class<?> 
sClass,
+                                                            boolean root, 
+                                                            boolean 
enableStatic,
+                                                            Bus bus) {
+        ClassResourceInfo cri = new ClassResourceInfo(rClass, sClass, root, 
enableStatic, bus);
 
         if (root) {
             URITemplate t = URITemplate.createTemplate(cri.getPath());
@@ -225,7 +242,8 @@ public final class ResourceUtils {
                         ClassResourceInfo subCri = cri.findResource(subClass, 
subClass);
                         if (subCri == null) {
                             subCri = subClass == cri.getServiceClass() ? cri
-                                     : createClassResourceInfo(subClass, 
subClass, false, enableStatic);
+                                     : createClassResourceInfo(subClass, 
subClass, false, enableStatic,
+                                                               cri.getBus());
                         }
                         
                         if (subCri != null) {

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
 Fri May 25 22:23:44 2012
@@ -39,6 +39,7 @@ import javax.ws.rs.core.UriInfo;
 
 import org.apache.cxf.jaxrs.utils.ResourceUtils;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -91,6 +92,11 @@ public class ClassResourceInfoTest exten
         }
     }
     
+    @After
+    public void tearDown() {
+        AbstractResourceInfo.clearAllMaps();
+    }
+    
     @Test
     public void testGetHttpContexts() {
         ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
@@ -99,33 +105,19 @@ public class ClassResourceInfoTest exten
         
         c = new ClassResourceInfo(TestClass.class, true);
         fields = c.getContextFields();
-        assertEquals("2 http context fields available", 2, fields.size());
-        assertTrue("Wrong fields selected", 
-                   (fields.get(0).getType() == UriInfo.class
-                   || fields.get(1).getType() == UriInfo.class)
-                   && (fields.get(0).getType() == HttpHeaders.class
-                   || fields.get(1).getType() == HttpHeaders.class));
-    }
-
-    @Test
-    public void testGetResources() {
-        ClassResourceInfo c = new ClassResourceInfo(TestClass3.class);
-        List<Field> fields = c.getResourceFields();
-        assertEquals("Only root classes should check these fields", 0, 
fields.size());
-        c = new ClassResourceInfo(TestClass3.class, true);
-        fields = c.getResourceFields();
-        
         Set<Class<?>> clses = new HashSet<Class<?>>(); 
         for (Field f : fields) {
             clses.add(f.getType());
         }
-        assertEquals("3 resources fields available", 3, fields.size());
+        assertEquals("5 http context fields available", 5, clses.size());
         assertTrue("Wrong fields selected",
                    clses.contains(HttpServletRequest.class)
                    && clses.contains(HttpServletResponse.class)
-                   && clses.contains(ServletContext.class)); 
+                   && clses.contains(ServletContext.class)
+                   && clses.contains(UriInfo.class)
+                   && clses.contains(HttpHeaders.class));
     }
-    
+
     @Test
     public void testGetPath() {
         ClassResourceInfo c = new ClassResourceInfo(TestClass.class);

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
 Fri May 25 22:23:44 2012
@@ -62,6 +62,7 @@ import org.apache.cxf.jaxrs.ext.Paramete
 import org.apache.cxf.jaxrs.ext.RequestHandler;
 import org.apache.cxf.jaxrs.impl.MetadataMap;
 import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper;
+import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
@@ -84,6 +85,7 @@ public class ProviderFactoryTest extends
     @Before
     public void setUp() {
         ProviderFactory.getInstance().clearProviders();
+        AbstractResourceInfo.clearAllMaps();
     }
     
     @Test

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=1342824&r1=1342823&r2=1342824&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
 Fri May 25 22:23:44 2012
@@ -80,6 +80,7 @@ import org.apache.cxf.jaxrs.impl.tl.Thre
 import org.apache.cxf.jaxrs.impl.tl.ThreadLocalUriInfo;
 import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.MethodDispatcher;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
@@ -93,6 +94,7 @@ import org.apache.cxf.message.MessageImp
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.easymock.EasyMock;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -102,6 +104,10 @@ public class JAXRSUtilsTest extends Asse
     @Before
     public void setUp() {
     }
+    @After
+    public void tearDown() {
+        AbstractResourceInfo.clearAllMaps();
+    }
     
     @Test
     public void testFormParametersUTF8Encoding() throws Exception {
@@ -1589,7 +1595,7 @@ public class JAXRSUtilsTest extends Asse
         Customer c = new Customer();
         cri.setResourceProvider(new SingletonResourceProvider(c));
                 
-        Message m = new MessageImpl();
+        Message m = createMessage();
         ServletContext servletContextMock = 
EasyMock.createNiceMock(ServletContext.class);
         m.put(AbstractHTTPDestination.HTTP_CONTEXT, servletContextMock);
         HttpServletRequest httpRequest = 
EasyMock.createNiceMock(HttpServletRequest.class);
@@ -1597,7 +1603,7 @@ public class JAXRSUtilsTest extends Asse
         HttpServletResponse httpResponse = 
EasyMock.createMock(HttpServletResponse.class);
         m.put(AbstractHTTPDestination.HTTP_RESPONSE, httpResponse);
         InjectionUtils.injectContextProxies(cri, 
cri.getResourceProvider().getInstance(null));
-        InjectionUtils.injectResourceFields(c, cri, m);
+        InjectionUtils.injectContextFields(c, cri, m);
         assertSame(servletContextMock, 
                    
((ThreadLocalProxy<ServletContext>)c.getServletContextResource()).get());
         assertSame(httpRequest, 
@@ -1727,20 +1733,17 @@ public class JAXRSUtilsTest extends Asse
         m.put(AbstractHTTPDestination.HTTP_RESPONSE, response);
         m.put(AbstractHTTPDestination.HTTP_CONTEXT, context);
         
-        InjectionUtils.injectResourceFields(c, ori.getClassResourceInfo(), m);
+        InjectionUtils.injectContextFields(c, ori.getClassResourceInfo(), m);
         assertSame(request.getClass(), 
c.getServletRequestResource().getClass());
         HttpServletResponseFilter filter = 
(HttpServletResponseFilter)c.getServletResponseResource();
         assertSame(response.getClass(), filter.getResponse().getClass());
         assertSame(context.getClass(), 
c.getServletContextResource().getClass());
-        assertNull(c.getServletRequest());
-        assertNull(c.getServletResponse());
-        assertNull(c.getServletContext());
-        
-        c = new Customer();
-        InjectionUtils.injectContextFields(c, ori.getClassResourceInfo(), m);
-        assertNull(c.getServletRequestResource());
-        assertNull(c.getServletResponseResource());
-        assertNull(c.getServletContextResource());
+        assertNotNull(c.getServletRequest());
+        assertNotNull(c.getServletResponse());
+        assertNotNull(c.getServletContext());
+        assertNotNull(c.getServletRequestResource());
+        assertNotNull(c.getServletResponseResource());
+        assertNotNull(c.getServletContextResource());
         assertSame(request.getClass(), c.getServletRequest().getClass());
         filter = (HttpServletResponseFilter)c.getServletResponse();
         assertSame(response.getClass(), filter.getResponse().getClass());


Reply via email to