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

ludovicp
30.23.2010 f5e61220e9878f71165989bd9f21f1d0a568bb87
Code refactoring, renaming and commenting only. No feature nor behavior change.
8 files renamed
15 files modified
1009 ■■■■■ changed files
opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java 6 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/AttrHistorical.java 34 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java 120 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/AttrHistoricalSingle.java 40 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/AttrHistoricalWithOptions.java 16 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/AttrValueHistorical.java 34 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java 351 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/FakeAddOperation.java 6 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/FakeModdnOperation.java 4 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/HistAttrModificationKey.java 26 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java 98 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java 56 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java 34 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java 5 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/protocol/AddMsg.java 6 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java 6 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/protocol/OperationContext.java 5 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java 20 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AttrInfoTest.java 34 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingTest.java 4 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalTest.java 14 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ModifyConflictTest.java 78 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ValueInfoTest.java 12 ●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
@@ -53,7 +53,7 @@
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.messages.Message;
import org.opends.server.api.AttributeSyntax;
import org.opends.server.replication.plugin.Historical;
import org.opends.server.replication.plugin.EntryHistorical;
import org.opends.server.schema.SchemaConstants;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
@@ -644,7 +644,7 @@
  {
    CustomSearchResult filteredSr;
    List<Object> values =
      sr.getAttributeValues(Historical.HISTORICALATTRIBUTENAME);
      sr.getAttributeValues(EntryHistorical.HISTORICALATTRIBUTENAME);
    if (values != null)
    {
      List<Object> newValues = new ArrayList<Object>();
@@ -659,7 +659,7 @@
      else
      {
        filteredSr = sr.clone();
        filteredSr.set(Historical.HISTORICALATTRIBUTENAME, newValues);
        filteredSr.set(EntryHistorical.HISTORICALATTRIBUTENAME, newValues);
      }
    }
    else
opends/src/server/org/opends/server/replication/plugin/AttrHistorical.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttributeInfo.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -37,11 +37,9 @@
/**
 * This classes is used to store historical information.
 * One object of this type is created for each attribute that was changed in
 * the entry.
 * This class store historical information for a provided attribute.
 */
public abstract class AttributeInfo
public abstract class AttrHistorical
{
  /**
   * This method will be called when replaying an operation.
@@ -76,18 +74,18 @@
      ChangeNumber changeNumber, Modification mod);
  /**
   * Create a new AttributeInfo object that will be used with the given type.
   * Create a new object from a provided attribute type. Historical is empty.
   *
   * @param type the AttrbuteType with which the ATtributeInfo is going to be
   *             used.
   * @param type the provided attribute type.
   * @return a new AttributeInfo object.
   */
  public static AttributeInfo createAttributeInfo(AttributeType type)
  public static AttrHistorical createAttributeHistorical(
      AttributeType type)
  {
    if (type.isSingleValue())
      return new AttrInfoSingle();
      return new AttrHistoricalSingle();
    else
      return new AttrInfoMultiple();
      return new AttrHistoricalMultiple();
  }
  /**
@@ -95,25 +93,25 @@
   *
   * @return the List of ValueInfo
   */
  public abstract ArrayList<ValueInfo> getValuesInfo();
  public abstract ArrayList<AttrValueHistorical> getValuesHistorical();
  /**
   * Returns the last time when the attribute was deleted.
   * Returns the last time when this attribute was deleted.
   *
   * @return the last time when the attribute was deleted
   * @return the last time when this attribute was deleted
   */
  public abstract ChangeNumber getDeleteTime();
  /**
   * Load the provided information.
   * Assign the provided information to this object.
   *
   * @param histKey the key to load.
   * @param histKey the key to assign.
   * @param value   the associated value or null if there is no value;
   * @param cn      the associated ChangeNumber.
   */
  public abstract void load(
      HistKey histKey, AttributeValue value, ChangeNumber cn);
  public abstract void assign(
      HistAttrModificationKey histKey, AttributeValue value, ChangeNumber cn);
}
opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttrInfoMultiple.java
@@ -48,42 +48,43 @@
 * time a given value was deleted and the last time the whole attribute was
 * deleted.
 */
public class AttrInfoMultiple extends AttributeInfo
public class AttrHistoricalMultiple extends AttrHistorical
{
   private ChangeNumber deleteTime, // last time when the attribute was deleted
                        lastUpdateTime; // last time the attribute was modified
   private ArrayList<ValueInfo> valuesInfo; // creation or deletion time for
                                            // given values
  /**
    * create a new AttrInfo object.
    * @param deleteTime the deletion time
    * @param updateTime the update time
    * @param valuesInfo of Value Info
   private ArrayList<AttrValueHistorical> valuesHist;
   /**
    * Create a new object from the provided informations.
    * @param deleteTime the last time this attribute was deleted
    * @param updateTime the last time this attribute was updated
    * @param valuesHist the new attribute values when updated.
    */
   public AttrInfoMultiple(ChangeNumber deleteTime, ChangeNumber updateTime,
       ArrayList<ValueInfo> valuesInfo)
   public AttrHistoricalMultiple(ChangeNumber deleteTime,
       ChangeNumber updateTime,
       ArrayList<AttrValueHistorical> valuesHist)
   {
     this.deleteTime = deleteTime;
     this.lastUpdateTime = updateTime;
     if (valuesInfo == null)
       this.valuesInfo = new ArrayList<ValueInfo>();
     if (valuesHist == null)
       this.valuesHist = new ArrayList<AttrValueHistorical>();
     else
       this.valuesInfo = valuesInfo;
       this.valuesHist = valuesHist;
   }
   /**
    * create a new empty AttrInfo object.
    * Create a new object.
    */
   public AttrInfoMultiple()
   public AttrHistoricalMultiple()
   {
     this.deleteTime = null;
     this.lastUpdateTime = null;
     this.valuesInfo = new ArrayList<ValueInfo>();
     this.valuesHist = new ArrayList<AttrValueHistorical>();
   }
   /**
    * Returns the last time when the entry was updated.
    * @return the last time when the entry was updated
    * Returns the last time when the attribute was updated.
    * @return the last time when the attribute was updated
    */
   private ChangeNumber getLastUpdateTime()
   {
@@ -92,7 +93,6 @@
   /**
    * Returns the last time when the attribute was deleted.
    *
    * @return the last time when the attribute was deleted
    */
   public ChangeNumber getDeleteTime()
@@ -101,15 +101,15 @@
   }
   /**
    * Duplicate an AttrInfo.
    * Duplicate an object.
    * ChangeNumber are duplicated by references
    * @return the duplicated AttrInfo
    * @return the duplicated object.
    */
   AttrInfoMultiple duplicate()
   AttrHistoricalMultiple duplicate()
   {
     AttrInfoMultiple dup =
       new AttrInfoMultiple(this.deleteTime, this.lastUpdateTime,
           this.valuesInfo);
     AttrHistoricalMultiple dup =
       new AttrHistoricalMultiple(this.deleteTime, this.lastUpdateTime,
           this.valuesHist);
     return dup;
   }
@@ -124,10 +124,10 @@
     // iterate through the values in the valuesInfo
     // and suppress all the values that have not been added
     // after the date of this delete.
     Iterator<ValueInfo> it = this.valuesInfo.iterator();
     Iterator<AttrValueHistorical> it = this.valuesHist.iterator();
     while (it.hasNext())
     {
       ValueInfo info = it.next();
       AttrValueHistorical info = it.next();
       if (CN.newerOrEquals(info.getValueUpdateTime()) &&
           CN.newerOrEquals(info.getValueDeleteTime()))
         it.remove();
@@ -145,15 +145,16 @@
   }
   /**
    * Change historical information after a delete value.
    * Update the historical of this attribute after a delete value.
    *
    * @param val value that was deleted
    * @param CN time when the delete was done
    */
   protected void delete(AttributeValue val, ChangeNumber CN)
   {
     ValueInfo info = new ValueInfo(val, null, CN);
     this.valuesInfo.remove(info);
     this.valuesInfo.add(info);
     AttrValueHistorical info = new AttrValueHistorical(val, null, CN);
     this.valuesHist.remove(info);
     this.valuesHist.add(info);
     if (CN.newer(lastUpdateTime))
     {
       lastUpdateTime = CN;
@@ -161,8 +162,7 @@
   }
   /**
     * Change historical information after a delete of a set of
     * values.
     * Update the historical of this attribute after deleting a set of values.
     *
     * @param attr
     *          the attribute containing the set of values that were
@@ -174,9 +174,9 @@
  {
    for (AttributeValue val : attr)
    {
      ValueInfo info = new ValueInfo(val, null, CN);
      this.valuesInfo.remove(info);
      this.valuesInfo.add(info);
      AttrValueHistorical info = new AttrValueHistorical(val, null, CN);
      this.valuesHist.remove(info);
      this.valuesHist.add(info);
      if (CN.newer(lastUpdateTime))
      {
        lastUpdateTime = CN;
@@ -187,16 +187,16 @@
   /**
     * Update the historical information when a value is added.
     *
     * @param val
     * @param addedValue
     *          values that was added
     * @param CN
     *          time when the value was added
     */
   protected void add(AttributeValue val, ChangeNumber CN)
   protected void add(AttributeValue addedValue, ChangeNumber CN)
   {
     ValueInfo info = new ValueInfo(val, CN, null);
     this.valuesInfo.remove(info);
     valuesInfo.add(info);
     AttrValueHistorical info = new AttrValueHistorical(addedValue, CN, null);
     this.valuesHist.remove(info);
     valuesHist.add(info);
     if (CN.newer(lastUpdateTime))
     {
       lastUpdateTime = CN;
@@ -215,9 +215,9 @@
  {
    for (AttributeValue val : attr)
    {
      ValueInfo info = new ValueInfo(val, CN, null);
      this.valuesInfo.remove(info);
      valuesInfo.add(info);
      AttrValueHistorical info = new AttrValueHistorical(val, CN, null);
      this.valuesHist.remove(info);
      valuesHist.add(info);
      if (CN.newer(lastUpdateTime))
      {
        lastUpdateTime = CN;
@@ -226,13 +226,13 @@
  }
  /**
   * Get the List of ValueInfo for this attribute Info.
   * Get the list of historical informations for the values.
   *
   * @return the List of ValueInfo
   * @return the list of historical informations for the values.
   */
  public ArrayList<ValueInfo> getValuesInfo()
  public ArrayList<AttrValueHistorical> getValuesHistorical()
  {
    return valuesInfo;
    return valuesHist;
  }
  /**
@@ -417,9 +417,10 @@
      m.setModificationType(ModificationType.REPLACE);
      AttributeBuilder builder = new AttributeBuilder(modAttr, true);
      for (Iterator<ValueInfo> it = getValuesInfo().iterator(); it.hasNext();)
      for (Iterator<AttrValueHistorical> it = getValuesHistorical().iterator();
        it.hasNext();)
      {
        ValueInfo valInfo; valInfo = it.next();
        AttrValueHistorical valInfo; valInfo = it.next();
        if (changeNumber.older(valInfo.getValueUpdateTime()))
        {
@@ -427,7 +428,7 @@
           * this value has been updated after this delete, therefore
           * this value must be kept
           */
          builder.add(valInfo.getValue());
          builder.add(valInfo.getAttributeValue());
        }
        else
        {
@@ -459,7 +460,7 @@
      /*
       * we are processing DELETE of some attribute values
       */
      ArrayList<ValueInfo> valuesInfo = getValuesInfo();
      ArrayList<AttrValueHistorical> valuesInfo = getValuesHistorical();
      AttributeBuilder builder = new AttributeBuilder(modAttr);
      for (AttributeValue val : modAttr)
@@ -468,12 +469,13 @@
        Boolean addedInCurrentOp = false;
        /* update historical information */
        ValueInfo valInfo = new ValueInfo(val, null, changeNumber);
        AttrValueHistorical valInfo =
          new AttrValueHistorical(val, null, changeNumber);
        int index = valuesInfo.indexOf(valInfo);
        if (index != -1)
        {
          /* this value already exist in the historical information */
          ValueInfo oldValInfo  = valuesInfo.get(index);
          AttrValueHistorical oldValInfo  = valuesInfo.get(index);
          if (changeNumber.equals(oldValInfo.getValueUpdateTime()))
          {
            // This value was added earlier in the same operation
@@ -561,8 +563,9 @@
    AttributeBuilder builder = new AttributeBuilder(m.getAttribute());
    for (AttributeValue addVal : m.getAttribute())
    {
      ArrayList<ValueInfo> valuesInfo = getValuesInfo();
      ValueInfo valInfo = new ValueInfo(addVal, changeNumber, null);
      ArrayList<AttrValueHistorical> valuesInfo = getValuesHistorical();
      AttrValueHistorical valInfo =
        new AttrValueHistorical(addVal, changeNumber, null);
      int index = valuesInfo.indexOf(valInfo);
      if (index == -1)
      {
@@ -574,7 +577,7 @@
      }
      else
      {
        ValueInfo oldValueInfo = valuesInfo.get(index);
        AttrValueHistorical oldValueInfo = valuesInfo.get(index);
        if  (oldValueInfo.isUpdate())
        {
          /* if the value is already present
@@ -637,7 +640,8 @@
   * {@inheritDoc}
   */
  @Override
  public void load(HistKey histKey, AttributeValue value, ChangeNumber cn)
  public void assign(HistAttrModificationKey histKey, AttributeValue value,
      ChangeNumber cn)
  {
    switch (histKey)
    {
opends/src/server/org/opends/server/replication/plugin/AttrHistoricalSingle.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttrInfoSingle.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -45,7 +45,7 @@
 * It allows to record the last time a given value was added,
 * and the last time the whole attribute was deleted.
 */
public class AttrInfoSingle extends AttributeInfo
public class AttrHistoricalSingle extends AttrHistorical
{
  private ChangeNumber deleteTime = null; // last time when the attribute was
                                          // deleted
@@ -58,23 +58,24 @@
  @Override
  public ChangeNumber getDeleteTime()
  {
    return deleteTime;
    return this.deleteTime;
  }
  /**
   * {@inheritDoc}
   */
  @Override
  public ArrayList<ValueInfo> getValuesInfo()
  public ArrayList<AttrValueHistorical> getValuesHistorical()
  {
    if (addTime == null)
    {
      return new ArrayList<ValueInfo>();
      return new ArrayList<AttrValueHistorical>();
    }
    else
    {
      ArrayList<ValueInfo> values = new ArrayList<ValueInfo>();
      values.add(new ValueInfo(value, addTime, null));
      ArrayList<AttrValueHistorical> values =
        new ArrayList<AttrValueHistorical>();
      values.add(new AttrValueHistorical(value, addTime, null));
      return values;
    }
  }
@@ -96,26 +97,26 @@
    switch (mod.getModificationType())
    {
    case DELETE:
      deleteTime = changeNumber;
      value = newValue;
      this.deleteTime = changeNumber;
      this.value = newValue;
      break;
    case ADD:
      addTime = changeNumber;
      value = newValue;
      this.addTime = changeNumber;
      this.value = newValue;
      break;
    case REPLACE:
      if (newValue == null)
      {
        // REPLACE with null value is actually a DELETE
        deleteTime = changeNumber;
        this.deleteTime = changeNumber;
      }
      else
      {
        deleteTime = addTime = changeNumber;
        this.deleteTime = addTime = changeNumber;
      }
      value = newValue;
      this.value = newValue;
      break;
    case INCREMENT:
@@ -229,29 +230,30 @@
   * {@inheritDoc}
   */
  @Override
  public void load(HistKey histKey, AttributeValue value, ChangeNumber cn)
  public void assign(HistAttrModificationKey histKey,
      AttributeValue value, ChangeNumber cn)
  {
    switch (histKey)
    {
    case ADD:
      addTime = cn;
      this.addTime = cn;
      this.value = value;
      break;
    case DEL:
      deleteTime = cn;
      this.deleteTime = cn;
      if (value != null)
        this.value = value;
      break;
    case REPL:
      addTime = deleteTime = cn;
      this.addTime = this.deleteTime = cn;
      if (value != null)
        this.value = value;
      break;
    case DELATTR:
      deleteTime = cn;
      this.deleteTime = cn;
      break;
    }
  }
opends/src/server/org/opends/server/replication/plugin/AttrHistoricalWithOptions.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttrInfoWithOptions.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -34,16 +34,16 @@
 * Used to store historical information.
 * Contain a map of AttrInfo for each options of a given attribute type.
 */
public class AttrInfoWithOptions
public class AttrHistoricalWithOptions
{
  private HashMap<Set<String> ,AttributeInfo> attributesInfo;
  private HashMap<Set<String> ,AttrHistorical> attributesInfo;
  /**
   * creates a new AttrInfoWithOptions.
   */
  public AttrInfoWithOptions()
  public AttrHistoricalWithOptions()
  {
    attributesInfo = new HashMap<Set<String> ,AttributeInfo>();
    attributesInfo = new HashMap<Set<String> ,AttrHistorical>();
  }
  /**
@@ -52,7 +52,7 @@
   * @param options the options
   * @return the information
   */
  public AttributeInfo get(Set<String> options)
  public AttrHistorical get(Set<String> options)
  {
    return attributesInfo.get(options);
  }
@@ -64,7 +64,7 @@
   * @param attrInfo the info to associate
   * @return the info to associate
   */
  public AttributeInfo put(Set<String> options, AttributeInfo attrInfo )
  public AttrHistorical put(Set<String> options, AttrHistorical attrInfo )
  {
    return attributesInfo.put(options, attrInfo);
  }
@@ -73,7 +73,7 @@
   * get the Attributes information associated to this object.
   * @return the set of informations
   */
  public HashMap<Set<String>, AttributeInfo> getAttributesInfo()
  public HashMap<Set<String>, AttrHistorical> getAttributesInfo()
  {
    return attributesInfo;
  }
opends/src/server/org/opends/server/replication/plugin/AttrValueHistorical.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/ValueInfo.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -30,22 +30,22 @@
import org.opends.server.types.AttributeValue;
/**
 * Allows to store historical information about specific values
 * for a given attribute.
 * Store historical information for an attribute value.
 */
public class ValueInfo
public class AttrValueHistorical
{
  private AttributeValue value;
  private ChangeNumber valueDeleteTime;
  private ChangeNumber valueUpdateTime;
  /**
   * Build a new ValueInfo.
   * @param value value for which ValueInfo is built
   * @param CNupdate last time when value was updated last
   * @param CNdelete last time when value for deleted
   * Build an AttrValueHistorical for a provided AttributeValue, providing
   * the last time the provided value is either updated or deleted.
   * @param value    the provided attributeValue
   * @param CNupdate last time when this value was updated
   * @param CNdelete last time when this value for deleted
   */
  public ValueInfo(AttributeValue value,
  public AttrValueHistorical(AttributeValue value,
                   ChangeNumber CNupdate,
                   ChangeNumber CNdelete)
  {
@@ -63,10 +63,10 @@
  @Override
  public boolean equals(Object obj)
  {
    if (obj instanceof ValueInfo)
    if (obj instanceof AttrValueHistorical)
    {
      ValueInfo objVal = (ValueInfo) obj;
      return (value.equals(objVal.getValue()));
      AttrValueHistorical objVal = (AttrValueHistorical) obj;
      return (value.equals(objVal.getAttributeValue()));
    }
    else
    {
@@ -104,17 +104,17 @@
  }
  /**
   * Get the value for which this ValueInfo was generated.
   * @return the value for which this ValueInfo was generated
   * Get the attributeValue for which this object was generated.
   * @return the value for which this object was generated
   */
  public AttributeValue getValue()
  public AttributeValue getAttributeValue()
  {
    return value;
  }
  /**
   * Check if the value associated with this ValueInfo was updated.
   * @return true if the value associated with this ValueInfo was updated
   * Check if the value associated with this object was updated.
   * @return true if the value associated with this object was updated
   */
  public boolean isUpdate()
  {
opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/Historical.java
@@ -64,36 +64,74 @@
 * each Historical Object contains a list of attribute historical information
 */
public class Historical
public class EntryHistorical
{
  /**
   * The name of the attribute used to store historical information.
   * Name of the attribute used to store historical information.
   */
  public static final String HISTORICALATTRIBUTENAME = "ds-sync-hist";
  /**
   * Name used to store attachment of historical information in the
   * operation.
   * operation. This attachement allows to use in several different places
   * the historical while reading/writing ONCE it from/to the entry.
   */
  public static final String HISTORICAL = "ds-synch-historical";
  /**
   * The name of the entryuuid attribute.
   * Name of the entryuuid attribute.
   */
  public static final String ENTRYUIDNAME = "entryuuid";
  /*
   * contains Historical information for each attribute sorted by attribute type
  /**
   * The in-memory historical information is made of.
   *
   * EntryHistorical ::= ADDDate MODDNDate attributesInfo
   * ADDDate       ::= ChangeNumber  // the date the entry was added
   * MODDNDate     ::= ChangeNumber  // the date the entry was last renamed
   *
   * attributesInfo      ::= (AttrInfoWithOptions)*
   *                         one AttrInfoWithOptions by attributeType
   *
   * AttrInfoWithOptions ::= (AttributeInfo)*
   *                         one AttributeInfo by attributeType and option
   *
   * AttributeInfo       ::= AttrInfoSingle | AttrInfoMultiple
   *
   * AttrInfoSingle      ::= AddTime DeleteTime ValueInfo
   *
   * AttrInfoMultiple    ::= AddTime DeleteTime ValuesInfo
   *
   * ValuesInfo          ::= (AttrValueHistorical)*
   *                         AttrValueHistorical is the historical of the
   *                         the modification of one value
   *
   * AddTime             ::= ChangeNumber // last time the attribute was added
   *                                      // to the entry
   * DeleteTime          ::= ChangeNumber // last time the attribute was deleted
   *                                      // from the entry
   *
   * AttrValueHistorical ::= AttributeValue valueDeleteTime valueUpdateTime
   * valueDeleteTime     ::= ChangeNumber
   * valueUpdateTime     ::= ChangeNumber
   *
   * - a list indexed on AttributeType of AttrInfoWithOptions :
   *     each value is the historical for this attribute
   *     an AttrInfoWithOptions is a set indexed on the optionValue(string) of
   *     AttributeInfo
   *
   */
  private HashMap<AttributeType,AttrInfoWithOptions> attributesInfo
                           = new HashMap<AttributeType,AttrInfoWithOptions>();
  // The date when the entry was added.
  private ChangeNumber ADDDate = null;
  private ChangeNumber entryADDDate = null;
  // The date when the entry was last renamed.
  private ChangeNumber MODDNDate = null;
  private ChangeNumber entryMODDNDate = null;
  // contains Historical information for each attribute sorted by attribute type
  // key:AttributeType  value:AttrInfoWithOptions
  private HashMap<AttributeType,AttrHistoricalWithOptions> attributesHistorical
    = new HashMap<AttributeType,AttrHistoricalWithOptions>();
  /**
   * {@inheritDoc}
@@ -120,17 +158,20 @@
  {
    boolean bConflict = false;
    List<Modification> mods = modifyOperation.getModifications();
    ChangeNumber changeNumber =
    ChangeNumber modOpChangeNumber =
      OperationContext.getChangeNumber(modifyOperation);
    for (Iterator<Modification> modsIterator = mods.iterator();
         modsIterator.hasNext(); )
    {
      // Traverse the mods of this MOD operation
      Modification m = modsIterator.next();
      AttributeInfo attrInfo = getAttrInfo(m);
      // Read or create the attr historical for the attribute type and option
      // contained in the mod
      AttrHistorical attrHist = getOrCreateAttrHistorical(m);
      if (attrInfo.replayOperation(modsIterator, changeNumber,
      if (attrHist.replayOperation(modsIterator, modOpChangeNumber,
                                   modifiedEntry, m))
      {
        bConflict = true;
@@ -141,11 +182,18 @@
  }
  /**
   * Append replacement of state information to a given modification.
   * Update the historical information for the provided operation.
   * Steps :
   * - compute the historical attribute
   * - update the mods in the provided operation by adding the update of the
   *   historical attribute
   * - update the modifiedEntry, already computed by core since we are in the
   *   preOperation plugin, that is called just before commiting into the DB.
   *
   * @param modifyOperation the modification.
   */
  public void generateState(PreOperationModifyOperation modifyOperation)
  public void setHistoricalAttrToOperation(
      PreOperationModifyOperation modifyOperation)
  {
    List<Modification> mods = modifyOperation.getModifications();
    Entry modifiedEntry = modifyOperation.getModifiedEntry();
@@ -153,8 +201,9 @@
      OperationContext.getChangeNumber(modifyOperation);
    /*
     * If this is a local operation we need first to update the historical
     * information, then update the entry with the historical information
     * If this is a local operation we need :
     * - first to update the historical information,
     * - then update the entry with the historical information
     * If this is a replicated operation the historical information has
     * already been set in the resolveConflict phase and we only need
     * to update the entry
@@ -163,29 +212,39 @@
    {
      for (Modification mod : mods)
      {
        AttributeInfo attrInfo = getAttrInfo(mod);
        if (attrInfo != null)
          attrInfo.processLocalOrNonConflictModification(changeNumber, mod);
        // Get the current historical for this attributeType/options
        // (eventually read from the provided modification)
        AttrHistorical attrHist = getOrCreateAttrHistorical(mod);
        if (attrHist != null)
          attrHist.processLocalOrNonConflictModification(changeNumber, mod);
      }
    }
    // Now do the 2 updates required by the core to be consistent:
    //
    // - add the modification of the ds-sync-hist attribute,
    // to the current modifications of the MOD operation
    Attribute attr = encode();
    Modification mod = new Modification(ModificationType.REPLACE, attr);
    mods.add(mod);
    // - update the already modified entry
    modifiedEntry.replaceAttribute(attr);
  }
  /**
     * Add historical information for a MODRDN operation to existing
     * historical information.
     * For a MODDN operation, add new or update existing historical information.
     *
     * This method is NOT static because it relies on this Historical object
     * created in the HandleConflictResolution phase.
     *
     * @param modifyDNOperation the modification for which the historical
     *                          information should be created.
     */
  public void generateState(PreOperationModifyDNOperation modifyDNOperation)
  public void setHistoricalAttrToOperation(
      PreOperationModifyDNOperation modifyDNOperation)
  {
    // Update this historical information with the operation ChangeNumber.
    this.MODDNDate = OperationContext.getChangeNumber(modifyDNOperation);
    this.entryMODDNDate = OperationContext.getChangeNumber(modifyDNOperation);
    // Update the operations mods and the modified entry so that the
    // historical information gets stored in the DB and indexed accordingly.
@@ -193,49 +252,67 @@
    List<Modification> mods = modifyDNOperation.getModifications();
    Attribute attr = encode();
    // Now do the 2 updates required by the core to be consistent:
    //
    // - add the modification of the ds-sync-hist attribute,
    // to the current modifications of the operation
    Modification mod;
    mod = new Modification(ModificationType.REPLACE, attr);
    mods.add(mod);
    // - update the already modified entry
    modifiedEntry.removeAttribute(attr.getAttributeType());
    modifiedEntry.addAttribute(attr, null);
  }
  /**
   * Generate and add to the Operation the historical information for
   * the ADD Operation.
   * This historical information will be used to generate fake operation
   * in case a Directory Server can not find a Replication Server with
   * all its changes at connection time.
   * This should only happen if a Directory Server or a Replication Server
   * crashes.
   * Generate an attribute containing the historical information
   * from the replication context attached to the provided operation
   * and set this attribute in the operation.
   *
   * @param addOperation     The Operation to process.
   *   For ADD, the historical is made of the changeNumber read from the
   *   synchronization context attached to the operation.
   *
   *   Called for both local and synchronization ADD preOperation.
   *
   *   This historical information will be used to generate fake operation
   *   in case a Directory Server can not find a Replication Server with
   *   all its changes at connection time.
   *   This should only happen if a Directory Server or a Replication Server
   *   crashes.
   *
   *   This method is static because there is no Historical object creation
   *   required here or before(in the HandleConflictResolution phase)
   *
   * @param addOperation The Operation to which the historical attribute will
   *                     be added.
   */
  public static void generateState(PreOperationAddOperation addOperation)
  public static void setHistoricalAttrToOperation(
      PreOperationAddOperation addOperation)
  {
    AttributeType historicalAttrType =
      DirectoryServer.getSchema().getAttributeType(HISTORICALATTRIBUTENAME);
    // Get the changeNumber from the attached synchronization context
    // Create the attribute (encoded)
    Attribute attr =
      Attributes.create(historicalAttrType,
          encodeAddHistorical(OperationContext.getChangeNumber(addOperation)));
    // Set the created attribute to the operation
    List<Attribute> attrList = new LinkedList<Attribute>();
    attrList.add(attr);
    addOperation.setAttribute(historicalAttrType, attrList);
  }
  /**
   * Generate historical information for an ADD Operation.
   * This historical information will be used to generate fake operation
   * in case a Directory Server can not find a Replication Server with
   * all its changes at connection time.
   * This should only happen if a Directory Server or a Replication Server
   * crashes.
   * Encode in the returned attributeValue, this historical information for
   * an ADD operation.
   * For ADD Operation : "dn:changeNumber:add"
   *
   * @param cn     The date when the ADD Operation happened.
   * @return       The encoded historical information for the ADD Operation.
   * @return       The encoded attribute value containing the historical
   *               information for the Operation.
   */
  private static AttributeValue encodeAddHistorical(ChangeNumber cn)
  {
@@ -248,15 +325,13 @@
  }
  /**
   * Generate historical information for a MODDN Operation.
   * This historical information will be used to generate fake operation
   * in case a Directory Server can not find a Replication Server with
   * all its changes at connection time.
   * This should only happen if a Directory Server or a Replication Server
   * crashes.
   * Encode in the returned attributeValue, the historical information for
   * a MODDN operation.
   * For MODDN Operation : "dn:changeNumber:moddn"
   *
   * @param cn     The date when the MODDN Operation happened.
   * @return       The encoded historical information for the MODDN Operation.
   * @return       The encoded attribute value containing the historical
   *               information for the Operation.
   */
  private static AttributeValue encodeMODDNHistorical(ChangeNumber cn)
  {
@@ -269,17 +344,21 @@
  }
  /**
   * Get the AttrInfo for a given Modification.
   * The AttrInfo is the object that is used to store the historical
   * information of a given attribute type.
   * If there is no historical information for this attribute yet, a new
   * empty AttrInfo is created and returned.
   * Return an AttributeHistorical corresponding to the attribute type
   * and options contained in the provided mod,
   * The attributeHistorical is :
   * - either read from this EntryHistorical object if one exist,
   * - or created empty.
   * Should never return null.
   *
   * @param mod The Modification that must be used.
   * @return The AttrInfo corresponding to the given Modification.
   * @param  mod the provided mod from which we'll use attributeType
   *             and options to retrieve/create the attribute historical
   * @return the attribute historical retrieved or created empty.
   */
  private AttributeInfo getAttrInfo(Modification mod)
  private AttrHistorical getOrCreateAttrHistorical(Modification mod)
  {
    // Read the provided mod
    Attribute modAttr = mod.getAttribute();
    if (isHistoricalAttribute(modAttr))
    {
@@ -287,31 +366,36 @@
      // used to store the historical information.
      return null;
    }
    Set<String> options = modAttr.getOptions();
    AttributeType type = modAttr.getAttributeType();
    AttrInfoWithOptions attrInfoWithOptions =  attributesInfo.get(type);
    AttributeInfo attrInfo;
    if (attrInfoWithOptions != null)
    Set<String> modOptions = modAttr.getOptions();
    AttributeType modAttrType = modAttr.getAttributeType();
    // Read from this entryHistorical,
    // Create one empty if none was existing in this entryHistorical.
    AttrHistoricalWithOptions attrHistWithOptions =
      attributesHistorical.get(modAttrType);
    AttrHistorical attrHist;
    if (attrHistWithOptions != null)
    {
      attrInfo = attrInfoWithOptions.get(options);
      attrHist = attrHistWithOptions.get(modOptions);
    }
    else
    {
      attrInfoWithOptions = new AttrInfoWithOptions();
      attributesInfo.put(type, attrInfoWithOptions);
      attrInfo = null;
      attrHistWithOptions = new AttrHistoricalWithOptions();
      attributesHistorical.put(modAttrType, attrHistWithOptions);
      attrHist = null;
    }
    if (attrInfo == null)
    if (attrHist == null)
    {
      attrInfo = AttributeInfo.createAttributeInfo(type);
      attrInfoWithOptions.put(options, attrInfo);
      attrHist = AttrHistorical.createAttributeHistorical(modAttrType);
      attrHistWithOptions.put(modOptions, attrHist);
    }
    return attrInfo;
    return attrHist;
  }
  /**
   * Encode the historical information in an operational attribute.
   * Encode this historical information object in an operational attribute.
   *
   * @return The historical information encoded in an operational attribute.
   */
  public Attribute encode()
@@ -321,20 +405,20 @@
    AttributeBuilder builder = new AttributeBuilder(historicalAttrType);
    // Encode the historical information for modify operation.
    for (Map.Entry<AttributeType, AttrInfoWithOptions> entryWithOptions :
                                                   attributesInfo.entrySet())
    for (Map.Entry<AttributeType, AttrHistoricalWithOptions> entryWithOptions :
          attributesHistorical.entrySet())
    {
      AttributeType type = entryWithOptions.getKey();
      HashMap<Set<String> , AttributeInfo> attrwithoptions =
      HashMap<Set<String> , AttrHistorical> attrwithoptions =
                                entryWithOptions.getValue().getAttributesInfo();
      for (Map.Entry<Set<String>, AttributeInfo> entry :
      for (Map.Entry<Set<String>, AttrHistorical> entry :
           attrwithoptions.entrySet())
      {
        boolean delAttr = false;
        Set<String> options = entry.getKey();
        String optionsString = "";
        AttributeInfo info = entry.getValue();
        AttrHistorical info = entry.getValue();
        if (options != null)
@@ -356,14 +440,14 @@
        }
        /* generate the historical information for modified attribute values */
        for (ValueInfo valInfo : info.getValuesInfo())
        for (AttrValueHistorical valInfo : info.getValuesHistorical())
        {
          String strValue;
          if (valInfo.getValueDeleteTime() != null)
          {
            strValue = type.getNormalizedPrimaryName() + optionsString + ":" +
            valInfo.getValueDeleteTime().toString() +
            ":del:" + valInfo.getValue().toString();
            ":del:" + valInfo.getAttributeValue().toString();
            AttributeValue val = AttributeValues.create(historicalAttrType,
                                                    strValue);
            builder.add(val);
@@ -371,16 +455,16 @@
          else if (valInfo.getValueUpdateTime() != null)
          {
            if ((delAttr && valInfo.getValueUpdateTime() == deleteTime)
               && (valInfo.getValue() != null))
               && (valInfo.getAttributeValue() != null))
            {
              strValue = type.getNormalizedPrimaryName() + optionsString + ":" +
              valInfo.getValueUpdateTime().toString() +  ":repl:" +
              valInfo.getValue().toString();
              valInfo.getAttributeValue().toString();
              delAttr = false;
            }
            else
            {
              if (valInfo.getValue() == null)
              if (valInfo.getAttributeValue() == null)
              {
                strValue = type.getNormalizedPrimaryName() + optionsString
                           + ":" + valInfo.getValueUpdateTime().toString() +
@@ -390,7 +474,7 @@
              {
                strValue = type.getNormalizedPrimaryName() + optionsString
                           + ":" + valInfo.getValueUpdateTime().toString() +
                           ":add:" + valInfo.getValue().toString();
                           ":add:" + valInfo.getAttributeValue().toString();
              }
            }
@@ -413,15 +497,15 @@
    }
    // Encode the historical information for the ADD Operation.
    if (ADDDate != null)
    if (entryADDDate != null)
    {
      builder.add(encodeAddHistorical(ADDDate));
      builder.add(encodeAddHistorical(entryADDDate));
    }
    // Encode the historical information for the MODDN Operation.
    if (MODDNDate != null)
    if (entryMODDNDate != null)
    {
      builder.add(encodeMODDNHistorical(MODDNDate));
      builder.add(encodeMODDNHistorical(entryMODDNDate));
    }
    return builder.toAttribute();
@@ -439,7 +523,7 @@
   */
  public boolean AddedOrRenamedAfter(ChangeNumber cn)
  {
    if (cn.older(ADDDate) || cn.older(MODDNDate))
    if (cn.older(entryADDDate) || cn.older(entryMODDNDate))
    {
      return true;
    }
@@ -455,58 +539,76 @@
   */
  public ChangeNumber getDNDate()
  {
    if (ADDDate == null)
      return MODDNDate;
    if (entryADDDate == null)
      return entryMODDNDate;
    if (MODDNDate == null)
      return ADDDate;
    if (entryMODDNDate == null)
      return entryADDDate;
    if (MODDNDate.older(ADDDate))
      return MODDNDate;
    if (entryMODDNDate.older(entryADDDate))
      return entryMODDNDate;
    else
      return ADDDate;
      return entryADDDate;
  }
  /**
   * read the historical information from the entry attribute and
   * load it into the Historical object attached to the entry.
   * Construct an Historical object from the provided entry by reading the
   * historical attribute.
   * Return an empty object when the entry does not contain any
   * historical attribute.
   *
   * @param entry The entry which historical information must be loaded
   * @return the generated Historical information
   * @return The constructed Historical information object
   *
   */
  public static Historical load(Entry entry)
  public static EntryHistorical newInstanceFromEntry(Entry entry)
  {
    List<Attribute> hist = getHistoricalAttr(entry);
    Historical histObj = new Historical();
    AttributeType lastAttrType = null;
    Set<String> lastOptions = new HashSet<String>();
    AttributeInfo attrInfo = null;
    AttrInfoWithOptions attrInfoWithOptions = null;
    AttrHistorical attrInfo = null;
    AttrHistoricalWithOptions attrInfoWithOptions = null;
    if (hist == null)
    // Read the DB historical attribute from the entry
    List<Attribute> histAttrWithOptionsFromEntry = getHistoricalAttr(entry);
    // Now we'll build the Historical object we want to construct
    EntryHistorical newHistorical = new EntryHistorical();
    if (histAttrWithOptionsFromEntry == null)
    {
      return histObj;
      // No historical attribute in the entry, return empty object
      return newHistorical;
    }
    try
    {
      for (Attribute attr : hist)
      // For each value of the historical attr read (mod. on a user attribute)
      //   build an AttrInfo subobject
      // Traverse the Attributes (when several options for the hist attr)
      // of the historical attribute read from the entry
      for (Attribute histAttrFromEntry : histAttrWithOptionsFromEntry)
      {
        for (AttributeValue val : attr)
        // For each Attribute (option), traverse the values
        for (AttributeValue histAttrValueFromEntry : histAttrFromEntry)
        {
          HistVal histVal = new HistVal(val.getValue().toString());
          // From each value of the hist attr, create an object
          HistoricalAttributeValue histVal = new HistoricalAttributeValue(
              histAttrValueFromEntry.getValue().toString());
          AttributeType attrType = histVal.getAttrType();
          Set<String> options = histVal.getOptions();
          ChangeNumber cn = histVal.getCn();
          AttributeValue value = histVal.getAttributeValue();
          HistKey histKey = histVal.getHistKey();
          HistAttrModificationKey histKey = histVal.getHistKey();
          if (histVal.isADDOperation())
          {
            histObj.ADDDate = cn;
            newHistorical.entryADDDate = cn;
          }
          else if (histVal.isMODDNOperation())
          {
            histObj.MODDNDate = cn;
            newHistorical.entryMODDNDate = cn;
          }
          else
          {
@@ -533,10 +635,15 @@
             */
            if (attrType != lastAttrType)
            {
              attrInfo = AttributeInfo.createAttributeInfo(attrType);
              attrInfoWithOptions = new AttrInfoWithOptions();
              attrInfo = AttrHistorical.createAttributeHistorical(attrType);
              // Create attrInfoWithOptions and store inside the attrInfo
              attrInfoWithOptions = new AttrHistoricalWithOptions();
              attrInfoWithOptions.put(options, attrInfo);
              histObj.attributesInfo.put(attrType, attrInfoWithOptions);
              // Store this attrInfoWithOptions in the newHistorical object
              newHistorical.attributesHistorical.
                put(attrType, attrInfoWithOptions);
              lastAttrType = attrType;
              lastOptions = options;
@@ -545,13 +652,13 @@
            {
              if (!options.equals(lastOptions))
              {
                attrInfo = AttributeInfo.createAttributeInfo(attrType);
                attrInfo = AttrHistorical.createAttributeHistorical(attrType);
                attrInfoWithOptions.put(options, attrInfo);
                lastOptions = options;
              }
            }
            attrInfo.load(histKey, value, cn);
            attrInfo.assign(histKey, value, cn);
          }
        }
      }
@@ -565,7 +672,7 @@
    }
    /* set the reference to the historical information in the entry */
    return histObj;
    return newHistorical;
  }
@@ -590,7 +697,8 @@
      {
        for (AttributeValue val : attr)
        {
          HistVal histVal = new HistVal(val.getValue().toString());
          HistoricalAttributeValue histVal =
            new HistoricalAttributeValue(val.getValue().toString());
          if (histVal.isADDOperation())
          {
            // Found some historical information indicating that this
@@ -643,12 +751,14 @@
  }
  /**
   * Get the Attribute used to store the historical information from
   * the given Entry.
   * Get the attribute used to store the historical information from
   * the provided Entry.
   *
   * @param   entry  The entry containing the historical information.
   *
   * @return  The Attribute used to store the historical information.
   *          Several values on the list if several options for this attribute.
   *          Null if not present.
   */
  public static List<Attribute> getHistoricalAttr(Entry entry)
  {
@@ -721,7 +831,8 @@
  public static boolean isHistoricalAttribute(Attribute attr)
  {
    AttributeType attrType = attr.getAttributeType();
    return attrType.getNameOrOID().equals(Historical.HISTORICALATTRIBUTENAME);
    return
      attrType.getNameOrOID().equals(EntryHistorical.HISTORICALATTRIBUTENAME);
  }
}
opends/src/server/org/opends/server/replication/plugin/FakeAddOperation.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -61,10 +61,10 @@
  public AddMsg generateMessage()
  {
    return new AddMsg(getChangeNumber(), entry.getDN().toString(),
               Historical.getEntryUuid(entry),
               EntryHistorical.getEntryUuid(entry),
               LDAPReplicationDomain.findEntryId(
                   entry.getDN().getParentDNInSuffix()),
               entry.getObjectClasses(),
               entry.getUserAttributes(), entry.getOperationalAttributes());
  }
}
}
opends/src/server/org/opends/server/replication/plugin/FakeModdnOperation.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Copyright 2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -65,7 +65,7 @@
  {
    DN dn = entry.getDN();
    return new ModifyDNMsg(dn.toString(), this.getChangeNumber(),
        Historical.getEntryUuid(entry),
        EntryHistorical.getEntryUuid(entry),
        LDAPReplicationDomain.findEntryId(dn.getParent()),
        false, dn.getParent().toString(), dn.getRDN().toString());
  }
opends/src/server/org/opends/server/replication/plugin/HistAttrModificationKey.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/HistKey.java
@@ -22,14 +22,22 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
/**
 * Enumeration used for storing type of historical information.
 * Enumeration used for storing type of attribute modification
 * in the value of the replication historical information.
 *
 * Example of ds-sync-hist values:
 * ds-sync-hist: attrName1:changeNumber1:repl:newReplacingValue
 * ds-sync-hist: attrName1:changeNumber2:del:deletedValue
 * ds-sync-hist: attrName3:changeNumber3:add:newAddedvalue
 * ds-sync-hist: attrName3:changeNumber4:attrDel
 *
 */
public enum HistKey
public enum HistAttrModificationKey
{
  /**
   * The key for attribute value deletion.
@@ -59,7 +67,7 @@
   *
   * @param histkey The key string
   */
  private HistKey(String histkey)
  private HistAttrModificationKey(String histkey)
  {
    this.key = histkey;
  }
@@ -70,22 +78,22 @@
   * @param histkey the String to decode
   * @return the key from the enum type
   */
  public static HistKey decodeKey(String histkey)
  public static HistAttrModificationKey decodeKey(String histkey)
  {
     if (histkey == null)
       return null;
     if (histkey.compareTo("repl") == 0)
       return HistKey.REPL;
       return HistAttrModificationKey.REPL;
     if (histkey.compareTo("add") == 0)
       return HistKey.ADD;
       return HistAttrModificationKey.ADD;
     if (histkey.compareTo("del") == 0)
       return HistKey.DEL;
       return HistAttrModificationKey.DEL;
     if (histkey.compareTo("attrDel") == 0)
       return HistKey.DELATTR;
       return HistAttrModificationKey.DELATTR;
     return null;
  }
opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/HistVal.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -35,56 +35,60 @@
/**
 * This Class is used to encode/decode historical information
 * from the String form to the internal usable form.
 * This class stores an internal usable representation of the value of
 * the historical related to an entry.
 * It encodes/decodes from the String form stored in the DB attribute
 * from/to the internal usable form.
 *
 *
 * an historical attribute value looks like :
 *  description:00000108b3a6554100000001:add:added_value
 *  or
 *  description:00000108b3a6cbb800000001:del:deleted_value
 *  or
 *  description:00000108b3a6cbb800000001:repl:new_value
 *  or
 *  description:00000108b3a6cbb800000001:delAttr
 *  or
 *  description:00000108b3a6554100000001:add
 *  or
 *  dn:00000108b3a6554100000001:add (ADD operation)
 *  or
 *  dn:00000108b3a6554100000001:moddn (MODIFYDN operation)
 *
 *  so after split
 *  token[0] will contain the attribute name
 *  token[1] will contain the change number
 *  token[2] will contain the type of historical information
 *  token[3] will contain the attribute value
 *
 *  options are stored with the attribute names using; as a separator
 *  example :
 *  description;FR;France:00000108b3a6554100000001:add:added_value
 *
 *
 */
public class HistVal
public class HistoricalAttributeValue
{
  private AttributeType attrType;
  private String attrString;
  private AttributeValue attributeValue;
  private ChangeNumber cn;
  private LinkedHashSet<String> options;
  private HistKey histKey;
  private HistAttrModificationKey histKey;
  private String stringValue;
  // This flag indicates that this HistVal was generated to store the last date
  // This flag indicates that this value was generated to store the last date
  // when the entry was renamed.
  private boolean ismodDN = false;
  /**
   * Create a new HistVal from the String encoded form.
   * Create a new object from the String encoded form.
   *
   * @param strVal The String encoded form of historical information.
   * @param strVal The String encoded form of historical attribute value.
   */
  public HistVal(String strVal)
  public HistoricalAttributeValue(String strVal)
  {
    /*
     * an historical attribute value looks like :
     *  description:00000108b3a6554100000001:add:added_value
     *  or
     *  description:00000108b3a6cbb800000001:del:deleted_value
     *  or
     *  description:00000108b3a6cbb800000001:repl:new_value
     *  or
     *  description:00000108b3a6cbb800000001:delAttr
     *  or
     *  description:00000108b3a6554100000001:add
     *  or
     *  dn:00000108b3a6554100000001:add (ADD operation)
     *  or
     *  dn:00000108b3a6554100000001:moddn (MODIFYDN operation)
     *
     *  so after split
     *  token[0] will contain the attribute name
     *  token[1] will contain the change number
     *  token[2] will contain the type of historical information
     *  token[3] will contain the attribute value
     *
     *  options are stored with the attribute names using; as a separator
     *  example :
     *  description;FR;France:00000108b3a6554100000001:add:added_value
     */
    String[] token = strVal.split(":", 4);
    options = new LinkedHashSet<String>();
@@ -124,9 +128,9 @@
    }
    cn = new ChangeNumber(token[1]);
    histKey = HistKey.decodeKey(token[2]);
    histKey = HistAttrModificationKey.decodeKey(token[2]);
    stringValue = null;
    if (histKey != HistKey.DELATTR)
    if (histKey != HistAttrModificationKey.DELATTR)
    {
      if (token.length == 4)
      {
@@ -177,7 +181,7 @@
   * Get the HistKey.
   * @return Returns the histKey.
   */
  public HistKey getHistKey()
  public HistAttrModificationKey getHistKey()
  {
    return histKey;
  }
@@ -210,16 +214,18 @@
  }
  /**
   * Generate a Modification equivalent to this HistVal.
   * Generate a Modification equivalent to this value of the historical
   * attribute.
   *
   * @return A Modification equivalent to this HistVal.
   * @return A modification equivalent to this value of the historical
   * attribute.
   */
  public Modification generateMod()
  {
    AttributeBuilder builder = new AttributeBuilder(attrType, attrString);
    builder.setOptions(options);
    if (histKey != HistKey.DELATTR)
    if (histKey != HistAttrModificationKey.DELATTR)
    {
      builder.add(attributeValue);
    }
@@ -247,9 +253,10 @@
  }
  /**
   * Indicates if the HistVal was generated for a ADD operation.
   * Indicates if this value of the historical attribute was generated
   * for a ADD operation.
   *
   * @return a boolean indicating if the HistVal was generated for a ADD
   * @return a boolean indicating if this was generated for a ADD
   *         operation.
   */
  public boolean isADDOperation()
@@ -258,9 +265,10 @@
  }
  /**
   * Indicates if the HistVal was generated for a MODDN operation.
   * Indicates if this value of the historical attribute was generated
   * for a MODDN operation.
   *
   * @return a boolean indicating if the HistVal was generated for a ADDMODDN
   * @return a boolean indicating if this was generated for a ADDMODDN
   *         operation.
   */
  public boolean isMODDNOperation()
opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -31,7 +31,7 @@
import static org.opends.server.loggers.ErrorLogger.logError;
import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
import static org.opends.server.loggers.debug.DebugLogger.getTracer;
import static org.opends.server.replication.plugin.Historical.ENTRYUIDNAME;
import static org.opends.server.replication.plugin.EntryHistorical.ENTRYUIDNAME;
import static org.opends.server.replication.protocol.OperationContext.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.createEntry;
@@ -203,7 +203,7 @@
      // after startingChangeNumber and before endChangeNumber and
      // add them to the replayOperations list
      Iterable<FakeOperation> updates =
        Historical.generateFakeOperations(searchEntry);
        EntryHistorical.generateFakeOperations(searchEntry);
      for (FakeOperation op : updates)
      {
@@ -1842,7 +1842,7 @@
       * as it was in the original message.
       */
      String operationEntryUUID = ctx.getEntryUid();
      String modifiedEntryUUID = Historical.getEntryUuid(deletedEntry);
      String modifiedEntryUUID = EntryHistorical.getEntryUuid(deletedEntry);
      if (!operationEntryUUID.equals(modifiedEntryUUID))
      {
        /*
@@ -1865,7 +1865,7 @@
      // There is no replication context attached to the operation
      // so this is not a replication operation.
      ChangeNumber changeNumber = generateChangeNumber(deleteOperation);
      String modifiedEntryUUID = Historical.getEntryUuid(deletedEntry);
      String modifiedEntryUUID = EntryHistorical.getEntryUuid(deletedEntry);
      ctx = new DeleteContext(changeNumber, modifiedEntryUUID);
      deleteOperation.setAttachment(SYNCHROCONTEXT, ctx);
@@ -2084,7 +2084,7 @@
       * as was in the original message.
       */
      String modifiedEntryUUID =
        Historical.getEntryUuid(modifyDNOperation.getOriginalEntry());
        EntryHistorical.getEntryUuid(modifyDNOperation.getOriginalEntry());
      if (!modifiedEntryUUID.equals(ctx.getEntryUid()))
      {
        /*
@@ -2119,7 +2119,8 @@
       * If the object has been renamed more recently than this
       * operation, cancel the operation.
       */
      Historical hist = Historical.load(modifyDNOperation.getOriginalEntry());
      EntryHistorical hist = EntryHistorical.newInstanceFromEntry(
          modifyDNOperation.getOriginalEntry());
      if (hist.AddedOrRenamedAfter(ctx.getChangeNumber()))
      {
        return new SynchronizationProviderResult.StopProcessing(
@@ -2138,7 +2139,7 @@
      }
      Entry modifiedEntry = modifyDNOperation.getOriginalEntry();
      String modifiedEntryUUID = Historical.getEntryUuid(modifiedEntry);
      String modifiedEntryUUID = EntryHistorical.getEntryUuid(modifiedEntry);
      ctx = new ModifyDnContext(changeNumber, modifiedEntryUUID, newParentId);
      modifyDNOperation.setAttachment(SYNCHROCONTEXT, ctx);
    }
@@ -2214,22 +2215,26 @@
    Entry modifiedEntry = modifyOperation.getModifiedEntry();
    if (ctx == null)
    {
      // There is no replication context attached to the operation
      // so this is not a replication operation.
      // No replication ctxt attached => not a replicated operation
      // - create a ctxt with : changeNumber, entryUUID
      // - attach the context to the op
      ChangeNumber changeNumber = generateChangeNumber(modifyOperation);
      String modifiedEntryUUID = Historical.getEntryUuid(modifiedEntry);
      String modifiedEntryUUID = EntryHistorical.getEntryUuid(modifiedEntry);
      if (modifiedEntryUUID == null)
        modifiedEntryUUID = modifyOperation.getEntryDN().toString();
      ctx = new ModifyContext(changeNumber, modifiedEntryUUID);
      modifyOperation.setAttachment(SYNCHROCONTEXT, ctx);
    }
    else
    {
      // This is a replayed operation, it is necessary to
      // Replication ctxt attached => this is a replicated operation being
      // replayed here, it is necessary to
      // - check if the entry has been renamed
      // - check for conflicts
      String modifiedEntryUUID = ctx.getEntryUid();
      String currentEntryUUID = Historical.getEntryUuid(modifiedEntry);
      String currentEntryUUID = EntryHistorical.getEntryUuid(modifiedEntry);
      if ((currentEntryUUID != null) &&
          (!currentEntryUUID.equals(modifiedEntryUUID)))
      {
@@ -2251,8 +2256,9 @@
      /*
       * Solve the conflicts between modify operations
       */
      Historical historicalInformation = Historical.load(modifiedEntry);
      modifyOperation.setAttachment(Historical.HISTORICAL,
      EntryHistorical historicalInformation =
        EntryHistorical.newInstanceFromEntry(modifiedEntry);
      modifyOperation.setAttachment(EntryHistorical.HISTORICAL,
                                    historicalInformation);
      if (historicalInformation.replayOperation(modifyOperation, modifiedEntry))
@@ -2276,7 +2282,7 @@
  public void doPreOperation(PreOperationAddOperation addOperation)
  {
    AddContext ctx = new AddContext(generateChangeNumber(addOperation),
        Historical.getEntryUuid(addOperation),
        EntryHistorical.getEntryUuid(addOperation),
        findEntryId(addOperation.getEntryDN().getParentDNInSuffix()));
    addOperation.setAttachment(SYNCHROCONTEXT, ctx);
@@ -2452,8 +2458,8 @@
    }
     LinkedHashSet<String> attrs = new LinkedHashSet<String>(1);
     attrs.add(Historical.HISTORICALATTRIBUTENAME);
     attrs.add(Historical.ENTRYUIDNAME);
     attrs.add(EntryHistorical.HISTORICALATTRIBUTENAME);
     attrs.add(EntryHistorical.ENTRYUIDNAME);
     attrs.add("*");
     InternalSearchOperation searchOp =  conn.processSearch(
       ByteString.valueOf(baseDn.toString()),
@@ -2467,7 +2473,7 @@
     ChangeNumber entrytoRenameDate = null;
     for (SearchResultEntry entry : entries)
     {
       Historical history = Historical.load(entry);
       EntryHistorical history = EntryHistorical.newInstanceFromEntry(entry);
       if (entrytoRename == null)
       {
         entrytoRename = entry;
@@ -2848,7 +2854,7 @@
          SearchResultEntry resultEntry = result.getFirst();
          if (resultEntry != null)
          {
            return Historical.getEntryUuid(resultEntry);
            return EntryHistorical.getEntryUuid(resultEntry);
          }
        }
      }
@@ -3306,7 +3312,7 @@
    {
      LinkedHashSet<String> attrs = new LinkedHashSet<String>(1);
      attrs.add(ENTRYUIDNAME);
      attrs.add(Historical.HISTORICALATTRIBUTENAME);
      attrs.add(EntryHistorical.HISTORICALATTRIBUTENAME);
      SearchFilter ALLMATCH;
      ALLMATCH = SearchFilter.createFilterFromString("(objectClass=*)");
@@ -3329,7 +3335,7 @@
             */
            conflict = true;
            renameConflictEntry(conflictOp, entry.getDN(),
                Historical.getEntryUuid(entry));
                EntryHistorical.getEntryUuid(entry));
          }
        }
      }
@@ -4849,13 +4855,13 @@
    }
    LDAPFilter filter = LDAPFilter.decode(
       "(&(" + Historical.HISTORICALATTRIBUTENAME + ">=dummy:"
       + fromChangeNumber + ")(" + Historical.HISTORICALATTRIBUTENAME +
       "(&(" + EntryHistorical.HISTORICALATTRIBUTENAME + ">=dummy:"
       + fromChangeNumber + ")(" + EntryHistorical.HISTORICALATTRIBUTENAME +
       "<=dummy:" + maxValueForId + "))");
    LinkedHashSet<String> attrs = new LinkedHashSet<String>(1);
    attrs.add(Historical.HISTORICALATTRIBUTENAME);
    attrs.add(Historical.ENTRYUIDNAME);
    attrs.add(EntryHistorical.HISTORICALATTRIBUTENAME);
    attrs.add(EntryHistorical.ENTRYUIDNAME);
    attrs.add("*");
    return conn.processSearch(
      ByteString.valueOf(baseDn.toString()),
opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
@@ -493,18 +493,17 @@
    if ((domain == null) || (!domain.solveConflict()))
      return new SynchronizationProviderResult.ContinueProcessing();
    Historical historicalInformation = (Historical)
                            modifyOperation.getAttachment(
                                    Historical.HISTORICAL);
    EntryHistorical historicalInformation = (EntryHistorical)
      modifyOperation.getAttachment(EntryHistorical.HISTORICAL);
    if (historicalInformation == null)
    {
      Entry entry = modifyOperation.getModifiedEntry();
      historicalInformation = Historical.load(entry);
      modifyOperation.setAttachment(Historical.HISTORICAL,
              historicalInformation);
      historicalInformation = EntryHistorical.newInstanceFromEntry(entry);
      modifyOperation.setAttachment(EntryHistorical.HISTORICAL,
          historicalInformation);
    }
    historicalInformation.generateState(modifyOperation);
    historicalInformation.setHistoricalAttrToOperation(modifyOperation);
    if (modifyOperation.getModifications().isEmpty())
    {
@@ -543,18 +542,22 @@
    if ((domain == null) || (!domain.solveConflict()))
      return new SynchronizationProviderResult.ContinueProcessing();
    Historical historicalInformation = (Historical)
    modifyDNOperation.getAttachment(
        Historical.HISTORICAL);
    // The historical object is retrieved from the attachment created
    // in the HandleConflictResolution phase.
    EntryHistorical historicalInformation = (EntryHistorical)
    modifyDNOperation.getAttachment(EntryHistorical.HISTORICAL);
    if (historicalInformation == null)
    {
      // When no Historical attached, create once by loading from the entry
      // and attach it to the operation
      Entry entry = modifyDNOperation.getUpdatedEntry();
      historicalInformation = Historical.load(entry);
      modifyDNOperation.setAttachment(Historical.HISTORICAL,
      historicalInformation = EntryHistorical.newInstanceFromEntry(entry);
      modifyDNOperation.setAttachment(EntryHistorical.HISTORICAL,
          historicalInformation);
    }
    historicalInformation.generateState(modifyDNOperation);
    // Add to the operation the historical attribute : "dn:changeNumger:moddn"
    historicalInformation.setHistoricalAttrToOperation(modifyDNOperation);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
@@ -566,15 +569,18 @@
  public SynchronizationProviderResult doPreOperation(
         PreOperationAddOperation addOperation)
  {
    // Check replication domain
    LDAPReplicationDomain domain =
      findDomain(addOperation.getEntryDN(), addOperation);
    if (domain == null)
      return new SynchronizationProviderResult.ContinueProcessing();
    // For LOCAL op only, generate ChangeNumber and attach Context
    if (!addOperation.isSynchronizationOperation())
      domain.doPreOperation(addOperation);
    Historical.generateState(addOperation);
    // Add to the operation the historical attribute : "dn:changeNumger:add"
    EntryHistorical.setHistoricalAttrToOperation(addOperation);
    return new SynchronizationProviderResult.ContinueProcessing();
  }
opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java
@@ -422,7 +422,7 @@
    ChangeNumber serverStateMaxCn;
    ChangeNumber dbMaxCn;
    final AttributeType histType =
      DirectoryServer.getAttributeType(Historical.HISTORICALATTRIBUTENAME);
      DirectoryServer.getAttributeType(EntryHistorical.HISTORICALATTRIBUTENAME);
    // Retrieves the entries that have changed since the
    // maxCn stored in the serverState
@@ -461,7 +461,8 @@
            while (true)
            {
              AttributeValue attrVal = iav.next();
              HistVal histVal = new HistVal(attrVal.toString());
              HistoricalAttributeValue histVal =
                new HistoricalAttributeValue(attrVal.toString());
              ChangeNumber cn = histVal.getCn();
              if ((cn != null) && (cn.getServerId() == serverId))
opends/src/server/org/opends/server/replication/protocol/AddMsg.java
@@ -42,7 +42,7 @@
import org.opends.server.protocols.asn1.ASN1;
import org.opends.server.protocols.asn1.ASN1Exception;
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.plugin.Historical;
import org.opends.server.replication.plugin.EntryHistorical;
import org.opends.server.types.*;
import org.opends.server.types.operation.PostOperationAddOperation;
@@ -345,7 +345,7 @@
      {
        for (Attribute a : list)
        {
          if (!Historical.isHistoricalAttribute(a))
          if (!EntryHistorical.isHistoricalAttribute(a))
            if (!a.isVirtual())
              new LDAPAttribute(a).write(writer);
        }
@@ -356,7 +356,7 @@
      {
        for (Attribute a : list)
        {
          if (!Historical.isHistoricalAttribute(a))
          if (!EntryHistorical.isHistoricalAttribute(a))
            if (!a.isVirtual())
              new LDAPAttribute(a).write(writer);
        }
opends/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2009 Sun Microsystems, Inc.
 *      Copyright 2009-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.protocol;
@@ -37,7 +37,7 @@
import org.opends.server.protocols.ldap.LDAPAttribute;
import org.opends.server.protocols.ldap.LDAPModification;
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.plugin.Historical;
import org.opends.server.replication.plugin.EntryHistorical;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeUsage;
@@ -153,7 +153,7 @@
        }
      }
      if (!Historical.isHistoricalAttribute(attr))
      if (!EntryHistorical.isHistoricalAttribute(attr))
      {
        LDAPModification ldapmod = new LDAPModification(
          mod.getModificationType(), new LDAPAttribute(mod.getAttribute()));
opends/src/server/org/opends/server/replication/protocol/OperationContext.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.protocol;
@@ -101,7 +101,8 @@
  }
  /**
   * Get the change number of an operation.
   * Get the change number of an operation from the synchronization context
   * attached to the provided operation.
   *
   * @param  op The operation.
   *
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
@@ -26,6 +26,10 @@
 */
package org.opends.server.replication;
import static org.opends.messages.ReplicationMessages.ERR_INVALID_COOKIE_SYNTAX;
import static org.opends.messages.ReplicationMessages.ERR_RESYNC_REQUIRED_MISSING_DOMAIN_IN_PROVIDED_COOKIE;
import static org.opends.messages.ReplicationMessages.ERR_RESYNC_REQUIRED_TOO_OLD_DOMAIN_IN_PROVIDED_COOKIE;
import static org.opends.messages.ReplicationMessages.ERR_RESYNC_REQUIRED_UNKNOWN_DOMAIN_IN_PROVIDED_COOKIE;
import static org.opends.server.TestCaseUtils.TEST_ROOT_DN_STRING;
import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
import static org.opends.server.loggers.debug.DebugLogger.getTracer;
@@ -54,6 +58,10 @@
import java.util.SortedSet;
import java.util.TreeSet;
import static org.opends.server.loggers.ErrorLogger.logError;
import org.opends.messages.Category;
import org.opends.messages.Message;
import org.opends.messages.Severity;
import org.opends.server.TestCaseUtils;
import org.opends.server.api.Backend;
import org.opends.server.api.ConnectionHandler;
@@ -141,8 +149,6 @@
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static org.opends.messages.ReplicationMessages.*;
import org.opends.messages.Message;
/**
 * Tests for the replicationServer code.
@@ -330,16 +336,16 @@
    // Request from an invalid draft change number
    ECLCompatBadSeqnum();
    // Write changes and read ECL from start
    // Write 4 changes and read ECL from start
    int ts = ECLCompatWriteReadAllOps(1);
    // Write additional changes and read ECL from a provided draft change number
    // Write 4 additional changes and read ECL from a provided draft change number
    ts = ECLCompatWriteReadAllOps(5);
    // Test request from a provided change number
    // Test request from a provided change number - read 6
    ECLCompatReadFrom(6);
    // Test request from a provided change number interval
    // Test request from a provided change number interval - read 5-7
    ECLCompatReadFromTo(5,7);
    // Test first and last draft changenumber
@@ -4102,4 +4108,4 @@
            operation.getErrorMessage().toString());                
    }
  }
}
}
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AttrInfoTest.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;
@@ -31,8 +31,8 @@
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.plugin.AttrInfoMultiple;
import org.opends.server.replication.plugin.ValueInfo;
import org.opends.server.replication.plugin.AttrHistoricalMultiple;
import org.opends.server.replication.plugin.AttrValueHistorical;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.Attributes;
@@ -85,50 +85,50 @@
      throws Exception
  {
    // Create an empty AttrInfo
    AttrInfoMultiple attrInfo1 = new AttrInfoMultiple();
    AttrHistoricalMultiple attrInfo1 = new AttrHistoricalMultiple();
    // Check add(AttributeValue val, ChangeNumber CN)
    attrInfo1.add(att, updateTime);
    ArrayList<ValueInfo> values1 = attrInfo1.getValuesInfo();
    ArrayList<AttrValueHistorical> values1 = attrInfo1.getValuesHistorical();
    assertTrue(values1.size() == 1);
    ValueInfo valueInfo1 = new ValueInfo(att, updateTime, null);
    AttrValueHistorical valueInfo1 = new AttrValueHistorical(att, updateTime, null);
    assertTrue(values1.get(0).equals(valueInfo1));
    // Check constructor with parameter
    ValueInfo valueInfo2 = new ValueInfo(att, updateTime, deleteTime);
    ArrayList<ValueInfo> values = new ArrayList<ValueInfo>();
    AttrValueHistorical valueInfo2 = new AttrValueHistorical(att, updateTime, deleteTime);
    ArrayList<AttrValueHistorical> values = new ArrayList<AttrValueHistorical>();
    values.add(valueInfo2);
    AttrInfoMultiple attrInfo2 = new AttrInfoMultiple(deleteTime, updateTime, values);
    AttrHistoricalMultiple attrInfo2 = new AttrHistoricalMultiple(deleteTime, updateTime, values);
    // Check equality
    //assertTrue(attrInfo1.getDeleteTime().compareTo(attrInfo2.getDeleteTime())==0);
    //  Check constructor with time parameter and not Value
    AttrInfoMultiple attrInfo3 = new AttrInfoMultiple(deleteTime, updateTime, null);
    AttrHistoricalMultiple attrInfo3 = new AttrHistoricalMultiple(deleteTime, updateTime, null);
    attrInfo3.add(att, updateTime);
    ArrayList<ValueInfo> values3 = attrInfo3.getValuesInfo();
    ArrayList<AttrValueHistorical> values3 = attrInfo3.getValuesHistorical();
    assertTrue(values3.size() == 1);
    valueInfo1 = new ValueInfo(att, updateTime, null);
    valueInfo1 = new AttrValueHistorical(att, updateTime, null);
    assertTrue(values3.get(0).equals(valueInfo1));
    // Check duplicate
    AttrInfoMultiple attrInfo4 = attrInfo3.duplicate();
    ArrayList<ValueInfo> values4 = attrInfo4.getValuesInfo();
    AttrHistoricalMultiple attrInfo4 = attrInfo3.duplicate();
    ArrayList<AttrValueHistorical> values4 = attrInfo4.getValuesHistorical();
    assertTrue(attrInfo4.getDeleteTime().compareTo(attrInfo3.getDeleteTime())==0);
    assertEquals(values4.size(), values3.size());
    // Check delete(AttributeValue val, ChangeNumber CN)
    attrInfo4.delete(att, updateTime);
    assertTrue(attrInfo4.getValuesInfo().size() == 1);
    assertTrue(attrInfo4.getValuesHistorical().size() == 1);
    // Check delete(LinkedHashSet<AttributeValue> values, ChangeNumber CN)
    AttributeType type = DirectoryServer.getAttributeType("description");
    attrInfo3.delete(Attributes.create(type, att), updateTime) ;
    assertTrue(attrInfo3.getValuesInfo().size() == 1);
    assertTrue(attrInfo3.getValuesHistorical().size() == 1);
    // Check delete(ChangeNumber CN)
    attrInfo2.delete(updateTime) ;
    assertTrue(attrInfo2.getValuesInfo().size() == 0);
    assertTrue(attrInfo2.getValuesHistorical().size() == 0);
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingTest.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -141,7 +141,7 @@
      long startTime = TimeThread.getTime();
    final DN dn1 = DN.decode("cn=test1," + baseDn.toString());
    final AttributeType histType =
      DirectoryServer.getAttributeType(Historical.HISTORICALATTRIBUTENAME);
      DirectoryServer.getAttributeType(EntryHistorical.HISTORICALATTRIBUTENAME);
    logError(Message.raw(Category.SYNC, Severity.INFORMATION,
    "Starting replication test : changesCmpTest"));
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalTest.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
@@ -183,11 +183,11 @@
    DN dn = DN.decode("uid=user.1," + TEST_ROOT_DN_STRING);
    Entry entry = DirectoryServer.getEntry(dn);
    List<Attribute> attrs = Historical.getHistoricalAttr(entry);
    List<Attribute> attrs = EntryHistorical.getHistoricalAttr(entry);
    Attribute before = attrs.get(0);
    // Check that encoding and decoding preserves the history information.
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    Attribute after = hist.encode();
    assertEquals(after, before);
@@ -368,7 +368,7 @@
    // This will ensure both that the Add historical information is
    // correctly added and also that the code that rebuild operation
    // from this historical information is working.
    Iterable<FakeOperation> ops = Historical.generateFakeOperations(entry);
    Iterable<FakeOperation> ops = EntryHistorical.generateFakeOperations(entry);
    // Perform a few check on the Operation to see that it
    // was correctly generated.
@@ -387,7 +387,7 @@
    // use historical information to generate new list of operations
    // equivalent to the operations that have been applied to this entry.
    ops = Historical.generateFakeOperations(entry);
    ops = EntryHistorical.generateFakeOperations(entry);
    // Perform a few check on the operation list to see that it
    // was correctly generated.
@@ -406,7 +406,7 @@
    // use historical information to generate new list of operations
    // equivalent to the operations that have been applied to this entry.
    ops = Historical.generateFakeOperations(entry);
    ops = EntryHistorical.generateFakeOperations(entry);
    // Perform a few check on the operation list to see that it
    // was correctly generated.
@@ -450,7 +450,7 @@
        assertTrue(addOp.getChangeNumber() != null);
        AddMsg addmsg = addOp.generateMessage();
        assertTrue(dn1.equals(DN.decode(addmsg.getDn())));
        assertTrue(addmsg.getUniqueId().equals(Historical.getEntryUuid(entry)));
        assertTrue(addmsg.getUniqueId().equals(EntryHistorical.getEntryUuid(entry)));
        String parentId = LDAPReplicationDomain.findEntryId(dn1.getParent());
        assertTrue(addmsg.getParentUid().equals(parentId));
        addmsg.createOperation(InternalClientConnection.getRootConnection());
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ModifyConflictTest.java
@@ -48,7 +48,7 @@
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.plugin.FakeOperation;
import org.opends.server.replication.plugin.FakeOperationComparator;
import org.opends.server.replication.plugin.Historical;
import org.opends.server.replication.plugin.EntryHistorical;
import org.opends.server.replication.protocol.ModifyContext;
import org.opends.server.replication.protocol.ReplicationMsg;
import org.opends.server.types.*;
@@ -86,7 +86,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a modify-replace done at time t10
@@ -128,7 +128,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a modify-replace done at time t10
@@ -171,7 +171,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a replace with null done at time t3
@@ -212,7 +212,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a modify-add done at time t10
@@ -254,7 +254,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a modify-add done at time 2
@@ -289,7 +289,7 @@
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the whole description attribute done at time
@@ -345,7 +345,7 @@
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the description attribute value "value1"
@@ -401,7 +401,7 @@
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the description attribute values
@@ -449,7 +449,7 @@
    entry.addAttribute(attribute, duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of attribute employeenumber.
@@ -483,7 +483,7 @@
    entry.addAttribute(attribute, duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * now simulate a delete of value "value1"
@@ -523,7 +523,7 @@
    entry.addAttribute(builder.toAttribute(), duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the description attribute value "value1"
@@ -569,7 +569,7 @@
    entry.addAttribute(attribute, duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the whole description attribute done at time
@@ -612,7 +612,7 @@
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the whole description attribute done at time
@@ -657,7 +657,7 @@
    entry.addAttribute(builder.toAttribute(), duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    // simulate a REPLACE of the attribute with values : value1, value2, value3
    // at time t1.
@@ -714,7 +714,7 @@
    entry.addAttribute(builder.toAttribute(), duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    // simulate a DELETE of the attribute values : value3 and value4
    // at time t2.
@@ -786,7 +786,7 @@
    entry.addAttribute(attribute, duplicateValues);
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a delete of the whole description attribute done at time
@@ -813,7 +813,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a add of the description attribute done at time t10
@@ -855,7 +855,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a add of the description attribute done at time t10
@@ -898,7 +898,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * Now simulate a del and a add in the same operation
@@ -937,7 +937,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a add of the description attribute done at time 1
@@ -967,7 +967,7 @@
    entry = initializeEntry();
    // load historical from the entry
    hist = Historical.load(entry);
    hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate an add of the description attribute values
@@ -1002,7 +1002,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a add of the description attribute done at time t10
@@ -1044,7 +1044,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a add of the description attribute done at time t1
@@ -1082,7 +1082,7 @@
    Entry entry = initializeEntry();
    // load historical from the entry
    Historical hist = Historical.load(entry);
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    /*
     * simulate a add of the description attribute done at time t1
@@ -1134,7 +1134,7 @@
  {
    AttributeType entryuuidAttrType =
      DirectoryServer.getSchema().getAttributeType(
          Historical.ENTRYUIDNAME);
          EntryHistorical.ENTRYUIDNAME);
    /*
     * Objectclass and DN do not have any impact on the modify conflict
@@ -1174,14 +1174,14 @@
   * helper function.
   */
  private void testHistoricalAndFake(
      Historical hist, Entry entry)
      EntryHistorical hist, Entry entry)
  {
    AttributeType entryuuidAttrType =
      DirectoryServer.getSchema().getAttributeType(Historical.ENTRYUIDNAME);
      DirectoryServer.getSchema().getAttributeType(EntryHistorical.ENTRYUIDNAME);
    // Get the historical uuid associated to the entry
    // (the one that needs to be tested)
    String uuid = Historical.getEntryUuid(entry);
    String uuid = EntryHistorical.getEntryUuid(entry);
    // Get the Entry uuid in String format
    List<Attribute> uuidAttrs = entry
@@ -1202,7 +1202,7 @@
    // Test FakeOperation
    try
    {
      Iterable<FakeOperation> fks = Historical.generateFakeOperations(entry);
      Iterable<FakeOperation> fks = EntryHistorical.generateFakeOperations(entry);
      if (fks.iterator().hasNext())
      {
        FakeOperation fk = fks.iterator().next();
@@ -1230,7 +1230,7 @@
   *
   */
  private void testModify(Entry entry,
      Historical hist, String attrName,
      EntryHistorical hist, String attrName,
      ModificationType modType, String value,
      int date, boolean keepChangeResult) throws DirectoryException
  {
@@ -1242,7 +1242,7 @@
   *
   */
  private void testModify(Entry entry,
      Historical hist, String attrName, Modification mod,
      EntryHistorical hist, String attrName, Modification mod,
      int date, boolean keepChangeResult) throws DirectoryException
  {
    List<Modification> mods = replayModify(entry, hist, mod, date);
@@ -1273,7 +1273,7 @@
   */
  private void replayModifies(
      Entry entry, Historical hist, List<Modification> mods, int date)
      Entry entry, EntryHistorical hist, List<Modification> mods, int date)
  {
    InternalClientConnection connection =
      InternalClientConnection.getRootConnection();
@@ -1289,11 +1289,11 @@
  }
  private List<Modification> replayModify(
      Entry entry, Historical hist, Modification mod, int date)
      Entry entry, EntryHistorical hist, Modification mod, int date)
  {
    AttributeType historicalAttrType =
      DirectoryServer.getSchema().getAttributeType(
          Historical.HISTORICALATTRIBUTENAME);
          EntryHistorical.HISTORICALATTRIBUTENAME);
    InternalClientConnection connection =
      InternalClientConnection.getRootConnection();
@@ -1330,7 +1330,7 @@
     */
    entry.removeAttribute(historicalAttrType);
    entry.addAttribute(hist.encode(), null);
    Historical hist2 = Historical.load(entry);
    EntryHistorical hist2 = EntryHistorical.newInstanceFromEntry(entry);
    assertEquals(hist2.encode().toString(), hist.encode().toString());
    return mods;
@@ -1367,15 +1367,15 @@
   *
   */
  private void testHistorical(
      Historical hist, LocalBackendAddOperation addOp)
      EntryHistorical hist, LocalBackendAddOperation addOp)
  {
    AttributeType entryuuidAttrType =
      DirectoryServer.getSchema().getAttributeType(
          Historical.ENTRYUIDNAME);
          EntryHistorical.ENTRYUIDNAME);
    // Get the historical uuid associated to the entry
    // (the one that needs to be tested)
    String uuid = Historical.getEntryUuid(addOp);
    String uuid = EntryHistorical.getEntryUuid(addOp);
    // Get the op uuid in String format
    List<Attribute> uuidAttrs = addOp.getOperationalAttributes().get(
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ValueInfoTest.java
@@ -22,14 +22,14 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 */
package org.opends.server.replication.plugin;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.plugin.ValueInfo;
import org.opends.server.replication.plugin.AttrValueHistorical;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.AttributeValues;
@@ -80,9 +80,9 @@
         throws Exception
  {
    AttributeType type = DirectoryServer.getAttributeType("description");
    ValueInfo valInfo1 = new ValueInfo(value,CNupdate,CNdelete);
    ValueInfo valInfo2 = new ValueInfo(value,CNupdate,CNupdate);
    ValueInfo valInfo3 = new ValueInfo(AttributeValues.create(type,"Test"),
    AttrValueHistorical valInfo1 = new AttrValueHistorical(value,CNupdate,CNdelete);
    AttrValueHistorical valInfo2 = new AttrValueHistorical(value,CNupdate,CNupdate);
    AttrValueHistorical valInfo3 = new AttrValueHistorical(AttributeValues.create(type,"Test"),
        CNupdate,CNupdate);
    // Check equals
@@ -107,7 +107,7 @@
    }
    // Check getValue
    assertTrue(valInfo1.getValue().equals(value)) ;
    assertTrue(valInfo1.getAttributeValue().equals(value)) ;
    // Chek valueUpdateTime
    if (CNupdate == null)