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/protocol/ServerStartMsg.java |  228 +++++++++++---------------------------------------------
 1 files changed, 45 insertions(+), 183 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/protocol/ServerStartMsg.java b/opends/src/server/org/opends/server/replication/protocol/ServerStartMsg.java
index 65a319f..f6870dd 100644
--- a/opends/src/server/org/opends/server/replication/protocol/ServerStartMsg.java
+++ b/opends/src/server/org/opends/server/replication/protocol/ServerStartMsg.java
@@ -22,16 +22,14 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2013 ForgeRock AS.
+ *      Portions Copyright 2013-2014 ForgeRock AS.
  */
 package org.opends.server.replication.protocol;
 
-import java.io.UnsupportedEncodingException;
 import java.util.zip.DataFormatException;
 
 import org.opends.server.replication.common.ServerState;
 import org.opends.server.types.DN;
-import org.opends.server.types.DirectoryException;
 
 /**
  * This message is used by LDAP server when they first connect.
@@ -40,27 +38,28 @@
  */
 public class ServerStartMsg extends StartMsg
 {
-  private int serverId; // Id of the LDAP server that sent this message
-  private String serverURL;
-  private DN baseDN;
-  private int maxReceiveQueue;
-  private int maxSendQueue;
-  private int maxReceiveDelay;
-  private int maxSendDelay;
-  private int windowSize;
-  private ServerState serverState = null;
+  /** Id of the LDAP server that sent this message */
+  private final int serverId;
+  private final String serverURL;
+  private final DN baseDN;
+  private final int maxReceiveQueue;
+  private final int maxSendQueue;
+  private final int maxReceiveDelay;
+  private final int maxSendDelay;
+  private final int windowSize;
+  private final ServerState serverState;
 
   /**
    * The time in milliseconds between heartbeats from the replication
    * server.  Zero means heartbeats are off.
    */
-  private long heartbeatInterval = 0;
+  private final long heartbeatInterval;
 
   /**
    * Whether to continue using SSL to encrypt messages after the start
    * messages have been exchanged.
    */
-  private boolean sslEncryption;
+  private final boolean sslEncryption;
 
   /**
    * Creates a new ServerStartMsg. This message is to be sent by an LDAP
@@ -108,107 +107,22 @@
    * @throws DataFormatException If the byte array does not contain a valid
    *                             encoded form of the ServerStartMsg.
    */
-  public ServerStartMsg(byte[] in) throws DataFormatException
+  ServerStartMsg(byte[] in) throws DataFormatException
   {
-    byte[] allowedPduTypes = new byte[1];
-    allowedPduTypes[0] = MSG_TYPE_SERVER_START;
-    headerLength = decodeHeader(allowedPduTypes, in);
+    final ByteArrayScanner scanner = new ByteArrayScanner(in);
+    decodeHeader(scanner, MSG_TYPE_SERVER_START);
 
-    try
-    {
-      /* first bytes are the header */
-      int pos = headerLength;
-
-      /*
-       * read the dn
-       * first calculate the length then construct the string
-       */
-      int length = getNextLength(in, pos);
-      baseDN = DN.decode(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the ServerId
-       */
-      length = getNextLength(in, pos);
-      String serverIdString = new String(in, pos, length, "UTF-8");
-      serverId = Integer.valueOf(serverIdString);
-      pos += length +1;
-
-      /*
-       * read the ServerURL
-       */
-      length = getNextLength(in, pos);
-      serverURL = new String(in, pos, length, "UTF-8");
-      pos += length +1;
-
-      /*
-       * read the maxReceiveDelay
-       */
-      length = getNextLength(in, pos);
-      maxReceiveDelay = Integer.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the maxReceiveQueue
-       */
-      length = getNextLength(in, pos);
-      maxReceiveQueue = Integer.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the maxSendDelay
-       */
-      length = getNextLength(in, pos);
-      maxSendDelay = Integer.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the maxSendQueue
-       */
-      length = getNextLength(in, pos);
-      maxSendQueue = Integer.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the windowSize
-       */
-      length = getNextLength(in, pos);
-      windowSize = Integer.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the heartbeatInterval
-       */
-      length = getNextLength(in, pos);
-      heartbeatInterval = Integer.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      /*
-       * read the sslEncryption setting
-       */
-      length = getNextLength(in, pos);
-      sslEncryption = Boolean.valueOf(new String(in, pos, length, "UTF-8"));
-      pos += length +1;
-
-      // Read the ServerState
-      // Caution: ServerState MUST be the last field. Because ServerState can
-      // contain null character (string termination of sererid string ..) it
-      // cannot be decoded using getNextLength() like the other fields. The
-      // only way is to rely on the end of the input buffer : and that forces
-      // the ServerState to be the last. This should be changed and we want to
-      // have more than one ServerState field.
-      serverState = new ServerState(in, pos, in.length - 1);
-
-    }
-    catch (UnsupportedEncodingException e)
-    {
-      throw new DataFormatException("UTF-8 is not supported by this jvm.");
-    }
-    catch (DirectoryException e)
-    {
-      throw new DataFormatException(e.getLocalizedMessage());
-    }
+    baseDN = scanner.nextDN();
+    serverId = scanner.nextIntUTF8();
+    serverURL = scanner.nextString();
+    maxReceiveDelay = scanner.nextIntUTF8();
+    maxReceiveQueue = scanner.nextIntUTF8();
+    maxSendDelay = scanner.nextIntUTF8();
+    maxSendQueue = scanner.nextIntUTF8();
+    windowSize = scanner.nextIntUTF8();
+    heartbeatInterval = scanner.nextIntUTF8();
+    sslEncryption = Boolean.valueOf(scanner.nextString());
+    serverState = scanner.nextServerState();
   }
 
   /**
@@ -284,76 +198,26 @@
     return serverState;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
-  public byte[] getBytes(short sessionProtocolVersion)
+  public byte[] getBytes(short protocolVersion)
   {
-    try {
-      byte[] byteDn = baseDN.toNormalizedString().getBytes("UTF-8");
-      byte[] byteServerId = String.valueOf(serverId).getBytes("UTF-8");
-      byte[] byteServerUrl = serverURL.getBytes("UTF-8");
-      byte[] byteMaxRecvDelay =
-                     String.valueOf(maxReceiveDelay).getBytes("UTF-8");
-      byte[] byteMaxRecvQueue =
-                     String.valueOf(maxReceiveQueue).getBytes("UTF-8");
-      byte[] byteMaxSendDelay =
-                     String.valueOf(maxSendDelay).getBytes("UTF-8");
-      byte[] byteMaxSendQueue =
-                     String.valueOf(maxSendQueue).getBytes("UTF-8");
-      byte[] byteWindowSize =
-                     String.valueOf(windowSize).getBytes("UTF-8");
-      byte[] byteHeartbeatInterval =
-                     String.valueOf(heartbeatInterval).getBytes("UTF-8");
-      byte[] byteSSLEncryption =
-                     String.valueOf(sslEncryption).getBytes("UTF-8");
-      byte[] byteServerState = serverState.getBytes();
+    final ByteArrayBuilder builder = new ByteArrayBuilder();
+    encodeHeader(MSG_TYPE_SERVER_START, builder, protocolVersion);
 
-      int length = byteDn.length + 1 + byteServerId.length + 1 +
-                   byteServerUrl.length + 1 +
-                   byteMaxRecvDelay.length + 1 +
-                   byteMaxRecvQueue.length + 1 +
-                   byteMaxSendDelay.length + 1 +
-                   byteMaxSendQueue.length + 1 +
-                   byteWindowSize.length + 1 +
-                   byteHeartbeatInterval.length + 1 +
-                   byteSSLEncryption.length + 1 +
-                   byteServerState.length + 1;
-
-      /* encode the header in a byte[] large enough to also contain the mods */
-      byte resultByteArray[] = encodeHeader(MSG_TYPE_SERVER_START, length,
-          sessionProtocolVersion);
-      int pos = headerLength;
-
-      pos = addByteArray(byteDn, resultByteArray, pos);
-
-      pos = addByteArray(byteServerId, resultByteArray, pos);
-
-      pos = addByteArray(byteServerUrl, resultByteArray, pos);
-
-      pos = addByteArray(byteMaxRecvDelay, resultByteArray, pos);
-
-      pos = addByteArray(byteMaxRecvQueue, resultByteArray, pos);
-
-      pos = addByteArray(byteMaxSendDelay, resultByteArray, pos);
-
-      pos = addByteArray(byteMaxSendQueue, resultByteArray, pos);
-
-      pos = addByteArray(byteWindowSize, resultByteArray, pos);
-
-      pos = addByteArray(byteHeartbeatInterval, resultByteArray, pos);
-
-      pos = addByteArray(byteSSLEncryption, resultByteArray, pos);
-
-      pos = addByteArray(byteServerState, resultByteArray, pos);
-
-      return resultByteArray;
-    }
-    catch (UnsupportedEncodingException e)
-    {
-      return null;
-    }
+    builder.append(baseDN);
+    builder.appendUTF8(serverId);
+    builder.append(serverURL);
+    builder.appendUTF8(maxReceiveDelay);
+    builder.appendUTF8(maxReceiveQueue);
+    builder.appendUTF8(maxSendDelay);
+    builder.appendUTF8(maxSendQueue);
+    builder.appendUTF8(windowSize);
+    builder.appendUTF8(heartbeatInterval);
+    builder.append(Boolean.toString(sslEncryption));
+    // Caution: ServerState MUST be the last field.
+    builder.append(serverState);
+    return builder.toByteArray();
   }
 
   /**
@@ -390,9 +254,7 @@
     return sslEncryption;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public String toString()
   {

--
Gitblit v1.10.0