From 383ff591182ce9730728c938d9b86e95f86ad676 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 09 Sep 2016 09:45:24 +0000
Subject: [PATCH] OPENDJ-3089 Update SchemaLoader and RemoteSchemaLoader to use SchemaHandler and SDK Schema

---
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java |   82 ++++++++++++-----------------------------
 1 files changed, 24 insertions(+), 58 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
index cc59818..48f1e2e 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
@@ -21,11 +21,8 @@
 import static org.forgerock.opendj.ldap.schema.CoreSchema.*;
 import static org.forgerock.opendj.ldap.schema.Schema.*;
 import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.config.ConfigConstants.ATTR_ATTRIBUTE_TYPES;
-import static org.opends.server.config.ConfigConstants.ATTR_LDAP_SYNTAXES;
 import static org.opends.server.schema.SchemaConstants.*;
 
-import java.util.Arrays;
 import java.util.Iterator;
 
 import org.forgerock.opendj.config.server.ConfigException;
@@ -37,20 +34,15 @@
 import org.forgerock.opendj.ldap.LdapException;
 import org.forgerock.opendj.ldap.requests.SearchRequest;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
-import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.forgerock.opendj.ldap.schema.MatchingRuleImpl;
+import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.schema.SchemaBuilder;
 import org.opends.admin.ads.util.ConnectionWrapper;
-import org.opends.server.api.AttributeSyntax;
-import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ServerContext;
 import org.opends.server.replication.plugin.HistoricalCsnOrderingMatchingRuleImpl;
 import org.opends.server.schema.AciSyntax;
 import org.opends.server.schema.SubtreeSpecificationSyntax;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
-import org.opends.server.types.Schema;
-import org.opends.server.types.Schema.SchemaUpdater;
 
 /** Class used to retrieve the schema from the schema files. */
 public class RemoteSchemaLoader extends SchemaLoader
@@ -70,10 +62,11 @@
   }
 
   /**
-   * Reads the schema.
+   * Reads and returns the schema.
    *
    * @param connWrapper
    *          the connection to be used to load the schema.
+   * @return the schema
    * @throws LdapException
    *           if an error occurs reading the schema.
    * @throws DirectoryException
@@ -83,72 +76,45 @@
    * @throws ConfigException
    *           if an error occurs loading the configuration required to use the schema classes.
    */
-  public void readSchema(ConnectionWrapper connWrapper) throws LdapException, DirectoryException,
+  public Schema readSchema(ConnectionWrapper connWrapper) throws LdapException, DirectoryException,
       InitializationException, ConfigException
   {
-    schema = getBaseSchema();
+    Schema baseSchema = getBaseSchema();
+    SchemaBuilder schemaBuilder = new SchemaBuilder(baseSchema);
+
     // Add missing matching rules and attribute syntaxes to base schema to allow read of remote server schema
     // (see OPENDJ-1122 for more details)
-    addMissingSyntaxesToBaseSchema(new AciSyntax(), new SubtreeSpecificationSyntax());
-    addMissingMatchingRuleToBaseSchema("1.3.6.1.4.1.26027.1.4.4", "historicalCsnOrderingMatch",
+    AciSyntax.addAciSyntax(schemaBuilder);
+    SubtreeSpecificationSyntax.addSubtreeSpecificationSyntax(schemaBuilder);
+    addMatchingRuleIfMissing(schemaBuilder, baseSchema, "1.3.6.1.4.1.26027.1.4.4", "historicalCsnOrderingMatch",
         "1.3.6.1.4.1.1466.115.121.1.40", new HistoricalCsnOrderingMatchingRuleImpl());
 
+    // Add remote schema entry
     final SearchRequest request = newSearchRequest(
         DN.valueOf(DN_DEFAULT_SCHEMA_ROOT), BASE_OBJECT, Filter.alwaysTrue(),
         ATTR_LDAP_SYNTAXES, ATTR_ATTRIBUTE_TYPES, ATTR_OBJECTCLASSES);
     final SearchResultEntry entry = connWrapper.getConnection().searchSingleEntry(request);
-
     removeNonOpenDjOrOpenDsSyntaxes(entry);
-    schema.updateSchema(new SchemaUpdater()
-    {
-      @Override
-      public org.forgerock.opendj.ldap.schema.Schema update(SchemaBuilder builder)
-      {
-        builder.addSchema(entry, true);
-        return builder.toSchema();
-      }
-    });
+    schemaBuilder.addSchema(entry, true);
+
+    return buildSchema(schemaBuilder);
+
   }
 
-  private void addMissingSyntaxesToBaseSchema(final AttributeSyntax<?>... syntaxes)
-      throws DirectoryException, InitializationException, ConfigException
+  private void addMatchingRuleIfMissing(SchemaBuilder schemaBuilder, Schema baseSchema, final String oid,
+      final String name, final String syntaxOID, final MatchingRuleImpl impl) throws InitializationException,
+      ConfigException, DirectoryException
   {
-    for (AttributeSyntax<?> syntax : syntaxes)
+    if (!baseSchema.hasMatchingRule(name))
     {
-      final ServerContext serverContext = DirectoryServer.getInstance().getServerContext();
-      final org.forgerock.opendj.ldap.schema.Schema schemaNG = serverContext.getSchemaNG();
-      if (!schemaNG.hasSyntax(syntax.getOID()))
-      {
-        syntax.initializeSyntax(null, serverContext);
-      }
-      schema.registerSyntax(syntax.getSDKSyntax(schemaNG), true);
+      schemaBuilder.buildMatchingRule(oid)
+        .names(name)
+        .syntaxOID(syntaxOID)
+        .implementation(impl)
+        .addToSchema();
     }
   }
 
-  private void addMissingMatchingRuleToBaseSchema(final String oid, final String name, final String syntaxOID,
-      final MatchingRuleImpl impl)
-      throws InitializationException, ConfigException, DirectoryException
-  {
-    final org.forgerock.opendj.ldap.schema.Schema schemaNG = schema.getSchemaNG();
-    final MatchingRule matchingRule;
-    if (schemaNG.hasMatchingRule(name))
-    {
-      matchingRule = schemaNG.getMatchingRule(name);
-    }
-    else
-    {
-      matchingRule = new SchemaBuilder(schemaNG)
-          .buildMatchingRule(oid)
-            .names(name)
-            .syntaxOID(syntaxOID)
-            .implementation(impl)
-          .addToSchema()
-          .toSchema()
-          .getMatchingRule(oid);
-    }
-    schema.registerMatchingRules(Arrays.asList(matchingRule), true);
-  }
-
   private void removeNonOpenDjOrOpenDsSyntaxes(final SearchResultEntry entry) throws DirectoryException
   {
     Attribute attribute = entry.getAttribute(AttributeDescription.create(getLDAPSyntaxesAttributeType()));

--
Gitblit v1.10.0