You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ap...@apache.org on 2018/05/10 19:10:49 UTC

atlas git commit: ATLAS-2670: Validate entity guid when processing term dissociation

Repository: atlas
Updated Branches:
  refs/heads/master f85ff28e0 -> f15995cc8


ATLAS-2670: Validate entity guid when processing term dissociation

Change-Id: I5e2db1b9968a37482b9ff97ba8602aa262a2db80


Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/f15995cc
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/f15995cc
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/f15995cc

Branch: refs/heads/master
Commit: f15995cc8471e498e2a86c3e4790889ccccac84e
Parents: f85ff28
Author: apoorvnaik <ap...@apache.org>
Authored: Thu May 10 10:02:11 2018 -0700
Committer: apoorvnaik <ap...@apache.org>
Committed: Thu May 10 12:10:38 2018 -0700

----------------------------------------------------------------------
 .../java/org/apache/atlas/AtlasErrorCode.java    |  3 ++-
 .../apache/atlas/glossary/GlossaryTermUtils.java | 19 ++++++++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/f15995cc/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
index 5e3d818..7cf3fd1 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -142,7 +142,8 @@ public enum AtlasErrorCode {
     RELATIONSHIP_END_IS_NULL(400, "ATLAS-400-00-07D", "Relationship end is invalid. Expected {0} but is NULL"),
     INVALID_TERM_RELATION_TO_SELF(400, "ATLAS-400-00-07E", "Invalid Term relationship: Term can't have a relationship with self"),
     INVALID_CHILD_CATEGORY_DIFFERENT_GLOSSARY(400, "ATLAS-400-00-07F", "Invalid child category relationship: Child category (guid = {0}) belongs to different glossary"),
-    ATTRIBUTE_TYPE_INVALID(400, "ATLAS-400-00-080", "{0}.{1}: invalid attribute type. Attribute cannot be of type classification"),
+    INVALID_TERM_DISSOCIATION(400, "ATLAS-400-00-080", "Given term (guid={0}) is not associated to entity(guid={1})"),
+    ATTRIBUTE_TYPE_INVALID(400, "ATLAS-400-00-081", "{0}.{1}: invalid attribute type. Attribute cannot be of type classification"),
 
     UNAUTHORIZED_ACCESS(403, "ATLAS-403-00-001", "{0} is not authorized to perform {1}"),
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/f15995cc/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java b/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java
index 5400b77..6977369 100644
--- a/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java
+++ b/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java
@@ -100,6 +100,14 @@ public class GlossaryTermUtils extends GlossaryUtils {
         }
 
         Objects.requireNonNull(glossaryTerm);
+        Set<AtlasRelatedObjectId> assignedEntities = glossaryTerm.getAssignedEntities();
+        Map<String, AtlasRelatedObjectId> assignedEntityMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(assignedEntities)) {
+            for (AtlasRelatedObjectId relatedObjectId : assignedEntities) {
+                assignedEntityMap.put(relatedObjectId.getGuid(), relatedObjectId);
+            }
+        }
+
         if (CollectionUtils.isNotEmpty(relatedObjectIds)) {
             for (AtlasRelatedObjectId relatedObjectId : relatedObjectIds) {
                 if (DEBUG_ENABLED) {
@@ -108,7 +116,12 @@ public class GlossaryTermUtils extends GlossaryUtils {
                 if (Objects.isNull(relatedObjectId.getRelationshipGuid())) {
                     throw new AtlasBaseException(AtlasErrorCode.TERM_DISSOCIATION_MISSING_RELATION_GUID);
                 }
-                relationshipStore.deleteById(relatedObjectId.getRelationshipGuid());
+                AtlasRelatedObjectId existingTermRelation = assignedEntityMap.get(relatedObjectId.getGuid());
+                if (CollectionUtils.isNotEmpty(assignedEntities) && isRelationshipGuidSame(existingTermRelation, relatedObjectId)) {
+                    relationshipStore.deleteById(relatedObjectId.getRelationshipGuid());
+                } else {
+                    throw new AtlasBaseException(AtlasErrorCode.INVALID_TERM_DISSOCIATION, glossaryTerm.getGuid(), relatedObjectId.getGuid());
+                }
             }
         }
 
@@ -117,6 +130,10 @@ public class GlossaryTermUtils extends GlossaryUtils {
         }
     }
 
+    private boolean isRelationshipGuidSame(final AtlasRelatedObjectId existing, final AtlasRelatedObjectId relatedObjectId) {
+        return StringUtils.equals(relatedObjectId.getRelationshipGuid(), existing.getRelationshipGuid());
+    }
+
     private void processTermAnchor(AtlasGlossaryTerm updatedTerm, AtlasGlossaryTerm existing, RelationshipOperation op) throws AtlasBaseException {
         AtlasGlossaryHeader existingAnchor    = existing.getAnchor();
         AtlasGlossaryHeader updatedTermAnchor = updatedTerm.getAnchor();