From 9ddedc10e3e8d445782ae84368c77b20f5861eb0 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 02 Aug 2016 14:19:47 +0000
Subject: [PATCH] OPENDJ-3196 Prevent ambiguous schema element names in SDK

---
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/NameFormTestCase.java               |    8 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java           |    1 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseBuilderTestCase.java |    5 
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java     |    5 
 opendj-core/clirr-ignored-api-changes.xml                                                      |   42 +++
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java          |   26 +-
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeTest.java              |   57 +++--
 opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties                       |   24 ++
 opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeBuilderTestCase.java   |    7 
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java                         |  340 +++++-------------------------
 opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java                  |  144 ++++++++++++
 11 files changed, 330 insertions(+), 329 deletions(-)

diff --git a/opendj-core/clirr-ignored-api-changes.xml b/opendj-core/clirr-ignored-api-changes.xml
index 336dac6..e5fa355 100644
--- a/opendj-core/clirr-ignored-api-changes.xml
+++ b/opendj-core/clirr-ignored-api-changes.xml
@@ -97,4 +97,46 @@
     <differenceType>8001</differenceType>
     <justification>CompactDN has been migrated to server</justification>
   </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.List getAttributeTypesWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.Collection getDITContentRulesWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.Collection getDITStructureRulesWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.Collection getMatchingRuleUsesWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.Collection getMatchingRulesWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.Collection getNameFormsWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
+  <difference>
+    <className>org/forgerock/opendj/ldap/schema/Schema</className>
+    <differenceType>7002</differenceType>
+    <method>java.util.Collection getObjectClassesWithName(java.lang.String)</method>
+    <justification>No duplicate names allowed</justification>
+  </difference>
 </differences>
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
index f83bc99..2aa9187 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/Schema.java
@@ -18,7 +18,6 @@
 package org.forgerock.opendj.ldap.schema;
 
 import static com.forgerock.opendj.ldap.CoreMessages.*;
-
 import static org.forgerock.opendj.ldap.AttributeDescription.*;
 
 import java.util.Collection;
@@ -81,21 +80,17 @@
 
         Collection<AttributeType> getAttributeTypes();
 
-        List<AttributeType> getAttributeTypesWithName(String name);
-
         DITContentRule getDITContentRule(ObjectClass structuralClass);
 
         DITContentRule getDITContentRule(String nameOrOid);
 
         Collection<DITContentRule> getDITContentRules();
 
-        Collection<DITContentRule> getDITContentRulesWithName(String name);
-
         DITStructureRule getDITStructureRule(int ruleID);
 
-        Collection<DITStructureRule> getDITStructureRules(NameForm nameForm);
+        DITStructureRule getDITStructureRule(String name);
 
-        Collection<DITStructureRule> getDITStructureRulesWithName(String name);
+        Collection<DITStructureRule> getDITStructureRules(NameForm nameForm);
 
         Collection<DITStructureRule> getDITStuctureRules();
 
@@ -103,30 +98,22 @@
 
         Collection<MatchingRule> getMatchingRules();
 
-        Collection<MatchingRule> getMatchingRulesWithName(String name);
-
         MatchingRuleUse getMatchingRuleUse(MatchingRule matchingRule);
 
         MatchingRuleUse getMatchingRuleUse(String nameOrOid);
 
         Collection<MatchingRuleUse> getMatchingRuleUses();
 
-        Collection<MatchingRuleUse> getMatchingRuleUsesWithName(String name);
-
         NameForm getNameForm(String nameOrOid);
 
         Collection<NameForm> getNameForms();
 
         Collection<NameForm> getNameForms(ObjectClass structuralClass);
 
-        Collection<NameForm> getNameFormsWithName(String name);
-
         ObjectClass getObjectClass(String nameOrOid);
 
         Collection<ObjectClass> getObjectClasses();
 
-        Collection<ObjectClass> getObjectClassesWithName(String name);
-
         String getSchemaName();
 
         Syntax getSyntax(Schema schema, String numericOID);
@@ -207,11 +194,6 @@
         }
 
         @Override
-        public List<AttributeType> getAttributeTypesWithName(final String name) {
-            return strictImpl.getAttributeTypesWithName(name);
-        }
-
-        @Override
         public DITContentRule getDITContentRule(final ObjectClass structuralClass) {
             return strictImpl.getDITContentRule(structuralClass);
         }
@@ -227,23 +209,18 @@
         }
 
         @Override
-        public Collection<DITContentRule> getDITContentRulesWithName(final String name) {
-            return strictImpl.getDITContentRulesWithName(name);
-        }
-
-        @Override
         public DITStructureRule getDITStructureRule(final int ruleID) {
             return strictImpl.getDITStructureRule(ruleID);
         }
 
         @Override
-        public Collection<DITStructureRule> getDITStructureRules(final NameForm nameForm) {
-            return strictImpl.getDITStructureRules(nameForm);
+        public DITStructureRule getDITStructureRule(final String name) {
+            return strictImpl.getDITStructureRule(name);
         }
 
         @Override
-        public Collection<DITStructureRule> getDITStructureRulesWithName(final String name) {
-            return strictImpl.getDITStructureRulesWithName(name);
+        public Collection<DITStructureRule> getDITStructureRules(final NameForm nameForm) {
+            return strictImpl.getDITStructureRules(nameForm);
         }
 
         @Override
@@ -262,11 +239,6 @@
         }
 
         @Override
-        public Collection<MatchingRule> getMatchingRulesWithName(final String name) {
-            return strictImpl.getMatchingRulesWithName(name);
-        }
-
-        @Override
         public MatchingRuleUse getMatchingRuleUse(final MatchingRule matchingRule) {
             return strictImpl.getMatchingRuleUse(matchingRule);
         }
@@ -282,11 +254,6 @@
         }
 
         @Override
-        public Collection<MatchingRuleUse> getMatchingRuleUsesWithName(final String name) {
-            return strictImpl.getMatchingRuleUsesWithName(name);
-        }
-
-        @Override
         public NameForm getNameForm(final String nameOrOid) {
             return strictImpl.getNameForm(nameOrOid);
         }
@@ -302,11 +269,6 @@
         }
 
         @Override
-        public Collection<NameForm> getNameFormsWithName(final String name) {
-            return strictImpl.getNameFormsWithName(name);
-        }
-
-        @Override
         public ObjectClass getObjectClass(final String nameOrOid) {
             ObjectClass result = strictImpl.getObjectClass0(nameOrOid);
             return result != null ? result : ObjectClass.newPlaceHolder(nameOrOid);
@@ -318,11 +280,6 @@
         }
 
         @Override
-        public Collection<ObjectClass> getObjectClassesWithName(final String name) {
-            return strictImpl.getObjectClassesWithName(name);
-        }
-
-        @Override
         public String getSchemaName() {
             return strictImpl.getSchemaName();
         }
@@ -514,16 +471,6 @@
         }
 
         @Override
-        public List<AttributeType> getAttributeTypesWithName(final String name) {
-            final List<AttributeType> attributes =
-                    name2AttributeTypes.get(StaticUtils.toLowerCase(name));
-            if (attributes != null) {
-                return attributes;
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
         public DITContentRule getDITContentRule(final ObjectClass structuralClass) {
             return numericOID2ContentRules.get(structuralClass.getOID());
         }
@@ -535,11 +482,8 @@
                 return rule;
             }
             final List<DITContentRule> rules = name2ContentRules.get(StaticUtils.toLowerCase(nameOrOid));
-            if (rules != null) {
-                if (rules.size() == 1) {
-                    return rules.get(0);
-                }
-                throw new UnknownSchemaElementException(WARN_DCR_AMBIGUOUS.get(nameOrOid));
+            if (rules != null && rules.size() == 1) {
+                return rules.get(0);
             }
             throw new UnknownSchemaElementException(WARN_DCR_UNKNOWN.get(nameOrOid));
         }
@@ -550,15 +494,6 @@
         }
 
         @Override
-        public Collection<DITContentRule> getDITContentRulesWithName(final String name) {
-            final List<DITContentRule> rules = name2ContentRules.get(StaticUtils.toLowerCase(name));
-            if (rules != null) {
-                return rules;
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
         public DITStructureRule getDITStructureRule(final int ruleID) {
             final DITStructureRule rule = id2StructureRules.get(ruleID);
             if (rule == null) {
@@ -578,13 +513,12 @@
         }
 
         @Override
-        public Collection<DITStructureRule> getDITStructureRulesWithName(final String name) {
-            final List<DITStructureRule> rules =
-                    name2StructureRules.get(StaticUtils.toLowerCase(name));
-            if (rules != null) {
-                return rules;
+        public DITStructureRule getDITStructureRule(final String name) {
+            List<DITStructureRule> rules = name2StructureRules.get(StaticUtils.toLowerCase(name));
+            if (rules != null && rules.size() == 1) {
+                return rules.get(0);
             }
-            return Collections.emptyList();
+            throw new UnknownSchemaElementException(WARN_DIT_SR_UNKNOWN.get(name));
         }
 
         @Override
@@ -599,11 +533,8 @@
                 return rule;
             }
             final List<MatchingRule> rules = name2MatchingRules.get(StaticUtils.toLowerCase(nameOrOid));
-            if (rules != null) {
-                if (rules.size() == 1) {
-                    return rules.get(0);
-                }
-                throw new UnknownSchemaElementException(WARN_MR_AMBIGUOUS.get(nameOrOid));
+            if (rules != null && rules.size() == 1) {
+                return rules.get(0);
             }
             throw new UnknownSchemaElementException(WARN_MR_UNKNOWN.get(nameOrOid));
         }
@@ -614,32 +545,19 @@
         }
 
         @Override
-        public Collection<MatchingRule> getMatchingRulesWithName(final String name) {
-            final List<MatchingRule> rules = name2MatchingRules.get(StaticUtils.toLowerCase(name));
-            if (rules != null) {
-                return rules;
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
         public MatchingRuleUse getMatchingRuleUse(final MatchingRule matchingRule) {
             return numericOID2MatchingRuleUses.get(matchingRule.getOID());
         }
 
         @Override
         public MatchingRuleUse getMatchingRuleUse(final String nameOrOid) {
-            final MatchingRuleUse rule = numericOID2MatchingRuleUses.get(nameOrOid);
-            if (rule != null) {
-                return rule;
+            final MatchingRuleUse use = numericOID2MatchingRuleUses.get(nameOrOid);
+            if (use != null) {
+                return use;
             }
-            final List<MatchingRuleUse> uses =
-                    name2MatchingRuleUses.get(StaticUtils.toLowerCase(nameOrOid));
-            if (uses != null) {
-                if (uses.size() == 1) {
-                    return uses.get(0);
-                }
-                throw new UnknownSchemaElementException(WARN_MRU_AMBIGUOUS.get(nameOrOid));
+            final List<MatchingRuleUse> uses = name2MatchingRuleUses.get(StaticUtils.toLowerCase(nameOrOid));
+            if (uses != null && uses.size() == 1) {
+                return uses.get(0);
             }
             throw new UnknownSchemaElementException(WARN_MRU_UNKNOWN.get(nameOrOid));
         }
@@ -650,27 +568,14 @@
         }
 
         @Override
-        public Collection<MatchingRuleUse> getMatchingRuleUsesWithName(final String name) {
-            final List<MatchingRuleUse> rules =
-                    name2MatchingRuleUses.get(StaticUtils.toLowerCase(name));
-            if (rules != null) {
-                return rules;
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
         public NameForm getNameForm(final String nameOrOid) {
             final NameForm form = numericOID2NameForms.get(nameOrOid);
             if (form != null) {
                 return form;
             }
             final List<NameForm> forms = name2NameForms.get(StaticUtils.toLowerCase(nameOrOid));
-            if (forms != null) {
-                if (forms.size() == 1) {
-                    return forms.get(0);
-                }
-                throw new UnknownSchemaElementException(WARN_NAMEFORM_AMBIGUOUS.get(nameOrOid));
+            if (forms != null && forms.size() == 1) {
+                return forms.get(0);
             }
             throw new UnknownSchemaElementException(WARN_NAMEFORM_UNKNOWN.get(nameOrOid));
         }
@@ -690,15 +595,6 @@
         }
 
         @Override
-        public Collection<NameForm> getNameFormsWithName(final String name) {
-            final List<NameForm> forms = name2NameForms.get(StaticUtils.toLowerCase(name));
-            if (forms != null) {
-                return forms;
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
         public ObjectClass getObjectClass(final String nameOrOid) {
             ObjectClass result = getObjectClass0(nameOrOid);
             if (result != null) {
@@ -713,11 +609,8 @@
                 return oc;
             }
             final List<ObjectClass> classes = name2ObjectClasses.get(StaticUtils.toLowerCase(nameOrOid));
-            if (classes != null) {
-                if (classes.size() == 1) {
-                    return classes.get(0);
-                }
-                throw new UnknownSchemaElementException(WARN_OBJECTCLASS_AMBIGUOUS.get(nameOrOid));
+            if (classes != null && classes.size() == 1) {
+                return classes.get(0);
             }
             return null;
         }
@@ -728,15 +621,6 @@
         }
 
         @Override
-        public Collection<ObjectClass> getObjectClassesWithName(final String name) {
-            final List<ObjectClass> classes = name2ObjectClasses.get(StaticUtils.toLowerCase(name));
-            if (classes != null) {
-                return classes;
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
         public String getSchemaName() {
             return schemaName;
         }
@@ -762,21 +646,14 @@
 
         @Override
         public boolean hasAttributeType(final String nameOrOid) {
-            if (numericOID2AttributeTypes.containsKey(nameOrOid)) {
-                return true;
-            }
-            final List<AttributeType> attributes =
-                    name2AttributeTypes.get(StaticUtils.toLowerCase(nameOrOid));
-            return attributes != null && attributes.size() == 1;
+            return numericOID2AttributeTypes.containsKey(nameOrOid)
+                    || name2AttributeTypes.containsKey(StaticUtils.toLowerCase(nameOrOid));
         }
 
         @Override
         public boolean hasDITContentRule(final String nameOrOid) {
-            if (numericOID2ContentRules.containsKey(nameOrOid)) {
-                return true;
-            }
-            final List<DITContentRule> rules = name2ContentRules.get(StaticUtils.toLowerCase(nameOrOid));
-            return rules != null && rules.size() == 1;
+            return numericOID2ContentRules.containsKey(nameOrOid)
+                    || name2ContentRules.containsKey(StaticUtils.toLowerCase(nameOrOid));
         }
 
         @Override
@@ -786,39 +663,26 @@
 
         @Override
         public boolean hasMatchingRule(final String nameOrOid) {
-            if (numericOID2MatchingRules.containsKey(nameOrOid)) {
-                return true;
-            }
-            final List<MatchingRule> rules = name2MatchingRules.get(StaticUtils.toLowerCase(nameOrOid));
-            return rules != null && rules.size() == 1;
+            return numericOID2MatchingRules.containsKey(nameOrOid)
+                    || name2MatchingRules.containsKey(StaticUtils.toLowerCase(nameOrOid));
         }
 
         @Override
         public boolean hasMatchingRuleUse(final String nameOrOid) {
-            if (numericOID2MatchingRuleUses.containsKey(nameOrOid)) {
-                return true;
-            }
-            final List<MatchingRuleUse> uses =
-                    name2MatchingRuleUses.get(StaticUtils.toLowerCase(nameOrOid));
-            return uses != null && uses.size() == 1;
+            return numericOID2MatchingRuleUses.containsKey(nameOrOid)
+                    || name2MatchingRuleUses.containsKey(StaticUtils.toLowerCase(nameOrOid));
         }
 
         @Override
         public boolean hasNameForm(final String nameOrOid) {
-            if (numericOID2NameForms.containsKey(nameOrOid)) {
-                return true;
-            }
-            final List<NameForm> forms = name2NameForms.get(StaticUtils.toLowerCase(nameOrOid));
-            return forms != null && forms.size() == 1;
+            return numericOID2NameForms.containsKey(nameOrOid)
+                    || name2NameForms.containsKey(StaticUtils.toLowerCase(nameOrOid));
         }
 
         @Override
         public boolean hasObjectClass(final String nameOrOid) {
-            if (numericOID2ObjectClasses.containsKey(nameOrOid)) {
-                return true;
-            }
-            final List<ObjectClass> classes = name2ObjectClasses.get(StaticUtils.toLowerCase(nameOrOid));
-            return classes != null && classes.size() == 1;
+            return numericOID2ObjectClasses.containsKey(nameOrOid)
+                    || name2ObjectClasses.containsKey(StaticUtils.toLowerCase(nameOrOid));
         }
 
         @Override
@@ -836,15 +700,8 @@
             if (type != null) {
                 return type;
             }
-            final List<AttributeType> attributes =
-                    name2AttributeTypes.get(StaticUtils.toLowerCase(nameOrOid));
-            if (attributes != null) {
-                if (attributes.size() == 1) {
-                    return attributes.get(0);
-                }
-                throw new UnknownSchemaElementException(WARN_ATTR_TYPE_AMBIGUOUS.get(nameOrOid));
-            }
-            return null;
+            final List<AttributeType> attrs = name2AttributeTypes.get(StaticUtils.toLowerCase(nameOrOid));
+            return attrs != null && attrs.size() == 1 ? attrs.get(0) : null;
         }
     }
 
@@ -1117,7 +974,7 @@
      * @return The requested attribute type.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested attribute type
-     *             was not found or if the provided name is ambiguous.
+     *             was not found.
      * @see AttributeType#isPlaceHolder()
      */
     public AttributeType getAttributeType(final String nameOrOid) {
@@ -1141,7 +998,7 @@
      * @return The requested attribute type.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested attribute type
-     *             was not found or if the provided name is ambiguous.
+     *             was not found.
      * @see AttributeType#isPlaceHolder()
      */
     public AttributeType getAttributeType(final String nameOrOid, final Syntax syntax) {
@@ -1160,19 +1017,6 @@
     }
 
     /**
-     * Returns an unmodifiable collection containing all of the attribute types
-     * having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the attribute types to retrieve.
-     * @return An unmodifiable collection containing all of the attribute types
-     *         having the specified name or numeric OID.
-     */
-    public List<AttributeType> getAttributeTypesWithName(final String name) {
-        return impl.getAttributeTypesWithName(name);
-    }
-
-    /**
      * Returns the DIT content rule associated with the provided structural
      * object class, or {@code null} if no rule is defined.
      *
@@ -1193,7 +1037,7 @@
      * @return The requested DIT content rule.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested DIT content rule
-     *             was not found or if the provided name is ambiguous.
+     *             was not found.
      */
     public DITContentRule getDITContentRule(final String nameOrOid) {
         return impl.getDITContentRule(nameOrOid);
@@ -1211,19 +1055,6 @@
     }
 
     /**
-     * Returns an unmodifiable collection containing all of the DIT content
-     * rules having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the DIT content rules to retrieve.
-     * @return An unmodifiable collection containing all of the DIT content
-     *         rules having the specified name or numeric OID.
-     */
-    public Collection<DITContentRule> getDITContentRulesWithName(final String name) {
-        return impl.getDITContentRulesWithName(name);
-    }
-
-    /**
      * Returns the DIT structure rule with the specified name or numeric OID.
      *
      * @param ruleID
@@ -1238,6 +1069,20 @@
     }
 
     /**
+     * Returns the DIT structure rule with the specified name or numeric OID.
+     *
+     * @param nameOrOid
+     *            The name or OID of the DIT structure rule to retrieve.
+     * @return The requested DIT structure rule.
+     * @throws UnknownSchemaElementException
+     *             If this is a strict schema and the requested DIT structure rule
+     *             was not found.
+     */
+    public DITStructureRule getDITStructureRule(final String nameOrOid) {
+        return impl.getDITStructureRule(nameOrOid);
+    }
+
+    /**
      * Returns an unmodifiable collection containing all of the DIT structure
      * rules associated with the provided name form.
      *
@@ -1252,19 +1097,6 @@
 
     /**
      * Returns an unmodifiable collection containing all of the DIT structure
-     * rules having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the DIT structure rules to retrieve.
-     * @return An unmodifiable collection containing all of the DIT structure
-     *         rules having the specified name or numeric OID.
-     */
-    public Collection<DITStructureRule> getDITStructureRulesWithName(final String name) {
-        return impl.getDITStructureRulesWithName(name);
-    }
-
-    /**
-     * Returns an unmodifiable collection containing all of the DIT structure
      * rules contained in this schema.
      *
      * @return An unmodifiable collection containing all of the DIT structure
@@ -1282,7 +1114,7 @@
      * @return The requested matching rule.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested matching rule
-     *             was not found or if the provided name is ambiguous.
+     *             was not found.
      */
     public MatchingRule getMatchingRule(final String nameOrOid) {
         return impl.getMatchingRule(nameOrOid);
@@ -1300,19 +1132,6 @@
     }
 
     /**
-     * Returns an unmodifiable collection containing all of the matching rules
-     * having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the matching rules to retrieve.
-     * @return An unmodifiable collection containing all of the matching rules
-     *         having the specified name or numeric OID.
-     */
-    public Collection<MatchingRule> getMatchingRulesWithName(final String name) {
-        return impl.getMatchingRulesWithName(name);
-    }
-
-    /**
      * Returns the matching rule use associated with the provided matching rule,
      * or {@code null} if no use is defined.
      *
@@ -1333,7 +1152,7 @@
      * @return The requested matching rule use.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested matching rule
-     *             use was not found or if the provided name is ambiguous.
+     *             use was not found.
      */
     public MatchingRuleUse getMatchingRuleUse(final String nameOrOid) {
         return impl.getMatchingRuleUse(nameOrOid);
@@ -1351,19 +1170,6 @@
     }
 
     /**
-     * Returns an unmodifiable collection containing all of the matching rule
-     * uses having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the matching rule uses to retrieve.
-     * @return An unmodifiable collection containing all of the matching rule
-     *         uses having the specified name or numeric OID.
-     */
-    public Collection<MatchingRuleUse> getMatchingRuleUsesWithName(final String name) {
-        return impl.getMatchingRuleUsesWithName(name);
-    }
-
-    /**
      * Returns the name form with the specified name or numeric OID.
      *
      * @param nameOrOid
@@ -1371,7 +1177,7 @@
      * @return The requested name form.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested name form was
-     *             not found or if the provided name is ambiguous.
+     *             not found.
      */
     public NameForm getNameForm(final String nameOrOid) {
         return impl.getNameForm(nameOrOid);
@@ -1403,19 +1209,6 @@
     }
 
     /**
-     * Returns an unmodifiable collection containing all of the name forms
-     * having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the name forms to retrieve.
-     * @return An unmodifiable collection containing all of the name forms
-     *         having the specified name or numeric OID.
-     */
-    public Collection<NameForm> getNameFormsWithName(final String name) {
-        return impl.getNameFormsWithName(name);
-    }
-
-    /**
      * Returns the object class with the specified name or numeric OID.
      * <p>
      * If the requested object class is not registered in this schema and this
@@ -1428,7 +1221,7 @@
      * @return The requested object class.
      * @throws UnknownSchemaElementException
      *             If this is a strict schema and the requested object class was
-     *             not found or if the provided name is ambiguous.
+     *             not found.
      * @see ObjectClass#isPlaceHolder()
      */
     public ObjectClass getObjectClass(final String nameOrOid) {
@@ -1447,19 +1240,6 @@
     }
 
     /**
-     * Returns an unmodifiable collection containing all of the object classes
-     * having the specified name or numeric OID.
-     *
-     * @param name
-     *            The name of the object classes to retrieve.
-     * @return An unmodifiable collection containing all of the object classes
-     *         having the specified name or numeric OID.
-     */
-    public Collection<ObjectClass> getObjectClassesWithName(final String name) {
-        return impl.getObjectClassesWithName(name);
-    }
-
-    /**
      * Returns the value associated to the provided {@link Option} or the option
      * default value, if there is no such option in this schema.
      *
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
index 8654199..723980c 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/SchemaBuilder.java
@@ -18,7 +18,6 @@
 package org.forgerock.opendj.ldap.schema;
 
 import static java.util.Collections.*;
-
 import static org.forgerock.opendj.ldap.LdapException.*;
 import static org.forgerock.opendj.ldap.schema.ObjectClass.*;
 import static org.forgerock.opendj.ldap.schema.ObjectClassType.*;
@@ -26,7 +25,6 @@
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.*;
 import static org.forgerock.opendj.ldap.schema.SchemaOptions.*;
 import static org.forgerock.opendj.ldap.schema.SchemaUtils.*;
-
 import static com.forgerock.opendj.ldap.CoreMessages.*;
 import static com.forgerock.opendj.util.StaticUtils.*;
 
@@ -2187,6 +2185,14 @@
             defaultMatchingRule = Schema.getCoreSchema().getDefaultMatchingRule();
         }
 
+        removeDuplicateMatchingRulesNames();
+        removeDuplicateMatchingRuleUsesNames();
+        removeDuplicateAttributeTypesNames();
+        removeDuplicateObjectClassesNames();
+        removeDuplicateNameFormsNames();
+        removeDuplicateDITContentRulesNames();
+        removeDuplicateDITStructureRulesNames();
+
         final Schema schema =
                 new Schema.StrictImpl(localSchemaName, options,
                         defaultSyntax, defaultMatchingRule, numericOID2Syntaxes,
@@ -2771,4 +2777,138 @@
             }
         }
     }
+
+    private void removeDuplicateMatchingRulesNames() {
+        for (final java.util.Map.Entry<String, List<MatchingRule>> entry : name2MatchingRules.entrySet()) {
+            List<MatchingRule> rules = entry.getValue();
+            if (rules.size() > 1) {
+                StringBuilder oids = new StringBuilder();
+                for (MatchingRule attr : rules) {
+                    if (oids.length() > 0) {
+                        oids.append(", ");
+                    }
+                    oids.append(attr.getOID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_MATCHING_RULES_DUPLICATED_NAME.get(oids, name, name, rules.get(0).getOID()));
+                // keep only the first value
+                rules.subList(1, rules.size()).clear();
+            }
+        }
+    }
+
+    private void removeDuplicateMatchingRuleUsesNames() {
+        for (final java.util.Map.Entry<String, List<MatchingRuleUse>> entry : name2MatchingRuleUses.entrySet()) {
+            List<MatchingRuleUse> uses = entry.getValue();
+            if (uses.size() > 1) {
+                StringBuilder oids = new StringBuilder();
+                for (MatchingRuleUse attr : uses) {
+                    if (oids.length() > 0) {
+                        oids.append(", ");
+                    }
+                    oids.append(attr.getMatchingRuleOID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_MATCHING_RULE_USES_DUPLICATED_NAME.get(oids, name, name,
+                        uses.get(0).getMatchingRuleOID()));
+                // keep only the first value
+                uses.subList(1, uses.size()).clear();
+            }
+        }
+    }
+
+    private void removeDuplicateAttributeTypesNames() {
+        for (final java.util.Map.Entry<String, List<AttributeType>> entry : name2AttributeTypes.entrySet()) {
+            List<AttributeType> types = entry.getValue();
+            if (entry.getValue().size() > 1) {
+                StringBuilder oids = new StringBuilder();
+                for (AttributeType attr : types) {
+                    if (oids.length() > 0) {
+                        oids.append(", ");
+                    }
+                    oids.append(attr.getOID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_ATTR_TYPES_DUPLICATED_NAME.get(oids, name, name, types.get(0).getOID()));
+                // keep only the first value
+                types.subList(1, types.size()).clear();
+            }
+        }
+    }
+
+    private void removeDuplicateObjectClassesNames() {
+        for (final java.util.Map.Entry<String, List<ObjectClass>> entry : name2ObjectClasses.entrySet()) {
+            List<ObjectClass> classes = entry.getValue();
+            if (entry.getValue().size() > 1) {
+                StringBuilder oids = new StringBuilder();
+                for (ObjectClass attr : classes) {
+                    if (oids.length() > 0) {
+                        oids.append(", ");
+                    }
+                    oids.append(attr.getOID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_CLASSES_DUPLICATED_NAME.get(oids, name, name, classes.get(0).getOID()));
+                // keep only the first value
+                classes.subList(1, classes.size()).clear();
+            }
+        }
+    }
+
+    private void removeDuplicateNameFormsNames() {
+        for (final java.util.Map.Entry<String, List<NameForm>> entry : name2NameForms.entrySet()) {
+            List<NameForm> forms = entry.getValue();
+            if (entry.getValue().size() > 1) {
+                StringBuilder oids = new StringBuilder();
+                for (NameForm attr : forms) {
+                    if (oids.length() > 0) {
+                        oids.append(", ");
+                    }
+                    oids.append(attr.getOID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_NAME_FORMS_DUPLICATED_NAME.get(oids, name, name, forms.get(0).getOID()));
+                // keep only the first value
+                forms.subList(1, forms.size()).clear();
+            }
+        }
+    }
+
+    private void removeDuplicateDITStructureRulesNames() {
+        for (final java.util.Map.Entry<String, List<DITStructureRule>> entry : name2StructureRules.entrySet()) {
+            List<DITStructureRule> rules = entry.getValue();
+            if (entry.getValue().size() > 1) {
+                StringBuilder ids = new StringBuilder();
+                for (DITStructureRule attr : rules) {
+                    if (ids.length() > 0) {
+                        ids.append(", ");
+                    }
+                    ids.append(attr.getRuleID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_DIT_SR_DUPLICATED_NAME.get(ids, name, name, rules.get(0).getRuleID()));
+                // keep only the first value
+                rules.subList(1, rules.size()).clear();
+            }
+        }
+    }
+
+    private void removeDuplicateDITContentRulesNames() {
+        for (final java.util.Map.Entry<String, List<DITContentRule>> entry : name2ContentRules.entrySet()) {
+            List<DITContentRule> rules = entry.getValue();
+            if (entry.getValue().size() > 1) {
+                StringBuilder ids = new StringBuilder();
+                for (DITContentRule attr : rules) {
+                    if (ids.length() > 0) {
+                        ids.append(", ");
+                    }
+                    ids.append(attr.getStructuralClassOID());
+                }
+                String name = entry.getKey();
+                warnings.add(WARN_DIT_CR_DUPLICATED_NAME.get(ids, name, name, rules.get(0).getStructuralClassOID()));
+                // keep only the first value
+                rules.subList(1, rules.size()).clear();
+            }
+        }
+    }
 }
diff --git a/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties b/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
index 8c52e87..a2384c0 100644
--- a/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
+++ b/opendj-core/src/main/resources/com/forgerock/opendj/ldap/core.properties
@@ -1661,7 +1661,29 @@
  superior type "%s" which is marked as OBSOLETE in the schema
 WARN_ATTR_TYPE_HAS_OBSOLETE_MR=The attribute type "%s" specifies the \
  matching rule "%s" which is marked as OBSOLETE in the schema
-
+WARN_ATTR_TYPES_DUPLICATED_NAME=The following attribute types share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ attribute type "%s"
+WARN_MATCHING_RULES_DUPLICATED_NAME=The following matching rules share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ matching rule "%s"
+WARN_MATCHING_RULE_USES_DUPLICATED_NAME=The following matching rule uses share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ matching rule use "%s"
+WARN_CLASSES_DUPLICATED_NAME=The following object classes share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ object class "%s"
+WARN_NAME_FORMS_DUPLICATED_NAME=The following name forms share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ name form "%s"
+WARN_DIT_SR_DUPLICATED_NAME=The following DIT structure rules share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ DIT structure rule "%s"
+WARN_DIT_CR_DUPLICATED_NAME=The following DIT content rules share the \
+ name "%s": %s. To avoid ambiguity the name "%s" will only be associated with \
+ DIT content rule "%s"
+WARN_DIT_SR_UNKNOWN=No DIT structure rule with name "%s" exists in the schema
+  
 # Labels for generated documentation
 DOC_LOCALE_TAG=Code tag: %s
 DOC_LOCALE_OID=Collation order object identifier: %s
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeBuilderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeBuilderTestCase.java
index 1a3f307..6fe24b0 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeBuilderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeBuilderTestCase.java
@@ -11,7 +11,7 @@
  * Header, with the fields enclosed by brackets [] replaced by your own identifying
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
- * Copyright 2015 ForgeRock AS.
+ * Copyright 2015-2016 ForgeRock AS.
  */
 package org.forgerock.opendj.ldap.schema;
 
@@ -132,7 +132,8 @@
 
         sb.buildAttributeType(schema.getAttributeType("AttributeTypeToDuplicate"))
                 .oid("1.1.1.43")
-                .names("Copy")
+                .removeAllNames() // mandatory to avoid duplicate names
+                .names("DuplicatedAttributeType", "Copy")
                 .obsolete(true)
                 .addToSchemaOverwrite();
         Schema schemaCopy = sb.toSchema();
@@ -143,7 +144,7 @@
         assertThat(atCopy.getOID()).isEqualTo("1.1.1.43");
         assertThat(atCopy.getDescription()).isEqualTo("Attribute type to duplicate");
         assertThat(atCopy.isObsolete()).isTrue();
-        assertThat(atCopy.getNames()).containsOnly("AttributeTypeToDuplicate", "Copy");
+        assertThat(atCopy.getNames()).containsOnly("DuplicatedAttributeType", "Copy");
         assertThat(atCopy.getExtraProperties()).isEmpty();
     }
 
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeTest.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeTest.java
index 05b2158..c5e00c2 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeTest.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/AttributeTypeTest.java
@@ -16,6 +16,7 @@
  */
 package org.forgerock.opendj.ldap.schema;
 
+import static com.forgerock.opendj.ldap.CoreMessages.WARN_ATTR_TYPES_DUPLICATED_NAME;
 import static org.assertj.core.api.Assertions.fail;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.forgerock.opendj.ldap.schema.SchemaConstants.*;
@@ -55,17 +56,17 @@
                         + "'user defined' ) X-SCHEMA-FILE '98sunEmp.ldif')", false);
 
         builder.buildAttributeType("1.2.3")
-               .names("testType")
+               .names("testType3")
                .superiorType("1.2.2")
                .syntax("1.3.6.1.4.1.1466.115.121.1.27")
                .collective(true)
                .usage(AttributeUsage.USER_APPLICATIONS)
                .addToSchema();
 
-        builder.addAttributeType("( 1.2.4 NAME 'testType' SUP 1.2.3 SINGLE-VALUE COLLECTIVE )", false);
+        builder.addAttributeType("( 1.2.4 NAME 'testType4' SUP 1.2.3 SINGLE-VALUE COLLECTIVE )", false);
 
         builder.buildAttributeType("1.2.5")
-               .names("testType", "testnamealias", "anothernamealias")
+               .names("testType5", "testnamealias5", "anothernamealias5")
                .equalityMatchingRule(EMR_CASE_IGNORE_LIST_OID)
                .substringMatchingRule(SMR_CASE_IGNORE_LIST_OID)
                .approximateMatchingRule(AMR_DOUBLE_METAPHONE_OID)
@@ -74,8 +75,8 @@
                .usage(AttributeUsage.DSA_OPERATION)
                .addToSchema();
 
-        builder.addAttributeType("( 1.2.6 NAME ( 'testType' 'testnamealias' 'anothernamealias1' ) "
-                + " SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SUP anothernamealias"
+        builder.addAttributeType("( 1.2.6 NAME ( 'testType6' 'testnamealias6' 'anothernamealias6' ) "
+                + " SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SUP anothernamealias5"
                 + " USAGE dSAOperation NO-USER-MODIFICATION )", false);
 
         schema = builder.toSchema();
@@ -236,12 +237,12 @@
     public final void testConstructorPrimaryName() throws Exception {
         AttributeType d = schema.getAttributeType("1.2.3");
 
-        Assert.assertTrue(d.hasName("testType"));
+        Assert.assertTrue(d.hasName("testType3"));
         Assert.assertFalse(d.hasName("xxx"));
 
         d = schema.getAttributeType("1.2.4");
 
-        Assert.assertTrue(d.hasName("testType"));
+        Assert.assertTrue(d.hasName("testType4"));
         Assert.assertFalse(d.hasName("xxx"));
 
     }
@@ -269,15 +270,15 @@
     public final void testConstructorTypeNames() throws Exception {
         AttributeType d = schema.getAttributeType("1.2.5");
 
-        Assert.assertTrue(d.hasName("testType"));
-        Assert.assertTrue(d.hasName("testnamealias"));
-        Assert.assertTrue(d.hasName("anothernamealias"));
+        Assert.assertTrue(d.hasName("testType5"));
+        Assert.assertTrue(d.hasName("testnamealias5"));
+        Assert.assertTrue(d.hasName("anothernamealias5"));
 
         d = schema.getAttributeType("1.2.6");
 
-        Assert.assertTrue(d.hasName("testType"));
-        Assert.assertTrue(d.hasName("testnamealias"));
-        Assert.assertTrue(d.hasName("anothernamealias1"));
+        Assert.assertTrue(d.hasName("testType6"));
+        Assert.assertTrue(d.hasName("testnamealias6"));
+        Assert.assertTrue(d.hasName("anothernamealias6"));
     }
 
     /**
@@ -320,9 +321,9 @@
     @Test
     public final void testGetNameOrOIDReturnsPrimaryName() throws Exception {
         AttributeType d = schema.getAttributeType("1.2.3");
-        Assert.assertEquals(d.getNameOrOID(), "testType");
+        Assert.assertEquals(d.getNameOrOID(), "testType3");
         d = schema.getAttributeType("1.2.4");
-        Assert.assertEquals(d.getNameOrOID(), "testType");
+        Assert.assertEquals(d.getNameOrOID(), "testType4");
     }
 
     /**
@@ -335,15 +336,15 @@
     public final void testGetNormalizedNames() throws Exception {
         AttributeType d = schema.getAttributeType("1.2.5");
         Iterator<String> i = d.getNames().iterator();
-        Assert.assertEquals(i.next(), "testType");
-        Assert.assertEquals(i.next(), "testnamealias");
-        Assert.assertEquals(i.next(), "anothernamealias");
+        Assert.assertEquals(i.next(), "testType5");
+        Assert.assertEquals(i.next(), "testnamealias5");
+        Assert.assertEquals(i.next(), "anothernamealias5");
 
         d = schema.getAttributeType("1.2.6");
         i = d.getNames().iterator();
-        Assert.assertEquals(i.next(), "testType");
-        Assert.assertEquals(i.next(), "testnamealias");
-        Assert.assertEquals(i.next(), "anothernamealias1");
+        Assert.assertEquals(i.next(), "testType6");
+        Assert.assertEquals(i.next(), "testnamealias6");
+        Assert.assertEquals(i.next(), "anothernamealias6");
     }
 
     /**
@@ -385,12 +386,12 @@
     public final void testHasNameOrOID() throws Exception {
         AttributeType d = schema.getAttributeType("1.2.3");
 
-        Assert.assertTrue(d.hasNameOrOID("testType"));
+        Assert.assertTrue(d.hasNameOrOID("testType3"));
         Assert.assertTrue(d.hasNameOrOID("1.2.3"));
         Assert.assertFalse(d.hasNameOrOID("x.y.z"));
         d = schema.getAttributeType("1.2.4");
 
-        Assert.assertTrue(d.hasNameOrOID("testType"));
+        Assert.assertTrue(d.hasNameOrOID("testType4"));
         Assert.assertTrue(d.hasNameOrOID("1.2.4"));
         Assert.assertFalse(d.hasNameOrOID("x.y.z"));
     }
@@ -556,4 +557,14 @@
         return builder.toSchema().getAttributeType("1.2.3");
     }
 
+    @Test
+    public void testDuplicateNamesGenerateWarnings() {
+        Schema dupSchema = new SchemaBuilder(schema).buildAttributeType("1.2.10")
+                .names("testType3")
+                .syntax("1.3.6.1.4.1.1466.115.121.1.27")
+                .addToSchema().toSchema();
+
+        assertThat(dupSchema.getWarnings()).contains(
+                WARN_ATTR_TYPES_DUPLICATED_NAME.get("1.2.3, 1.2.10", "testtype3", "testtype3", "1.2.3"));
+    }
 }
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java
index 30b3b2e..c724424 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleTestCase.java
@@ -512,6 +512,7 @@
 
         // @formatter:off
         sb.buildMatchingRule(mr)
+            .removeAllNames() // mandatory to remove duplicate names
             .names("Dolly")
             .oid("2.5.13.0.1")
             .obsolete(true)
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseBuilderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseBuilderTestCase.java
index 8489a6b..4b4ce53 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseBuilderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/MatchingRuleUseBuilderTestCase.java
@@ -11,7 +11,7 @@
  * Header, with the fields enclosed by brackets [] replaced by your own identifying
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
- * Copyright 2015 ForgeRock AS.
+ * Copyright 2015-2016 ForgeRock AS.
  */
 package org.forgerock.opendj.ldap.schema;
 
@@ -63,6 +63,7 @@
 
         final Schema schemaCopy = builder.buildMatchingRuleUse(schema.getMatchingRuleUse(EMR_BIT_STRING_OID))
                 .oid(EMR_OCTET_STRING_OID)
+                .removeAllNames()
                 .names("Matching rule use test copy")
                 .attributes("2.5.4.53")
                 .addToSchema()
@@ -72,7 +73,7 @@
         final MatchingRuleUse mru = schemaCopy.getMatchingRuleUse(EMR_OCTET_STRING_OID);
         assertThat(mru).isNotNull();
         assertThat(mru.getMatchingRuleOID()).isEqualTo(EMR_OCTET_STRING_OID);
-        assertThat(mru.getNames()).containsOnly("Matching rule use test", "Matching rule use test copy");
+        assertThat(mru.getNames()).containsOnly("Matching rule use test copy");
         assertThat(mru.getDescription()).isEqualTo("Matching rule use description");
         assertThat(mru.getAttributes()).containsOnly(schema.getAttributeType("2.5.4.40"),
                                                      schema.getAttributeType("2.5.4.53"));
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/NameFormTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/NameFormTestCase.java
index fd4dd95..0800635 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/NameFormTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/NameFormTestCase.java
@@ -399,6 +399,7 @@
         assertThat(nf.getOID()).isEqualTo("1.3.6.1.4.1.1466.115.121.1.35");
 
         sb.buildNameForm(nf)
+            .removeAllNames() // mandatory to avoid duplicate names
             .names("Dolly")
             .oid("1.3.6.1.4.1.1466.115.121.1.36")
             .addToSchemaOverwrite();
@@ -411,7 +412,7 @@
         i.next(); // Jump the first element (== nf)
         final NameForm dolly = i.next(); // Our new cloned NameForm.
         assertThat(dolly.getOID()).isEqualTo("1.3.6.1.4.1.1466.115.121.1.36"); // With the new OID !
-        assertThat(dolly.getNames().size()).isEqualTo(2);
+        assertThat(dolly.getNames().size()).isEqualTo(1);
     }
 
     /**
@@ -548,7 +549,7 @@
 
         final Schema schema = sb.toSchema();
         assertThat(schema.getWarnings()).isEmpty();
-        assertThat(schema.getNameFormsWithName("mycustomnameform")).isNotNull();
+        assertThat(schema.getNameForm("mycustomnameform")).isNotNull();
         for (final NameForm o : schema.getNameForms()) {
             assertThat(o.getNameOrOID()).isEqualTo("myCustomNameForm");
             assertThat(o.getOID()).isEqualTo("mycustomnameform-oid");
@@ -885,7 +886,8 @@
         // @formatter:off.
         SchemaBuilder sb = new SchemaBuilder(Schema.getCoreSchema());
         Builder nfBuilder = new Builder(nf, sb)
-                    .names("Dolly")
+                    .removeAllNames() // mandatory to avoid duplicate names
+                    .names("MyCopiedNewForm", "Dolly")
                     .oid("1.3.6.1.4.1.1466.115.121.1.36")
                     .removeOptionalAttribute("uid")
                     .removeOptionalAttribute("nonExistentUid")
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java
index d31b293..dd53100 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/ObjectClassBuilderTestCase.java
@@ -162,7 +162,8 @@
 
         sb.buildObjectClass(schema.getObjectClass("ObjectClassToDuplicate"))
                 .oid("1.1.1.43")
-                .names("Copy")
+                .removeAllNames() // mandatory to avoid duplicate names
+                .names("DuplicatedOC", "Copy")
                 .obsolete(true)
                 .addToSchemaOverwrite();
         final Schema schemaCopy = sb.toSchema();
@@ -173,7 +174,7 @@
         assertThat(ocCopy.getOID()).isEqualTo("1.1.1.43");
         assertThat(ocCopy.getDescription()).isEqualTo("Object class to duplicate");
         assertThat(ocCopy.isObsolete()).isTrue();
-        assertThat(ocCopy.getNames()).containsOnly("ObjectClassToDuplicate", "Copy");
+        assertThat(ocCopy.getNames()).containsOnly("DuplicatedOC", "Copy");
         assertSchemaElementsContainsAll(ocCopy.getSuperiorClasses(), TOP_OBJECTCLASS_NAME);
         assertSchemaElementsContainsAll(ocCopy.getRequiredAttributes(), "name");
         assertThat(ocCopy.getOptionalAttributes()).isEmpty();
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
index 953c591..5434038 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTestCase.java
@@ -110,10 +110,10 @@
     @Test
     public void attributeTypeSuperiorFailureChildThenParent() {
         final Schema schema =
-                new SchemaBuilder(Schema.getCoreSchema()).addAttributeType(
-                        "( childtype-oid NAME 'childtype' SUP parenttype )", false)
-                        .addAttributeType("( parenttype-oid NAME 'parenttype' SUP xxx )", false)
-                        .toSchema();
+                new SchemaBuilder(Schema.getCoreSchema())
+                    .addAttributeType("( childtype-oid NAME 'childtype' SUP parenttype )", false)
+                    .addAttributeType("( parenttype-oid NAME 'parenttype' SUP xxx )", false)
+                    .toSchema();
 
         try {
             schema.getAttributeType("childtype");
@@ -137,9 +137,10 @@
     @Test
     public void attributeTypeSuperiorFailureParentThenChild() {
         final Schema schema =
-                new SchemaBuilder(Schema.getCoreSchema()).addAttributeType(
-                        "( parenttype-oid NAME 'parenttype' SUP xxx )", false).addAttributeType(
-                        "( childtype-oid NAME 'childtype' SUP parenttype )", false).toSchema();
+                new SchemaBuilder(Schema.getCoreSchema())
+                    .addAttributeType("( parenttype-oid NAME 'parenttype' SUP xxx )", false)
+                    .addAttributeType("( childtype-oid NAME 'childtype' SUP parenttype )", false)
+                    .toSchema();
 
         try {
             schema.getAttributeType("childtype");
@@ -412,7 +413,7 @@
         assertThat(schema.getAttributeType("myCustomAttribute").getUsage().toString()).isEqualTo(
                 "userApplications");
 
-        assertThat(schema.getObjectClassesWithName("myCustomObjClass")).isNotEmpty();
+        assertThat(schema.getObjectClass("myCustomObjClass").isPlaceHolder()).isFalse();
     }
 
     /**
@@ -990,7 +991,7 @@
         assertThat(schema.getAttributeType("myCustomAttribute").getDescription())
                 .isEqualTo("A short description");
 
-        assertThat(schema.getObjectClassesWithName("myCustomObjClass")).isNotEmpty();
+        assertThat(schema.getObjectClass("myCustomObjClass").isPlaceHolder()).isFalse();
     }
 
     /**
@@ -1025,7 +1026,7 @@
                 "userApplications");
         assertThat(schema.getAttributeType("myCustomAttribute").getDescription())
                 .isEqualTo("A short description");
-        assertThat(schema.getObjectClassesWithName("myCustomObjClass")).isNotEmpty();
+        assertThat(schema.getObjectClass("myCustomObjClass").isPlaceHolder()).isFalse();
     }
 
     /**
@@ -1380,7 +1381,6 @@
         // @formatter:on
 
         assertThat(schema.getWarnings()).isEmpty();
-        assertThat(schema.getDITStructureRulesWithName("testAllowATRequiredByDCR")).isNotNull();
         assertThat(schema.getDITStructureRule(999014).getDescription()).isEqualTo(
                 "A short description");
         assertThat(schema.getDITStructureRule(999014).getNameOrRuleID()).isEqualTo(
@@ -1569,7 +1569,7 @@
         // @formatter:on
 
         assertThat(schema.getWarnings()).isEmpty();
-        assertThat(schema.getMatchingRuleUsesWithName("bitStringMatch")).isNotEmpty();
+        assertThat(schema.getMatchingRuleUse("bitStringMatch")).isNotNull();
         assertThat(schema.getMatchingRuleUses().size()).isEqualTo(1);
 
         for (MatchingRuleUse o : schema.getMatchingRuleUses()) {
@@ -1636,7 +1636,7 @@
         // @formatter:on
 
         assertThat(schema.getWarnings()).isEmpty();
-        assertThat(schema.getNameFormsWithName("testViolatesSingleValuedNameForm")).isNotNull();
+        assertThat(schema.getNameForm("testViolatesSingleValuedNameForm")).isNotNull();
         for (NameForm o : schema.getNameForms()) {
             assertThat(o.getNameOrOID()).isEqualTo("testViolatesSingleValuedNameForm");
             assertThat(o.getOID()).isEqualTo("testviolatessinglevaluednameform-oid");

--
Gitblit v1.10.0