From 6de1b8454468f0b219408752f161ad56ac6e736c Mon Sep 17 00:00:00 2001
From: Venkatesh Seetharam <venkatesh@apache.org>
Date: Fri, 5 Jun 2015 13:59:10 -0700
Subject: [PATCH] BUG-38869 update entity for an entity that does not exist returns a 400 instead of 404 BUG-38726 add trait to an entity that does not exist returns a 400, it should return a 404

---
 repository/src/main/java/org/apache/hadoop/metadata/repository/EntityNotFoundException.java             |  2 +-
 repository/src/main/java/org/apache/hadoop/metadata/repository/graph/GraphBackedMetadataRepository.java |  4 ++--
 webapp/src/main/java/org/apache/hadoop/metadata/web/resources/EntityResource.java                       | 26 ++++++++++++++++++++++++--
 webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java                  |  1 -
 webapp/src/main/java/org/apache/hadoop/metadata/web/resources/MetadataDiscoveryResource.java            |  3 +--
 webapp/src/main/java/org/apache/hadoop/metadata/web/resources/RexsterGraphResource.java                 |  1 -
 webapp/src/main/java/org/apache/hadoop/metadata/web/resources/TypesResource.java                        |  1 -
 webapp/src/test/java/org/apache/hadoop/metadata/web/resources/EntityJerseyResourceIT.java               |  6 +++---
 8 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/repository/src/main/java/org/apache/hadoop/metadata/repository/EntityNotFoundException.java b/repository/src/main/java/org/apache/hadoop/metadata/repository/EntityNotFoundException.java
index 52ee200..f41bd42 100644
--- a/repository/src/main/java/org/apache/hadoop/metadata/repository/EntityNotFoundException.java
+++ b/repository/src/main/java/org/apache/hadoop/metadata/repository/EntityNotFoundException.java
@@ -23,7 +23,7 @@ import org.apache.hadoop.metadata.MetadataException;
 /**
  * A simple wrapper for 404.
  */
-public class EntityNotFoundException extends MetadataException {
+public class EntityNotFoundException extends RepositoryException {
     public EntityNotFoundException() {
     }
 
diff --git a/repository/src/main/java/org/apache/hadoop/metadata/repository/graph/GraphBackedMetadataRepository.java b/repository/src/main/java/org/apache/hadoop/metadata/repository/graph/GraphBackedMetadataRepository.java
index 9db6f22..9b546b1 100755
--- a/repository/src/main/java/org/apache/hadoop/metadata/repository/graph/GraphBackedMetadataRepository.java
+++ b/repository/src/main/java/org/apache/hadoop/metadata/repository/graph/GraphBackedMetadataRepository.java
@@ -162,9 +162,9 @@ public class GraphBackedMetadataRepository implements MetadataRepository {
     public ITypedReferenceableInstance getEntityDefinition(String guid) throws RepositoryException {
         LOG.info("Retrieving entity with guid={}", guid);
 
-        try {
-            Vertex instanceVertex = getVertexForGUID(guid);
+        Vertex instanceVertex = getVertexForGUID(guid);
 
+        try {
             LOG.debug("Found a vertex {} for guid {}", instanceVertex, guid);
             return graphToInstanceMapper.mapGraphToTypedInstance(guid, instanceVertex);
 
diff --git a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/EntityResource.java b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/EntityResource.java
index 3198100..3d9162b 100755
--- a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/EntityResource.java
+++ b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/EntityResource.java
@@ -21,6 +21,8 @@ package org.apache.hadoop.metadata.web.resources;
 import com.google.common.base.Preconditions;
 import org.apache.hadoop.metadata.MetadataException;
 import org.apache.hadoop.metadata.MetadataServiceClient;
+import org.apache.hadoop.metadata.ParamChecker;
+import org.apache.hadoop.metadata.repository.EntityNotFoundException;
 import org.apache.hadoop.metadata.services.MetadataService;
 import org.apache.hadoop.metadata.typesystem.types.ValueConversionException;
 import org.apache.hadoop.metadata.web.util.Servlets;
@@ -43,7 +45,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
@@ -131,6 +132,7 @@ public class EntityResource {
     public Response getEntityDefinition(@PathParam("guid") String guid) {
         try {
             LOG.debug("Fetching entity definition for guid={} ", guid);
+            ParamChecker.notEmpty(guid, "guid cannot be null");
             final String entityDefinition = metadataService.getEntityDefinition(guid);
 
             JSONObject response = new JSONObject();
@@ -148,10 +150,14 @@ public class EntityResource {
 
             return Response.status(status).entity(response).build();
 
-        } catch (MetadataException | IllegalArgumentException e) {
+        } catch (EntityNotFoundException e) {
             LOG.error("An entity with GUID={} does not exist", guid, e);
             throw new WebApplicationException(
                     Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
+        } catch (MetadataException | IllegalArgumentException e) {
+            LOG.error("Bad GUID={}", guid, e);
+            throw new WebApplicationException(
+                    Servlets.getErrorResponse(e, Response.Status.BAD_REQUEST));
         } catch (Throwable e) {
             LOG.error("Unable to get instance definition for GUID {}", guid, e);
             throw new WebApplicationException(
@@ -218,6 +224,10 @@ public class EntityResource {
             JSONObject response = new JSONObject();
             response.put(MetadataServiceClient.REQUEST_ID, Thread.currentThread().getName());
             return Response.ok(response).build();
+        } catch (EntityNotFoundException e) {
+            LOG.error("An entity with GUID={} does not exist", guid, e);
+            throw new WebApplicationException(
+                    Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
         } catch (MetadataException | IllegalArgumentException e) {
             LOG.error("Unable to add property {} to entity id {}", property, guid, e);
             throw new WebApplicationException(
@@ -251,6 +261,10 @@ public class EntityResource {
             response.put(MetadataServiceClient.COUNT, traitNames.size());
 
             return Response.ok(response).build();
+        } catch (EntityNotFoundException e) {
+            LOG.error("An entity with GUID={} does not exist", guid, e);
+            throw new WebApplicationException(
+                    Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
         } catch (MetadataException | IllegalArgumentException e) {
             LOG.error("Unable to get trait names for entity {}", guid, e);
             throw new WebApplicationException(
@@ -286,6 +300,10 @@ public class EntityResource {
             response.put(MetadataServiceClient.GUID, guid);
 
             return Response.created(locationURI).entity(response).build();
+        } catch (EntityNotFoundException e) {
+            LOG.error("An entity with GUID={} does not exist", guid, e);
+            throw new WebApplicationException(
+                    Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
         } catch (MetadataException | IOException | IllegalArgumentException e) {
             LOG.error("Unable to add trait for entity={}", guid, e);
             throw new WebApplicationException(
@@ -320,6 +338,10 @@ public class EntityResource {
             response.put(TRAIT_NAME, traitName);
 
             return Response.ok(response).build();
+        } catch (EntityNotFoundException e) {
+            LOG.error("An entity with GUID={} does not exist", guid, e);
+            throw new WebApplicationException(
+                    Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
         } catch (MetadataException | IllegalArgumentException e) {
             LOG.error("Unable to delete trait name={} for entity={}", traitName, guid, e);
             throw new WebApplicationException(
diff --git a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java
index 69091b9..076a916 100644
--- a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java
+++ b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java
@@ -33,7 +33,6 @@ import javax.inject.Singleton;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 /**
diff --git a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/MetadataDiscoveryResource.java b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/MetadataDiscoveryResource.java
index f5d16d0..5928e37 100755
--- a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/MetadataDiscoveryResource.java
+++ b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/MetadataDiscoveryResource.java
@@ -38,7 +38,6 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.List;
 import java.util.Map;
@@ -320,4 +319,4 @@ public class MetadataDiscoveryResource {
             return response;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/RexsterGraphResource.java b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/RexsterGraphResource.java
index 8c336cd..0092879 100755
--- a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/RexsterGraphResource.java
+++ b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/RexsterGraphResource.java
@@ -46,7 +46,6 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.HashMap;
 import java.util.Map;
diff --git a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/TypesResource.java b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/TypesResource.java
index 3ad8076..b4ab051 100755
--- a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/TypesResource.java
+++ b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/TypesResource.java
@@ -43,7 +43,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/webapp/src/test/java/org/apache/hadoop/metadata/web/resources/EntityJerseyResourceIT.java b/webapp/src/test/java/org/apache/hadoop/metadata/web/resources/EntityJerseyResourceIT.java
index 2fe874c..d58ee5b 100755
--- a/webapp/src/test/java/org/apache/hadoop/metadata/web/resources/EntityJerseyResourceIT.java
+++ b/webapp/src/test/java/org/apache/hadoop/metadata/web/resources/EntityJerseyResourceIT.java
@@ -389,7 +389,7 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
 
     @Test(dependsOnMethods = "testAddTrait")
     public void testAddExistingTrait() throws Exception {
-        final String traitName = "PII_Trait";
+        final String traitName = "PII_Trait" + randomString();
 
         Struct traitInstance = new Struct(traitName);
         String traitInstanceAsJSON = InstanceSerialization.toJson(traitInstance, true);
@@ -408,7 +408,7 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
 
     @Test(dependsOnMethods = "testGetTraitNames")
     public void testAddTraitWithAttribute() throws Exception {
-            final String traitName = "P_I_I";
+        final String traitName = "PII_Trait" + randomString();
         HierarchicalTypeDefinition<TraitType> piiTrait =
                 TypesUtil.createTraitTypeDef(traitName, ImmutableList.<String>of(),
                         TypesUtil.createRequiredAttrDef("type", DataTypes.STRING_TYPE));
@@ -456,7 +456,7 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
 
     @Test
     public void testAddTraitWithNoRegistration() throws Exception {
-        final String traitName = "PII_Trait_Blah";
+        final String traitName = "PII_Trait" + randomString();
         HierarchicalTypeDefinition<TraitType> piiTrait =
                 TypesUtil.createTraitTypeDef(traitName, ImmutableList.<String>of());
         String traitDefinitionAsJSON = TypesSerialization$.MODULE$.toJson(piiTrait, true);
--
libgit2 0.27.1