From 4fd152ec8ba98ac9a70202dbac2b3a579df1033a Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 10 Jun 2013 14:25:54 +0000
Subject: [PATCH] Fix OPENDJ-951: Reduce size and frequency of replication MonitorMsg

---
 opends/src/server/org/opends/server/replication/common/ChangeNumber.java |  109 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 90 insertions(+), 19 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/common/ChangeNumber.java b/opends/src/server/org/opends/server/replication/common/ChangeNumber.java
index 27347b7..56dd1fb 100644
--- a/opends/src/server/org/opends/server/replication/common/ChangeNumber.java
+++ b/opends/src/server/org/opends/server/replication/common/ChangeNumber.java
@@ -29,20 +29,71 @@
 
 import java.util.Date;
 
+import org.opends.server.types.ByteSequence;
+import org.opends.server.types.ByteSequenceReader;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.ByteStringBuilder;
+
 /**
  * Class used to represent Change Numbers.
  */
 public class ChangeNumber implements java.io.Serializable,
                                      java.lang.Comparable<ChangeNumber>
 {
+  /**
+   * The number of bytes used by the byte string representation of a change
+   * number.
+   *
+   * @see #valueOf(ByteSequence)
+   * @see #toByteString()
+   * @see #toByteString(ByteStringBuilder)
+   */
+  public static final int BYTE_ENCODING_LENGTH = 14;
+
+  /**
+   * The number of characters used by the string representation of a change
+   * number.
+   *
+   * @see #valueOf(String)
+   * @see #toString()
+   */
+  public static final int STRING_ENCODING_LENGTH = 28;
+
   private static final long serialVersionUID = -8802722277749190740L;
   private final long timeStamp;
   private final int seqnum;
   private final int serverId;
 
-  // A String representation of the ChangeNumber suitable for network
-  // transmission.
-  private String formatedString = null;
+  /**
+   * Parses the provided {@link #toString()} representation of a change number.
+   *
+   * @param s
+   *          The string to be parsed.
+   * @return The parsed change number.
+   * @see #toString()
+   */
+  public static ChangeNumber valueOf(String s)
+  {
+    return new ChangeNumber(s);
+  }
+
+  /**
+   * Decodes the provided {@link #toByteString()} representation of a change
+   * number.
+   *
+   * @param bs
+   *          The byte sequence to be parsed.
+   * @return The decoded change number.
+   * @see #toByteString()
+   */
+  public static ChangeNumber valueOf(ByteSequence bs)
+  {
+    ByteSequenceReader reader = bs.asReader();
+    long timeStamp = reader.getLong();
+    int serverId = reader.getShort() & 0xffff;
+    int seqnum = reader.getInt();
+    return new ChangeNumber(timeStamp, seqnum, serverId);
+  }
 
   /**
    * Create a new ChangeNumber from a String.
@@ -59,8 +110,6 @@
 
     temp = str.substring(20, 28);
     seqnum = Integer.parseInt(temp, 16);
-
-    formatedString = str;
   }
 
   /**
@@ -140,25 +189,47 @@
   }
 
   /**
+   * Encodes this change number as a byte string.
+   * <p>
+   * NOTE: this representation must not be modified otherwise interop with
+   * earlier protocol versions will be broken.
+   *
+   * @return The encoded representation of this change number.
+   * @see #valueOf(ByteSequence)
+   */
+  public ByteString toByteString()
+  {
+    return toByteString(new ByteStringBuilder(BYTE_ENCODING_LENGTH))
+        .toByteString();
+  }
+
+  /**
+   * Encodes this change number into the provided byte string builder.
+   * <p>
+   * NOTE: this representation must not be modified otherwise interop with
+   * earlier protocol versions will be broken.
+   *
+   * @param builder
+   *          The byte string builder.
+   * @return The byte string builder containing the encoded change number.
+   * @see #valueOf(ByteSequence)
+   */
+  public ByteStringBuilder toByteString(ByteStringBuilder builder)
+  {
+    return builder.append(timeStamp).append((short) (serverId & 0xffff))
+        .append(seqnum);
+  }
+
+  /**
    * Convert the ChangeNumber to a printable String.
+   * <p>
+   * NOTE: this representation must not be modified otherwise interop with
+   * earlier protocol versions will be broken.
+   *
    * @return the string
    */
   public String toString()
   {
-    return format();
-  }
-
-  /**
-   * Convert the ChangeNumber to a String that is suitable for network
-   * transmission.
-   *
-   * @return the string
-   */
-  public String format()
-  {
-    if (formatedString != null)
-      return formatedString;
-
     return String.format("%016x%04x%08x", timeStamp, serverId, seqnum);
   }
 

--
Gitblit v1.10.0