package com.hwlcn.ldap.asn1;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import com.hwlcn.ldap.util.ByteStringBuffer;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
import static com.hwlcn.ldap.util.Debug.*;
@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
public final class ASN1Writer
{
private static final ThreadLocal<ByteStringBuffer> buffers =
new ThreadLocal<ByteStringBuffer>();
private static final int MAX_BUFFER_LENGTH = 524288;
private ASN1Writer()
{
}
public static void writeElement(final ASN1Element element,
final OutputStream outputStream)
throws IOException
{
debugASN1Write(element);
ByteStringBuffer buffer = buffers.get();
if (buffer == null)
{
buffer = new ByteStringBuffer();
buffers.set(buffer);
}
element.encodeTo(buffer);
try
{
buffer.write(outputStream);
}
finally
{
if (buffer.capacity() > MAX_BUFFER_LENGTH)
{
buffer.setCapacity(MAX_BUFFER_LENGTH);
}
buffer.clear();
}
}
public static void writeElement(final ASN1Element element,
final ByteBuffer buffer)
throws BufferOverflowException
{
debugASN1Write(element);
ByteStringBuffer b = buffers.get();
if (b == null)
{
b = new ByteStringBuffer();
buffers.set(b);
}
element.encodeTo(b);
try
{
if (buffer.remaining() < b.length())
{
throw new BufferOverflowException();
}
final int pos = buffer.position();
buffer.put(b.getBackingArray(), 0, b.length());
buffer.limit(buffer.position());
buffer.position(pos);
}
finally
{
if (b.capacity() > MAX_BUFFER_LENGTH)
{
b.setCapacity(MAX_BUFFER_LENGTH);
}
b.clear();
}
}
}