From 25d74fabde4b0fd4d101d1a91df8de49944e4084 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@bioforsk.no>
Date: Wed, 9 Oct 2013 21:46:29 +0200
Subject: [PATCH] Added sane handling of invalid JSON input

---
 .../VIPSCoreManagerApplication.java           |  2 ++
 .../service/JsonParseExceptionMapper.java     | 22 +++++++++++++++++++
 .../service/ManagerResourceImpl.java          |  7 ++++--
 3 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/no/bioforsk/vips/coremanager/service/JsonParseExceptionMapper.java

diff --git a/src/main/java/no/bioforsk/vips/coremanager/VIPSCoreManagerApplication.java b/src/main/java/no/bioforsk/vips/coremanager/VIPSCoreManagerApplication.java
index 06e2cc2..138b18a 100644
--- a/src/main/java/no/bioforsk/vips/coremanager/VIPSCoreManagerApplication.java
+++ b/src/main/java/no/bioforsk/vips/coremanager/VIPSCoreManagerApplication.java
@@ -28,6 +28,7 @@ public class VIPSCoreManagerApplication extends Application
     private void addRestResourceClassesManually(Set<Class<?>> resources) {
         //resources.add(no.bioforsk.vips.core.service.ModelResource.class);
         resources.add(no.bioforsk.vips.coremanager.service.ManagerResourceImpl.class);
+        resources.add(no.bioforsk.vips.coremanager.service.JsonParseExceptionMapper.class);
     }
     
     /**
@@ -37,6 +38,7 @@ public class VIPSCoreManagerApplication extends Application
      */
     private void addRestResourceClasses(Set<Class<?>> resources) {
         resources.add(no.bioforsk.vips.core.service.ModelResource.class);
+        resources.add(no.bioforsk.vips.coremanager.service.JsonParseExceptionMapper.class);
         resources.add(no.bioforsk.vips.coremanager.service.ManagerResource.class);
         resources.add(no.bioforsk.vips.coremanager.service.ManagerResourceImpl.class);
     }
diff --git a/src/main/java/no/bioforsk/vips/coremanager/service/JsonParseExceptionMapper.java b/src/main/java/no/bioforsk/vips/coremanager/service/JsonParseExceptionMapper.java
new file mode 100644
index 0000000..598b6a5
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/coremanager/service/JsonParseExceptionMapper.java
@@ -0,0 +1,22 @@
+package no.bioforsk.vips.coremanager.service;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+import org.codehaus.jackson.JsonParseException;
+
+/**
+ * Catches when user sends in invalid JSON that causes exception to be thrown
+ * in Jackson's JSON parser.
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Provider
+public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException>{
+    
+    @Override
+    public Response toResponse(JsonParseException exception) {
+        String errorMessage = "Error with input: Invalid JSON. Details: " + exception.getMessage();
+         return Response.status(Response.Status.BAD_REQUEST).entity(errorMessage).build();
+    }
+}
diff --git a/src/main/java/no/bioforsk/vips/coremanager/service/ManagerResourceImpl.java b/src/main/java/no/bioforsk/vips/coremanager/service/ManagerResourceImpl.java
index 2268c65..760dc18 100644
--- a/src/main/java/no/bioforsk/vips/coremanager/service/ManagerResourceImpl.java
+++ b/src/main/java/no/bioforsk/vips/coremanager/service/ManagerResourceImpl.java
@@ -34,6 +34,7 @@ import no.bioforsk.vips.entity.ModelConfiguration;
 import no.bioforsk.vips.entity.Result;
 import no.bioforsk.vips.model.Model;
 import no.bioforsk.vips.util.ServletUtil;
+import org.codehaus.jackson.JsonParseException;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
 
 
@@ -220,6 +221,7 @@ public class ManagerResourceImpl implements ManagerResource{
     @Path("models/{modelId}/run")
     @Consumes("application/json")
     @Produces("application/json")
+    @Override
     public Response runModel(@PathParam("modelId") String modelId, Map<String,Object> input)
     {
         try
@@ -274,9 +276,10 @@ public class ManagerResourceImpl implements ManagerResource{
                 ControllerGetter.getUserController().storeModelUsageLog(log);
                 return Response.ok().entity(result).build();
             }
-        } catch(IOException e)
+        }
+        catch( IOException ioe)
         {
-            throw new WebApplicationException(Response.serverError().entity(e).build());
+            throw new WebApplicationException(Response.serverError().entity(ioe).build());
         }
         
     }
-- 
GitLab