/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions copyright 2012 ForgeRock AS. */ package org.opends.server.protocols.asn1; import org.opends.server.types.ByteStringBuilder; import java.io.OutputStream; import java.io.IOException; /** * An adapter class that allows writing to an byte string builder * with the outputstream interface. */ final class ByteSequenceOutputStream extends OutputStream { private static final int BUFFER_INIT_SIZE = 32; private final ByteStringBuilder buffer; private final int maxInternalBufferSize; /** * Creates a new byte string builder output stream. * * @param buffer * The underlying byte string builder. * @param maxInternalBufferSize * The threshold capacity beyond which internal cached buffers used * for encoding and decoding protocol messages will be trimmed after * use. */ ByteSequenceOutputStream(ByteStringBuilder buffer, int maxInternalBufferSize) { this.buffer = buffer; this.maxInternalBufferSize = Math.max(maxInternalBufferSize, BUFFER_INIT_SIZE); } /** * {@inheritDoc} */ public void write(int i) throws IOException { buffer.append(((byte) (i & 0xFF))); } /** * {@inheritDoc} */ public void write(byte[] bytes) throws IOException { buffer.append(bytes); } /** * {@inheritDoc} */ public void write(byte[] bytes, int i, int i1) throws IOException { buffer.append(bytes, i, i1); } /** * Gets the length of the underlying byte string builder. * * @return The length of the underlying byte string builder. */ int length() { return buffer.length(); } /** * Writes the content of the underlying byte string builder to the * provided output stream. * * @param stream * The output stream. * @throws IOException * If an I/O error occurs. In particular, an {@code * IOException} is thrown if the output stream is closed. */ void writeTo(OutputStream stream) throws IOException { buffer.copyTo(stream); } /** * Resets this output stream such that the underlying byte string builder is * empty, and also has a capacity which is not too big. */ void reset() { if (buffer.capacity() > maxInternalBufferSize) { buffer.clear(BUFFER_INIT_SIZE); } else { buffer.clear(); } } /** * {@inheritDoc} */ public void close() throws IOException { reset(); } }