From 22094368c2865dcfb6daf8366425212b721a4657 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Thu, 05 Feb 2009 17:42:14 +0000
Subject: [PATCH] Merge ASN1 branch to trunk

---
 opends/src/server/org/opends/server/protocols/asn1/ASN1Writer.java |  389 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 297 insertions(+), 92 deletions(-)

diff --git a/opends/src/server/org/opends/server/protocols/asn1/ASN1Writer.java b/opends/src/server/org/opends/server/protocols/asn1/ASN1Writer.java
index 1c04d4c..2e54c39 100644
--- a/opends/src/server/org/opends/server/protocols/asn1/ASN1Writer.java
+++ b/opends/src/server/org/opends/server/protocols/asn1/ASN1Writer.java
@@ -22,135 +22,340 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.protocols.asn1;
 
 
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.Socket;
+import org.opends.server.types.ByteSequence;
 
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.DebugLogLevel;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.Flushable;
 
 
 /**
- * This class defines a utility that can be used to write ASN.1 elements over a
- * provided socket or output stream.
+ * An interface for encoding ASN.1 elements to a data source.
+ * <p>
+ * Methods for creating {@link ASN1Writer}s are provided in the
+ * {@link ASN1} class.
  */
-@org.opends.server.types.PublicAPI(
-     stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
-     mayInstantiate=true,
-     mayExtend=false,
-     mayInvoke=true)
-public final class ASN1Writer
+public interface ASN1Writer extends Closeable, Flushable
 {
+
   /**
-   * The tracer object for the debug logger.
+   * Closes this ASN.1 writer, flushing it first. Closing a
+   * previously closed ASN.1 writer has no effect. Any unfinished
+   * sequences and/or sets will be ended.
+   *
+   * @throws IOException
+   *           If an error occurs while closing the writer.
    */
-  private static final DebugTracer TRACER = getTracer();
+  public void close() throws IOException;
 
-
-
-
-  // The output stream to which the encoded elements should be written.
-  private OutputStream outputStream;
-
-  // The socket with which the output stream is associated.
-  private Socket socket;
+  /**
+   * Flushes the writer. If the writer has saved any elements from the
+   * previous write methods in a buffer, write them immediately to their
+   * intended destination. Then, if that destination is another byte stream,
+   * flush it. Thus one flush() invocation will flush all the buffers in a
+   * chain of streams.
+   * <p/>
+   * If the intended destination of this stream is an abstraction provided
+   * by the underlying operating system, for example a file, then flushing
+   * the stream guarantees only that bytes previously written to the stream
+   * are passed to the operating system for writing; it does not guarantee
+   * that they are actually written to a physical device such as a disk drive.
+   *
+   * @throws IOException If an I/O error occurs
+   */
+  public void flush() throws IOException;
 
 
 
   /**
-   * Creates a new ASN.1 writer that will write elements over the provided
-   * socket.
+   * Writes a boolean element using the Universal Boolean ASN.1 type
+   * tag.
    *
-   * @param  socket  The socket to use to write ASN.1 elements.
-   *
-   * @throws  IOException  If a problem occurs while trying to get the output
-   *                       stream for the socket.
+   * @param booleanValue
+   *          The boolean value to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
    */
-  public ASN1Writer(Socket socket)
-         throws IOException
-  {
-    this.socket  = socket;
-    outputStream = socket.getOutputStream();
-  }
+  ASN1Writer writeBoolean(boolean booleanValue) throws IOException;
 
 
 
   /**
-   * Creates a new ASN.1 writer that will write elements over the provided
-   * output stream.
+   * Writes a boolean element using the provided type tag.
    *
-   * @param  outputStream  The output stream to use to write ASN.1 elements.
+   * @param type
+   *          The type tag to use.
+   * @param booleanValue
+   *          The boolean value to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
    */
-  public ASN1Writer(OutputStream outputStream)
-  {
-    this.outputStream = outputStream;
-    socket            = null;
-  }
+  ASN1Writer writeBoolean(byte type, boolean booleanValue) throws IOException;
 
 
 
   /**
-   * Writes the provided ASN.1 element over the output stream associated with
-   * this ASN.1 writer.
+   * Finish writing a sequence.
    *
-   * @param  element  The element to be written.
-   *
-   * @return  The number of bytes actually written over the output stream.
-   *
-   * @throws  IOException  If a problem occurs while trying to write the
-   *                       information over the output stream.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
    */
-  public int writeElement(ASN1Element element)
-         throws IOException
-  {
-    byte[] elementBytes = element.encode();
-    outputStream.write(elementBytes);
-    outputStream.flush();
-
-    return elementBytes.length;
-  }
+  ASN1Writer writeEndSequence() throws IOException;
 
 
 
   /**
-   * Closes this ASN.1 writer and the underlying output stream/socket.
+   * Finish writing a set.
+   *
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
    */
-  public void close()
-  {
-    try
-    {
-      outputStream.close();
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-    }
+  ASN1Writer writeEndSet() throws IOException;
 
 
-    if (socket != null)
-    {
-      try
-      {
-        socket.close();
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-      }
-    }
-  }
+
+  /**
+   * Writes an integer element using the provided type tag.
+   *
+   * @param type
+   *          The type tag to use.
+   * @param intValue
+   *          The integer value to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeInteger(byte type, int intValue) throws IOException;
+
+
+
+  /**
+   * Writes an integer element using the provided type tag.
+   *
+   * @param type
+   *          The type tag to use.
+   * @param longValue
+   *          The integer value to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeInteger(byte type, long longValue) throws IOException;
+
+
+
+  /**
+   * Writes an integer element using the Universal Integer ASN.1 type
+   * tag.
+   *
+   * @param intValue
+   *          The integer value to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeInteger(int intValue) throws IOException;
+
+
+
+  /**
+   * Writes an integer element using the Universal Integer ASN.1 type
+   * tag.
+   *
+   * @param longValue
+   *          The integer value to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeInteger(long longValue) throws IOException;
+
+
+
+  /**
+   * Writes an enumerated element using the Universal Enumerated ASN.1 type
+   * tag.
+   *
+   * @param intValue
+   *          The integer value of the enumeration to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeEnumerated(int intValue) throws IOException;
+
+
+  /**
+   * Writes a null element using the Universal Null ASN.1 type tag.
+   *
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeNull() throws IOException;
+
+
+
+  /**
+   * Writes a null element using the provided type tag.
+   *
+   * @param type
+   *          The type tag to use.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeNull(byte type) throws IOException;
+
+
+
+  /**
+   * Writes an octet string element using the provided type tag and
+   * byte array.
+   *
+   * @param type
+   *          The type tag to use.
+   * @param value
+   *          The byte array containing the data to write.
+   * @param offset
+   *          The offset in the byte array.
+   * @param length
+   *          The number of bytes to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeOctetString(byte type, byte[] value, int offset, int length)
+      throws IOException;
+
+
+
+  /**
+   * Writes an octet string element using the provided type tag and
+   * byte sequence.
+   *
+   * @param type
+   *          The type tag to use.
+   * @param value
+   *          The byte sequence containing the data to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeOctetString(byte type, ByteSequence value) throws IOException;
+
+
+
+  /**
+   * Writes an octet string element using the provided type tag and
+   * the UTF-8 encoded bytes of the provided string.
+   *
+   * @param type
+   *          The type tag to use.
+   * @param value
+   *          The string to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeOctetString(byte type, String value) throws IOException;
+
+
+
+  /**
+   * Writes an octet string element using the Universal Octet String
+   * ASN.1 type tag and the provided byte array.
+   *
+   * @param value
+   *          The byte array containing the data to write.
+   * @param offset
+   *          The offset in the byte array.
+   * @param length
+   *          The number of bytes to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeOctetString(byte[] value, int offset, int length)
+      throws IOException;
+
+
+
+  /**
+   * Writes an octet string element using the Universal Octet String
+   * ASN.1 type tag and the provided byte sequence.
+   *
+   * @param value
+   *          The byte sequence containing the data to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeOctetString(ByteSequence value) throws IOException;
+
+
+
+  /**
+   * Writes an octet string element using the Universal Octet String
+   * ASN.1 type tag and the UTF-8 encoded bytes of the provided
+   * string.
+   *
+   * @param value
+   *          The string to write.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeOctetString(String value) throws IOException;
+
+
+
+  /**
+   * Writes a sequence element using the Universal Sequence ASN.1 type
+   * tag. All further writes will be part of this set until
+   * {@link #writeEndSequence()} is called.
+   *
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeStartSequence() throws IOException;
+
+
+
+  /**
+   * Writes a sequence element using the provided type tag. All
+   * further writes will be part of this set until
+   * {@link #writeEndSequence()} is called.
+   *
+   * @param type
+   *          The type tag to use.
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeStartSequence(byte type) throws IOException;
+
+
+
+  /**
+   * Writes a set element using the Universal Set type tag. All
+   * further writes will be part of this set until
+   * {@link #writeEndSet()} is called.
+   *
+   * @return a reference to this object.
+   * @throws IOException
+   *           If an error occurs while writing.
+   */
+  ASN1Writer writeStartSet() throws IOException;
 }
-

--
Gitblit v1.10.0