From 19004a003b3e4387de43f8c399971187156f3d54 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 30 May 2016 10:43:11 +0000
Subject: [PATCH] OPENDJ-2987 Remove object class parsing in ObjectClassSyntax class - now responsability of Schema class

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java |   89 ++++++++++++++++++++++----------------------
 1 files changed, 44 insertions(+), 45 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
index f2f2874..2f59cf4 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/SchemaBackend.java
@@ -16,6 +16,7 @@
  */
 package org.opends.server.backends;
 
+import static org.forgerock.opendj.ldap.ResultCode.*;
 import static org.forgerock.util.Reject.*;
 import static org.opends.messages.BackendMessages.*;
 import static org.opends.messages.ConfigMessages.*;
@@ -48,6 +49,7 @@
 import java.util.TreeSet;
 
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageDescriptor.Arg2;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.config.server.ConfigChangeResult;
 import org.forgerock.opendj.config.server.ConfigException;
@@ -85,7 +87,6 @@
 import org.opends.server.schema.DITStructureRuleSyntax;
 import org.opends.server.schema.GeneralizedTimeSyntax;
 import org.opends.server.schema.NameFormSyntax;
-import org.opends.server.schema.ObjectClassSyntax;
 import org.opends.server.schema.ServerSchemaElement;
 import org.opends.server.schema.SomeSchemaElement;
 import org.opends.server.types.Attribute;
@@ -762,22 +763,8 @@
           {
             for (ByteString v : a)
             {
-              ObjectClass oc;
-              try
-              {
-                oc = ObjectClassSyntax.decodeObjectClass(v, newSchema, false);
-              }
-              catch (DirectoryException de)
-              {
-                logger.traceException(de);
-
-                LocalizableMessage message = ERR_SCHEMA_MODIFY_CANNOT_DECODE_OBJECTCLASS.
-                    get(v, de.getMessageObject());
-                throw new DirectoryException(
-                    ResultCode.INVALID_ATTRIBUTE_SYNTAX, message, de);
-              }
-
-              addObjectClass(oc, newSchema, modifiedSchemaFiles);
+              ObjectClass objectClass = newSchema.parseObjectClass(v.toString());
+              addObjectClass(objectClass, newSchema, modifiedSchemaFiles);
             }
           }
           else if (at.equals(nameFormsType))
@@ -900,21 +887,7 @@
           {
             for (ByteString v : a)
             {
-              ObjectClass oc;
-              try
-              {
-                oc = ObjectClassSyntax.decodeObjectClass(v, newSchema, false);
-              }
-              catch (DirectoryException de)
-              {
-                logger.traceException(de);
-
-                LocalizableMessage message = ERR_SCHEMA_MODIFY_CANNOT_DECODE_OBJECTCLASS.
-                    get(v, de.getMessageObject());
-                throw new DirectoryException(
-                    ResultCode.INVALID_ATTRIBUTE_SYNTAX, message, de);
-              }
-
+              ObjectClass oc = newSchema.parseObjectClass(v.toString());
               removeObjectClass(oc, newSchema, mods, pos, modifiedSchemaFiles);
             }
           }
@@ -1194,7 +1167,7 @@
       String schemaFile = replaceExistingSchemaElement(
           modifiedSchemaFiles, new SomeSchemaElement(attributeType), new SomeSchemaElement(existingType));
       schema.registerAttributeType(attributeType, schemaFile, false);
-      schema.rebuildDependentElements(new SomeSchemaElement(existingType));
+      schema.rebuildDependentElements(existingType);
     }
   }
 
@@ -1545,15 +1518,14 @@
     // Otherwise, we're replacing an existing one.
     if (existingClass.isPlaceHolder())
     {
-      schema.registerObjectClass(objectClass, false);
-      addNewSchemaElement(modifiedSchemaFiles, objectClass);
+      String schemaFile = addNewSchemaElement(modifiedSchemaFiles, new SomeSchemaElement(objectClass));
+      schema.registerObjectClass(objectClass, schemaFile, false);
     }
     else
     {
-      schema.deregisterObjectClass(existingClass);
-      schema.registerObjectClass(objectClass, false);
-      schema.rebuildDependentElements(existingClass);
-      replaceExistingSchemaElement(modifiedSchemaFiles, objectClass, existingClass);
+      final String schemaFile = replaceExistingSchemaElement(
+          modifiedSchemaFiles, new SomeSchemaElement(objectClass), new SomeSchemaElement(existingClass));
+      schema.replaceObjectClass(objectClass, existingClass, schemaFile);
     }
   }
 
@@ -1618,7 +1590,7 @@
         ObjectClass oc;
         try
         {
-          oc = ObjectClassSyntax.decodeObjectClass(v, schema, true);
+          oc = schema.parseObjectClass(v.toString());
         }
         catch (DirectoryException de)
         {
@@ -3448,7 +3420,7 @@
       {
         // It IS important here to allow the unknown elements that could
         // appear in the new config schema.
-        ObjectClass newObjectClass = ObjectClassSyntax.decodeObjectClass(v, newSchema, true);
+        ObjectClass newObjectClass = newSchema.parseObjectClass(v.toString());
         String schemaFile = getSchemaFile(newObjectClass);
         if (CONFIG_SCHEMA_ELEMENTS_FILE.equals(schemaFile))
         {
@@ -3458,10 +3430,8 @@
           continue;
         }
 
-        // Now we know we are not in the config schema, let's check
-        // the unknown elements ... sadly but simply by redoing the
-        // whole decoding.
-        newObjectClass = ObjectClassSyntax.decodeObjectClass(v, newSchema, false);
+        // Now we know we are not in the config schema, let's check the unknown elements ...
+        validateNoUnknownElements(newObjectClass);
         oidList.add(newObjectClass.getOID());
         try
         {
@@ -3517,6 +3487,35 @@
     }
   }
 
+  private void validateNoUnknownElements(ObjectClass oc) throws DirectoryException
+  {
+    validateNoUnknownElements(oc.getDeclaredOptionalAttributes(), oc.getOID(),
+        WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_OPTIONAL_ATTR);
+    validateNoUnknownElements(oc.getDeclaredRequiredAttributes(), oc.getOID(),
+        WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_REQUIRED_ATTR);
+    for (ObjectClass superiorClass : oc.getSuperiorClasses())
+    {
+      if (superiorClass.isPlaceHolder())
+      {
+        LocalizableMessage message =
+            WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_SUPERIOR_CLASS.get(oc.getOID(), superiorClass.getOID());
+        throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message);
+      }
+    }
+  }
+
+  private void validateNoUnknownElements(Set<AttributeType> attributeTypes, String oid, Arg2<Object, Object> msg)
+      throws DirectoryException
+  {
+    for (AttributeType attributeType : attributeTypes)
+    {
+      if (attributeType.isPlaceHolder())
+      {
+        throw new DirectoryException(CONSTRAINT_VIOLATION, msg.get(oid, attributeType.getOID()));
+      }
+    }
+  }
+
   @Override
   public void createBackup(BackupConfig backupConfig) throws DirectoryException
   {

--
Gitblit v1.10.0