mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
06.49.2014 5d5b442929285a252f13cf61207ffe2fc4697a69
OPENDJ-1307 Migrate server ASN1 classes to SDK

* ByteStringBuilder - cache the output stream view
* ASN1*Writer - truncate cached internal buffers if they grow too big.

3 files modified
40 ■■■■■ changed files
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/io/ASN1OutputStreamWriter.java 9 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java 13 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/ASN1BufferWriter.java 18 ●●●● patch | view | raw | blame | history
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 {
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;
    }
    /**
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;
    /**