You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/11/28 18:49:00 UTC

svn commit: r1207482 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/

Author: sergeyb
Date: Mon Nov 28 17:48:58 2011
New Revision: 1207482

URL: http://svn.apache.org/viewvc?rev=1207482&view=rev
Log:
[CXF-3938] Injecting contexts into the providers at the selection stage

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java
    cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml

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=1207482&r1=1207481&r2=1207482&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 Mon Nov 28 17:48:58 2011
@@ -118,7 +118,7 @@ public final class ProviderFactory {
             jaxbReaders.add(new ProviderInfo<MessageBodyReader>((MessageBodyReader)jsonProvider));
             jaxbWriters.add(new ProviderInfo<MessageBodyWriter>((MessageBodyWriter)jsonProvider));
         }
-        injectContexts(jaxbReaders, jaxbWriters);
+        injectContextProxies(jaxbReaders, jaxbWriters);
     }
     
     
@@ -172,9 +172,7 @@ public final class ProviderFactory {
                     Type[] args = pt.getActualTypeArguments();
                     for (int i = 0; i < args.length; i++) {
                         if (contextType == args[i]) {
-                            
-                            InjectionUtils.injectContextFields(cr.getProvider(), cr, m);
-                            InjectionUtils.injectContextMethods(cr.getProvider(), cr, m);
+                            injectContextValues(cr, m);
                             return cr.getProvider();
                         }
                     }
@@ -202,7 +200,7 @@ public final class ProviderFactory {
         List<ExceptionMapper<T>> candidates = new LinkedList<ExceptionMapper<T>>();
         
         for (ProviderInfo<ExceptionMapper> em : exceptionMappers) {
-            handleMapper((List)candidates, em, exceptionType, m, ExceptionMapper.class);
+            handleMapper((List)candidates, em, exceptionType, m, ExceptionMapper.class, true);
         }
         if (candidates.size() == 0) {
             return null;
@@ -217,7 +215,7 @@ public final class ProviderFactory {
         List<ParameterHandler<T>> candidates = new LinkedList<ParameterHandler<T>>();
         
         for (ProviderInfo<ParameterHandler> em : paramHandlers) {
-            handleMapper((List)candidates, em, paramType, null, ParameterHandler.class);
+            handleMapper((List)candidates, em, paramType, null, ParameterHandler.class, true);
         }
         if (candidates.size() == 0) {
             return null;
@@ -233,7 +231,7 @@ public final class ProviderFactory {
         List<ResponseExceptionMapper<T>> candidates = new LinkedList<ResponseExceptionMapper<T>>();
         
         for (ProviderInfo<ResponseExceptionMapper> em : responseExceptionMappers) {
-            handleMapper((List)candidates, em, paramType, null, ResponseExceptionMapper.class);
+            handleMapper((List)candidates, em, paramType, null, ResponseExceptionMapper.class, true);
         }
         if (candidates.size() == 0) {
             return null;
@@ -242,8 +240,12 @@ public final class ProviderFactory {
         return candidates.get(0);
     }
     
-    private static void handleMapper(List<Object> candidates, ProviderInfo em, 
-                                     Class<?> expectedType, Message m, Class<?> providerClass) {
+    private static void handleMapper(List<Object> candidates, 
+                                     ProviderInfo em, 
+                                     Class<?> expectedType, 
+                                     Message m, 
+                                     Class<?> providerClass,
+                                     boolean injectContext) {
         
         Class<?> mapperClass =  ClassHelper.getRealClass(em.getProvider());
         Type[] types = getGenericInterfaces(mapperClass);
@@ -267,9 +269,8 @@ public final class ProviderFactory {
                         if (!isResolved) {
                             return;
                         }
-                        if (m != null) {
-                            InjectionUtils.injectContextFields(em.getProvider(), em, m);
-                            InjectionUtils.injectContextMethods(em.getProvider(), em, m);
+                        if (injectContext) {
+                            injectContextValues(em, m);
                         }
                         candidates.add(em.getProvider());
                         return;
@@ -279,15 +280,17 @@ public final class ProviderFactory {
                         continue;
                     }
                     if (actualClass.isAssignableFrom(expectedType)) {
-                        if (m != null) {
-                            InjectionUtils.injectContextFields(em.getProvider(), em, m);
-                            InjectionUtils.injectContextMethods(em.getProvider(), em, m);
+                        if (injectContext) {
+                            injectContextValues(em, m);
                         }
                         candidates.add(em.getProvider());
                         return;
                     }
                 }
             } else if (t instanceof Class && ((Class<?>)t).isAssignableFrom(providerClass)) {
+                if (injectContext) {
+                    injectContextValues(em, m);
+                }
                 candidates.add(em.getProvider());
             }
         }
@@ -437,12 +440,19 @@ public final class ProviderFactory {
         sortReaders();
         sortWriters();
         
-        injectContexts(messageReaders, messageWriters, contextResolvers, requestHandlers, responseHandlers,
+        injectContextProxies(messageReaders, messageWriters, contextResolvers, requestHandlers, responseHandlers,
                        exceptionMappers);
     }
 //CHECKSTYLE:ON
     
-    void injectContexts(List<?> ... providerLists) {
+    static void injectContextValues(ProviderInfo pi, Message m) {
+        if (m != null) {
+            InjectionUtils.injectContextFields(pi.getProvider(), pi, m);
+            InjectionUtils.injectContextMethods(pi.getProvider(), pi, m);
+        }
+    }
+    
+    void injectContextProxies(List<?> ... providerLists) {
         for (List<?> list : providerLists) {
             for (Object p : list) {
                 ProviderInfo pi = (ProviderInfo)p;
@@ -490,15 +500,11 @@ public final class ProviderFactory {
                                                          Message m) {
         List<MessageBodyReader<T>> candidates = new LinkedList<MessageBodyReader<T>>();
         for (ProviderInfo<MessageBodyReader> ep : readers) {
-            if (matchesReaderCriterias(ep.getProvider(), type, genericType, annotations, mediaType)) {
+            if (matchesReaderCriterias(ep, type, genericType, annotations, mediaType, m)) {
                 if (this == SHARED_FACTORY) {
-                    if (!isJaxbBasedProvider(ep.getProvider())) {
-                        InjectionUtils.injectContextFields(ep.getProvider(), ep, m);
-                        InjectionUtils.injectContextMethods(ep.getProvider(), ep, m);
-                    }
                     return ep.getProvider();
                 }
-                handleMapper((List)candidates, ep, type, m, MessageBodyReader.class);
+                handleMapper((List)candidates, ep, type, m, MessageBodyReader.class, false);
             }
         }     
         
@@ -510,11 +516,13 @@ public final class ProviderFactory {
         
     }
     
-    private <T> boolean matchesReaderCriterias(MessageBodyReader<T> ep,
+    private <T> boolean matchesReaderCriterias(ProviderInfo<MessageBodyReader> pi,
                                                Class<T> type,
                                                Type genericType,
                                                Annotation[] annotations,
-                                               MediaType mediaType) {
+                                               MediaType mediaType,
+                                               Message m) {
+        MessageBodyReader<?> ep = pi.getProvider();
         List<MediaType> supportedMediaTypes = JAXRSUtils.getProviderConsumeTypes(ep);
         
         List<MediaType> availableMimeTypes = 
@@ -523,9 +531,16 @@ public final class ProviderFactory {
         if (availableMimeTypes.size() == 0) {
             return false;
         }
-        
-        return ep.isReadable(type, genericType, annotations, mediaType);
-        
+        boolean injected = false;
+        if (this != SHARED_FACTORY || !isJaxbBasedProvider(ep)) {
+            injectContextValues(pi, m);
+            injected = true;
+        }
+        boolean matches = ep.isReadable(type, genericType, annotations, mediaType);
+        if (!matches && injected) {
+            pi.clearThreadLocalProxies();
+        }
+        return matches;
     }
         
     /**
@@ -547,15 +562,11 @@ public final class ProviderFactory {
                                                          Message m) {
         List<MessageBodyWriter<T>> candidates = new LinkedList<MessageBodyWriter<T>>();
         for (ProviderInfo<MessageBodyWriter> ep : writers) {
-            if (matchesWriterCriterias(ep.getProvider(), type, genericType, annotations, mediaType)) {
+            if (matchesWriterCriterias(ep, type, genericType, annotations, mediaType, m)) {
                 if (this == SHARED_FACTORY) {
-                    if (!isJaxbBasedProvider(ep.getProvider())) {
-                        InjectionUtils.injectContextFields(ep.getProvider(), ep, m);
-                        InjectionUtils.injectContextMethods(ep.getProvider(), ep, m);
-                    }
                     return ep.getProvider();
                 }
-                handleMapper((List)candidates, ep, type, m, MessageBodyWriter.class);
+                handleMapper((List)candidates, ep, type, m, MessageBodyWriter.class, false);
             }
         }     
         if (candidates.size() == 0) {
@@ -565,11 +576,13 @@ public final class ProviderFactory {
         return candidates.get(0);
     }
     
-    private <T> boolean matchesWriterCriterias(MessageBodyWriter<T> ep,
+    private <T> boolean matchesWriterCriterias(ProviderInfo<MessageBodyWriter> pi,
                                                Class<T> type,
                                                Type genericType,
                                                Annotation[] annotations,
-                                               MediaType mediaType) {
+                                               MediaType mediaType,
+                                               Message m) {
+        MessageBodyWriter<?> ep = pi.getProvider();
         List<MediaType> supportedMediaTypes = JAXRSUtils.getProviderProduceTypes(ep);
         
         List<MediaType> availableMimeTypes = 
@@ -579,7 +592,16 @@ public final class ProviderFactory {
         if (availableMimeTypes.size() == 0) {
             return false;
         }
-        return ep.isWriteable(type, genericType, annotations, mediaType); 
+        boolean injected = false;
+        if (this != SHARED_FACTORY || !isJaxbBasedProvider(ep)) {
+            injectContextValues(pi, m);
+            injected = true;
+        }
+        boolean matches = ep.isWriteable(type, genericType, annotations, mediaType);
+        if (!matches && injected) {
+            pi.clearThreadLocalProxies();
+        }
+        return matches;
     }
     
     List<ProviderInfo<MessageBodyReader>> getMessageReaders() {

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java?rev=1207482&r1=1207481&r2=1207482&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java Mon Nov 28 17:48:58 2011
@@ -24,18 +24,34 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
 
 import org.apache.cxf.jaxrs.provider.PrimitiveTextProvider;
 
 public class StringTextWriter extends PrimitiveTextProvider {
+    
+    @Context
+    private UriInfo ui;
+    
     @Override
     public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
         return false;
     }
     
+    @Override
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
+        String path = ui.getAbsolutePath().toString();
+        if (path.endsWith("/webapp/resources/bookstore/nonexistent")) {
+            return super.isWriteable(type, genericType, annotations, mt);
+        } else {
+            return false;
+        }
+    }
+    
     public void writeTo(Object obj, Class<?> type, Type genType, Annotation[] anns, 
                         MediaType mt, MultivaluedMap<String, Object> headers,
                         OutputStream os) throws IOException {

Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml?rev=1207482&r1=1207481&r2=1207482&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml Mon Nov 28 17:48:58 2011
@@ -48,4 +48,5 @@ http://cxf.apache.org/schemas/jaxrs.xsd"
     </bean>   
     <bean id="exceptionMapper2" class="org.apache.cxf.systest.jaxrs.RuntimeExceptionMapper"/>
     <bean id="plainTextProvider" class="org.apache.cxf.systest.jaxrs.StringTextWriter"/>
+    
 </beans>