From 4cb8262e95fde77e6a0d2c84f1aa118e3b1ee850 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Thu, 06 Nov 2014 14:50:48 +0000
Subject: [PATCH] OPENDJ-1591 CR-5092 Switch server to SDK matching rules

---
 opendj3-server-dev/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java |  175 ++++++---------------------------------------------------
 1 files changed, 20 insertions(+), 155 deletions(-)

diff --git a/opendj3-server-dev/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java b/opendj3-server-dev/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java
index feb827c..c892cfd 100644
--- a/opendj3-server-dev/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java
+++ b/opendj3-server-dev/src/server/org/opends/server/schema/LDAPSyntaxDescriptionSyntax.java
@@ -27,9 +27,8 @@
 package org.opends.server.schema;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -41,11 +40,12 @@
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DecodeException;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.std.server.AttributeSyntaxCfg;
 import org.opends.server.api.AttributeSyntax;
-import org.opends.server.api.MatchingRule;
+import org.forgerock.opendj.ldap.schema.CoreSchema;
+import org.forgerock.opendj.ldap.schema.MatchingRule;
+import org.forgerock.opendj.ldap.schema.SchemaBuilder;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.CommonSchemaElements;
 import org.opends.server.types.DirectoryException;
@@ -54,8 +54,6 @@
 
 import static org.opends.messages.SchemaMessages.*;
 import static org.opends.server.schema.SchemaConstants.*;
-import static com.forgerock.opendj.util.StringPrepProfile.*;
-import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
 /**
@@ -68,9 +66,6 @@
 {
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
-
-
-
   // The default equality matching rule for this syntax.
   private MatchingRule defaultEqualityMatchingRule;
 
@@ -1438,9 +1433,23 @@
     @Override
     public MatchingRule getOrderingMatchingRule()
     {
-      if(orderingMatchingRule == null)
+      if (orderingMatchingRule == null)
       {
-        orderingMatchingRule = new EnumOrderingMatchingRule(this, oid);
+        /*
+         * It is not sufficient to build the enum matching rule alone here, we
+         * need to build enum syntax as well otherwise the schema is not valid. The
+         * enum matching rule is automatically built with the enum syntax by the
+         * builder.
+         */
+        String[] enumerations = new String[entries.size()];
+        Iterator<ByteSequence> it = entries.iterator();
+        for (int i=0; i < entries.size(); i++)
+        {
+          enumerations[i] = it.next().toString();
+        }
+        SchemaBuilder builder = new SchemaBuilder(CoreSchema.getInstance()).addEnumerationSyntax(
+            oid, getDescription(), true, enumerations);
+        orderingMatchingRule = builder.toSchema().getMatchingRule(OMR_OID_GENERIC_ENUM + "." + oid);
         try
         {
           DirectoryServer.registerMatchingRule(orderingMatchingRule, false);
@@ -1496,149 +1505,5 @@
       return approximateMatchingRule;
     }
 
-
-
-    //Returns the associated data structure containing the enum
-    //values.
-    private LinkedList<ByteSequence> getEnumValues()
-    {
-      return entries;
-    }
-
-
-
-    /**
-      * Implementation of an Enum Ordering matching rule.
-      */
-    private final class EnumOrderingMatchingRule
-       extends AbstractOrderingMatchingRule
-    {
-      //The enumeration syntax instance.
-      private EnumSyntax syntax;
-
-
-      //The oid of the matching rule.
-      private String oid;
-
-
-      //The name of the matching rule.
-      private String name;
-
-
-
-      static final long serialVersionUID = -2624642267131703408L;
-
-
-      /**
-       * Creates a new instance.
-       */
-      private EnumOrderingMatchingRule(EnumSyntax syntax,String oid)
-      {
-        super();
-        this.syntax = syntax;
-        this.oid = OMR_OID_GENERIC_ENUM + "." + oid;
-        this.name = OMR_GENERIC_ENUM_NAME + oid;
-      }
-
-
-
-      /**
-      * {@inheritDoc}
-      */
-      @Override
-      public int compare(byte[] arg0, byte[] arg1)
-      {
-        return compareValues(ByteString.wrap(arg0),ByteString.wrap(arg1));
-      }
-
-
-
-      /**
-      * {@inheritDoc}
-      */
-      @Override
-      public int compareValues(ByteSequence value1, ByteSequence value2)
-      {
-        LinkedList<ByteSequence> enumValues = syntax.getEnumValues();
-        return enumValues.indexOf(value1) - enumValues.indexOf(value2);
-      }
-
-
-
-      /**
-       * {@inheritDoc}
-       */
-      @Override
-      public Collection<String> getNames()
-      {
-        return Collections.singleton(name);
-      }
-
-
-
-       /**
-       * {@inheritDoc}
-       */
-      @Override
-      public String getOID()
-      {
-        return oid;
-      }
-
-
-
-      /**
-       * {@inheritDoc}
-       */
-      @Override
-      public String getSyntaxOID()
-      {
-        return SYNTAX_DIRECTORY_STRING_OID;
-      }
-
-
-
-      /**
-       * {@inheritDoc}
-       */
-      @Override
-      public ByteString normalizeAttributeValue(ByteSequence value)
-              throws DecodeException
-      {
-        StringBuilder buffer = new StringBuilder();
-        prepareUnicode(buffer, value, TRIM, CASE_FOLD);
-
-        int bufferLength = buffer.length();
-        if (bufferLength == 0)
-        {
-          if (value.length() > 0)
-          {
-            // This should only happen if the value is composed entirely
-            // of spaces. In that case, the normalized value is a single space.
-            return SINGLE_SPACE_VALUE;
-          }
-          else
-          {
-            // The value is empty, so it is already normalized.
-            return ByteString.empty();
-          }
-        }
-
-
-        // Replace any consecutive spaces with a single space.
-        for (int pos = bufferLength-1; pos > 0; pos--)
-        {
-          if (buffer.charAt(pos) == ' ')
-          {
-            if (buffer.charAt(pos-1) == ' ')
-            {
-              buffer.delete(pos, pos+1);
-            }
-          }
-        }
-
-        return ByteString.valueOf(buffer.toString());
-      }
-    }
   }
 }

--
Gitblit v1.10.0