mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

ludovicp
27.59.2010 668183d216ba6bcf49e361e5749ac8f2f9a2b780
Fix issue #4468. Now values in filters and indexes are normalized according to the MR used and not the equality MR.
5 files modified
128 ■■■■ changed files
opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java 15 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/controls/MatchedValuesFilter.java 13 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRule.java 11 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/types/AttributeBuilder.java 16 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/schema/AttributeTypeSyntaxTest.java 73 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -31,6 +31,7 @@
import org.opends.server.types.*;
import java.util.*;
import org.opends.server.api.SubstringMatchingRule;
/**
 * An implementation of an Indexer for attribute substrings.
@@ -161,18 +162,21 @@
                              Set<byte[]> keys)
  {
    if (attrList == null) return;
    for (Attribute attr : attrList)
    {
      if (attr.isVirtual())
      {
        continue;
      }
      //Get the substring matching rule.
      SubstringMatchingRule rule =
              attr.getAttributeType().getSubstringMatchingRule();
      for (AttributeValue value : attr)
      {
        try
        {
          byte[] normalizedBytes = value.getNormalizedValue().toByteArray();
          byte[] normalizedBytes = rule.normalizeValue(value.getValue()).
                  toByteArray();
          substringKeys(normalizedBytes, keys);
        }
@@ -249,11 +253,16 @@
      {
        continue;
      }
            //Get the substring matching rule.
      SubstringMatchingRule rule =
              attr.getAttributeType().getSubstringMatchingRule();
      for (AttributeValue value : attr)
      {
        try
        {
          byte[] normalizedBytes = value.getNormalizedValue().toByteArray();
          byte[] normalizedBytes = rule.normalizeValue(value.getValue())
                  .toByteArray();
          substringKeys(normalizedBytes, modifiedKeys, insert);
        }
opends/src/server/org/opends/server/controls/MatchedValuesFilter.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.controls;
import org.opends.messages.Message;
@@ -1357,7 +1357,8 @@
                 new ArrayList<ByteSequence>(normalizedSubAny);
            return substringMatchingRule.valueMatchesSubstring(
                 value.getNormalizedValue(), normalizedSubInitial,
                 substringMatchingRule.normalizeValue(value.getValue()),
                 normalizedSubInitial,
                 normalizedSubAnyBS, normalizedSubFinal);
          }
          catch (Exception e)
@@ -1385,7 +1386,8 @@
          {
            return (orderingMatchingRule.compareValues(
                         assertionValue.getNormalizedValue(),
                         value.getNormalizedValue()) >= 0);
                         orderingMatchingRule.normalizeValue(
                         value.getValue())) >= 0);
          }
          catch (Exception e)
          {
@@ -1412,7 +1414,8 @@
          {
            return (orderingMatchingRule.compareValues(
                         assertionValue.getNormalizedValue(),
                         value.getNormalizedValue()) <= 0);
                         orderingMatchingRule.normalizeValue(
                         value.getValue())) <= 0);
          }
          catch (Exception e)
          {
@@ -1445,7 +1448,7 @@
            ByteString nv1 =  approximateMatchingRule.normalizeValue(
                    assertionValue.getNormalizedValue());
            ByteString nv2 =  approximateMatchingRule.normalizeValue(
                    value.getNormalizedValue());
                    approximateMatchingRule.normalizeValue(value.getValue()));
            return approximateMatchingRule.approximatelyMatch(nv1, nv2);
          }
opends/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRule.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -67,13 +67,7 @@
   */
  public int compareValues(ByteSequence value1, ByteSequence value2)
  {
    String[] token1 = value1.toString().split(":", 3);
    String[] token2 = value2.toString().split(":", 3);
    if ((token1[1] == null) || (token2[1] == null))
      return -1;
    return token1[1].compareTo(token2[1]);
    return value1.compareTo(value2);
  }
@@ -136,7 +130,6 @@
  @Override
  public ByteString normalizeValue(ByteSequence value)
  {
    String[] token = value.toString().split(":", 3);
    /* Change the format of the value to index and start
opends/src/server/org/opends/server/types/AttributeBuilder.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.types;
@@ -275,7 +275,8 @@
      ByteString normalizedValue;
      try
      {
        normalizedValue = value.getNormalizedValue();
        normalizedValue =
                matchingRule.normalizeValue(value.getValue());
      }
      catch (Exception e)
      {
@@ -294,7 +295,8 @@
      {
        try
        {
          ByteString nv = v.getNormalizedValue();
          ByteString nv =
                  matchingRule.normalizeValue(v.getValue());
          int comparisonResult = matchingRule
              .compareValues(nv, normalizedValue);
          if (comparisonResult >= 0)
@@ -357,7 +359,8 @@
      ByteString normalizedValue;
      try
      {
        normalizedValue = value.getNormalizedValue();
        normalizedValue =
                matchingRule.normalizeValue(value.getValue());
      }
      catch (Exception e)
      {
@@ -376,7 +379,7 @@
      {
        try
        {
          ByteString nv = v.getNormalizedValue();
          ByteString nv = matchingRule.normalizeValue(v.getValue());
          int comparisonResult = matchingRule
              .compareValues(nv, normalizedValue);
          if (comparisonResult <= 0)
@@ -502,7 +505,8 @@
        try
        {
          if (matchingRule.valueMatchesSubstring(
              value.getNormalizedValue(),
              attributeType.getSubstringMatchingRule().
                    normalizeValue(value.getValue()),
              normalizedSubInitial,
              normalizedSubAny,
              normalizedSubFinal))
opends/tests/unit-tests-testng/src/server/org/opends/server/schema/AttributeTypeSyntaxTest.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.schema;
@@ -34,6 +34,15 @@
import org.opends.server.types.AttributeType;
import org.opends.server.types.ByteString;
import org.opends.messages.MessageBuilder;
import java.util.ArrayList;
import org.opends.server.TestCaseUtils;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.ldap.LDAPFilter;
import org.opends.server.types.Control;
import org.opends.server.types.DereferencePolicy;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchScope;
import static org.testng.Assert.*;
@@ -149,5 +158,67 @@
    assertNotNull(attrType.getApproximateMatchingRule());
    assertEquals(attrType.getApproximateMatchingRule(), testApproxRule);
  }
  /**
   * Tests a situation when two radically different equality and substring
   * matching rules (such as Case Ignore and Case Exact) are used to define an
   * attribute description. For more information, look at the issue# 4468 in
   * Issue Tracker.
   *
   * @throws Exception In case of an error.
   */
  @Test()
  public void testMixedEqualityAndSubstringMatchingRules() throws Exception
  {
    //Add an attribute with directory string syntax.
    int  resultCode = TestCaseUtils.applyModifications(true,
      "dn: cn=schema",
      "changetype: modify",
      "add: attributetypes",
      "attributeTypes: ( gvRights-oid NAME 'gvRights' DESC 'x attr' EQUALITY " +
      "caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR " +
      "caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 " +
      "USAGE userApplications )",
      "-",
      "add: objectclasses",
      "objectClasses: ( gvRightsTest-oid NAME 'gvRightsTest' DESC 'Test' SUP top AUXILIARY " +
      "MUST ( objectClass $ gvRights ) )");
    assertTrue(resultCode == 0);
    TestCaseUtils.initializeTestBackend(true);
    //add the test entry.
    TestCaseUtils.addEntry(
    "dn: cn=gvrightstest,o=test",
    "objectclass: person",
    "objectclass: gvRightsTest",
    "cn: gvrightstest",
    "sn: test",
    "gvRights: gvApplId=test2,ou=Applications,dc=bla$test2-T");
    //Search for the entry using substring matching rule filter.
    InternalClientConnection conn =
       InternalClientConnection.getRootConnection();
    InternalSearchOperation searchOperation =
       new InternalSearchOperation(
            conn,
            InternalClientConnection.nextOperationID(),
            InternalClientConnection.nextMessageID(),
            new ArrayList<Control>(),
            ByteString.valueOf("cn=gvrightstest,o=test"),
            SearchScope.WHOLE_SUBTREE,
            DereferencePolicy.NEVER_DEREF_ALIASES,
            Integer.MAX_VALUE,
            Integer.MAX_VALUE,
            false,
            LDAPFilter.decode("(&(gvrights=*ApplId=test2,ou=*)" +
            "(gvrights=*test2,ou=A*))"),
            null, null);
    searchOperation.run();
    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(searchOperation.getEntriesSent(), 1);
  }
}