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>
