From c17e2c6f9b9921e93282ba3727d94b51f92ea39c Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 03 Jul 2013 14:03:48 +0000
Subject: [PATCH] AttrHistoricalMultiple.java: Added javadocs explaining the use of collection classes. Increased encapsulation a bit.

---
 opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java |    9 +-
 opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java   |   28 ++++--
 opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java          |  190 +++++++++++++++++++---------------------------
 3 files changed, 102 insertions(+), 125 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java b/opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java
index a48125b..39a3439 100644
--- a/opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java
+++ b/opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java
@@ -55,7 +55,18 @@
   private ChangeNumber deleteTime;
   /** Last time the attribute was modified. */
   private ChangeNumber lastUpdateTime;
-  private final Map<AttrValueHistorical,AttrValueHistorical> valuesHist;
+  /**
+   * Change history for the values of this attribute. We are using a
+   * LinkedHasMap here because we want:
+   * <ol>
+   * <li>Fast access for removing/adding a AttrValueHistorical keyed by the
+   * AttributeValue => Use a Map</li>
+   * <li>Ordering changes according to the changeNumber of each changes => Use a
+   * LinkedHashMap</li>
+   * </ol>
+   */
+  private final Map<AttrValueHistorical, AttrValueHistorical> valuesHist =
+      new LinkedHashMap<AttrValueHistorical, AttrValueHistorical>();
 
    /**
     * Create a new object from the provided informations.
@@ -69,11 +80,10 @@
    {
      this.deleteTime = deleteTime;
      this.lastUpdateTime = updateTime;
-     if (valuesHist == null)
-       this.valuesHist =
-         new LinkedHashMap<AttrValueHistorical,AttrValueHistorical>();
-     else
-       this.valuesHist = valuesHist;
+     if (valuesHist != null)
+     {
+       this.valuesHist.putAll(valuesHist);
+     }
    }
 
    /**
@@ -83,8 +93,6 @@
    {
      this.deleteTime = null;
      this.lastUpdateTime = null;
-     this.valuesHist =
-         new LinkedHashMap<AttrValueHistorical,AttrValueHistorical>();
    }
 
    /**
@@ -428,7 +436,7 @@
       Iterator<AttrValueHistorical> it = valuesHist.keySet().iterator();
       while (it.hasNext())
       {
-        AttrValueHistorical valInfo; valInfo = it.next();
+        AttrValueHistorical valInfo = it.next();
 
         if (changeNumber.older(valInfo.getValueUpdateTime()))
         {
@@ -596,7 +604,7 @@
           builder.remove(addVal);
         }
         else
-        {
+        { // it is a delete
           /* this value is marked as a deleted value
            * check if this mod is more recent the this delete
            */
diff --git a/opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java b/opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java
index 1561d53..2cef46a 100644
--- a/opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java
+++ b/opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java
@@ -28,10 +28,9 @@
 package org.opends.server.replication.plugin;
 
 import static org.opends.messages.ReplicationMessages.*;
-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.util.StaticUtils.getBytes;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.StaticUtils.*;
 
 import java.util.*;
 
@@ -62,7 +61,6 @@
  * One Historical object is created for each entry in the entry cache
  * each Historical Object contains a list of attribute historical information
  */
-
 public class EntryHistorical
 {
   /**
@@ -72,7 +70,7 @@
 
   /**
    * Name used to store attachment of historical information in the
-   * operation. This attachement allows to use in several different places
+   * operation. This attachment 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";
@@ -87,9 +85,8 @@
    */
   private static final DebugTracer TRACER = getTracer();
 
-
-
-  /* The delay to purge the historical informations
+  /**
+   * The delay to purge the historical informations.
    * This delay indicates the time the domain keeps the historical
    * information necessary to solve conflicts.When a change stored in the
    * historical part of the user entry has a date (from its replication
@@ -101,7 +98,7 @@
    */
   private long purgeDelayInMillisec = -1;
 
-  /*
+  /**
    * The oldest ChangeNumber stored in this entry historical attribute.
    * null when this historical object has been created from
    * an entry that has no historical attribute and after the last
@@ -155,14 +152,16 @@
    *
    */
 
-  // The date when the entry was added.
+  /** The date when the entry was added. */
   private ChangeNumber entryADDDate = null;
 
-  // The date when the entry was last renamed.
+  /** The date when the entry was last renamed. */
   private ChangeNumber entryMODDNDate = null;
 
-  // contains Historical information for each attribute sorted by attribute type
-  // key:AttributeType  value:AttrInfoWithOptions
+  /**
+   * Contains Historical information for each attribute sorted by attribute
+   * type. key:AttributeType value:AttrInfoWithOptions
+   */
   private HashMap<AttributeType,AttrHistoricalWithOptions> attributesHistorical
     = new HashMap<AttributeType,AttrHistoricalWithOptions>();
 
@@ -216,14 +215,20 @@
 
   /**
    * 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.
+   * <p>
+   * Steps:
+   * <ul>
+   * <li>compute the historical attribute</li>
+   * <li>update the mods in the provided operation by adding the update of the
+   * historical attribute</li>
+   * <li>update the modifiedEntry, already computed by core since we are in the
+   * preOperation plugin, that is called just before committing into the DB.
+   * </li>
+   * </ul>
+   * </p>
    *
-   * @param modifyOperation the modification.
+   * @param modifyOperation
+   *          the modification.
    */
   public void setHistoricalAttrToOperation(
       PreOperationModifyOperation modifyOperation)
@@ -258,8 +263,7 @@
     // - add the modification of the ds-sync-hist attribute,
     // to the current modifications of the MOD operation
     Attribute attr = encodeAndPurge();
-    Modification mod = new Modification(ModificationType.REPLACE, attr);
-    mods.add(mod);
+    mods.add(new Modification(ModificationType.REPLACE, attr));
     // - update the already modified entry
     modifiedEntry.replaceAttribute(attr);
   }
@@ -290,9 +294,7 @@
     //
     // - 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);
+    mods.add(new Modification(ModificationType.REPLACE, attr));
     // - update the already modified entry
     modifiedEntry.removeAttribute(attr.getAttributeType());
     modifiedEntry.addAttribute(attr, null);
@@ -328,9 +330,9 @@
 
     // Get the changeNumber from the attached synchronization context
     // Create the attribute (encoded)
-    Attribute attr =
-      Attributes.create(historicalAttrType,
-          encodeAddHistorical(OperationContext.getChangeNumber(addOperation)));
+    ChangeNumber addCn = OperationContext.getChangeNumber(addOperation);
+    AttributeValue attrValue = encodeHistorical(addCn, "add");
+    Attribute attr = Attributes.create(historicalAttrType, attrValue);
 
     // Set the created attribute to the operation
     List<Attribute> attrList = new LinkedList<Attribute>();
@@ -339,41 +341,25 @@
   }
 
   /**
-   * Encode in the returned attributeValue, this historical information for
-   * an ADD operation.
-   * For ADD Operation : "dn:changeNumber:add"
+   * Builds an attributeValue for the supplied historical information and
+   * operation type . For ADD Operation : "dn:changeNumber:add", for MODDN
+   * Operation : "dn:changeNumber:moddn", etc.
    *
-   * @param cn     The date when the ADD Operation happened.
-   * @return       The encoded attribute value containing the historical
-   *               information for the Operation.
+   * @param cn
+   *          The date when the ADD Operation happened.
+   * @param operationType
+   *          the operation type to encode
+   * @return The attribute value containing the historical information for the
+   *         Operation type.
    */
-  private static AttributeValue encodeAddHistorical(ChangeNumber cn)
+  private static AttributeValue encodeHistorical(ChangeNumber cn,
+      String operationType)
   {
     AttributeType historicalAttrType =
       DirectoryServer.getSchema().getAttributeType(HISTORICAL_ATTRIBUTE_NAME);
 
-    String strValue = "dn:" + cn.toString() +":add";
-    AttributeValue val = AttributeValues.create(historicalAttrType, strValue);
-    return val;
-  }
-
-  /**
-   * 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 attribute value containing the historical
-   *               information for the Operation.
-   */
-  private static AttributeValue encodeMODDNHistorical(ChangeNumber cn)
-  {
-    AttributeType historicalAttrType =
-      DirectoryServer.getSchema().getAttributeType(HISTORICAL_ATTRIBUTE_NAME);
-
-    String strValue = "dn:" + cn.toString() +":moddn";
-    AttributeValue val = AttributeValues.create(historicalAttrType, strValue);
-    return val;
+    String strValue = "dn:" + cn + ":" + operationType;
+    return AttributeValues.create(historicalAttrType, strValue);
   }
 
   /**
@@ -390,7 +376,6 @@
    */
   private AttrHistorical getOrCreateAttrHistorical(Modification mod)
   {
-
     // Read the provided mod
     Attribute modAttr = mod.getAttribute();
     if (isHistoricalAttribute(modAttr))
@@ -438,10 +423,12 @@
   }
 
   /**
-   * Encode this historical information object in an operational attribute
-   * and purge it from the values older than the purge delay.
+   * Encode this historical information object in an operational attribute and
+   * purge it from the values older than the purge delay.
    *
    * @return The historical information encoded in an operational attribute.
+   * @see HistoricalAttributeValue#HistoricalAttributeValue(String) the decode
+   *      operation in HistoricalAttributeValue
    */
   public Attribute encodeAndPurge()
   {
@@ -462,42 +449,38 @@
     {
       // Encode an attribute type
       AttributeType type = entryWithOptions.getKey();
-      HashMap<Set<String> , AttrHistorical> attrwithoptions =
+      Map<Set<String>, AttrHistorical> attrWithOptions =
                                 entryWithOptions.getValue().getAttributesInfo();
 
-      for (Map.Entry<Set<String>, AttrHistorical> entry :
-           attrwithoptions.entrySet())
+      for (Map.Entry<Set<String>, AttrHistorical> entry : attrWithOptions
+          .entrySet())
       {
         // Encode an (attribute type/option)
-        boolean delAttr = false;
         Set<String> options = entry.getKey();
-        String optionsString = "";
         AttrHistorical attrHist = entry.getValue();
 
-
+        String optionsString = "";
         if (options != null)
         {
           StringBuilder optionsBuilder = new StringBuilder();
           for (String s : options)
           {
-            optionsBuilder.append(';');
-            optionsBuilder.append(s);
+            optionsBuilder.append(';').append(s);
           }
           optionsString = optionsBuilder.toString();
         }
 
         ChangeNumber deleteTime = attrHist.getDeleteTime();
         /* generate the historical information for deleted attributes */
-        if (deleteTime != null)
-        {
-          delAttr = true;
-        }
+        boolean delAttr = deleteTime != null;
 
         for (AttrValueHistorical attrValHist : attrHist.getValuesHistorical()
             .keySet())
         {
+          attrValHist.getAttributeValue();
+
           // Encode an attribute value
-          String strValue;
+          final String strValue;
           if (attrValHist.getValueDeleteTime() != null)
           {
             // this hist must be purged now, so skip its encoding
@@ -547,9 +530,7 @@
               }
             }
 
-            AttributeValue val = AttributeValues.create(historicalAttrType,
-                                                    strValue);
-            builder.add(val);
+            builder.add(AttributeValues.create(historicalAttrType, strValue));
           }
         }
 
@@ -584,7 +565,7 @@
       }
       else
       {
-        builder.add(encodeAddHistorical(entryADDDate));
+        builder.add(encodeHistorical(entryADDDate, "add"));
       }
     }
 
@@ -599,7 +580,7 @@
       }
       else
       {
-        builder.add(encodeMODDNHistorical(entryMODDNDate));
+        builder.add(encodeHistorical(entryMODDNDate, "moddn"));
       }
     }
 
@@ -629,12 +610,7 @@
    */
   public boolean addedOrRenamedAfter(ChangeNumber cn)
   {
-    if (cn.older(entryADDDate) || cn.older(entryMODDNDate))
-    {
-      return true;
-    }
-    else
-      return false;
+    return cn.older(entryADDDate) || cn.older(entryMODDNDate);
   }
 
 
@@ -757,14 +733,11 @@
               lastAttrType = attrType;
               lastOptions = options;
             }
-            else
+            else if (!options.equals(lastOptions))
             {
-              if (!options.equals(lastOptions))
-              {
-                attrInfo = AttrHistorical.createAttributeHistorical(attrType);
-                attrInfoWithOptions.put(options, attrInfo);
-                lastOptions = options;
-              }
+              attrInfo = AttrHistorical.createAttributeHistorical(attrType);
+              attrInfoWithOptions.put(options, attrInfo);
+              lastOptions = options;
             }
 
             attrInfo.assign(histKey, value, cn);
@@ -831,20 +804,19 @@
             // the already generated Operation if it can be found.
             ChangeNumber cn = histVal.getCn();
             Modification mod = histVal.generateMod();
-            FakeModifyOperation modifyFakeOperation;
             FakeOperation fakeOperation = operations.get(cn);
 
-            if ((fakeOperation != null) &&
-                      (fakeOperation instanceof FakeModifyOperation))
+            if (fakeOperation instanceof FakeModifyOperation)
             {
-              modifyFakeOperation = (FakeModifyOperation) fakeOperation;
+              FakeModifyOperation modifyFakeOperation =
+                  (FakeModifyOperation) fakeOperation;
               modifyFakeOperation.addModification(mod);
             }
             else
             {
               String uuidString = getEntryUUID(entry);
-              modifyFakeOperation = new FakeModifyOperation(entry.getDN(), cn,
-                  uuidString);
+              FakeModifyOperation modifyFakeOperation =
+                  new FakeModifyOperation(entry.getDN(), cn, uuidString);
               modifyFakeOperation.addModification(mod);
               operations.put(histVal.getCn(), modifyFakeOperation);
             }
@@ -927,14 +899,10 @@
    */
   private void updateOldestCN(ChangeNumber cn)
   {
-    if (cn != null)
-    {
-      if (this.oldestChangeNumber == null)
-        this.oldestChangeNumber = cn;
-      else
-        if (cn.older(this.oldestChangeNumber))
-            this.oldestChangeNumber = cn;
-    }
+    if (cn != null
+        && (this.oldestChangeNumber == null
+            || cn.older(this.oldestChangeNumber)))
+      this.oldestChangeNumber = cn;
   }
 
   /**
@@ -950,11 +918,11 @@
     return this.oldestChangeNumber;
   }
 
-
-
-  // Extracts the entryUUID attribute value from the provided list of
-  // attributes. If the attribute is not present one is generated from the DN
-  // using the same algorithm as the entryUUID virtual attribute provider.
+  /**
+   * Extracts the entryUUID attribute value from the provided list of
+   * attributes. If the attribute is not present one is generated from the DN
+   * using the same algorithm as the entryUUID virtual attribute provider.
+   */
   private static String extractEntryUUID(List<Attribute> entryUUIDAttributes,
       DN entryDN)
   {
diff --git a/opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java b/opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java
index 0b27028..1501e73 100644
--- a/opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java
+++ b/opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java
@@ -66,8 +66,6 @@
  *  options are stored with the attribute names using; as a separator
  *  example :
  *  description;FR;France:00000108b3a6554100000001:add:added_value
- *
- *
  */
 public class HistoricalAttributeValue
 {
@@ -79,14 +77,17 @@
   private HistAttrModificationKey histKey;
   private String stringValue;
 
-  // This flag indicates that this value was generated to store the last date
-  // when the entry was renamed.
+  /**
+   * 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 object from the String encoded form.
    *
    * @param strVal The String encoded form of historical attribute value.
+   * @see EntryHistorical#encodeAndPurge() encoding in EntryHistorical
    */
   public HistoricalAttributeValue(String strVal)
   {

--
Gitblit v1.10.0