From 5d5b442929285a252f13cf61207ffe2fc4697a69 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 06 Feb 2014 17:49:07 +0000
Subject: [PATCH] OPENDJ-1307 Migrate server ASN1 classes to SDK
---
opendj-sdk/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java | 18 +++++++++---------
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java | 13 +++++++++++--
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java | 9 ++++++---
3 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java
index 756055a..b86d234 100644
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java
@@ -31,6 +31,7 @@
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
+
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteSequence;
@@ -42,6 +43,8 @@
* An ASN1Writer implementation that outputs to an outputstream.
*/
final class ASN1OutputStreamWriter extends AbstractASN1Writer {
+ /** Initial size of internal buffers. */
+ private static final int BUFFER_INIT_SIZE = 32;
private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
@@ -63,7 +66,7 @@
ASN1OutputStreamWriter(final OutputStream stream, final int maxBufferSize) {
this.out = stream;
this.rootStream = stream;
- this.maxBufferSize = maxBufferSize;
+ this.maxBufferSize = Math.max(maxBufferSize, BUFFER_INIT_SIZE);
this.streamStack = new ArrayList<ByteStringBuilder>();
this.stackDepth = -1;
}
@@ -128,7 +131,7 @@
logger.trace("WRITE ASN.1 END SEQUENCE(length=%d)", childStream.length());
- childStream.clearAndTruncate(maxBufferSize, maxBufferSize);
+ childStream.clearAndTruncate(maxBufferSize, BUFFER_INIT_SIZE);
return this;
}
@@ -333,7 +336,7 @@
// Make sure we have a cached sub-stream at this depth
if (stackDepth >= streamStack.size()) {
- final ByteStringBuilder subStream = new ByteStringBuilder();
+ final ByteStringBuilder subStream = new ByteStringBuilder(BUFFER_INIT_SIZE);
streamStack.add(subStream);
out = subStream.asOutputStream();
} else {
diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
index 9dd3a6d..c03563c 100755
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
@@ -253,6 +253,13 @@
int length;
/**
+ * The lazily allocated output stream view of this builder. Synchronization
+ * is not necessary because the stream is stateless and race conditions can
+ * be tolerated.
+ */
+ private OutputStreamImpl os;
+
+ /**
* Creates a new byte string builder with an initial capacity of 32 bytes.
*/
public ByteStringBuilder() {
@@ -668,8 +675,10 @@
* this byte string builder.
*/
public OutputStream asOutputStream() {
- // Is it worth caching this?
- return new OutputStreamImpl();
+ if (os == null) {
+ os = new OutputStreamImpl();
+ }
+ return os;
}
/**
diff --git a/opendj-sdk/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java b/opendj-sdk/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java
index ad57ccf..47e6edc 100644
--- a/opendj-sdk/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java
+++ b/opendj-sdk/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java
@@ -50,17 +50,14 @@
final class ASN1BufferWriter extends AbstractASN1Writer implements Cacheable {
private class ChildSequenceBuffer implements SequenceBuffer {
private SequenceBuffer parent;
-
private ChildSequenceBuffer child;
-
private final ByteStringBuilder buffer = new ByteStringBuilder(BUFFER_INIT_SIZE);
public SequenceBuffer endSequence() throws IOException {
writeLength(parent, buffer.length());
parent.writeByteArray(buffer.getBackingArray(), 0, buffer.length());
-
+ buffer.clearAndTruncate(DEFAULT_MAX_INTERNAL_BUFFER_SIZE, BUFFER_INIT_SIZE);
logger.trace("WRITE ASN.1 END SEQUENCE(length=%d)", buffer.length());
-
return parent;
}
@@ -69,10 +66,8 @@
child = new ChildSequenceBuffer();
child.parent = this;
}
-
buffer.append(type);
child.buffer.clear();
-
return child;
}
@@ -130,11 +125,9 @@
child = new ChildSequenceBuffer();
child.parent = this;
}
-
outBuffer.ensureAdditionalCapacity(1);
outBuffer.put(type);
child.buffer.clear();
-
return child;
}
@@ -162,9 +155,17 @@
private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+ /**
+ * Initial size of newly created buffers.
+ */
private static final int BUFFER_INIT_SIZE = 1024;
/**
+ * Default maximum size for cached protocol/entry encoding buffers.
+ */
+ private static final int DEFAULT_MAX_INTERNAL_BUFFER_SIZE = 32 * 1024;
+
+ /**
* Reset the writer.
*/
void reset() {
@@ -177,7 +178,6 @@
private SequenceBuffer sequenceBuffer;
private RecyclableBuffer outBuffer;
-
private final RootSequenceBuffer rootBuffer;
/**
--
Gitblit v1.10.0