From 88cfe5045d77d433ce02b0ef10ee84c9d4fb15e2 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 23 May 2014 15:17:15 +0000
Subject: [PATCH] (CR-3599) Convert all protocols message to use ByteArrayBuilder + ByteArrayScanner

---
 opends/src/server/org/opends/server/replication/common/ServerState.java |  130 ++++---------------------------------------
 1 files changed, 12 insertions(+), 118 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/common/ServerState.java b/opends/src/server/org/opends/server/replication/common/ServerState.java
index 81cb59d..73d9714 100644
--- a/opends/src/server/org/opends/server/replication/common/ServerState.java
+++ b/opends/src/server/org/opends/server/replication/common/ServerState.java
@@ -22,17 +22,14 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.replication.common;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.util.*;
-import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.zip.DataFormatException;
 
 import org.opends.server.protocols.asn1.ASN1Writer;
 import org.opends.server.replication.protocol.ProtocolVersion;
@@ -75,70 +72,6 @@
     serverIdToCSN.clear();
   }
 
-
-  /**
-   * Creates a new ServerState object from its encoded form.
-   *
-   * @param in The byte array containing the encoded ServerState form.
-   * @param pos The position in the byte array where the encoded ServerState
-   *            starts.
-   * @param endpos The position in the byte array where the encoded ServerState
-   *               ends.
-   * @throws DataFormatException If the encoded form was not correct.
-   */
-  public ServerState(byte[] in, int pos, int endpos) throws DataFormatException
-  {
-    try
-    {
-      while (endpos > pos)
-      {
-        // FIXME JNR: why store the serverId separately from the CSN since the
-        // CSN already contains the serverId?
-
-        // read the ServerId
-        int length = getNextLength(in, pos);
-        String serverIdString = new String(in, pos, length, "UTF-8");
-        int serverId = Integer.valueOf(serverIdString);
-        pos += length +1;
-
-        // read the CSN
-        length = getNextLength(in, pos);
-        String csnString = new String(in, pos, length, "UTF-8");
-        CSN csn = new CSN(csnString);
-        pos += length +1;
-
-        // Add the serverId
-        serverIdToCSN.put(serverId, csn);
-      }
-    } catch (UnsupportedEncodingException e)
-    {
-      throw new DataFormatException("UTF-8 is not supported by this jvm.");
-    }
-  }
-
-  /**
-   * Get the length of the next String encoded in the in byte array.
-   * This method is used to cut the different parts (serverIds, CSN)
-   * of a server state.
-   *
-   * @param in the byte array where to calculate the string.
-   * @param pos the position where to start from in the byte array.
-   * @return the length of the next string.
-   * @throws DataFormatException If the byte array does not end with null.
-   */
-  private int getNextLength(byte[] in, int pos) throws DataFormatException
-  {
-    int offset = pos;
-    int length = 0;
-    while (in[offset++] != 0)
-    {
-      if (offset >= in.length)
-        throw new DataFormatException("byte[] is not a valid server state");
-      length++;
-    }
-    return length;
-  }
-
   /**
    * Forward update the Server State with a CSN. The provided CSN will be put on
    * the current object only if it is newer than the existing CSN for the same
@@ -151,7 +84,9 @@
   public boolean update(CSN csn)
   {
     if (csn == null)
+    {
       return false;
+    }
 
     saved = false;
 
@@ -191,7 +126,9 @@
   public boolean update(ServerState serverState)
   {
     if (serverState == null)
+    {
       return false;
+    }
 
     boolean updated = false;
     for (CSN csn : serverState.serverIdToCSN.values())
@@ -215,7 +152,9 @@
   public boolean removeCSN(CSN expectedCSN)
   {
     if (expectedCSN == null)
+    {
       return false;
+    }
 
     if (serverIdToCSN.remove(expectedCSN.getServerId(), expectedCSN))
     {
@@ -335,63 +274,18 @@
   }
 
   /**
-   * Add the tail into resultByteArray at position pos.
-   */
-  private int addByteArray(byte[] tail, byte[] resultByteArray, int pos)
-  {
-    for (int i=0; i<tail.length; i++,pos++)
-    {
-      resultByteArray[pos] = tail[i];
-    }
-    resultByteArray[pos++] = 0;
-    return pos;
-  }
-
-  /**
-   * Encode this ServerState object and return its byte array representation.
+   * Returns a copy of this ServerState's content as a Map of serverId => CSN.
    *
-   * @return a byte array with an encoded representation of this object.
-   * @throws UnsupportedEncodingException if UTF8 is not supported by the JVM.
+   * @return a copy of this ServerState's content as a Map of serverId => CSN.
    */
-  public byte[] getBytes() throws UnsupportedEncodingException
+  public Map<Integer, CSN> getServerIdToCSNMap()
   {
     // copy to protect from concurrent updates
     // that could change the number of elements in the Map
-    final Map<Integer, CSN> copy = new HashMap<Integer, CSN>(serverIdToCSN);
-
-    final int size = copy.size();
-    List<String> idList = new ArrayList<String>(size);
-    List<String> csnList = new ArrayList<String>(size);
-    // calculate the total length needed to allocate byte array
-    int length = 0;
-    for (Entry<Integer, CSN> entry : copy.entrySet())
-    {
-      // serverId is useless, see comment in ServerState ctor
-      final String serverIdStr = String.valueOf(entry.getKey());
-      idList.add(serverIdStr);
-      length += serverIdStr.length() + 1;
-
-      final String csnStr = entry.getValue().toString();
-      csnList.add(csnStr);
-      length += csnStr.length() + 1;
-    }
-    byte[] result = new byte[length];
-
-    // write the server state into the byte array
-    int pos = 0;
-    for (int i = 0; i < size; i++)
-    {
-      String str = idList.get(i);
-      pos = addByteArray(str.getBytes("UTF-8"), result, pos);
-      str = csnList.get(i);
-      pos = addByteArray(str.getBytes("UTF-8"), result, pos);
-    }
-    return result;
+    return new HashMap<Integer, CSN>(serverIdToCSN);
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public Iterator<CSN> iterator()
   {

--
Gitblit v1.10.0