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