Author: sergeyb
Date: Thu Mar 24 14:27:25 2011
New Revision: 1084966

URL: http://svn.apache.org/viewvc?rev=1084966&view=rev
Log:
[CXF-3417] Injection of contexts into Applications

Modified:
    
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.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/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/JAXRSUtils.java
    
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.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/JAXRSInvoker.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1084966&r1=1084965&r2=1084966&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
 Thu Mar 24 14:27:25 2011
@@ -28,6 +28,7 @@ import java.util.ResourceBundle;
 import java.util.logging.Logger;
 
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
@@ -46,6 +47,7 @@ import org.apache.cxf.jaxrs.model.Operat
 import org.apache.cxf.jaxrs.model.OperationResourceInfoStack;
 import org.apache.cxf.jaxrs.model.Parameter;
 import org.apache.cxf.jaxrs.model.ParameterType;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.model.URITemplate;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
@@ -121,15 +123,21 @@ public class JAXRSInvoker extends Abstra
                     
             if (cri.isRoot()) {
                 Object realResourceObject = 
ClassHelper.getRealObject(resourceObject);
-                JAXRSUtils.handleSetters(ori, realResourceObject,
+                JAXRSUtils.injectParameters(ori, realResourceObject,
                                          exchange.getInMessage());
     
-                InjectionUtils.injectContextFields(realResourceObject,
-                                                   ori.getClassResourceInfo(),
-                                                   exchange.getInMessage());
-                InjectionUtils.injectResourceFields(realResourceObject,
-                                                ori.getClassResourceInfo(),
-                                                exchange.getInMessage());
+                InjectionUtils.injectContexts(realResourceObject,
+                                              ori.getClassResourceInfo(),
+                                              exchange.getInMessage());
+                
+                ProviderInfo<?> appProvider = 
+                    
(ProviderInfo)exchange.getEndpoint().get(Application.class.getName());
+                if (appProvider != null) {
+                    InjectionUtils.injectContexts(appProvider.getProvider(),
+                                                  appProvider,
+                                                  exchange.getInMessage());
+                }
+                
             }
         }
         

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=1084966&r1=1084965&r2=1084966&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
 Thu Mar 24 14:27:25 2011
@@ -39,6 +39,7 @@ import org.apache.cxf.jaxrs.impl.Request
 import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
 import org.apache.cxf.service.factory.FactoryBeanListener;
@@ -72,7 +73,7 @@ public class JAXRSServerFactoryBean exte
     private Map<Object, Object> languageMappings;
     private Map<Object, Object> extensionMappings;
     private ResourceComparator rc;
-    private Application application;
+    private ProviderInfo<Application> appProvider;
     
     public JAXRSServerFactoryBean() {
         this(new JAXRSServiceFactoryBean());
@@ -87,7 +88,7 @@ public class JAXRSServerFactoryBean exte
      * @param app
      */
     public void setApplication(Application app) {
-        application = app;    
+        appProvider = new ProviderInfo<Application>(app);    
     }
     
     /**
@@ -138,8 +139,10 @@ public class JAXRSServerFactoryBean exte
                 ep.getService().setInvoker(invoker);
             }
             
-            ep.put(Application.class.getName(), application);
             ProviderFactory factory = setupFactory(ep);
+            ep.put(Application.class.getName(), appProvider);
+            factory.setApplicationProvider(appProvider);
+            
             factory.setRequestPreprocessor(
                 new RequestPreprocessor(languageMappings, extensionMappings));
             if (rc != null) {
@@ -321,6 +324,7 @@ public class JAXRSServerFactoryBean exte
     }
 
     private void injectContexts() {
+        Application application = appProvider == null ? null : 
appProvider.getProvider();
         for (ClassResourceInfo cri : serviceFactory.getClassResourceInfo()) {
             if (cri.isSingleton()) {
                 InjectionUtils.injectContextProxiesAndApplication(cri, 
@@ -328,6 +332,10 @@ public class JAXRSServerFactoryBean exte
                                                     application);
             }
         }
+        if (application != null) {
+            InjectionUtils.injectContextProxiesAndApplication(appProvider, 
+                                                              application, 
null);
+        }
     }
     
     private void updateClassResourceProviders() {

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=1084966&r1=1084965&r2=1084966&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
 Thu Mar 24 14:27:25 2011
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.logging.Logger;
 
+import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.ExceptionMapper;
@@ -94,6 +95,8 @@ public final class ProviderFactory {
     private List<ProviderInfo<ResponseExceptionMapper>> 
responseExceptionMappers = 
         new ArrayList<ProviderInfo<ResponseExceptionMapper>>(1);
     private RequestPreprocessor requestPreprocessor;
+    private ProviderInfo<Application> application;
+    
     private Set<Object> clonedProviders = new HashSet<Object>();
     
     private ProviderFactory() {
@@ -607,6 +610,10 @@ public final class ProviderFactory {
         }
     }
     
+    public void setApplicationProvider(ProviderInfo<Application> app) {
+        application = app;
+    }
+    
     public void setRequestPreprocessor(RequestPreprocessor rp) {
         this.requestPreprocessor = rp;
     }
@@ -622,6 +629,9 @@ public final class ProviderFactory {
                      requestHandlers,
                      responseHandlers,
                      exceptionMappers);
+        if (application != null) {
+            application.clearThreadLocalProxies();
+        }
         if (this != SHARED_FACTORY) {
             SHARED_FACTORY.clearThreadLocalProxies();
         }

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=1084966&r1=1084965&r2=1084966&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
 Thu Mar 24 14:27:25 2011
@@ -814,6 +814,14 @@ public final class InjectionUtils {
         }
     }
     
+    public static void injectContexts(Object requestObject,
+                                 AbstractResourceInfo resource,
+                                 Message message) {
+        injectContextMethods(requestObject, resource, message);
+        injectContextFields(requestObject, resource, message);
+        injectResourceFields(requestObject, resource, message);
+    }
+    
     @SuppressWarnings("unchecked")
     public static void injectContextMethods(Object requestObject,
                                             AbstractResourceInfo cri,

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1084966&r1=1084965&r2=1084966&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
 Thu Mar 24 14:27:25 2011
@@ -93,6 +93,7 @@ import org.apache.cxf.jaxrs.model.Operat
 import org.apache.cxf.jaxrs.model.OperationResourceInfoComparator;
 import org.apache.cxf.jaxrs.model.Parameter;
 import org.apache.cxf.jaxrs.model.ParameterType;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.model.URITemplate;
 import org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
@@ -184,12 +185,11 @@ public final class JAXRSUtils {
     }
     
     @SuppressWarnings("unchecked")
-    public static void handleSetters(OperationResourceInfo ori,
-                                     Object requestObject,
-                                     Message message) {
+    public static void injectParameters(OperationResourceInfo ori,
+                                        Object requestObject,
+                                        Message message) {
         ClassResourceInfo cri = ori.getClassResourceInfo();
-        InjectionUtils.injectContextMethods(requestObject, cri, message);
-        
+                
         if (cri.isSingleton() 
             && (!cri.getParameterMethods().isEmpty() || 
!cri.getParameterFields().isEmpty())) {
             LOG.fine("Injecting request parameters into singleton resource is 
not thread-safe");
@@ -815,7 +815,9 @@ public final class JAXRSUtils {
         } else if (SearchContext.class.isAssignableFrom(clazz)) {
             o = new SearchContextImpl(m);
         } else if (Application.class.isAssignableFrom(clazz)) {
-            o = 
contextMessage.getExchange().getEndpoint().get(Application.class.getName());
+            ProviderInfo<?> providerInfo = 
+                
(ProviderInfo)contextMessage.getExchange().getEndpoint().get(Application.class.getName());
+            o = providerInfo == null ? providerInfo : 
providerInfo.getProvider();
         }
         if (o == null && contextMessage != null && 
!MessageUtils.isRequestor(contextMessage)) {
             o = createServletResourceValue(contextMessage, clazz);

Modified: 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java?rev=1084966&r1=1084965&r2=1084966&view=diff
==============================================================================
--- 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java
 (original)
+++ 
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java
 Thu Mar 24 14:27:25 2011
@@ -19,7 +19,14 @@
 package org.apache.cxf.jaxrs;
 
 import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
 
 public class CustomerApplication extends Application {
-
+    @Context
+    private UriInfo uriInfo;
+    
+    public UriInfo getUriInfo() {
+        return uriInfo;
+    }
 }

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=1084966&r1=1084965&r2=1084966&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
 Thu Mar 24 14:27:25 2011
@@ -119,7 +119,7 @@ public class JAXRSUtilsTest extends Asse
     
     @Test
     public void testInjectApplicationInSingleton() throws Exception {
-        Application app = new CustomerApplication();
+        CustomerApplication app = new CustomerApplication();
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         Customer customer = new Customer();
         sf.setServiceBeanObjects(customer);
@@ -128,20 +128,26 @@ public class JAXRSUtilsTest extends Asse
         Server server = sf.create();  
         assertSame(app, customer.getApplication1());
         assertSame(app, customer.getApplication2());
+        ThreadLocalProxy proxy = (ThreadLocalProxy)app.getUriInfo();
+        assertNotNull(proxy);
         
invokeCustomerMethod(sf.getServiceFactory().getClassResourceInfo().get(0),
                              customer, server);
         assertSame(app, customer.getApplication2());
+        assertTrue(proxy.get() instanceof UriInfo);
     }
     
     @Test
     public void testInjectApplicationInPerRequestResource() throws Exception {
-        Application app = new CustomerApplication();
+        CustomerApplication app = new CustomerApplication();
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setServiceClass(Customer.class);
         sf.setApplication(app);
         sf.setStart(false);
         Server server = sf.create();  
         
+        ThreadLocalProxy proxy = (ThreadLocalProxy)app.getUriInfo();
+        assertNotNull(proxy);
+        
         ClassResourceInfo cri = 
sf.getServiceFactory().getClassResourceInfo().get(0);
         
         Customer customer = (Customer)cri.getResourceProvider().getInstance(
@@ -153,6 +159,8 @@ public class JAXRSUtilsTest extends Asse
         invokeCustomerMethod(cri, customer, server);
         assertSame(app, customer.getApplication1());
         assertSame(app, customer.getApplication2());
+        
+        assertTrue(proxy.get() instanceof UriInfo);
     }
     
     private void invokeCustomerMethod(ClassResourceInfo cri, 
@@ -1425,7 +1433,7 @@ public class JAXRSUtilsTest extends Asse
         OperationResourceInfo ori = new 
OperationResourceInfo(Customer.class.getMethods()[0],
                                                               cri); 
         Message message = new MessageImpl();
-        JAXRSUtils.handleSetters(ori, c, message);
+        InjectionUtils.injectContextMethods(c, ori.getClassResourceInfo(), 
message);
         assertNotNull(c.getUriInfo());
         assertSame(ThreadLocalUriInfo.class, c.getUriInfo().getClass());
         assertSame(UriInfoImpl.class, 
@@ -1446,7 +1454,7 @@ public class JAXRSUtilsTest extends Asse
         headers.add("AHeader2", "theAHeader2");
         m.put(Message.PROTOCOL_HEADERS, headers);
         m.put(Message.QUERY_STRING, "a=aValue&query2=b");
-        JAXRSUtils.handleSetters(ori, c, m);
+        JAXRSUtils.injectParameters(ori, c, m);
         assertEquals("aValue", c.getQueryParam());
         assertEquals("theAHeader2", c.getAHeader2());
     }
@@ -1464,7 +1472,7 @@ public class JAXRSUtilsTest extends Asse
         headers.add("AHeader", "theAHeader");
         m.put(Message.PROTOCOL_HEADERS, headers);
         m.put(Message.QUERY_STRING, "b=bValue");
-        JAXRSUtils.handleSetters(ori, c, m);
+        JAXRSUtils.injectParameters(ori, c, m);
         assertEquals("bValue", c.getB());
         assertEquals("theAHeader", c.getAHeader());
     }


Reply via email to