[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