Author: sergeyb
Date: Fri Aug 17 20:52:53 2012
New Revision: 1374433
URL: http://svn.apache.org/viewvc?rev=1374433&view=rev
Log:
[CXF-4455] Prototyping some code for supporting the mapping of new
WebApplicationException extensions
Modified:
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/JAXRSUtils.java
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=1374433&r1=1374432&r2=1374433&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
Fri Aug 17 20:52:53 2012
@@ -34,6 +34,7 @@ import java.util.Set;
import java.util.logging.Logger;
import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@@ -82,6 +83,7 @@ public final class ProviderFactory {
new MultipartProvider(),
new WebApplicationExceptionMapper(),
new WadlGenerator());
+
}
private List<ProviderInfo<MessageBodyReader<?>>> messageReaders =
@@ -265,23 +267,38 @@ public final class ProviderFactory {
return null;
}
+ public <T extends Throwable> ExceptionMapper<T>
createExceptionMapper(Class<?> exceptionType,
+
Message m) {
+ return createExceptionMapper(null, exceptionType, m);
+ }
+
+ public <T extends Throwable> ExceptionMapper<T> createExceptionMapper(T
ex,
+
Message m) {
+ return createExceptionMapper(ex, ex.getClass(), m);
+ }
- public <T extends Throwable> ExceptionMapper<T>
createExceptionMapper(Class<?> exceptionType, Message m) {
+ private <T extends Throwable> ExceptionMapper<T> createExceptionMapper(T
ex,
+
Class<?> exceptionType,
+
Message m) {
- ExceptionMapper<T> mapper = doCreateExceptionMapper(exceptionType, m);
+ ExceptionMapper<T> mapper = doCreateExceptionMapper(ex, exceptionType,
m);
if (mapper != null || this == SHARED_FACTORY) {
return mapper;
}
- return SHARED_FACTORY.createExceptionMapper(exceptionType, m);
+ return SHARED_FACTORY.createExceptionMapper(ex, exceptionType, m);
}
@SuppressWarnings("unchecked")
private <T extends Throwable> ExceptionMapper<T> doCreateExceptionMapper(
- Class<?> exceptionType, Message m) {
+ T exception, Class<?> exceptionType, Message m) {
List<ExceptionMapper<?>> candidates = new
LinkedList<ExceptionMapper<?>>();
-
+ if (WebApplicationException.class == exceptionType
+ && exception instanceof WebApplicationException) {
+ exceptionType =
+
JAXRSUtils.getWebApplicationExceptionClass((WebApplicationException)exception,
exceptionType);
+ }
for (ProviderInfo<ExceptionMapper<?>> em : exceptionMappers) {
handleMapper(candidates, em, exceptionType, m,
ExceptionMapper.class, true);
}
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=1374433&r1=1374432&r2=1374433&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
Fri Aug 17 20:52:53 2012
@@ -22,6 +22,7 @@ package org.apache.cxf.jaxrs.utils;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
@@ -31,6 +32,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -86,6 +88,7 @@ import org.apache.cxf.jaxrs.impl.Provide
import org.apache.cxf.jaxrs.impl.RequestImpl;
import org.apache.cxf.jaxrs.impl.SecurityContextImpl;
import org.apache.cxf.jaxrs.impl.UriInfoImpl;
+import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.ClassResourceInfoComparator;
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
@@ -115,6 +118,12 @@ public final class JAXRSUtils {
private static final String PROPAGATE_EXCEPTION =
"org.apache.cxf.propagate.exception";
private static final String REPORT_FAULT_MESSAGE_PROPERTY =
"org.apache.cxf.jaxrs.report-fault-message";
+ private static final Map<Integer, Class<?>> EXCEPTIONS_MAP;
+ static {
+ //TODO: Populate it with the upgrade to the more up to date API
+ EXCEPTIONS_MAP = new HashMap<Integer, Class<?>>();
+ }
+
private JAXRSUtils() {
}
@@ -1214,11 +1223,39 @@ public final class JAXRSUtils {
return types;
}
+ public static Class<?>
getWebApplicationExceptionClass(WebApplicationException ex,
+ Class<?>
exceptionType) {
+ int status = ex.getResponse().getStatus();
+ Class<?> cls = EXCEPTIONS_MAP.get(status);
+ //TODO: enable this code after the upgrade to the more up-to-date API
+ //if (cls == null && status / 100 == 5) {
+ // cls = ServerErrorException.class;
+ //}
+ return cls == null ? exceptionType : cls;
+ }
+
+ @SuppressWarnings("unchecked")
public static <T extends Throwable> Response convertFaultToResponse(T ex,
Message inMessage) {
ExceptionMapper<T> mapper =
-
ProviderFactory.getInstance(inMessage).createExceptionMapper(ex.getClass(),
inMessage);
+ ProviderFactory.getInstance(inMessage).createExceptionMapper(ex,
inMessage);
if (mapper != null) {
+ if (ex.getClass() == WebApplicationException.class
+ && mapper.getClass() != WebApplicationExceptionMapper.class) {
+ WebApplicationException webEx = (WebApplicationException)ex;
+ Class<?> exceptionClass =
getWebApplicationExceptionClass(webEx,
+
WebApplicationException.class);
+ if (exceptionClass != WebApplicationException.class) {
+ //TODO: consider using switch statements
+ try {
+ Constructor<?> ctr =
exceptionClass.getConstructor(Response.class);
+ ex = (T)ctr.newInstance(webEx.getResponse());
+ } catch (Exception ex2) {
+ ex2.printStackTrace();
+ return Response.serverError().build();
+ }
+ }
+ }
try {
return mapper.toResponse(ex);
} catch (Exception mapperEx) {