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/server/NotAssuredUpdateMsg.java | 255 ++++++++++++++++++---------------------------------
1 files changed, 90 insertions(+), 165 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/NotAssuredUpdateMsg.java b/opends/src/server/org/opends/server/replication/server/NotAssuredUpdateMsg.java
index e26e6b9..6c40582 100644
--- a/opends/src/server/org/opends/server/replication/server/NotAssuredUpdateMsg.java
+++ b/opends/src/server/org/opends/server/replication/server/NotAssuredUpdateMsg.java
@@ -22,7 +22,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
- * Portions Copyright 2013 ForgeRock AS.
+ * Portions Copyright 2013-2014 ForgeRock AS.
*/
package org.opends.server.replication.server;
@@ -31,9 +31,7 @@
import org.opends.server.replication.common.AssuredMode;
import org.opends.server.replication.common.CSN;
-import org.opends.server.replication.protocol.LDAPUpdateMsg;
-import org.opends.server.replication.protocol.ProtocolVersion;
-import org.opends.server.replication.protocol.UpdateMsg;
+import org.opends.server.replication.protocol.*;
/**
* This is a facility class that is in fact an hack to optimize replication
@@ -48,28 +46,32 @@
* when calling the isAssured() method.
*
*/
-public class NotAssuredUpdateMsg extends UpdateMsg
+class NotAssuredUpdateMsg extends UpdateMsg
{
- // The real update message this message represents
- private UpdateMsg realUpdateMsg = null;
+ /** The real update message this message represents */
+ private final UpdateMsg realUpdateMsg;
- // V1 serialized form of the real message with assured flag set to false.
- // Ready to be sent.
- private byte[] realUpdateMsgNotAssuredBytesV1 = null;
+ /**
+ * V1 serialized form of the real message with assured flag set to false.
+ * Ready to be sent.
+ */
+ private final byte[] realUpdateMsgNotAssuredBytesV1;
- // VLatest serialized form of the real message with assured flag set to false.
- // Ready to be sent.
- private byte[] realUpdateMsgNotAssuredBytesVLatest = null;
+ /**
+ * VLatest serialized form of the real message with assured flag set to false.
+ * Ready to be sent.
+ */
+ private final byte[] realUpdateMsgNotAssuredBytesVLatest;
/**
* Creates a new empty UpdateMsg.
* This class is only used by replication server code so constructor is not
* public by security.
+ *
* @param updateMsg The real underlying update message this object represents.
* @throws UnsupportedEncodingException When the pre-encoding of the message
* failed because the UTF-8 encoding is not supported or the
* requested protocol version to use is not supported by this PDU.
- *
*/
NotAssuredUpdateMsg(UpdateMsg updateMsg) throws UnsupportedEncodingException
{
@@ -85,18 +87,7 @@
* Get the encoding form of the real message then overwrite the assured
* flag to always be false.
*/
- byte[] origBytes = realUpdateMsg.getBytes(
- ProtocolVersion.REPLICATION_PROTOCOL_V1);
- // Clone the byte array to be able to modify it without problems
- // (ModifyMsg messages for instance do not return a cloned version of
- // their byte array)
- byte[] bytes = new byte[origBytes.length];
- System.arraycopy(origBytes, 0, bytes, 0, origBytes.length);
-
- int maxLen = bytes.length;
- int pos;
- int nZeroFound = 0; // Number of 0 value found
- boolean found = false;
+ byte[] bytes = getRealUpdateMsgBytes(ProtocolVersion.REPLICATION_PROTOCOL_V1);
/* Look for assured flag position:
* The message header is stored in the form :
@@ -107,23 +98,7 @@
* See LDAPUpdateMsg.encodeHeader_V1() for more information
*/
// Find end of CSN then end of dn
- for (pos = 1; pos < maxLen; pos++)
- {
- if (bytes[pos] == (byte) 0)
- {
- nZeroFound++;
- if (nZeroFound == 2) // 2 end of string to find
- {
- found = true;
- break;
- }
- }
- }
- if (!found)
- throw new UnsupportedEncodingException("Could not find end of CSN.");
- pos++;
- if (pos >= maxLen)
- throw new UnsupportedEncodingException("Reached end of packet.");
+ int pos = findNthZeroByte(bytes, 1, 2);
// Force assured flag to false
bytes[pos] = 0;
@@ -135,16 +110,7 @@
* Get the encoding form of the real message then overwrite the assured
* flag to always be false.
*/
- origBytes = realUpdateMsg.getBytes(ProtocolVersion.getCurrentVersion());
- // Clone the byte array to be able to modify it without problems
- // (ModifyMsg messages for instance do not return a cloned version of
- // their byte array)
- bytes = new byte[origBytes.length];
- System.arraycopy(origBytes, 0, bytes, 0, origBytes.length);
-
- maxLen = bytes.length;
- nZeroFound = 0; // Number of 0 value found
- found = false;
+ bytes = getRealUpdateMsgBytes(ProtocolVersion.getCurrentVersion());
/* Look for assured flag position:
* The message header is stored in the form :
@@ -156,48 +122,22 @@
* See LDAPUpdateMsg.encodeHeader() for more information
*/
// Find end of CSN then end of dn then end of uuid
- for (pos = 2; pos < maxLen; pos++)
- {
- if (bytes[pos] == (byte) 0)
- {
- nZeroFound++;
- if (nZeroFound == 3) // 3 end of string to find
- {
- found = true;
- break;
- }
- }
- }
- if (!found)
- throw new UnsupportedEncodingException("Could not find end of CSN.");
- pos++;
- if (pos >= maxLen)
- throw new UnsupportedEncodingException("Reached end of packet.");
+ pos = findNthZeroByte(bytes, 2, 3);
// Force assured flag to false
bytes[pos] = 0;
// Store computed VLATEST serialized form
realUpdateMsgNotAssuredBytesVLatest = bytes;
-
- } else
+ }
+ else
{
+ realUpdateMsgNotAssuredBytesV1 = null;
/**
* Prepare VLATEST serialized form of the message:
* Get the encoding form of the real message then overwrite the assured
* flag to always be false.
*/
- byte[] origBytes = realUpdateMsg.getBytes(
- ProtocolVersion.getCurrentVersion());
- // Clone the byte array to be able to modify it without problems
- // (ModifyMsg messages for instance do not return a cloned version of
- // their byte array)
- byte[] bytes = new byte[origBytes.length];
- System.arraycopy(origBytes, 0, bytes, 0, origBytes.length);
-
- int maxLen = bytes.length;
- int pos;
- int nZeroFound = 0; // Number of 0 value found
- boolean found = false;
+ byte[] bytes = getRealUpdateMsgBytes(ProtocolVersion.getCurrentVersion());
// This is a generic update message
/* Look for assured flag position:
@@ -210,23 +150,7 @@
* See UpdateMsg.encodeHeader() for more information
*/
// Find end of CSN
- for (pos = 2; pos < maxLen; pos++)
- {
- if (bytes[pos] == (byte) 0)
- {
- nZeroFound++;
- if (nZeroFound == 1) // 1 end of string to find
- {
- found = true;
- break;
- }
- }
- }
- if (!found)
- throw new UnsupportedEncodingException("Could not find end of CSN.");
- pos++;
- if (pos >= maxLen)
- throw new UnsupportedEncodingException("Reached end of packet.");
+ int pos = findNthZeroByte(bytes, 2, 1);
// Force assured flag to false
bytes[pos] = 0;
@@ -236,17 +160,52 @@
}
/**
- * {@inheritDoc}
+ * Clones the byte array to be able to modify it without problems
+ * (ModifyMsg messages for instance do not return a cloned version of
+ * their byte array).
*/
+ private byte[] getRealUpdateMsgBytes(final short protocolVersion)
+ {
+ byte[] origBytes = realUpdateMsg.getBytes(protocolVersion);
+ byte[] bytes = new byte[origBytes.length];
+ System.arraycopy(origBytes, 0, bytes, 0, origBytes.length);
+ return bytes;
+ }
+
+ private int findNthZeroByte(byte[] bytes, int startPos, int nbToFind)
+ throws UnsupportedEncodingException
+ {
+ final int maxLen = bytes.length;
+ int nbZeroFound = 0; // Number of 0 values found
+ for (int pos = startPos; pos < maxLen; pos++)
+ {
+ if (bytes[pos] == (byte) 0)
+ {
+ nbZeroFound++;
+ if (nbZeroFound == nbToFind)
+ {
+ // nb of end of strings reached
+ pos++;
+ if (pos >= maxLen)
+ {
+ throw new UnsupportedEncodingException("Reached end of packet.");
+ }
+ return pos;
+ }
+ }
+ }
+ throw new UnsupportedEncodingException(
+ "Could not find " + nbToFind + " zero bytes in byte array.");
+ }
+
+ /** {@inheritDoc} */
@Override
public CSN getCSN()
{
return realUpdateMsg.getCSN();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public boolean isAssured()
{
@@ -254,9 +213,7 @@
return false;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public void setAssured(boolean assured)
{
@@ -264,78 +221,59 @@
// and we do not want to change the original real update message settings
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public boolean equals(Object obj)
{
// Compare with the underlying real update message
- if (obj != null)
- {
- if (obj.getClass() != realUpdateMsg.getClass())
- return false;
- return realUpdateMsg.getCSN().
- equals(((UpdateMsg)obj).getCSN());
- }
- else
+ if (obj == null)
{
return false;
}
+ return obj.getClass() == realUpdateMsg.getClass()
+ && realUpdateMsg.getCSN().equals(((UpdateMsg) obj).getCSN());
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public int hashCode()
{
return realUpdateMsg.hashCode();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public int compareTo(UpdateMsg msg)
{
return realUpdateMsg.compareTo(msg);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
- public byte[] getBytes(short reqProtocolVersion)
- throws UnsupportedEncodingException
+ public byte[] getBytes(short protocolVersion)
{
- if (reqProtocolVersion == ProtocolVersion.REPLICATION_PROTOCOL_V1)
+ if (protocolVersion == ProtocolVersion.REPLICATION_PROTOCOL_V1)
+ {
return realUpdateMsgNotAssuredBytesV1;
- else
- return realUpdateMsgNotAssuredBytesVLatest;
+ }
+ return realUpdateMsgNotAssuredBytesVLatest;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public AssuredMode getAssuredMode()
{
return realUpdateMsg.getAssuredMode();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public byte getSafeDataLevel()
{
return realUpdateMsg.getSafeDataLevel();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public void setAssuredMode(AssuredMode assuredMode)
{
@@ -343,9 +281,7 @@
// and we do not want to change the original real update message settings
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public void setSafeDataLevel(byte safeDataLevel)
{
@@ -353,49 +289,38 @@
// and we do not want to change the original real update message settings
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public short getVersion()
{
return realUpdateMsg.getVersion();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public int size()
{
return realUpdateMsg.size();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
- protected byte[] encodeHeader(byte type, int additionalLength, short version)
- throws UnsupportedEncodingException
+ protected ByteArrayBuilder encodeHeader(byte allowedType,
+ short protocolVersion)
{
// Not called as only used by constructors using bytes
return null;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
- public int decodeHeader(byte type, byte[] encodedMsg)
- throws DataFormatException
+ protected void decodeHeader(byte msgType, ByteArrayScanner scanner)
+ throws DataFormatException
{
// Not called as only used by getBytes methods
- return -1;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public byte[] getPayload()
{
--
Gitblit v1.10.0