From 79aa099229a8d7dcd15798b4857d12f0649afa4e Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 06 Feb 2014 13:33:54 +0000
Subject: [PATCH] OPENDJ-1307 Migrate server ASN1 classes to SDK
---
opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java | 107 ++++++++++++++-------
opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java | 179 +++++++++++++++--------------------
opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java | 7 -
3 files changed, 149 insertions(+), 144 deletions(-)
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java b/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java
index 422e110..756055a 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java
@@ -128,12 +128,7 @@
logger.trace("WRITE ASN.1 END SEQUENCE(length=%d)", childStream.length());
- if (childStream.capacity() > maxBufferSize) {
- // garbage collect excessively large buffers
- childStream.clear(maxBufferSize);
- } else {
- childStream.clear();
- }
+ childStream.clearAndTruncate(maxBufferSize, maxBufferSize);
return this;
}
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
index f49fad7..9dd3a6d 100755
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
@@ -22,7 +22,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
- * Portions copyright 2011-2013 ForgeRock AS
+ * Portions copyright 2011-2014 ForgeRock AS
*/
package org.forgerock.opendj.ldap;
@@ -60,7 +60,7 @@
@Override
public void write(final int i) {
- append(((byte) (i & 0xFF)));
+ append((byte) (i & 0xFF));
}
}
@@ -71,10 +71,10 @@
*/
private final class SubSequence implements ByteSequence {
- // The length of the sub-sequence.
+ /** The length of the sub-sequence. */
private final int subLength;
- // The offset of the sub-sequence.
+ /** The offset of the sub-sequence. */
private final int subOffset;
/**
@@ -90,16 +90,14 @@
this.subLength = length;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ByteSequenceReader asReader() {
return new ByteSequenceReader(this);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte byteAt(final int index) {
if (index >= subLength || index < 0) {
throw new IndexOutOfBoundsException();
@@ -109,9 +107,8 @@
return buffer[subOffset + index];
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public int compareTo(final byte[] b, final int offset, final int length) {
ByteString.checkArrayBounds(b, offset, length);
@@ -119,9 +116,8 @@
return ByteString.compareTo(buffer, subOffset, subLength, b, offset, length);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public int compareTo(final ByteSequence o) {
if (this == o) {
return 0;
@@ -131,17 +127,15 @@
return -o.compareTo(buffer, subOffset, subLength);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte[] copyTo(final byte[] b) {
copyTo(b, 0);
return b;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte[] copyTo(final byte[] b, final int offset) {
if (offset < 0) {
throw new IndexOutOfBoundsException();
@@ -152,26 +146,23 @@
return b;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ByteStringBuilder copyTo(final ByteStringBuilder builder) {
// Protect against reallocation: use builder's buffer.
return builder.append(buffer, subOffset, subLength);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public OutputStream copyTo(final OutputStream stream) throws IOException {
// Protect against reallocation: use builder's buffer.
stream.write(buffer, subOffset, subLength);
return stream;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public boolean equals(final byte[] b, final int offset, final int length) {
ByteString.checkArrayBounds(b, offset, length);
@@ -179,9 +170,7 @@
return ByteString.equals(buffer, subOffset, subLength, b, offset, length);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public boolean equals(final Object o) {
if (this == o) {
@@ -196,9 +185,7 @@
}
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public int hashCode() {
// Protect against reallocation: use builder's buffer.
@@ -210,16 +197,14 @@
return length == 0;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public int length() {
return subLength;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ByteSequence subSequence(final int start, final int end) {
if (start < 0 || start > end || end > subLength) {
throw new IndexOutOfBoundsException();
@@ -229,24 +214,20 @@
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public String toBase64String() {
return Base64.encode(this);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte[] toByteArray() {
return copyTo(new byte[subLength]);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ByteString toByteString() {
// Protect against reallocation: use builder's buffer.
final byte[] b = new byte[subLength];
@@ -254,9 +235,7 @@
return ByteString.wrap(b);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public String toString() {
// Protect against reallocation: use builder's buffer.
@@ -267,10 +246,10 @@
// These are package private so that compression and crypto
// functionality may directly access the fields.
- // The buffer where data is stored.
+ /** The buffer where data is stored. */
byte[] buffer;
- // The number of bytes to expose from the buffer.
+ /** The number of bytes to expose from the buffer. */
int length;
/**
@@ -706,13 +685,13 @@
* read and decode data from this byte string builder.
* @see #clear()
*/
+ @Override
public ByteSequenceReader asReader() {
return new ByteSequenceReader(this);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte byteAt(final int index) {
if (index >= length || index < 0) {
throw new IndexOutOfBoundsException();
@@ -747,41 +726,47 @@
/**
* Sets the length of this byte string builder to zero, and resets the
- * capacity to the specified size.
+ * capacity to the specified size if above provided threshold.
* <p>
* <b>NOTE:</b> if this method is called, then
* {@code ByteSequenceReader.rewind()} must also be called on any associated
* byte sequence readers in order for them to remain valid.
*
- * @param capacity
+ * @param thresholdCapacity
+ * The threshold capacity triggering a truncate
+ * @param newCapacity
* The new capacity.
* @return This byte string builder.
* @throws IllegalArgumentException
- * If the {@code capacity} is negative.
+ * If the {@code newCapacity} is negative or the {@code newCapacity}
+ * is bigger than the {@code thresholdCapacity}.
* @see #asReader()
*/
- public ByteStringBuilder clear(int capacity) {
- if (capacity < 0) {
- throw new IllegalArgumentException();
+ public ByteStringBuilder clearAndTruncate(int thresholdCapacity, int newCapacity) {
+ if (newCapacity > thresholdCapacity) {
+ throw new IllegalArgumentException("new capacity '" + newCapacity
+ + "' cannot be bigger than threshold capacity '" + thresholdCapacity + "'");
}
- if (capacity != buffer.length) {
- buffer = new byte[capacity];
+ if (newCapacity < 0) {
+ throw new IllegalArgumentException("new capacity '" + newCapacity + "' cannot be negative.");
+ }
+ if (buffer.length > thresholdCapacity) {
+ // garbage collect excessively large buffers
+ buffer = new byte[newCapacity];
}
length = 0;
return this;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public int compareTo(final byte[] bytes, final int offset, final int length) {
ByteString.checkArrayBounds(bytes, offset, length);
return ByteString.compareTo(this.buffer, 0, this.length, bytes, offset, length);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public int compareTo(final ByteSequence o) {
if (this == o) {
return 0;
@@ -789,17 +774,15 @@
return -o.compareTo(buffer, 0, length);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte[] copyTo(final byte[] bytes) {
copyTo(bytes, 0);
return bytes;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte[] copyTo(final byte[] bytes, final int offset) {
if (offset < 0) {
throw new IndexOutOfBoundsException();
@@ -808,17 +791,15 @@
return bytes;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public ByteStringBuilder copyTo(final ByteStringBuilder builder) {
builder.append(buffer, 0, length);
return builder;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public OutputStream copyTo(final OutputStream stream) throws IOException {
stream.write(buffer, 0, length);
return stream;
@@ -857,9 +838,8 @@
return this;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public boolean equals(final byte[] bytes, final int offset, final int length) {
ByteString.checkArrayBounds(bytes, offset, length);
return ByteString.equals(this.buffer, 0, this.length, bytes, offset, length);
@@ -921,14 +901,14 @@
return ByteString.hashCode(buffer, 0, length);
}
+ /** {@inheritDoc} */
@Override
public boolean isEmpty() {
return length == 0;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public int length() {
return length;
}
@@ -991,6 +971,7 @@
* The end index, exclusive.
* @return The newly created byte subsequence.
*/
+ @Override
public ByteSequence subSequence(final int start, final int end) {
if (start < 0 || start > end || end > length) {
throw new IndexOutOfBoundsException();
@@ -999,17 +980,14 @@
return new SubSequence(start, end - start);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public String toBase64String() {
return Base64.encode(this);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ @Override
public byte[] toByteArray() {
return copyTo(new byte[length]);
}
@@ -1021,15 +999,14 @@
*
* @return The {@link ByteString} representation of this byte sequence.
*/
+ @Override
public ByteString toByteString() {
final byte[] b = new byte[length];
System.arraycopy(buffer, 0, b, 0, length);
return ByteString.wrap(b);
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public String toString() {
return ByteString.toString(buffer, 0, length);
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java
index 6eb8f03..1f472ad 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java
@@ -22,9 +22,8 @@
*
*
* Copyright 2010 Sun Microsystems, Inc.
- * Portions copyright 2011 ForgeRock AS
+ * Portions copyright 2011-2014 ForgeRock AS
*/
-
package org.forgerock.opendj.ldap;
import java.io.ByteArrayInputStream;
@@ -35,6 +34,7 @@
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterOutputStream;
+import org.fest.assertions.Assertions;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -44,8 +44,15 @@
*/
@SuppressWarnings("javadoc")
public class ByteStringBuilderTestCase extends ByteSequenceTestCase {
- private static final byte[] EIGHT_BYTES = new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03,
- (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 };
+
+ //@Checkstyle:off
+ private static byte _(int i) {
+ return (byte) i;
+ }
+ //@Checkstyle:on
+
+ private static final byte[] EIGHT_BYTES = new byte[] { _(0x01), _(0x02), _(0x03),
+ _(0x04), _(0x05), _(0x06), _(0x07), _(0x08) };
/**
* ByteSequence data provider.
@@ -59,7 +66,7 @@
System.arraycopy(builders, 0, addlSequences, 0, builders.length);
addlSequences[builders.length] =
new Object[] { new ByteStringBuilder().append(EIGHT_BYTES).subSequence(2, 6),
- new byte[] { (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06 } };
+ new byte[] { _(0x03), _(0x04), _(0x05), _(0x06) } };
return addlSequences;
}
@@ -124,12 +131,39 @@
bs.byteAt(0);
}
- @Test(dataProvider = "builderProvider", expectedExceptions = IndexOutOfBoundsException.class)
- public void testClearWithNewCapacity(ByteStringBuilder bs, byte[] ba) {
- bs.clear(123);
- Assert.assertEquals(bs.length(), 0);
- Assert.assertEquals(bs.capacity(), 123);
- bs.byteAt(0);
+ @DataProvider
+ public Object[][] clearAndTruncateProvider() throws Exception {
+ return new Object[][] {
+ { builder(0), 42, 42 },
+ { builder(42), 42, 42 },
+ { builder(43), 42, 42 },
+ };
+ }
+
+ private ByteStringBuilder builder(int length) {
+ final ByteStringBuilder builder = new ByteStringBuilder();
+ for (int i = 0; i < length; i++) {
+ builder.append(42);
+ }
+ return builder;
+ }
+
+ @Test(dataProvider = "clearAndTruncateProvider")
+ public void testClearAndTruncate(ByteStringBuilder bs, int thresholdCapacity, int newCapacity) {
+ bs.clearAndTruncate(thresholdCapacity, newCapacity);
+ Assertions.assertThat(bs.length()).isEqualTo(0);
+ Assertions.assertThat(bs.capacity()).isLessThanOrEqualTo(thresholdCapacity);
+ Assertions.assertThat(bs.capacity()).isLessThanOrEqualTo(newCapacity);
+ }
+
+ @Test(expectedExceptions = { IllegalArgumentException.class })
+ public void clearAndTruncateThrowsWithNegativeNewCapacity() {
+ new ByteStringBuilder().clearAndTruncate(42, -1);
+ }
+
+ @Test(expectedExceptions = { IllegalArgumentException.class })
+ public void clearAndTruncateThrowsWithNewCapacityAboveThreshold() {
+ new ByteStringBuilder().clearAndTruncate(42, 42 + 1);
}
@Test
@@ -166,7 +200,7 @@
public void testAsOutputStream() throws Exception {
final ByteStringBuilder bsb = new ByteStringBuilder();
final OutputStream os = bsb.asOutputStream();
- os.write((byte) 0x01);
+ os.write(_(0x01));
os.write(2);
os.write(new byte[] { 2, 3, 4, 5 }, 1, 2);
os.close();
@@ -200,12 +234,11 @@
testBuilderFromStream.append(testStream, 8);
return new Object[][] {
- { new ByteStringBuilder().append((byte) 0x00).append((byte) 0x01),
- new byte[] { (byte) 0x00, (byte) 0x01 } },
- {
- new ByteStringBuilder(5).append(
- new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04 }).append(
- new byte[] { (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 }),
+ { new ByteStringBuilder().append(_(0x00)).append(_(0x01)),
+ new byte[] { _(0x00), _(0x01) } },
+ { new ByteStringBuilder(5)
+ .append(new byte[] { _(0x01), _(0x02), _(0x03), _(0x04) })
+ .append(new byte[] { _(0x05), _(0x06), _(0x07), _(0x08) }),
EIGHT_BYTES },
{ new ByteStringBuilder(3).append(EIGHT_BYTES, 0, 3).append(EIGHT_BYTES, 3, 5),
EIGHT_BYTES },
@@ -215,16 +248,16 @@
EIGHT_BYTES },
{ testBuilderFromStream, EIGHT_BYTES },
{ new ByteStringBuilder().append(Short.MIN_VALUE).append(Short.MAX_VALUE),
- new byte[] { (byte) 0x80, (byte) 0x00, (byte) 0x7F, (byte) 0xFF } },
+ new byte[] { _(0x80), _(0x00), _(0x7F), _(0xFF) } },
{
new ByteStringBuilder(5).append(Integer.MIN_VALUE).append(Integer.MAX_VALUE),
- new byte[] { (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x7F,
- (byte) 0xFF, (byte) 0xFF, (byte) 0xFF } },
+ new byte[] { _(0x80), _(0x00), _(0x00), _(0x00), _(0x7F),
+ _(0xFF), _(0xFF), _(0xFF) } },
{
new ByteStringBuilder().append(Long.MIN_VALUE).append(Long.MAX_VALUE),
- new byte[] { (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
- (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x7F, (byte) 0xFF, (byte) 0xFF,
- (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF } },
+ new byte[] { _(0x80), _(0x00), _(0x00), _(0x00), _(0x00),
+ _(0x00), _(0x00), _(0x00), _(0x7F), _(0xFF), _(0xFF),
+ _(0xFF), _(0xFF), _(0xFF), _(0xFF), _(0xFF) } },
{ new ByteStringBuilder(11).append("this is a").append(" test"),
"this is a test".getBytes("UTF-8") },
{ new ByteStringBuilder().append((Object) "this is a").append((Object) " test"),
@@ -237,9 +270,9 @@
(Object) " test".toCharArray()), "this is a test".getBytes("UTF-8") },
{
new ByteStringBuilder().append((Object) EIGHT_BYTES).append((Object) EIGHT_BYTES),
- new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05,
- (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x01, (byte) 0x02, (byte) 0x03,
- (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 } },
+ new byte[] { _(0x01), _(0x02), _(0x03), _(0x04), _(0x05),
+ _(0x06), _(0x07), _(0x08), _(0x01), _(0x02), _(0x03),
+ _(0x04), _(0x05), _(0x06), _(0x07), _(0x08) } },
{
new ByteStringBuilder().appendBERLength(0x00000000).appendBERLength(0x00000001)
.appendBERLength(0x0000000F).appendBERLength(0x00000010).appendBERLength(
@@ -249,15 +282,15 @@
.appendBERLength(0x00100000).appendBERLength(0x00FFFFFF).appendBERLength(
0x01000000).appendBERLength(0x0FFFFFFF).appendBERLength(0x10000000)
.appendBERLength(0xFFFFFFFF),
- new byte[] { (byte) 0x00, (byte) 0x01, (byte) 0x0F, (byte) 0x10, (byte) 0x7F,
- (byte) 0x81, (byte) 0xFF, (byte) 0x82, (byte) 0x01, (byte) 0x00, (byte) 0x82,
- (byte) 0x0F, (byte) 0xFF, (byte) 0x82, (byte) 0x10, (byte) 0x00, (byte) 0x82,
- (byte) 0xFF, (byte) 0xFF, (byte) 0x83, (byte) 0x01, (byte) 0x00, (byte) 0x00,
- (byte) 0x83, (byte) 0x0F, (byte) 0xFF, (byte) 0xFF, (byte) 0x83, (byte) 0x10,
- (byte) 0x00, (byte) 0x00, (byte) 0x83, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
- (byte) 0x84, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x84,
- (byte) 0x0F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x84, (byte) 0x10,
- (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x84, (byte) 0xFF, (byte) 0xFF,
- (byte) 0xFF, (byte) 0xFF } }, };
+ new byte[] { _(0x00), _(0x01), _(0x0F), _(0x10), _(0x7F),
+ _(0x81), _(0xFF), _(0x82), _(0x01), _(0x00), _(0x82),
+ _(0x0F), _(0xFF), _(0x82), _(0x10), _(0x00), _(0x82),
+ _(0xFF), _(0xFF), _(0x83), _(0x01), _(0x00), _(0x00),
+ _(0x83), _(0x0F), _(0xFF), _(0xFF), _(0x83), _(0x10),
+ _(0x00), _(0x00), _(0x83), _(0xFF), _(0xFF), _(0xFF),
+ _(0x84), _(0x01), _(0x00), _(0x00), _(0x00), _(0x84),
+ _(0x0F), _(0xFF), _(0xFF), _(0xFF), _(0x84), _(0x10),
+ _(0x00), _(0x00), _(0x00), _(0x84), _(0xFF), _(0xFF),
+ _(0xFF), _(0xFF) } }, };
}
}
--
Gitblit v1.10.0