From 5712b9b5e1e139088d0e62e30213d8dabb67f668 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 07 Mar 2014 13:19:57 +0000
Subject: [PATCH] OPENDJ-1308 Migrate schema support

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleIndexer.java                                |   30 ---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java                          |    4 
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EqualityIndexer.java                         |   42 +++-
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java                      |   22 +-
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java                  |  135 ++++++----------
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java                  |   86 +++-------
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java                     |   20 ++
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/OrderingIndexer.java                         |   22 +-
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java                        |   69 ++------
 10 files changed, 161 insertions(+), 271 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleIndexer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleIndexer.java
index 3196adf..aeabefc 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleIndexer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/api/ExtensibleIndexer.java
@@ -26,16 +26,7 @@
  */
 package org.opends.server.api;
 
-import java.util.Collection;
-import java.util.Set;
-
-import org.forgerock.opendj.ldap.ByteSequence;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.DecodeException;
-import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.spi.Indexer;
-import org.forgerock.opendj.ldap.spi.IndexingOptions;
-import org.opends.server.types.AttributeValue;
 
 /**
  * This class is registered with a Backend and it provides call- backs
@@ -63,25 +54,4 @@
    */
   public abstract String getExtensibleIndexID();
 
-
-
-  /**
-   * Generates the set of index keys for an attribute.
-   *
-   * @param value
-   *          The attribute value for which keys are required.
-   * @param keys
-   *          The set into which the generated keys will be inserted.
-   */
-  public abstract void getKeys(AttributeValue value, Set<byte[]> keys);
-
-  /** {@inheritDoc} */
-  @Override
-  public void createKeys(Schema schema, ByteSequence value,
-      IndexingOptions options, Collection<ByteString> keys)
-      throws DecodeException
-  {
-    throw new RuntimeException("Not implemented yet");
-  }
-
 }
\ No newline at end of file
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java
index 6d4884d..331ca37 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java
@@ -26,21 +26,22 @@
  */
 package org.opends.server.backends.jeb;
 
-import java.util.Set;
+import java.util.Collection;
 
-import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.schema.Schema;
+import org.forgerock.opendj.ldap.spi.IndexingOptions;
 import org.opends.server.api.ApproximateMatchingRule;
 import org.opends.server.api.ExtensibleIndexer;
 import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
 
 /**
  * An implementation of an Indexer for attribute approximate matching.
  */
 public class ApproximateIndexer extends ExtensibleIndexer
 {
-  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
   /**
    * The attribute type approximate matching rule.
@@ -75,16 +76,11 @@
 
   /** {@inheritDoc} */
   @Override
-  public void getKeys(AttributeValue value, Set<byte[]> keys)
+  public void createKeys(Schema schema, ByteSequence value,
+      IndexingOptions options, Collection<ByteString> keys)
+      throws DecodeException
   {
-    try
-    {
-      keys.add(approximateRule.normalizeAttributeValue(value.getValue()).toByteArray());
-    }
-    catch (DecodeException e)
-    {
-      logger.traceException(e);
-    }
+    keys.add(approximateRule.normalizeAttributeValue(value));
   }
 
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index 841d35d..db235d3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -155,7 +155,7 @@
             LocalDBIndexCfgDefn.IndexType.EQUALITY))
     {
       this.equalityIndex = buildExtIndex(
-          name, attrType, attrType.getEqualityMatchingRule(), new EqualityIndexer());
+          name, attrType, attrType.getEqualityMatchingRule(), new EqualityIndexer(attrType));
     }
 
     if (indexConfig.getIndexType().contains(
@@ -1591,7 +1591,7 @@
       {
         if (equalityIndex == null)
         {
-          EqualityIndexer indexer = new EqualityIndexer();
+          EqualityIndexer indexer = new EqualityIndexer(attrType);
           Indexer extIndexer = new JEExtensibleIndexer(attrType, attrType.getEqualityMatchingRule(), indexer);
           equalityIndex = openNewIndex(name, extIndexer, indexer, adminActionRequired, messages);
         }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EqualityIndexer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
index cc287fd..fe443a1 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
@@ -26,19 +26,38 @@
  */
 package org.opends.server.backends.jeb;
 
-import java.util.Set;
+import java.util.Collection;
 
-import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.schema.Schema;
+import org.forgerock.opendj.ldap.spi.IndexingOptions;
+import org.opends.server.api.EqualityMatchingRule;
 import org.opends.server.api.ExtensibleIndexer;
-import org.opends.server.types.AttributeValue;
-import org.opends.server.types.DirectoryException;
+import org.opends.server.types.AttributeType;
 
 /**
  * An implementation of an Indexer for attribute equality.
  */
 public class EqualityIndexer extends ExtensibleIndexer
 {
-  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+
+  /**
+   * The attribute type equality matching rule which is also the
+   * comparator for the index keys generated by this class.
+   */
+  private EqualityMatchingRule equalityRule;
+
+  /**
+   * Create a new attribute equality indexer for the given index configuration.
+   * @param attributeType The attribute type for which an indexer is
+   * required.
+   */
+  public EqualityIndexer(AttributeType attributeType)
+  {
+    this.equalityRule = attributeType.getEqualityMatchingRule();
+  }
 
   /** {@inheritDoc} */
   @Override
@@ -57,16 +76,11 @@
 
   /** {@inheritDoc} */
   @Override
-  public void getKeys(AttributeValue value, Set<byte[]> keys)
+  public void createKeys(Schema schema, ByteSequence value,
+      IndexingOptions options, Collection<ByteString> keys)
+      throws DecodeException
   {
-    try
-    {
-      keys.add(value.getNormalizedValue().toByteArray());
-    }
-    catch (DirectoryException e)
-    {
-      logger.traceException(e);
-    }
+    keys.add(equalityRule.normalizeAttributeValue(value));
   }
 
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
index 3fa54eb..a3e213f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
@@ -31,7 +31,11 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.api.ExtensibleIndexer;
 import org.opends.server.api.MatchingRule;
 import org.opends.server.types.AttributeType;
@@ -45,6 +49,8 @@
  */
 public final class JEExtensibleIndexer extends Indexer
 {
+  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+
   /**
    * The comparator for index keys generated by this class.
    */
@@ -173,16 +179,28 @@
   {
     if (attrList == null) return;
 
+    Set<ByteString> keysBS = new TreeSet<ByteString>();
     for (Attribute attr : attrList)
     {
       if (!attr.isVirtual())
       {
         for (AttributeValue value : attr)
         {
-          extensibleIndexer.getKeys(value, keys);
+          try
+          {
+            extensibleIndexer.createKeys(null, value.getValue(), null, keysBS);
+          }
+          catch (DecodeException e)
+          {
+            logger.traceException(e);
+          }
         }
       }
     }
+    for (ByteString key : keysBS)
+    {
+      keys.add(key.toByteArray());
+    }
   }
 
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/OrderingIndexer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
index a55e82e..7f2f79f 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
@@ -26,21 +26,22 @@
  */
 package org.opends.server.backends.jeb;
 
-import java.util.Set;
+import java.util.Collection;
 
-import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.schema.Schema;
+import org.forgerock.opendj.ldap.spi.IndexingOptions;
 import org.opends.server.api.ExtensibleIndexer;
 import org.opends.server.api.OrderingMatchingRule;
 import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
 
 /**
  * An implementation of an Indexer for attribute ordering.
  */
 public class OrderingIndexer extends ExtensibleIndexer
 {
-  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
   /**
    * The attribute type ordering matching rule which is also the
@@ -76,16 +77,11 @@
 
   /** {@inheritDoc} */
   @Override
-  public void getKeys(AttributeValue value, Set<byte[]> keys)
+  public void createKeys(Schema schema, ByteSequence value,
+      IndexingOptions options, Collection<ByteString> keys)
+      throws DecodeException
   {
-    try
-    {
-      keys.add(orderingRule.normalizeAttributeValue(value.getValue()).toByteArray());
-    }
-    catch (DecodeException e)
-    {
-      logger.traceException(e);
-    }
+    keys.add(orderingRule.normalizeAttributeValue(value));
   }
 
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
index 247aa80..9d0180e 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -26,22 +26,22 @@
  */
 package org.opends.server.backends.jeb;
 
-import java.util.Set;
+import java.util.Collection;
 
-import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.spi.IndexingOptions;
 import org.opends.server.api.ExtensibleIndexer;
 import org.opends.server.api.SubstringMatchingRule;
 import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
 
 /**
  * An implementation of an Indexer for attribute substrings.
  */
 public class SubstringIndexer extends ExtensibleIndexer
 {
-  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
   private SubstringMatchingRule substringRule;
   private IndexingOptions indexingOptions;
@@ -76,54 +76,27 @@
     return "substring";
   }
 
-  /**
-   * Decompose an attribute value into a set of substring index keys.
-   * The ID of the entry containing this value should be inserted
-   * into the list of each of these keys.
-   *
-   * @param attrValue A byte array containing the normalized attribute value
-   * @param keys A set into which the keys will be inserted.
-   */
+  /** {@inheritDoc} */
   @Override
-  public void getKeys(AttributeValue attrValue, Set<byte[]> keys)
-  { // TODO merge with ExtensibleIndexer.getKeys(attrValue, keys);
-    try
-    {
-      byte[] value = substringRule.normalizeAttributeValue(attrValue.getValue()).toByteArray();
+  public void createKeys(Schema schema, ByteSequence value,
+      IndexingOptions options, Collection<ByteString> keys)
+      throws DecodeException
+  { // FIXME Code similar to
+    // AbstractSubstringMatchingRuleImpl.SubstringIndexer.createKeys()
+    ByteString normValue = substringRule.normalizeAttributeValue(value);
+    final int substringKeySize = indexingOptions.substringKeySize();
 
-      // Example: The value is ABCDE and the substring length is 3.
-      // We produce the keys ABC BCD CDE DE E
-      // To find values containing a short substring such as DE,
-      // iterate through keys with prefix DE. To find values
-      // containing a longer substring such as BCDE, read keys
-      // BCD and CDE.
-      final int substringKeySize = indexingOptions.substringKeySize();
-      for (int i = 0, remain = value.length; remain > 0; i++, remain--)
-      {
-        int len = Math.min(substringKeySize, remain);
-        keys.add(makeSubstringKey(value, i, len));
-      }
-    }
-    catch (DecodeException e)
+    // Example: The value is ABCDE and the substring length is 3.
+    // We produce the keys ABC BCD CDE DE E
+    // To find values containing a short substring such as DE,
+    // iterate through keys with prefix DE. To find values
+    // containing a longer substring such as BCDE, read keys
+    // BCD and CDE.
+    for (int i = 0, remain = normValue.length(); remain > 0; i++, remain--)
     {
-      logger.traceException(e);
+      int len = Math.min(substringKeySize, remain);
+      keys.add(normValue.subSequence(i, i + len));
     }
   }
 
-  /**
-   * Makes a byte array representing a substring index key for
-   * one substring of a value.
-   *
-   * @param bytes The byte array containing the value
-   * @param pos The starting position of the substring
-   * @param len The length of the substring
-   * @return A byte array containing a substring key
-   */
-  private byte[] makeSubstringKey(byte[] bytes, int pos, int len)
-  {
-    byte[] keyBytes = new byte[len];
-    System.arraycopy(bytes, pos, keyBytes, 0, len);
-    return keyBytes;
-  }
-
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java
index a778a52..bf4c6aa 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/CollationMatchingRuleFactory.java
@@ -33,21 +33,16 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.forgerock.opendj.ldap.ByteSequence;
-import org.forgerock.opendj.ldap.ByteString;
-import org.forgerock.opendj.ldap.ConditionResult;
-import org.forgerock.opendj.ldap.DecodeException;
-import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.*;
+import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
 import org.forgerock.opendj.ldap.spi.IndexingOptions;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.std.meta.CollationMatchingRuleCfgDefn.MatchingRuleType;
 import org.opends.server.admin.std.server.CollationMatchingRuleCfg;
 import org.opends.server.api.*;
-import org.opends.server.backends.jeb.AttributeIndex;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.types.AttributeValue;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
@@ -1569,16 +1564,15 @@
      *          The starting position of the substring.
      * @param len
      *          The length of the substring.
-     * @return A byte array containing a substring key.
+     * @return A byte string containing a substring key.
      */
-    private byte[] makeSubstringKey(String value, int pos, int len)
+    private ByteString makeSubstringKey(String value, int pos, int len)
     {
       String sub = value.substring(pos, pos + len);
       CollationKey col = collator.getCollationKey(sub);
-      byte[] origKey = col.toByteArray();
-      byte[] newKey = new byte[origKey.length - 4];
-      System.arraycopy(origKey, 0, newKey, 0, newKey.length);
-      return newKey;
+      byte[] key = col.toByteArray();
+      // truncate the key
+      return ByteString.wrap(key).subSequence(0, key.length - 4);
     }
 
 
@@ -1593,34 +1587,36 @@
      */
     private <T> T matchInitialSubstring(String value,
         IndexQueryFactory<T> factory)
+    {
+      // Use the shared equality indexer.
+      return createRangeMatchQuery(value, factory, this.indexer);
+    }
+
+    private <T> T createRangeMatchQuery(String value,
+        IndexQueryFactory<T> factory, ExtensibleIndexer indexer)
     { // FIXME Code similar to
       // AbstractSubstringMatchingRuleImpl.DefaultSubstringAssertion.rangeMatch()
-      byte[] lower = makeSubstringKey(value, 0, value.length());
-      byte[] upper = new byte[lower.length];
-      System.arraycopy(lower, 0, upper, 0, lower.length);
-
-      for (int i = upper.length - 1; i >= 0; i--)
+      ByteString lower = makeSubstringKey(value, 0, value.length());
+      ByteStringBuilder upper = new ByteStringBuilder(lower);
+      for (int i = upper.length() - 1; i >= 0; i--)
       {
-        if (upper[i] == 0xFF)
+        if (upper.byteAt(i) == 0xFF)
         {
           // We have to carry the overflow to the more significant byte.
-          upper[i] = 0;
+          upper.setByte(i, (byte) 0);
         }
         else
         {
           // No overflow, we can stop.
-          upper[i] = (byte) (upper[i] + 1);
+          upper.setByte(i, (byte) (upper.byteAt(i) + 1));
           break;
         }
       }
-      // Use the shared equality indexer.
-      return factory.createRangeMatchQuery(indexer
-          .getExtensibleIndexID(), ByteString.wrap(lower), ByteString
-          .wrap(upper), true, false);
+      // Read the range: lower <= keys < upper.
+      return factory.createRangeMatchQuery(
+          indexer.getExtensibleIndexID(), lower, upper, true, false);
     }
 
-
-
     /**
      * Retrieves the Index Records that might contain a given substring.
      *
@@ -1636,58 +1632,29 @@
         IndexQueryFactory<T> factory)
     { // FIXME Code similar to
       // AbstractSubstringMatchingRuleImpl.DefaultSubstringAssertion.substringMatch()
-      T intersectionQuery;
       int substrLength = subIndexer.getSubstringLength();
-
       if (value.length() < substrLength)
       {
-        byte[] lower = makeSubstringKey(value, 0, value.length());
-        byte[] upper = makeSubstringKey(value, 0, value.length());
-        for (int i = upper.length - 1; i >= 0; i--)
-        {
-          if (upper[i] == 0xFF)
-          {
-            // We have to carry the overflow to the more significant
-            // byte.
-            upper[i] = 0;
-          }
-          else
-          {
-            // No overflow, we can stop.
-            upper[i] = (byte) (upper[i] + 1);
-            break;
-          }
-        }
-        // Read the range: lower <= keys < upper.
-        intersectionQuery =
-            factory.createRangeMatchQuery(subIndexer
-                .getExtensibleIndexID(), ByteString.wrap(lower),
-                ByteString.wrap(upper), true, false);
+        return createRangeMatchQuery(value, factory, subIndexer);
       }
-      else
+
+      List<T> queryList = new ArrayList<T>();
+      Set<ByteString> set = new TreeSet<ByteString>();
+      for (int first = 0, last = substrLength;
+           last <= value.length();
+           first++, last++)
       {
-        List<T> queryList = new ArrayList<T>();
-        Set<byte[]> set =
-            new TreeSet<byte[]>(new AttributeIndex.KeyComparator());
-        for (int first = 0, last = substrLength;
-             last <= value.length();
-             first++, last++)
-        {
-          set.add(makeSubstringKey(value, first, substrLength));
-        }
-
-        for (byte[] keyBytes : set)
-        {
-          queryList.add(factory.createExactMatchQuery(
-              subIndexer.getExtensibleIndexID(), ByteString.wrap(keyBytes)));
-        }
-        intersectionQuery = factory.createIntersectionQuery(queryList);
+        set.add(makeSubstringKey(value, first, substrLength));
       }
-      return intersectionQuery;
+
+      for (ByteString keyBytes : set)
+      {
+        queryList.add(factory.createExactMatchQuery(
+            subIndexer.getExtensibleIndexID(), keyBytes));
+      }
+      return factory.createIntersectionQuery(queryList);
     }
 
-
-
     /**
      * {@inheritDoc}
      */
@@ -2091,17 +2058,11 @@
      * {@inheritDoc}
      */
     @Override
-    public final void getKeys(AttributeValue value, Set<byte[]> keys)
+    public final void createKeys(Schema schema, ByteSequence value,
+        IndexingOptions options, Collection<ByteString> keys)
+        throws DecodeException
     {
-      try
-      {
-        ByteString key = matchingRule.normalizeAttributeValue(value.getValue());
-        keys.add(key.toByteArray());
-      }
-      catch (DecodeException e)
-      {
-        logger.traceException(e);
-      }
+      keys.add(matchingRule.normalizeAttributeValue(value));
     }
 
     /** {@inheritDoc} */
@@ -2148,15 +2109,15 @@
      * {@inheritDoc}
      */
     @Override
-    public void getKeys(AttributeValue attValue, Set<byte[]> keys)
-    { // TODO merge with ExtensibleIndexer.getKeys(attrValue, keys);
-      // TODO and with AbstractSubstringMatchingRuleImpl.SubstringIndexer.createKeys();
-      String value = attValue.toString();
+    public void createKeys(Schema schema, ByteSequence value,
+        IndexingOptions options, Collection<ByteString> keys)
+    { // TODO merge with AbstractSubstringMatchingRuleImpl.SubstringIndexer.createKeys();
+      String normValue = value.toString();
       int keyLength = substringLen;
-      for (int i = 0, remain = value.length(); remain > 0; i++, remain--)
+      for (int i = 0, remain = normValue.length(); remain > 0; i++, remain--)
       {
         int len = Math.min(keyLength, remain);
-        keys.add(matchingRule.makeSubstringKey(value, i, len));
+        keys.add(matchingRule.makeSubstringKey(normValue, i, len));
       }
     }
 
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java
index 7914dbb..b87a9a3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/schema/TimeBasedMatchingRuleFactory.java
@@ -38,13 +38,13 @@
 import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.forgerock.opendj.ldap.ConditionResult;
 import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.schema.Schema;
 import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
 import org.forgerock.opendj.ldap.spi.IndexingOptions;
 import org.opends.server.admin.std.server.MatchingRuleCfg;
 import org.opends.server.api.*;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
 import org.opends.server.util.StaticUtils;
@@ -89,20 +89,10 @@
 
   //Constants for generating keys.
   private static final char SECOND = 's';
-
-
   private static final char MINUTE = 'm';
-
-
   private static final char HOUR = 'h';
-
-
   private static final char MONTH = 'M';
-
-
   private static final char DATE = 'D';
-
-
   private static final char YEAR = 'Y';
 
 
@@ -619,17 +609,11 @@
      * {@inheritDoc}
      */
     @Override
-    public final void getKeys(AttributeValue value, Set<byte[]> keys)
+    public final void createKeys(Schema schema, ByteSequence value2,
+        IndexingOptions options, Collection<ByteString> keys)
+        throws DecodeException
     {
-      try
-      {
-        ByteString key = matchingRule.normalizeAttributeValue(value.getValue());
-        keys.add(key.toByteArray());
-      }
-      catch (DecodeException de)
-      {
-        //don't do anything.
-      }
+      keys.add(matchingRule.normalizeAttributeValue(value2));
     }
 
     /** {@inheritDoc} */
@@ -1108,7 +1092,7 @@
      * @param set
      *          A set into which the keys will be inserted.
      */
-    private void timeKeys(ByteString attributeValue, Set<byte[]> keys)
+    private void timeKeys(ByteSequence attributeValue, Collection<ByteString> keys)
     {
       long timeInMS = 0L;
       try
@@ -1124,46 +1108,23 @@
       //Build the information from the attribute value.
       GregorianCalendar cal = new GregorianCalendar(TIME_ZONE_UTC_OBJ);
       cal.setTimeInMillis(timeInMS);
-      int second = cal.get(Calendar.SECOND);
-      int minute = cal.get(Calendar.MINUTE);
-      int hour = cal.get(Calendar.HOUR_OF_DAY);
-      int date = cal.get(Calendar.DATE);
-      int month = cal.get(Calendar.MONTH);
-      int year = cal.get(Calendar.YEAR);
-
-      if (second >=0)
-      {
-        keys.add(getKey(second,SECOND).toByteArray());
-      }
-
-      if(minute >=0)
-      {
-        keys.add(getKey(minute,MINUTE).toByteArray());
-      }
-
-      if(hour >=0)
-      {
-        keys.add(getKey(hour,HOUR).toByteArray());
-      }
-      //Insert date.
-      if(date > 0)
-      {
-        keys.add(getKey(date,DATE).toByteArray());
-      }
-
-      //Insert month.
-      if(month >=0)
-      {
-        keys.add(getKey(month,MONTH).toByteArray());
-      }
-
-      if(year > 0)
-      {
-        keys.add(getKey(year,YEAR).toByteArray());
-      }
+      addKeyIfNotZero(keys, cal, Calendar.SECOND, SECOND);
+      addKeyIfNotZero(keys, cal, Calendar.MINUTE, MINUTE);
+      addKeyIfNotZero(keys, cal, Calendar.HOUR_OF_DAY, HOUR);
+      addKeyIfNotZero(keys, cal, Calendar.DATE, DATE);
+      addKeyIfNotZero(keys, cal, Calendar.MONTH, MONTH);
+      addKeyIfNotZero(keys, cal, Calendar.YEAR, YEAR);
     }
 
-
+    private void addKeyIfNotZero(Collection<ByteString> keys,
+        GregorianCalendar cal, int calField, char type)
+    {
+      int value = cal.get(calField);
+      if (value >= 0)
+      {
+        keys.add(getKey(value, type));
+      }
+    }
 
     private ByteString getKey(int value, char type)
     {
@@ -1205,9 +1166,10 @@
      * {@inheritDoc}
      */
     @Override
-    public void getKeys(AttributeValue value, Set<byte[]> keys)
+    public void createKeys(Schema schema, ByteSequence value,
+        IndexingOptions options, Collection<ByteString> keys)
     {
-      matchingRule.timeKeys(value.getValue(), keys);
+      matchingRule.timeKeys(value, keys);
     }
 
     /** {@inheritDoc} */
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
index bc22017..8b88953 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
@@ -870,7 +870,7 @@
   private Indexer newEqualityIndexer(AttributeIndex index)
   {
     AttributeType attrType = index.getAttributeType();
-    ExtensibleIndexer extIndexer = new EqualityIndexer();
+    ExtensibleIndexer extIndexer = new EqualityIndexer(index.getAttributeType());
     return new JEExtensibleIndexer(attrType, attrType.getSubstringMatchingRule(), extIndexer);
   }
 

--
Gitblit v1.10.0