/*
|
* 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 legal-notices/CDDLv1_0.txt
|
* or http://forgerock.org/license/CDDLv1.0.html.
|
* 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 legal-notices/CDDLv1_0.txt.
|
* 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-2010 Sun Microsystems, Inc.
|
* Portions copyright 2012 ForgeRock AS.
|
*/
|
package org.opends.server.protocols.asn1;
|
|
|
|
import static org.opends.server.util.ServerConstants.*;
|
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.nio.channels.ReadableByteChannel;
|
|
import org.opends.server.types.ByteSequence;
|
import org.opends.server.types.ByteString;
|
import org.opends.server.types.ByteStringBuilder;
|
import org.opends.server.types.ByteSequenceReader;
|
|
|
|
/**
|
* This class contains various static factory methods for creating
|
* ASN.1 readers and writers.
|
*
|
* @see ASN1Reader
|
* @see ASN1Writer
|
* @see ASN1ByteChannelReader
|
*/
|
public final class ASN1
|
{
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided byte array and
|
* having an unlimited maximum BER element size.
|
*
|
* @param array
|
* The byte array to use.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(byte[] array)
|
{
|
return getReader(array, 0);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided byte array and
|
* having a user defined maximum BER element size.
|
*
|
* @param array
|
* The byte array to use.
|
* @param maxElementSize
|
* The maximum BER element size, or <code>0</code> to
|
* indicate that there is no limit.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(byte[] array, int maxElementSize)
|
{
|
return getReader(ByteString.wrap(array), maxElementSize);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided byte sequence
|
* and having an unlimited maximum BER element size.
|
*
|
* @param sequence
|
* The byte sequence to use.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(ByteSequence sequence)
|
{
|
return getReader(sequence, 0);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided byte sequence
|
* and having a user defined maximum BER element size.
|
*
|
* @param sequence
|
* The byte sequence to use.
|
* @param maxElementSize
|
* The maximum BER element size, or <code>0</code> to
|
* indicate that there is no limit.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(ByteSequence sequence, int maxElementSize)
|
{
|
return new ASN1ByteSequenceReader(sequence.asReader(), maxElementSize);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided byte sequence reader
|
* and having an unlimited maximum BER element size.
|
*
|
* @param reader
|
* The byte sequence reader to use.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(ByteSequenceReader reader)
|
{
|
return getReader(reader, 0);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided byte sequence reader
|
* and having a user defined maximum BER element size.
|
*
|
* @param reader
|
* The byte sequence reader to use.
|
* @param maxElementSize
|
* The maximum BER element size, or <code>0</code> to
|
* indicate that there is no limit.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(ByteSequenceReader reader,
|
int maxElementSize)
|
{
|
return new ASN1ByteSequenceReader(reader, maxElementSize);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided input stream
|
* and having an unlimited maximum BER element size.
|
*
|
* @param stream
|
* The input stream to use.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(InputStream stream)
|
{
|
return getReader(stream, 0);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 reader whose source is the provided input stream
|
* and having a user defined maximum BER element size.
|
*
|
* @param stream
|
* The input stream to use.
|
* @param maxElementSize
|
* The maximum BER element size, or <code>0</code> to
|
* indicate that there is no limit.
|
* @return The new ASN.1 reader.
|
*/
|
public static ASN1Reader getReader(InputStream stream, int maxElementSize)
|
{
|
return new ASN1InputStreamReader(stream, maxElementSize);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 byte channel reader whose source is the provided
|
* readable byte channel, uses 4KB buffer, and having an unlimited
|
* maximum BER element size.
|
*
|
* @param channel
|
* The readable byte channel to use.
|
* @return The new ASN.1 byte channel reader.
|
*/
|
public static ASN1ByteChannelReader getReader(ReadableByteChannel channel)
|
{
|
return getReader(channel, 4096, 0);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 byte channel reader whose source is the provided
|
* readable byte channel, having a user defined buffer size, and
|
* user defined maximum BER element size.
|
*
|
* @param channel
|
* The readable byte channel to use.
|
* @param bufferSize
|
* The buffer size to use when reading from the channel.
|
* @param maxElementSize
|
* The maximum BER element size, or <code>0</code> to
|
* indicate that there is no limit.
|
* @return The new ASN.1 byte channel reader.
|
*/
|
public static ASN1ByteChannelReader getReader(ReadableByteChannel channel,
|
int bufferSize, int maxElementSize)
|
{
|
return new ASN1ByteChannelReader(channel, bufferSize, maxElementSize);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 writer whose destination is the provided byte
|
* string builder.
|
*
|
* @param builder
|
* The byte string builder to use.
|
* @return The new ASN.1 writer.
|
*/
|
public static ASN1Writer getWriter(ByteStringBuilder builder)
|
{
|
return getWriter(builder, DEFAULT_MAX_INTERNAL_BUFFER_SIZE);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 writer whose destination is the provided byte string builder.
|
*
|
* @param builder
|
* The byte string builder to use.
|
* @param maxInternalBufferSize
|
* The threshold capacity beyond which internal cached buffers used
|
* for encoding and decoding protocol messages will be trimmed after
|
* use.
|
* @return The new ASN.1 writer.
|
*/
|
public static ASN1Writer getWriter(ByteStringBuilder builder,
|
int maxInternalBufferSize)
|
{
|
if (maxInternalBufferSize <= 0)
|
{
|
throw new IllegalArgumentException();
|
}
|
ByteSequenceOutputStream outputStream = new ByteSequenceOutputStream(
|
builder, maxInternalBufferSize);
|
return getWriter(outputStream, maxInternalBufferSize);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 writer whose destination is the provided output
|
* stream.
|
*
|
* @param stream
|
* The output stream to use.
|
* @return The new ASN.1 writer.
|
*/
|
public static ASN1Writer getWriter(OutputStream stream)
|
{
|
return getWriter(stream, DEFAULT_MAX_INTERNAL_BUFFER_SIZE);
|
}
|
|
|
|
/**
|
* Gets an ASN.1 writer whose destination is the provided output
|
* stream.
|
*
|
* @param stream
|
* The output stream to use.
|
* @param maxInternalBufferSize
|
* The threshold capacity beyond which internal cached buffers used
|
* for encoding and decoding protocol messages will be trimmed after
|
* use.
|
* @return The new ASN.1 writer.
|
*/
|
public static ASN1Writer getWriter(OutputStream stream,
|
int maxInternalBufferSize)
|
{
|
if (maxInternalBufferSize <= 0)
|
{
|
throw new IllegalArgumentException();
|
}
|
return new ASN1OutputStreamWriter(stream, maxInternalBufferSize);
|
}
|
|
|
|
// Prevent instantiation.
|
private ASN1()
|
{
|
// Nothing to do.
|
}
|
}
|