From 251f9586274ce5f121b0bb596fbb21e1ecd39442 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 09 Sep 2016 12:52:10 +0000
Subject: [PATCH] OPENDJ-3281 Modify operations may not be replayed if case is mixed on attribute values

---
 opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/AttrValueHistorical.java |   41 ++++++++++++++++++++++++++++++++++++-----
 1 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/AttrValueHistorical.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/AttrValueHistorical.java
index 4422c20..463e2fb 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/AttrValueHistorical.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/AttrValueHistorical.java
@@ -12,30 +12,38 @@
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
  * Copyright 2006-2010 Sun Microsystems, Inc.
- * Portions Copyright 2013-2015 ForgeRock AS.
+ * Portions Copyright 2013-2016 ForgeRock AS.
  */
 package org.opends.server.replication.plugin;
 
+import static org.forgerock.util.Reject.*;
+
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.opends.server.replication.common.CSN;
 
 /** AttrValueHistorical is the historical information of the modification of one attribute value. */
 public class AttrValueHistorical
 {
+  private AttributeType attributeType;
   private ByteString value;
+  private ByteString normalizedValue;
   private CSN valueDeleteTime;
   private CSN valueUpdateTime;
 
   /**
    * Build an AttrValueHistorical for a provided attribute value, providing
    * the last time the provided value is either updated or deleted.
-   * @param value    the provided attributeValue
+   * @param value    the provided attribute value
+   * @param attributeType the provided attribute type
    * @param csnUpdate last time when this value was updated
    * @param csnDelete last time when this value for deleted
    */
-  public AttrValueHistorical(ByteString value, CSN csnUpdate, CSN csnDelete)
+  public AttrValueHistorical(ByteString value, AttributeType attributeType, CSN csnUpdate, CSN csnDelete)
   {
     this.value = value;
+    this.attributeType = checkNotNull(attributeType);
     this.valueUpdateTime = csnUpdate;
     this.valueDeleteTime = csnDelete;
   }
@@ -46,7 +54,14 @@
     if (obj instanceof AttrValueHistorical)
     {
       AttrValueHistorical objVal = (AttrValueHistorical) obj;
-      return value.equals(objVal.getAttributeValue());
+      try
+      {
+        return getNormalizedValue().equals(objVal.getNormalizedValue());
+      }
+      catch (DecodeException e)
+      {
+        return value.equals(objVal.getAttributeValue());
+      }
     }
     return false;
   }
@@ -54,7 +69,23 @@
   @Override
   public int hashCode()
   {
-    return value.hashCode();
+    try
+    {
+      return getNormalizedValue().hashCode();
+    }
+    catch (DecodeException e)
+    {
+      return value.hashCode();
+    }
+  }
+
+  private ByteString getNormalizedValue() throws DecodeException
+  {
+    if (normalizedValue == null)
+    {
+      normalizedValue = attributeType.getEqualityMatchingRule().normalizeAttributeValue(value);
+    }
+    return normalizedValue;
   }
 
   /**

--
Gitblit v1.10.0