Author: sergeyb
Date: Tue Nov 29 11:11:06 2011
New Revision: 1207824

URL: http://svn.apache.org/viewvc?rev=1207824&view=rev
Log:
Merged revisions 1207484 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/branches/2.4.x-fixes

................
  r1207484 | sergeyb | 2011-11-28 17:51:27 +0000 (Mon, 28 Nov 2011) | 9 lines
  
  Merged revisions 1207482 via svnmerge from 
  https://svn.apache.org/repos/asf/cxf/trunk
  
  ........
    r1207482 | sergeyb | 2011-11-28 17:48:58 +0000 (Mon, 28 Nov 2011) | 1 line
    
    [CXF-3938] Injecting contexts into the providers at the selection stage
  ........
................

Modified:
    cxf/branches/2.3.x-fixes/   (props changed)
    
cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
    
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java
    
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml

Propchange: cxf/branches/2.3.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Nov 29 11:11:06 2011
@@ -0,0 +1,2 @@
+/cxf/branches/2.4.x-fixes:1207484
+/cxf/trunk:1207482

Propchange: cxf/branches/2.3.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: 
cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=1207824&r1=1207823&r2=1207824&view=diff
==============================================================================
--- 
cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
 (original)
+++ 
cxf/branches/2.3.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
 Tue Nov 29 11:11:06 2011
@@ -147,9 +147,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();
                         }
                     }
@@ -177,7 +175,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;
@@ -192,7 +190,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;
@@ -208,7 +206,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;
@@ -217,8 +215,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);
@@ -242,9 +244,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;
@@ -254,15 +255,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());
             }
         }
@@ -383,12 +386,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;
@@ -432,13 +442,11 @@ public final class ProviderFactory {
                                                          Message m) {
         List<MessageBodyReader<T>> candidates = new 
LinkedList<MessageBodyReader<T>>();
         for (ProviderInfo<MessageBodyReader> ep : messageReaders) {
-            if (matchesReaderCriterias(ep.getProvider(), type, genericType, 
annotations, mediaType)) {
+            if (matchesReaderCriterias(ep, type, genericType, annotations, 
mediaType, m)) {
                 if (this == SHARED_FACTORY) {
-                    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);
             }
         }     
         
@@ -450,11 +458,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 = 
@@ -463,9 +473,12 @@ public final class ProviderFactory {
         if (availableMimeTypes.size() == 0) {
             return false;
         }
-        
-        return ep.isReadable(type, genericType, annotations, mediaType);
-        
+        injectContextValues(pi, m);
+        boolean matches = ep.isReadable(type, genericType, annotations, 
mediaType);
+        if (!matches) {
+            pi.clearThreadLocalProxies();
+        }
+        return matches;
     }
         
     /**
@@ -486,13 +499,11 @@ public final class ProviderFactory {
                                                          Message m) {
         List<MessageBodyWriter<T>> candidates = new 
LinkedList<MessageBodyWriter<T>>();
         for (ProviderInfo<MessageBodyWriter> ep : messageWriters) {
-            if (matchesWriterCriterias(ep.getProvider(), type, genericType, 
annotations, mediaType)) {
+            if (matchesWriterCriterias(ep, type, genericType, annotations, 
mediaType, m)) {
                 if (this == SHARED_FACTORY) {
-                    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) {
@@ -502,11 +513,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 = 
@@ -516,7 +529,12 @@ public final class ProviderFactory {
         if (availableMimeTypes.size() == 0) {
             return false;
         }
-        return ep.isWriteable(type, genericType, annotations, mediaType); 
+        injectContextValues(pi, m);
+        boolean matches = ep.isWriteable(type, genericType, annotations, 
mediaType);
+        if (!matches) {
+            pi.clearThreadLocalProxies();
+        }
+        return matches;
     }
     
     List<ProviderInfo<MessageBodyReader>> getMessageReaders() {

Modified: 
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java?rev=1207824&r1=1207823&r2=1207824&view=diff
==============================================================================
--- 
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java
 (original)
+++ 
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/StringTextWriter.java
 Tue Nov 29 11:11:06 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/branches/2.3.x-fixes/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml?rev=1207824&r1=1207823&r2=1207824&view=diff
==============================================================================
--- 
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml
 (original)
+++ 
cxf/branches/2.3.x-fixes/systests/jaxrs/src/test/resources/jaxrs_spring_providers/WEB-INF/beans.xml
 Tue Nov 29 11:11:06 2011
@@ -47,4 +47,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>


Reply via email to