Repository: atlas Updated Branches: refs/heads/master c0bf0b8af -> 3f9fc5c91
ATLAS-2653: Disallow term self relation Change-Id: I372a02bf8d19b5c6862bd98166cfeef63ceafcf0 Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/3f9fc5c9 Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/3f9fc5c9 Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/3f9fc5c9 Branch: refs/heads/master Commit: 3f9fc5c919afde048e32a9b6fbcfe3f61a0d1346 Parents: c0bf0b8 Author: apoorvnaik <apoorvn...@apache.org> Authored: Mon May 7 14:06:35 2018 -0700 Committer: apoorvnaik <apoorvn...@apache.org> Committed: Mon May 7 18:12:00 2018 -0700 ---------------------------------------------------------------------- .../java/org/apache/atlas/AtlasErrorCode.java | 4 ++- .../atlas/model/glossary/AtlasGlossaryTerm.java | 38 ++++++++++++-------- .../atlas/glossary/GlossaryTermUtils.java | 23 +++++++++--- 3 files changed, 45 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/3f9fc5c9/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 a6fefd7..9d6d73d 100644 --- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java +++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java @@ -140,6 +140,8 @@ public enum AtlasErrorCode { GLOSSARY_TERM_QUALIFIED_NAME_CANT_BE_DERIVED(400, "ATLAS-400-00-07A", "Attributes qualifiedName, displayName & glossary name are missing. Failed to derive a unique name for Glossary term"), GLOSSARY_CATEGORY_QUALIFIED_NAME_CANT_BE_DERIVED(400, "ATLAS-400-00-07B", "Attributes qualifiedName, displayName & glossary name are missing. Failed to derive a unique name for Glossary category"), 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 belongs to different glossary"), UNAUTHORIZED_ACCESS(403, "ATLAS-403-00-001", "{0} is not authorized to perform {1}"), @@ -188,7 +190,7 @@ public enum AtlasErrorCode { CURATOR_FRAMEWORK_UPDATE(500, "ATLAS-500-00-00B", "ActiveInstanceState.update resulted in exception."), QUICK_START(500, "ATLAS-500-00-00C", "Failed to run QuickStart: {0}"), EMBEDDED_SERVER_START(500, "ATLAS-500-00-00D", "EmbeddedServer.Start: failed!"), - STORM_TOPOLOGY_UTIL(500, "ATLAS-500-00-00E", "StormToplogyUtil: {0}"), + STORM_TOPOLOGY_UTIL(500, "ATLAS-500-00-00E", "StormTopologyUtil: {0}"), SQOOP_HOOK(500, "ATLAS-500-00-00F", "SqoopHook: {0}"), HIVE_HOOK(500, "ATLAS-500-00-010", "HiveHook: {0}"), HIVE_HOOK_METASTORE_BRIDGE(500, "ATLAS-500-00-011", "HiveHookMetaStoreBridge: {0}"), http://git-wip-us.apache.org/repos/asf/atlas/blob/3f9fc5c9/intg/src/main/java/org/apache/atlas/model/glossary/AtlasGlossaryTerm.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/model/glossary/AtlasGlossaryTerm.java b/intg/src/main/java/org/apache/atlas/model/glossary/AtlasGlossaryTerm.java index 1073e33..7b4543b 100644 --- a/intg/src/main/java/org/apache/atlas/model/glossary/AtlasGlossaryTerm.java +++ b/intg/src/main/java/org/apache/atlas/model/glossary/AtlasGlossaryTerm.java @@ -440,33 +440,43 @@ public class AtlasGlossaryTerm extends AtlasGlossaryBaseObject { SEE_ALSO("AtlasGlossaryRelatedTerm", "seeAlso"), SYNONYMS("AtlasGlossarySynonym", "synonyms"), ANTONYMS("AtlasGlossaryAntonym", "antonyms"), + PREFERRED_TO_TERMS("AtlasGlossaryPreferredTerm", "preferredToTerms", true), PREFERRED_TERMS("AtlasGlossaryPreferredTerm", "preferredTerms"), - PREFERRED_TO_TERMS("AtlasGlossaryPreferredTerm", "preferredToTerms"), - REPLACEMENT_TERMS("AtlasGlossaryReplacementTerm", "replacementTerms"), + REPLACEMENT_TERMS("AtlasGlossaryReplacementTerm", "replacementTerms", true), REPLACED_BY("AtlasGlossaryReplacementTerm", "replacedBy"), - TRANSLATION_TERMS("AtlasGlossaryTranslation", "translationTerms"), + TRANSLATION_TERMS("AtlasGlossaryTranslation", "translationTerms", true), TRANSLATED_TERMS("AtlasGlossaryTranslation", "translatedTerms"), - ISA("AtlasGlossaryIsARelationship", "isA"), + ISA("AtlasGlossaryIsARelationship", "isA", true), CLASSIFIES("AtlasGlossaryIsARelationship", "classifies"), - VALID_VALUES("AtlasGlossaryValidValue", "validValues"), + VALID_VALUES("AtlasGlossaryValidValue", "validValues", true), VALID_VALUES_FOR("AtlasGlossaryValidValue", "validValuesFor"), ; - private String relationName; - private String relationAttrName; + private String name; + private String attrName; + private boolean isEnd2Attr; - Relation(final String relationName, final String relationAttrName) { - this.relationName = relationName; - this.relationAttrName = relationAttrName; + Relation(final String name, final String attrName) { + this(name, attrName, false); } - public String getRelationName() { - return relationName; + Relation(final String name, final String attrName, final boolean isEnd2Attr) { + this.name = name; + this.attrName = attrName; + this.isEnd2Attr = isEnd2Attr; + } + + public String getName() { + return name; } @JsonValue - public String getRelationAttrName() { - return relationAttrName; + public String getAttrName() { + return attrName; + } + + public boolean isEnd2Attr() { + return isEnd2Attr; } } } http://git-wip-us.apache.org/repos/asf/atlas/blob/3f9fc5c9/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 803fad6..e9efc77 100644 --- a/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java +++ b/repository/src/main/java/org/apache/atlas/glossary/GlossaryTermUtils.java @@ -355,7 +355,7 @@ public class GlossaryTermUtils extends GlossaryUtils { if (Objects.nonNull(existing.getRelatedTerms()) && Objects.nonNull(existing.getRelatedTerms().get(relation))) { existingRelations = existing.getRelatedTerms().get(relation).stream().collect(Collectors.toMap(AtlasRelatedTermHeader::getTermGuid, t -> t)); } else { - existingRelations = Collections.EMPTY_MAP; + existingRelations = Collections.emptyMap(); } for (AtlasRelatedTermHeader term : terms) { if (Objects.nonNull(existingRelations) && existingRelations.containsKey(term.getTermGuid())) { @@ -364,10 +364,16 @@ public class GlossaryTermUtils extends GlossaryUtils { } continue; } + + if (existing.getGuid().equals(term.getTermGuid())) { + throw new AtlasBaseException(AtlasErrorCode.INVALID_TERM_RELATION_TO_SELF); + } + if (DEBUG_ENABLED) { LOG.debug("Creating new term relation = {}, terms = {}", relation, term.getDisplayText()); } - createRelationship(defineTermRelation(relation.getRelationName(), existing.getGuid(), term)); + + createRelationship(defineTermRelation(relation, existing.getGuid(), term)); } } } @@ -403,11 +409,18 @@ public class GlossaryTermUtils extends GlossaryUtils { return new AtlasRelationship(TERM_ANCHOR, new AtlasObjectId(glossaryGuid), new AtlasObjectId(termGuid), defaultAttrs.getAttributes()); } - private AtlasRelationship defineTermRelation(String relation, String end1TermGuid, AtlasRelatedTermHeader end2RelatedTerm) { - AtlasRelationshipType relationshipType = typeRegistry.getRelationshipTypeByName(relation); + private AtlasRelationship defineTermRelation(AtlasGlossaryTerm.Relation relation, String end1TermGuid, AtlasRelatedTermHeader end2RelatedTerm) { + AtlasRelationshipType relationshipType = typeRegistry.getRelationshipTypeByName(relation.getName()); AtlasStruct defaultAttrs = relationshipType.createDefaultValue(); - AtlasRelationship relationship = new AtlasRelationship(relation, new AtlasObjectId(end1TermGuid), new AtlasObjectId(end2RelatedTerm.getTermGuid()), defaultAttrs.getAttributes()); + AtlasRelationship relationship; + // End1 and End2 ObjectIds depend on the attribute + if (relation.isEnd2Attr()) { + relationship = new AtlasRelationship(relation.getName(), new AtlasObjectId(end2RelatedTerm.getTermGuid()), new AtlasObjectId(end1TermGuid), defaultAttrs.getAttributes()); + } else { + relationship = new AtlasRelationship(relation.getName(), new AtlasObjectId(end1TermGuid), new AtlasObjectId(end2RelatedTerm.getTermGuid()), defaultAttrs.getAttributes()); + } + updateRelationshipAttributes(relationship, end2RelatedTerm); return relationship; }