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