ATLAS-4146 [Atlas: Glossary] On updating the related terms, UI allows the user to add the already added term
diff --git a/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java b/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java
index 1da3279..df5fcbd 100644
--- a/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java
+++ b/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java
@@ -407,6 +407,11 @@
throw new AtlasBaseException(AtlasErrorCode.INVALID_DISPLAY_NAME);
}
+ String qualifiedName = getDuplicateGlossaryRelatedTerm(atlasGlossaryTerm);
+ if (StringUtils.isNotEmpty(qualifiedName)) {
+ throw new AtlasBaseException(AtlasErrorCode.GLOSSARY_TERM_ALREADY_EXISTS, qualifiedName);
+ }
+
AtlasGlossaryTerm storeObject = dataAccess.load(atlasGlossaryTerm);
if (!storeObject.equals(atlasGlossaryTerm)) {
atlasGlossaryTerm.setGuid(storeObject.getGuid());
@@ -1030,6 +1035,30 @@
return StringUtils.containsAny(name, invalidNameChars);
}
+ private String getDuplicateGlossaryRelatedTerm(AtlasGlossaryTerm atlasGlossaryTerm) throws AtlasBaseException {
+
+ Map<AtlasGlossaryTerm.Relation, Set<AtlasRelatedTermHeader>> relatedTermsMap = atlasGlossaryTerm.getRelatedTerms();
+ for (Map.Entry<AtlasGlossaryTerm.Relation, Set<AtlasRelatedTermHeader>> relatedTermsMapEntry : relatedTermsMap.entrySet()) {
+ Set<AtlasRelatedTermHeader> termHeaders = relatedTermsMapEntry.getValue();
+
+ if (CollectionUtils.isNotEmpty(termHeaders)) {
+ List<AtlasRelatedTermHeader> duplicateTermHeaders = termHeaders.stream()
+ .collect(Collectors.groupingBy(AtlasRelatedTermHeader::getTermGuid))
+ .values().stream()
+ .filter(duplicates -> duplicates.size() > 1)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList());
+
+ if (CollectionUtils.isNotEmpty(duplicateTermHeaders) && duplicateTermHeaders.size() > 0) {
+ String dupTermGuid = duplicateTermHeaders.get(0).getTermGuid();
+ AtlasGlossaryTerm glossaryTerm = getTerm(dupTermGuid);
+ return glossaryTerm.getQualifiedName();
+ }
+ }
+ }
+ return StringUtils.EMPTY;
+ }
+
private String getDisplayText(AtlasGlossaryTerm term) {
return term != null ? term.getName() : null;
}