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;
     }