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 2012/09/06 17:54:28 UTC
svn commit: r1381654 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
rt/frontend/jaxrs/src/mai...
Author: sergeyb
Date: Thu Sep 6 15:54:27 2012
New Revision: 1381654
URL: http://svn.apache.org/viewvc?rev=1381654&view=rev
Log:
[CXF-4455] Preparing for the introduction of new Container filters
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.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/OperationResourceInfo.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/AnnotationUtils.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/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSLocalTransportTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=1381654&r1=1381653&r2=1381654&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Thu Sep 6 15:54:27 2012
@@ -165,18 +165,7 @@ public class JAXRSInInterceptor extends
boolean operChecked = false;
List<ProviderInfo<RequestHandler>> shs = ProviderFactory.getInstance(message).getRequestHandlers();
for (ProviderInfo<RequestHandler> sh : shs) {
- String newAcceptTypes = HttpUtils.getProtocolHeader(message, Message.ACCEPT_CONTENT_TYPE, "*/*");
- if (!acceptTypes.equals(newAcceptTypes) || (ori == null && !operChecked)) {
- acceptTypes = newAcceptTypes;
- acceptContentTypes = JAXRSUtils.sortMediaTypes(newAcceptTypes);
- message.getExchange().put(Message.ACCEPT_CONTENT_TYPE, acceptContentTypes);
- if (ori != null) {
- values = new MetadataMap<String, String>();
- resource = JAXRSUtils.selectResourceClass(resources,
- rawPath,
- values,
- message);
- }
+ if (ori == null && !operChecked) {
try {
ori = JAXRSUtils.findTargetMethod(resource,
message, httpMethod, values,
@@ -187,27 +176,16 @@ public class JAXRSInInterceptor extends
}
}
- InjectionUtils.injectContextFields(sh.getProvider(), sh, message);
- InjectionUtils.injectContextMethods(sh.getProvider(), sh, message);
+ InjectionUtils.injectContexts(sh.getProvider(), sh, message);
Response response = sh.getProvider().handleRequest(message, resource);
if (response != null) {
message.getExchange().put(Response.class, response);
return;
}
+
}
- String newAcceptTypes = (String)message.get(Message.ACCEPT_CONTENT_TYPE);
- if (!acceptTypes.equals(newAcceptTypes) || ori == null) {
- acceptTypes = newAcceptTypes;
- acceptContentTypes = JAXRSUtils.sortMediaTypes(acceptTypes);
- message.getExchange().put(Message.ACCEPT_CONTENT_TYPE, acceptContentTypes);
- if (ori != null) {
- values = new MetadataMap<String, String>();
- resource = JAXRSUtils.selectResourceClass(resources,
- rawPath,
- values,
- message);
- }
+ if (ori == null) {
try {
ori = JAXRSUtils.findTargetMethod(resource, message,
httpMethod, values, requestContentType, acceptContentTypes, true);
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1381654&r1=1381653&r2=1381654&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Thu Sep 6 15:54:27 2012
@@ -133,14 +133,13 @@ public class JAXRSOutInterceptor extends
List<ProviderInfo<ResponseHandler>> handlers =
ProviderFactory.getInstance(message).getResponseHandlers();
for (ProviderInfo<ResponseHandler> rh : handlers) {
- InjectionUtils.injectContextFields(rh.getProvider(), rh,
- message.getExchange().getInMessage());
- InjectionUtils.injectContextFields(rh.getProvider(), rh,
+ InjectionUtils.injectContexts(rh.getProvider(), rh,
message.getExchange().getInMessage());
Response r = rh.getProvider().handleResponse(message, ori, response);
if (r != null) {
response = r;
}
+
}
serializeMessage(message, response, ori, true);
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=1381654&r1=1381653&r2=1381654&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 Thu Sep 6 15:54:27 2012
@@ -50,6 +50,7 @@ public abstract class AbstractResourceIn
private Map<Class<?>, List<Field>> contextFields;
private Map<Class<?>, Map<Class<?>, Method>> contextMethods;
private Bus bus;
+ private boolean contextsAvailable = true;
protected AbstractResourceInfo(Bus bus) {
this.bus = bus;
@@ -61,11 +62,21 @@ public abstract class AbstractResourceIn
this.resourceClass = resourceClass;
root = isRoot;
if (root && resourceClass != null) {
- findContextFields(serviceClass);
- findContextSetterMethods(serviceClass);
+ findContexts(serviceClass);
}
}
+ private void findContexts(Class<?> cls) {
+ findContextFields(cls);
+ findContextSetterMethods(cls);
+ contextsAvailable = contextFields != null && !contextFields.isEmpty()
+ || contextMethods != null && !contextMethods.isEmpty();
+ }
+
+ public boolean contextsAvailable() {
+ return contextsAvailable;
+ }
+
public Bus getBus() {
return bus;
}
@@ -73,8 +84,7 @@ public abstract class AbstractResourceIn
public void setResourceClass(Class<?> rClass) {
resourceClass = rClass;
if (serviceClass.isInterface() && resourceClass != null && !resourceClass.isInterface()) {
- findContextFields(resourceClass);
- findContextSetterMethods(resourceClass);
+ findContexts(resourceClass);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java?rev=1381654&r1=1381653&r2=1381654&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java Thu Sep 6 15:54:27 2012
@@ -20,6 +20,7 @@
package org.apache.cxf.jaxrs.model;
import java.lang.reflect.Method;
+import java.util.Collections;
import java.util.List;
import javax.ws.rs.Consumes;
@@ -45,6 +46,7 @@ public class OperationResourceInfo {
private String defaultParamValue;
private List<Parameter> parameters;
private boolean oneway;
+ private List<String> nameBindings = Collections.emptyList();
public OperationResourceInfo(Method mInvoke, ClassResourceInfo cri) {
this(mInvoke, mInvoke, cri);
@@ -62,6 +64,7 @@ public class OperationResourceInfo {
this.parameters = ori.parameters;
this.oneway = ori.oneway;
this.classResourceInfo = cri;
+ this.nameBindings = ori.nameBindings;
}
public OperationResourceInfo(Method mInvoke, Method mAnnotated, ClassResourceInfo cri) {
@@ -69,6 +72,7 @@ public class OperationResourceInfo {
annotatedMethod = mAnnotated;
if (mAnnotated != null) {
parameters = ResourceUtils.getParameters(mAnnotated);
+ nameBindings = AnnotationUtils.getNameBindings(mAnnotated.getAnnotations());
}
classResourceInfo = cri;
checkMediaTypes(null, null);
@@ -97,6 +101,10 @@ public class OperationResourceInfo {
this.oneway = oneway;
}
+ public List<String> getNameBindings() {
+ return nameBindings;
+ }
+
private void checkOneway() {
if (annotatedMethod != null) {
oneway = AnnotationUtils.getAnnotation(annotatedMethod.getAnnotations(), Oneway.class) != null;
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=1381654&r1=1381653&r2=1381654&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 Sep 6 15:54:27 2012
@@ -25,16 +25,22 @@ import java.lang.reflect.ParameterizedTy
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@@ -61,6 +67,7 @@ import org.apache.cxf.jaxrs.impl.WebAppl
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.message.Message;
@@ -96,12 +103,31 @@ public final class ProviderFactory {
new ArrayList<ProviderInfo<ContextProvider<?>>>(1);
private List<ProviderInfo<ExceptionMapper<?>>> exceptionMappers =
new ArrayList<ProviderInfo<ExceptionMapper<?>>>(1);
+ // RequestHandler & ResponseHandler will have to be deprecated for 2.7.0
private List<ProviderInfo<RequestHandler>> requestHandlers =
new ArrayList<ProviderInfo<RequestHandler>>(1);
private List<ProviderInfo<ResponseHandler>> responseHandlers =
new ArrayList<ProviderInfo<ResponseHandler>>(1);
+
+ // ContainerRequestFilter & ContainerResponseFilter are introduced in JAX-RS 2.0
+ private List<ProviderInfo<ContainerRequestFilter>> globalContainerRequestFilters =
+ new ArrayList<ProviderInfo<ContainerRequestFilter>>(1);
+ private List<ProviderInfo<ContainerRequestFilter>> globalPreContainerRequestFilters =
+ new ArrayList<ProviderInfo<ContainerRequestFilter>>(1);
+ private List<ProviderInfo<ContainerResponseFilter>> globalContainerResponseFilters =
+ new ArrayList<ProviderInfo<ContainerResponseFilter>>(1);
+ private List<ProviderInfo<ContainerResponseFilter>> globalPreContainerResponseFilters =
+ new ArrayList<ProviderInfo<ContainerResponseFilter>>(1);
+ private Map<String, ProviderInfo<ContainerRequestFilter>> boundContainerRequestFilters =
+ new LinkedHashMap<String, ProviderInfo<ContainerRequestFilter>>();
+ private Map<String, ProviderInfo<ContainerResponseFilter>> boundContainerResponseFilters =
+ new LinkedHashMap<String, ProviderInfo<ContainerResponseFilter>>();
+
+ // ParamConverter and ParamConverterProvider is introduced in JAX-RS 2.0
+ // ParameterHandler will have to be deprecated
private List<ProviderInfo<ParameterHandler<?>>> paramHandlers =
new ArrayList<ProviderInfo<ParameterHandler<?>>>(1);
+
private List<ProviderInfo<ResponseExceptionMapper<?>>> responseExceptionMappers =
new ArrayList<ProviderInfo<ResponseExceptionMapper<?>>>(1);
private RequestPreprocessor requestPreprocessor;
@@ -112,6 +138,9 @@ public final class ProviderFactory {
private List<ProviderInfo<MessageBodyWriter<?>>> jaxbWriters =
new ArrayList<ProviderInfo<MessageBodyWriter<?>>>();
+ private Collection<ProviderInfo<?>> injectedProviders =
+ new LinkedList<ProviderInfo<?>>();
+
private Bus bus;
private ProviderFactory(Bus bus) {
@@ -267,6 +296,7 @@ public final class ProviderFactory {
return null;
}
+ //This method can only be called from providers
public <T extends Throwable> ExceptionMapper<T> createExceptionMapper(Class<?> exceptionType,
Message m) {
return createExceptionMapper(null, exceptionType, m);
@@ -436,6 +466,36 @@ public final class ProviderFactory {
return JAXB_PROVIDER_NAME.equals(clsName) || JSON_PROVIDER_NAME.equals(clsName);
}
+ public List<ProviderInfo<ContainerRequestFilter>> getGlobalContainerRequestFilters(boolean preMatch) {
+ return Collections.unmodifiableList(
+ preMatch ? globalPreContainerRequestFilters : globalContainerRequestFilters);
+ }
+
+ public List<ProviderInfo<ContainerResponseFilter>> getGlobalContainerResponseFilters(boolean preMatch) {
+ return Collections.unmodifiableList(
+ preMatch ? globalPreContainerResponseFilters : globalContainerResponseFilters);
+ }
+
+ public List<ProviderInfo<ContainerRequestFilter>> getBoundContainerRequestFilters(List<String> names) {
+ return getBoundContainerFilters(boundContainerRequestFilters, names);
+ }
+
+ public List<ProviderInfo<ContainerResponseFilter>> getBoundContainerResponseFilters(List<String> names) {
+ return getBoundContainerFilters(boundContainerResponseFilters, names);
+ }
+
+ private static <T> List<ProviderInfo<T>> getBoundContainerFilters(Map<String, ProviderInfo<T>> filters,
+ List<String> names) {
+ List<ProviderInfo<T>> list = new LinkedList<ProviderInfo<T>>();
+ for (String name : names) {
+ ProviderInfo<T> filter = filters.get(name);
+ if (filter != null) {
+ list.add(filter);
+ }
+ }
+ return list;
+ }
+
public List<ProviderInfo<RequestHandler>> getRequestHandlers() {
List<ProviderInfo<RequestHandler>> handlers = null;
if (requestHandlers.size() == 0) {
@@ -530,6 +590,16 @@ public final class ProviderFactory {
responseHandlers.add(new ProviderInfo<ResponseHandler>((ResponseHandler)o, bus));
}
+ if (ContainerRequestFilter.class.isAssignableFrom(oClass)) {
+ addContainerRequestFilter(
+ new ProviderInfo<ContainerRequestFilter>((ContainerRequestFilter)o, bus));
+ }
+
+ if (ContainerResponseFilter.class.isAssignableFrom(oClass)) {
+ addContainerResponseFilter(
+ new ProviderInfo<ContainerResponseFilter>((ContainerResponseFilter)o, bus));
+ }
+
if (ExceptionMapper.class.isAssignableFrom(oClass)) {
exceptionMappers.add(new ProviderInfo<ExceptionMapper<?>>((ExceptionMapper<?>)o, bus));
}
@@ -547,26 +617,60 @@ public final class ProviderFactory {
sortContextResolvers();
injectContextProxies(messageReaders, messageWriters, contextResolvers,
- requestHandlers, responseHandlers,
- exceptionMappers);
+ requestHandlers, responseHandlers, exceptionMappers,
+ boundContainerRequestFilters.values(), globalPreContainerRequestFilters, globalContainerRequestFilters,
+ boundContainerResponseFilters.values(), globalPreContainerResponseFilters, globalContainerResponseFilters);
}
//CHECKSTYLE:ON
+ private void addContainerRequestFilter(ProviderInfo<ContainerRequestFilter> p) {
+ addContainerFilter(p, boundContainerRequestFilters,
+ globalPreContainerRequestFilters, globalContainerRequestFilters);
+ }
+
+ private void addContainerResponseFilter(ProviderInfo<ContainerResponseFilter> p) {
+ addContainerFilter(p, boundContainerResponseFilters,
+ globalPreContainerResponseFilters, globalContainerResponseFilters);
+ }
+
+ private static <T> void addContainerFilter(ProviderInfo<T> p,
+ Map<String, ProviderInfo<T>> boundFilters,
+ List<ProviderInfo<T>> globalPreFilters,
+ List<ProviderInfo<T>> globalPostFilters) {
+ T filter = p.getProvider();
+ Annotation[] annotations = filter.getClass().getAnnotations();
+ List<String> names = AnnotationUtils.getNameBindings(annotations);
+ if (!names.isEmpty()) {
+ for (String name : names) {
+ boundFilters.put(name, p);
+ }
+ } else {
+ boolean isPreMatch = AnnotationUtils.getAnnotation(annotations, PreMatching.class) != null;
+ if (isPreMatch) {
+ globalPreFilters.add(p);
+ } else {
+ globalPostFilters.add(p);
+ }
+ }
+ }
+
static void injectContextValues(ProviderInfo<?> pi, Message m) {
if (m != null) {
- InjectionUtils.injectContextFields(pi.getProvider(), pi, m);
- InjectionUtils.injectContextMethods(pi.getProvider(), pi, m);
+ InjectionUtils.injectContexts(pi.getProvider(), pi, m);
}
}
- void injectContextProxies(List<?> ... providerLists) {
- for (List<?> list : providerLists) {
- List<ProviderInfo<?>> l2 = CastUtils.cast(list);
+ void injectContextProxies(Collection<?> ... providerLists) {
+ for (Collection<?> list : providerLists) {
+ Collection<ProviderInfo<?>> l2 = CastUtils.cast(list);
for (ProviderInfo<?> pi : l2) {
if (ProviderFactory.SHARED_FACTORY == this && isJaxbBasedProvider(pi.getProvider())) {
continue;
}
- InjectionUtils.injectContextProxies(pi, pi.getProvider());
+ if (pi.contextsAvailable()) {
+ InjectionUtils.injectContextProxies(pi, pi.getProvider());
+ injectedProviders.add(pi);
+ }
}
}
}
@@ -804,15 +908,13 @@ public final class ProviderFactory {
return requestPreprocessor;
}
+ public void clearExceptionMapperProxies() {
+ clearProxies(exceptionMappers);
+ }
+
public void clearThreadLocalProxies() {
- clearProxies(messageReaders,
- messageWriters,
- jaxbReaders,
- jaxbWriters,
- contextResolvers,
- requestHandlers,
- responseHandlers,
- exceptionMappers);
+ clearProxies(injectedProviders);
+
if (application != null) {
application.clearThreadLocalProxies();
}
@@ -821,9 +923,9 @@ public final class ProviderFactory {
}
}
- void clearProxies(List<?> ...lists) {
- for (List<?> list : lists) {
- List<ProviderInfo<?>> l2 = CastUtils.cast(list);
+ void clearProxies(Collection<?> ...lists) {
+ for (Collection<?> list : lists) {
+ Collection<ProviderInfo<?>> l2 = CastUtils.cast(list);
for (ProviderInfo<?> pi : l2) {
pi.clearThreadLocalProxies();
}
@@ -834,9 +936,16 @@ public final class ProviderFactory {
messageReaders.clear();
messageWriters.clear();
contextResolvers.clear();
+ contextProviders.clear();
exceptionMappers.clear();
requestHandlers.clear();
responseHandlers.clear();
+ globalContainerRequestFilters.clear();
+ globalContainerResponseFilters.clear();
+ boundContainerRequestFilters.clear();
+ boundContainerResponseFilters.clear();
+ globalPreContainerRequestFilters.clear();
+ globalPreContainerResponseFilters.clear();
paramHandlers.clear();
responseExceptionMappers.clear();
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java?rev=1381654&r1=1381653&r2=1381654&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java Thu Sep 6 15:54:27 2012
@@ -21,7 +21,10 @@ package org.apache.cxf.jaxrs.utils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
+import java.util.Collections;
import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Logger;
@@ -37,6 +40,7 @@ import javax.ws.rs.FormParam;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.MatrixParam;
+import javax.ws.rs.NameBinding;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@@ -118,6 +122,20 @@ public final class AnnotationUtils {
return classes;
}
+ public static List<String> getNameBindings(Annotation[] targetAnns) {
+ if (targetAnns.length == 0) {
+ return Collections.emptyList();
+ }
+ List<String> names = new LinkedList<String>();
+ for (Annotation a : targetAnns) {
+ NameBinding nb = a.annotationType().getAnnotation(NameBinding.class);
+ if (nb != null) {
+ names.add(a.getClass().getName());
+ }
+ }
+ return names;
+ }
+
public static boolean isContextClass(Class<?> contextClass) {
return CONTEXT_CLASSES.contains(contextClass);
}
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=1381654&r1=1381653&r2=1381654&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 Sep 6 15:54:27 2012
@@ -905,7 +905,7 @@ public final class InjectionUtils {
public static void injectContextProxiesAndApplication(AbstractResourceInfo cri,
Object instance,
Application app) {
- if (!cri.isSingleton()) {
+ if (!cri.contextsAvailable() || !cri.isSingleton()) {
return;
}
@@ -942,8 +942,10 @@ public final class InjectionUtils {
public static void injectContexts(Object requestObject,
AbstractResourceInfo resource,
Message message) {
- injectContextMethods(requestObject, resource, message);
- injectContextFields(requestObject, resource, message);
+ if (resource.contextsAvailable()) {
+ injectContextMethods(requestObject, resource, message);
+ injectContextFields(requestObject, resource, message);
+ }
}
@SuppressWarnings("unchecked")
@@ -975,8 +977,6 @@ public final class InjectionUtils {
}
}
- // TODO : should we have context and resource fields be treated as context fields ?
-
public static void injectContextFields(Object o,
AbstractResourceInfo cri,
Message m) {
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=1381654&r1=1381653&r2=1381654&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 Sep 6 15:54:27 2012
@@ -1260,9 +1260,8 @@ public final class JAXRSUtils {
@SuppressWarnings("unchecked")
public static <T extends Throwable> Response convertFaultToResponse(T ex, Message inMessage) {
-
- ExceptionMapper<T> mapper =
- ProviderFactory.getInstance(inMessage).createExceptionMapper(ex, inMessage);
+ ProviderFactory factory = ProviderFactory.getInstance(inMessage);
+ ExceptionMapper<T> mapper = factory.createExceptionMapper(ex, inMessage);
if (mapper != null) {
if (ex.getClass() == WebApplicationException.class
&& mapper.getClass() != WebApplicationExceptionMapper.class) {
@@ -1270,7 +1269,6 @@ public final class JAXRSUtils {
Class<?> exceptionClass = getWebApplicationExceptionClass(webEx.getResponse(),
WebApplicationException.class);
if (exceptionClass != WebApplicationException.class) {
- //TODO: consider using switch statements
try {
Constructor<?> ctr = exceptionClass.getConstructor(Response.class);
ex = (T)ctr.newInstance(webEx.getResponse());
@@ -1280,11 +1278,14 @@ public final class JAXRSUtils {
}
}
}
+
try {
return mapper.toResponse(ex);
} catch (Exception mapperEx) {
mapperEx.printStackTrace();
return Response.serverError().build();
+ } finally {
+ factory.clearExceptionMapperProxies();
}
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSLocalTransportTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSLocalTransportTest.java?rev=1381654&r1=1381653&r2=1381654&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSLocalTransportTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSLocalTransportTest.java Thu Sep 6 15:54:27 2012
@@ -113,6 +113,7 @@ public class JAXRSLocalTransportTest ext
@Test
public void testWebClientPipedDispatch() throws Exception {
WebClient localClient = WebClient.create("local://books");
+ localClient.accept("text/xml");
localClient.path("bookstore/books");
Book book = localClient.post(new Book("New", 124L), Book.class);
assertEquals(124L, book.getId());