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/ServerStartECLMsg.java | 194 ++++++++++--------------------------------------
1 files changed, 40 insertions(+), 154 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/protocol/ServerStartECLMsg.java b/opends/src/server/org/opends/server/replication/protocol/ServerStartECLMsg.java
index 4d514fb..d66aba2 100644
--- a/opends/src/server/org/opends/server/replication/protocol/ServerStartECLMsg.java
+++ b/opends/src/server/org/opends/server/replication/protocol/ServerStartECLMsg.java
@@ -22,11 +22,10 @@
*
*
* Copyright 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;
@@ -38,26 +37,25 @@
*/
public class ServerStartECLMsg extends StartMsg
{
- private String serverURL;
- private int maxReceiveQueue;
- private int maxSendQueue;
- private int maxReceiveDelay;
- private int maxSendDelay;
- private int windowSize;
- private ServerState serverState = null;
+ private final String serverURL;
+ 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,86 +106,21 @@
* @throws DataFormatException If the byte array does not contain a valid
* encoded form of the ServerStartMsg.
*/
- public ServerStartECLMsg(byte[] in) throws DataFormatException
+ ServerStartECLMsg(byte[] in) throws DataFormatException
{
- byte[] allowedPduTypes = new byte[1];
- allowedPduTypes[0] = MSG_TYPE_START_ECL;
- headerLength = decodeHeader(allowedPduTypes, in);
+ final ByteArrayScanner scanner = new ByteArrayScanner(in);
+ decodeHeader(scanner, MSG_TYPE_START_ECL);
- try
- {
- /* first bytes are the header */
- int pos = headerLength;
-
- /*
- * read the ServerURL
- */
- int 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.");
- }
+ serverURL = scanner.nextString();
+ maxReceiveDelay = scanner.nextIntUTF8();
+ maxReceiveQueue = scanner.nextIntUTF8();
+ maxSendDelay = scanner.nextIntUTF8();
+ maxSendQueue = scanner.nextIntUTF8();
+ windowSize = scanner.nextIntUTF8();
+ heartbeatInterval = scanner.nextIntUTF8();
+ // FIXME awful encoding
+ sslEncryption = Boolean.valueOf(scanner.nextString());
+ serverState = scanner.nextServerState();
}
/**
@@ -244,69 +177,24 @@
return serverState;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public byte[] getBytes(short sessionProtocolVersion)
{
- try {
- 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();
-
- int length = 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_START_ECL, length,
- sessionProtocolVersion);
- int pos = headerLength;
-
- 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;
- }
+ final ByteArrayBuilder builder = new ByteArrayBuilder();
+ encodeHeader(MSG_TYPE_START_ECL, builder, sessionProtocolVersion);
+ builder.append(serverURL);
+ builder.appendUTF8(maxReceiveDelay);
+ builder.appendUTF8(maxReceiveQueue);
+ builder.appendUTF8(maxSendDelay);
+ builder.appendUTF8(maxSendQueue);
+ builder.appendUTF8(windowSize);
+ builder.appendUTF8(heartbeatInterval);
+ // FIXME awful encoding
+ builder.append(Boolean.toString(sslEncryption));
+ // Caution: ServerState MUST be the last field.
+ builder.append(serverState);
+ return builder.toByteArray();
}
/**
@@ -343,13 +231,11 @@
return sslEncryption;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public String toString()
{
- return this.getClass().getCanonicalName() + " content: " +
+ return getClass().getCanonicalName() + " content: " +
"\nprotocolVersion: " + protocolVersion +
"\ngenerationId: " + generationId +
"\ngroupId: " + groupId +
--
Gitblit v1.10.0