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