[exo-jcr-commits] exo-jcr SVN: r2262 - in ws/trunk/exo.ws.rest.core/src: test/java/org/exoplatform/services/rest/impl and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Apr 9 11:21:22 EDT 2010
Author: aparfonov
Date: 2010-04-09 11:21:21 -0400 (Fri, 09 Apr 2010)
New Revision: 2262
Added:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DefaultExceptionMapper.java
Modified:
ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ProviderBinder.java
ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/ExceptionsTest.java
Log:
EXOJCR-645: create default exception mapper
Added: ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DefaultExceptionMapper.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DefaultExceptionMapper.java (rev 0)
+++ ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DefaultExceptionMapper.java 2010-04-09 15:21:21 UTC (rev 2262)
@@ -0,0 +1,47 @@
+/**
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.services.rest.impl;
+
+import org.exoplatform.services.rest.ExtHttpHeaders;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+
+/**
+ * Transform {@link java.lang.Exception} to JAX-RS response.
+ *
+ * @author <a href="mailto:andrew00x at gmail.com">Andrey Parfonov</a>
+ * @version $Id$
+ */
+public class DefaultExceptionMapper implements ExceptionMapper<Exception>
+{
+
+ /**
+ * {@inheritDoc}
+ */
+ public Response toResponse(Exception exception)
+ {
+ String message = exception.getMessage();
+ return Response.status(500).entity(message == null ? exception.getClass().getName() : message).type(
+ MediaType.TEXT_PLAIN).header(ExtHttpHeaders.JAXRS_BODY_PROVIDED, "Error-Message").build();
+ }
+
+}
Property changes on: ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/DefaultExceptionMapper.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Modified: ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ProviderBinder.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ProviderBinder.java 2010-04-09 14:25:13 UTC (rev 2261)
+++ ws/trunk/exo.ws.rest.core/src/main/java/org/exoplatform/services/rest/impl/ProviderBinder.java 2010-04-09 15:21:21 UTC (rev 2262)
@@ -86,7 +86,7 @@
/**
* Providers instance.
- *
+ *
* @see Providers
*/
private static AtomicReference<ProviderBinder> ainst = new AtomicReference<ProviderBinder>();
@@ -182,6 +182,8 @@
// JAXB context
addContextResolver(JAXBContextResolver.class, null, ComponentLifecycleScope.CONTAINER);
+ addExceptionMapper(new DefaultExceptionMapper());
+
}
/**
@@ -235,7 +237,7 @@
/**
* Add per-request ContextResolver.
- *
+ *
* @param clazz class of implementation ContextResolver
*/
@SuppressWarnings("unchecked")
@@ -253,7 +255,7 @@
/**
* Add singleton ContextResolver.
- *
+ *
* @param instance ContextResolver instance
*/
@SuppressWarnings("unchecked")
@@ -272,7 +274,7 @@
/**
* Add per-request ExceptionMapper.
- *
+ *
* @param clazz class of implementation ExceptionMapper
*/
@SuppressWarnings("unchecked")
@@ -290,7 +292,7 @@
/**
* Add singleton ExceptionMapper.
- *
+ *
* @param instance ExceptionMapper instance
*/
@SuppressWarnings("unchecked")
@@ -309,7 +311,7 @@
/**
* Add per-request MessageBodyReader.
- *
+ *
* @param clazz class of implementation MessageBodyReader
*/
@SuppressWarnings("unchecked")
@@ -327,7 +329,7 @@
/**
* Add singleton MessageBodyReader.
- *
+ *
* @param instance MessageBodyReader instance
*/
@SuppressWarnings("unchecked")
@@ -346,7 +348,7 @@
/**
* Add per-request MessageBodyWriter.
- *
+ *
* @param clazz class of implementation MessageBodyWriter
*/
@SuppressWarnings("unchecked")
@@ -364,7 +366,7 @@
/**
* Add singleton MessageBodyWriter.
- *
+ *
* @param instance MessageBodyWriter instance
*/
@SuppressWarnings("unchecked")
@@ -383,7 +385,7 @@
/**
* Get list of most acceptable writer's media type for specified type.
- *
+ *
* @param type type
* @param genericType generic type
* @param annotations annotations
@@ -401,7 +403,9 @@
{
MessageBodyWriter writer = (MessageBodyWriter)pf.getInstance(ApplicationContextImpl.getCurrent());
if (writer.isWriteable(type, genericType, annotations, MediaTypeHelper.DEFAULT_TYPE))
+ {
l.add(mime);
+ }
}
}
@@ -419,14 +423,20 @@
if (pm != null)
{
if (mediaType == null)
+ {
return _getContextResolver(pm, contextType, MediaTypeHelper.DEFAULT_TYPE);
+ }
resolver = _getContextResolver(pm, contextType, mediaType);
if (resolver == null)
+ {
resolver =
_getContextResolver(pm, contextType, new MediaType(mediaType.getType(), MediaType.MEDIA_TYPE_WILDCARD));
+ }
if (resolver == null)
+ {
resolver = _getContextResolver(pm, contextType, MediaTypeHelper.DEFAULT_TYPE);
+ }
}
return resolver;
}
@@ -439,7 +449,9 @@
{
ObjectFactory pf = exceptionMappers.get(type);
if (pf != null)
+ {
return (ExceptionMapper<T>)pf.getInstance(ApplicationContextImpl.getCurrent());
+ }
return null;
}
@@ -450,15 +462,21 @@
MediaType mediaType)
{
if (mediaType == null)
+ {
return _getMessageBodyReader(type, genericType, annotations, MediaTypeHelper.DEFAULT_TYPE);
+ }
MessageBodyReader<T> reader = _getMessageBodyReader(type, genericType, annotations, mediaType);
if (reader == null)
+ {
reader =
_getMessageBodyReader(type, genericType, annotations, new MediaType(mediaType.getType(),
MediaType.MEDIA_TYPE_WILDCARD));
+ }
if (reader == null)
+ {
reader = _getMessageBodyReader(type, genericType, annotations, MediaTypeHelper.DEFAULT_TYPE);
+ }
return reader;
}
@@ -470,21 +488,27 @@
MediaType mediaType)
{
if (mediaType == null)
+ {
return _getMessageBodyWriter(type, genericType, annotations, MediaTypeHelper.DEFAULT_TYPE);
+ }
MessageBodyWriter<T> writer = _getMessageBodyWriter(type, genericType, annotations, mediaType);
if (writer == null)
+ {
writer =
_getMessageBodyWriter(type, genericType, annotations, new MediaType(mediaType.getType(),
MediaType.MEDIA_TYPE_WILDCARD));
+ }
if (writer == null)
+ {
writer = _getMessageBodyWriter(type, genericType, annotations, MediaTypeHelper.DEFAULT_TYPE);
+ }
return writer;
}
/**
* Add per-request MethodInvokerFilter.
- *
+ *
* @param clazz class of implementation MethodInvokerFilter
*/
public void addMethodInvokerFilter(Class<? extends MethodInvokerFilter> clazz)
@@ -501,7 +525,7 @@
/**
* Add singleton MethodInvokerFilter.
- *
+ *
* @param instance MethodInvokerFilter instance
*/
public void addMethodInvokerFilter(MethodInvokerFilter instance)
@@ -519,7 +543,7 @@
/**
* Add per-request RequestFilter.
- *
+ *
* @param clazz class of implementation RequestFilter
*/
public void addRequestFilter(Class<? extends RequestFilter> clazz)
@@ -536,7 +560,7 @@
/**
* Add singleton RequestFilter.
- *
+ *
* @param instance RequestFilter instance
*/
public void addRequestFilter(RequestFilter instance)
@@ -554,7 +578,7 @@
/**
* Add per-request ResponseFilter.
- *
+ *
* @param clazz class of implementation ResponseFilter
*/
public void addResponseFilter(Class<? extends ResponseFilter> clazz)
@@ -571,7 +595,7 @@
/**
* Add singleton ResponseFilter.
- *
+ *
* @param instance ResponseFilter instance
*/
public void addResponseFilter(ResponseFilter instance)
@@ -639,7 +663,9 @@
{
int len = capturingValues.size();
if (capturingValues.get(len - 1) != null && !"/".equals(capturingValues.get(len - 1)))
+ {
continue; // not matched
+ }
}
else
{
@@ -681,7 +707,7 @@
/**
* Looking for message body reader according to supplied entity class, entity
* generic type, annotations and content type.
- *
+ *
* @param <T> message body reader actual type argument
* @param type entity type
* @param genericType entity generic type
@@ -697,7 +723,9 @@
{
MessageBodyReader reader = (MessageBodyReader)pf.getInstance(ApplicationContextImpl.getCurrent());
if (reader.isReadable(type, genericType, annotations, mediaType))
+ {
return reader;
+ }
}
return null;
}
@@ -705,7 +733,7 @@
/**
* Looking for message body writer according to supplied entity class, entity
* generic type, annotations and content type.
- *
+ *
* @param <T> message body writer actual type argument
* @param type entity type
* @param genericType entity generic type
@@ -721,7 +749,9 @@
{
MessageBodyWriter writer = (MessageBodyWriter)pf.getInstance(ApplicationContextImpl.getCurrent());
if (writer.isWriteable(type, genericType, annotations, mediaType))
+ {
return writer;
+ }
}
return null;
}
@@ -745,7 +775,9 @@
{
Type[] atypes = pt.getActualTypeArguments();
if (atypes.length > 1)
+ {
throw new RuntimeException("Unable strong determine actual type argument, more then one type found.");
+ }
Class<?> aclazz = (Class<?>)atypes[0];
@@ -768,7 +800,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("ContextResolver instance is null.");
+ }
factory = new SingletonObjectFactory<ProviderDescriptor>(descriptor, instance);
break;
case CONTAINER :
@@ -814,7 +848,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("MessageBodyReader instance is null.");
+ }
factory = new SingletonObjectFactory<ProviderDescriptor>(descriptor, instance);
break;
case CONTAINER :
@@ -827,7 +863,9 @@
// check is reader for the same Java and media type already exists.
// Let it be under developer's control.
for (MediaType mime : factory.getObjectModel().consumes())
+ {
readProviders.getList(mime).add(factory);
+ }
}
/**
@@ -850,7 +888,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("MessageBodyWriter instance is null.");
+ }
factory = new SingletonObjectFactory<ProviderDescriptor>(descriptor, instance);
break;
case CONTAINER :
@@ -863,7 +903,9 @@
// check is writer for the same Java and media type already exists.
// Let it be under developer's control.
for (MediaType mime : factory.getObjectModel().produces())
+ {
writeProviders.getList(mime).add(factory);
+ }
}
/**
@@ -885,7 +927,9 @@
{
Type[] atypes = pt.getActualTypeArguments();
if (atypes.length > 1)
+ {
throw new RuntimeException("Unable strong determine actual type argument, more then one type found.");
+ }
Class<? extends Throwable> exc = (Class<? extends Throwable>)atypes[0];
if (exceptionMappers.get(exc) != null)
@@ -905,7 +949,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("ExceptionMapper instance is null.");
+ }
factory = new SingletonObjectFactory<ProviderDescriptor>(descriptor, instance);
break;
case CONTAINER :
@@ -940,7 +986,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("RequestFilter instance is null.");
+ }
factory = new SingletonObjectFactory<FilterDescriptor>(descriptor, instance);
break;
case CONTAINER :
@@ -972,7 +1020,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("ResponseFilter instance is null.");
+ }
factory = new SingletonObjectFactory<FilterDescriptor>(descriptor, instance);
break;
case CONTAINER :
@@ -1004,7 +1054,9 @@
break;
case SINGLETON :
if (instance == null)
+ {
throw new NullPointerException("MethodInvokerFilter instance is null.");
+ }
factory = new SingletonObjectFactory<FilterDescriptor>(descriptor, instance);
break;
case CONTAINER :
Modified: ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/ExceptionsTest.java
===================================================================
--- ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/ExceptionsTest.java 2010-04-09 14:25:13 UTC (rev 2261)
+++ ws/trunk/exo.ws.rest.core/src/test/java/org/exoplatform/services/rest/impl/ExceptionsTest.java 2010-04-09 15:21:21 UTC (rev 2262)
@@ -18,23 +18,21 @@
*/
package org.exoplatform.services.rest.impl;
+import org.exoplatform.services.rest.AbstractResourceTest;
+import org.exoplatform.services.rest.ExtHttpHeaders;
+import org.exoplatform.services.rest.tools.ByteArrayContainerResponseWriter;
+
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
-import org.exoplatform.services.rest.AbstractResourceTest;
-import org.exoplatform.services.rest.ExtHttpHeaders;
-import org.exoplatform.services.rest.impl.ContainerResponse;
-import org.exoplatform.services.rest.impl.UnhandledException;
-import org.exoplatform.services.rest.tools.ByteArrayContainerResponseWriter;
-
/**
* Created by The eXo Platform SAS. <br/>
* Date: 24 Dec 2009
- *
+ *
* @author <a href="mailto:max.shaposhnik at exoplatform.com">Max Shaposhnik</a>
- * @version $Id: WebApplicationExceptionTest.java
+ * @version $Id: ExceptionsTest
*/
public class ExceptionsTest extends AbstractResourceTest
{
@@ -70,7 +68,7 @@
@Path("3")
public void m3() throws Exception
{
- throw new RuntimeException("Runtime exception");
+ throw new RuntimeException(errorMessage);
}
@GET
@@ -98,7 +96,7 @@
unregistry(resource);
super.tearDown();
}
-
+
public void testErrorResponse() throws Exception
{
ByteArrayContainerResponseWriter writer = new ByteArrayContainerResponseWriter();
@@ -112,15 +110,11 @@
public void testUncheckedException() throws Exception
{
ByteArrayContainerResponseWriter writer = new ByteArrayContainerResponseWriter();
- try
- {
- service("GET", "/a/3", "", null, null, writer);
- fail("UnhandledException should be throw by RequstHandlerImpl");
- }
- catch (UnhandledException e)
- {
- // OK
- }
+ ContainerResponse response = service("GET", "/a/3", "", null, null, writer);
+ assertEquals(500, response.getStatus());
+ String entity = new String(writer.getBody());
+ assertEquals(errorMessage, entity);
+ assertNotNull(response.getHttpHeaders().getFirst(ExtHttpHeaders.JAXRS_BODY_PROVIDED));
}
public void testWebApplicationExceptionWithCause() throws Exception
More information about the exo-jcr-commits
mailing list