From 263d085885df024dca9250cc03c807912b0a7662 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 24 Apr 2012 22:33:21 +0000
Subject: [PATCH] Reformat to comply with new Checkstyle rules.

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/asn1/ASN1OutputStreamWriter.java |  863 ++++++++++++++++++++++++---------------------------------
 1 files changed, 366 insertions(+), 497 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/asn1/ASN1OutputStreamWriter.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/asn1/ASN1OutputStreamWriter.java
index 369c293..2245810 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/asn1/ASN1OutputStreamWriter.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/asn1/ASN1OutputStreamWriter.java
@@ -6,17 +6,16 @@
  * (the "License").  You may not use this file except in compliance
  * with the License.
  *
- * You can obtain a copy of the license at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt
+ * 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
- * trunk/opendj3/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:
+ * 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
@@ -27,8 +26,6 @@
  */
 package org.forgerock.opendj.asn1;
 
-
-
 import static org.forgerock.opendj.asn1.ASN1Constants.BOOLEAN_VALUE_FALSE;
 import static org.forgerock.opendj.asn1.ASN1Constants.BOOLEAN_VALUE_TRUE;
 import static org.forgerock.opendj.ldap.CoreMessages.ERR_ASN1_SEQUENCE_WRITE_NOT_STARTED;
@@ -45,518 +42,390 @@
 import com.forgerock.opendj.util.ByteSequenceOutputStream;
 import com.forgerock.opendj.util.StaticUtils;
 
-
-
 /**
  * An ASN1Writer implementation that outputs to an outputstream.
  */
-final class ASN1OutputStreamWriter extends AbstractASN1Writer implements
-    ASN1Writer
-{
-  private final OutputStream rootStream;
-  private OutputStream out;
-  private final ArrayList<ByteSequenceOutputStream> streamStack;
-  private int stackDepth;
+final class ASN1OutputStreamWriter extends AbstractASN1Writer implements ASN1Writer {
+    private final OutputStream rootStream;
+    private OutputStream out;
+    private final ArrayList<ByteSequenceOutputStream> streamStack;
+    private int stackDepth;
 
-
-
-  /**
-   * Creates a new ASN.1 output stream reader.
-   *
-   * @param stream
-   *          The underlying output stream.
-   */
-  ASN1OutputStreamWriter(final OutputStream stream)
-  {
-    this.out = stream;
-    this.rootStream = stream;
-    this.streamStack = new ArrayList<ByteSequenceOutputStream>();
-    this.stackDepth = -1;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public void close() throws IOException
-  {
-    while (stackDepth >= 0)
-    {
-      writeEndSequence();
-    }
-    rootStream.flush();
-
-    streamStack.clear();
-    rootStream.close();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public void flush() throws IOException
-  {
-    rootStream.flush();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeBoolean(final byte type, final boolean booleanValue)
-      throws IOException
-  {
-    out.write(type);
-    writeLength(1);
-    out.write(booleanValue ? BOOLEAN_VALUE_TRUE : BOOLEAN_VALUE_FALSE);
-
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String.format(
-          "WRITE ASN.1 BOOLEAN(type=0x%x, length=%d, value=%s)", type, 1,
-          String.valueOf(booleanValue)));
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeEndSequence() throws IOException
-  {
-    if (stackDepth < 0)
-    {
-      final LocalizableMessage message = ERR_ASN1_SEQUENCE_WRITE_NOT_STARTED
-          .get();
-      throw new IllegalStateException(message.toString());
+    /**
+     * Creates a new ASN.1 output stream reader.
+     *
+     * @param stream
+     *            The underlying output stream.
+     */
+    ASN1OutputStreamWriter(final OutputStream stream) {
+        this.out = stream;
+        this.rootStream = stream;
+        this.streamStack = new ArrayList<ByteSequenceOutputStream>();
+        this.stackDepth = -1;
     }
 
-    final ByteSequenceOutputStream childStream = streamStack.get(stackDepth);
+    /**
+     * {@inheritDoc}
+     */
+    public void close() throws IOException {
+        while (stackDepth >= 0) {
+            writeEndSequence();
+        }
+        rootStream.flush();
 
-    // Decrement the stack depth and get the parent stream
-    --stackDepth;
-
-    final OutputStream parentStream = stackDepth < 0 ? rootStream : streamStack
-        .get(stackDepth);
-
-    // Switch to parent stream and reset the sub-stream
-    out = parentStream;
-
-    // Write the length and contents of the sub-stream
-    writeLength(childStream.length());
-    childStream.writeTo(parentStream);
-
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String.format(
-          "WRITE ASN.1 END SEQUENCE(length=%d)", childStream.length()));
+        streamStack.clear();
+        rootStream.close();
     }
 
-    childStream.reset();
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeEndSet() throws IOException
-  {
-    return writeEndSequence();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeEnumerated(final byte type, final int intValue)
-      throws IOException
-  {
-    return writeInteger(type, intValue);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeInteger(final byte type, final int intValue)
-      throws IOException
-  {
-    out.write(type);
-    if (((intValue < 0) && ((intValue & 0xFFFFFF80) == 0xFFFFFF80))
-        || ((intValue & 0x0000007F) == intValue))
-    {
-      writeLength(1);
-      out.write((byte) (intValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 1,
-            intValue));
-      }
-    }
-    else if (((intValue < 0) && ((intValue & 0xFFFF8000) == 0xFFFF8000))
-        || ((intValue & 0x00007FFF) == intValue))
-    {
-      writeLength(2);
-      out.write((byte) ((intValue >> 8) & 0xFF));
-      out.write((byte) (intValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 2,
-            intValue));
-      }
-    }
-    else if (((intValue < 0) && ((intValue & 0xFF800000) == 0xFF800000))
-        || ((intValue & 0x007FFFFF) == intValue))
-    {
-      writeLength(3);
-      out.write((byte) ((intValue >> 16) & 0xFF));
-      out.write((byte) ((intValue >> 8) & 0xFF));
-      out.write((byte) (intValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 3,
-            intValue));
-      }
-    }
-    else
-    {
-      writeLength(4);
-      out.write((byte) ((intValue >> 24) & 0xFF));
-      out.write((byte) ((intValue >> 16) & 0xFF));
-      out.write((byte) ((intValue >> 8) & 0xFF));
-      out.write((byte) (intValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 4,
-            intValue));
-      }
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeInteger(final byte type, final long longValue)
-      throws IOException
-  {
-    out.write(type);
-    if (((longValue < 0) && ((longValue & 0xFFFFFFFFFFFFFF80L) == 0xFFFFFFFFFFFFFF80L))
-        || ((longValue & 0x000000000000007FL) == longValue))
-    {
-      writeLength(1);
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 1,
-            longValue));
-      }
-    }
-    else if (((longValue < 0) && ((longValue & 0xFFFFFFFFFFFF8000L) == 0xFFFFFFFFFFFF8000L))
-        || ((longValue & 0x0000000000007FFFL) == longValue))
-    {
-      writeLength(2);
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 2,
-            longValue));
-      }
-    }
-    else if (((longValue < 0) && ((longValue & 0xFFFFFFFFFF800000L) == 0xFFFFFFFFFF800000L))
-        || ((longValue & 0x00000000007FFFFFL) == longValue))
-    {
-      writeLength(3);
-      out.write((byte) ((longValue >> 16) & 0xFF));
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 3,
-            longValue));
-      }
-    }
-    else if (((longValue < 0) && ((longValue & 0xFFFFFFFF80000000L) == 0xFFFFFFFF80000000L))
-        || ((longValue & 0x000000007FFFFFFFL) == longValue))
-    {
-      writeLength(4);
-      out.write((byte) ((longValue >> 24) & 0xFF));
-      out.write((byte) ((longValue >> 16) & 0xFF));
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 4,
-            longValue));
-      }
-    }
-    else if (((longValue < 0) && ((longValue & 0xFFFFFF8000000000L) == 0xFFFFFF8000000000L))
-        || ((longValue & 0x0000007FFFFFFFFFL) == longValue))
-    {
-      writeLength(5);
-      out.write((byte) ((longValue >> 32) & 0xFF));
-      out.write((byte) ((longValue >> 24) & 0xFF));
-      out.write((byte) ((longValue >> 16) & 0xFF));
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 5,
-            longValue));
-      }
-    }
-    else if (((longValue < 0) && ((longValue & 0xFFFF800000000000L) == 0xFFFF800000000000L))
-        || ((longValue & 0x00007FFFFFFFFFFFL) == longValue))
-    {
-      writeLength(6);
-      out.write((byte) ((longValue >> 40) & 0xFF));
-      out.write((byte) ((longValue >> 32) & 0xFF));
-      out.write((byte) ((longValue >> 24) & 0xFF));
-      out.write((byte) ((longValue >> 16) & 0xFF));
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 6,
-            longValue));
-      }
-    }
-    else if (((longValue < 0) && ((longValue & 0xFF80000000000000L) == 0xFF80000000000000L))
-        || ((longValue & 0x007FFFFFFFFFFFFFL) == longValue))
-    {
-      writeLength(7);
-      out.write((byte) ((longValue >> 48) & 0xFF));
-      out.write((byte) ((longValue >> 40) & 0xFF));
-      out.write((byte) ((longValue >> 32) & 0xFF));
-      out.write((byte) ((longValue >> 24) & 0xFF));
-      out.write((byte) ((longValue >> 16) & 0xFF));
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 7,
-            longValue));
-      }
-    }
-    else
-    {
-      writeLength(8);
-      out.write((byte) ((longValue >> 56) & 0xFF));
-      out.write((byte) ((longValue >> 48) & 0xFF));
-      out.write((byte) ((longValue >> 40) & 0xFF));
-      out.write((byte) ((longValue >> 32) & 0xFF));
-      out.write((byte) ((longValue >> 24) & 0xFF));
-      out.write((byte) ((longValue >> 16) & 0xFF));
-      out.write((byte) ((longValue >> 8) & 0xFF));
-      out.write((byte) (longValue & 0xFF));
-      if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-      {
-        StaticUtils.DEBUG_LOG.finest(String.format(
-            "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 8,
-            longValue));
-      }
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeNull(final byte type) throws IOException
-  {
-    out.write(type);
-    writeLength(0);
-
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String.format(
-          "WRITE ASN.1 NULL(type=0x%x, length=%d)", type, 0));
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeOctetString(final byte type, final byte[] value,
-      final int offset, final int length) throws IOException
-  {
-    out.write(type);
-    writeLength(length);
-    out.write(value, offset, length);
-
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String.format(
-          "WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d)", type, length));
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeOctetString(final byte type, final ByteSequence value)
-      throws IOException
-  {
-    out.write(type);
-    writeLength(value.length());
-    value.copyTo(out);
-
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String
-          .format("WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d)", type, value
-              .length()));
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeOctetString(final byte type, final String value)
-      throws IOException
-  {
-    out.write(type);
-
-    if (value == null)
-    {
-      writeLength(0);
-      return this;
+    /**
+     * {@inheritDoc}
+     */
+    public void flush() throws IOException {
+        rootStream.flush();
     }
 
-    final byte[] bytes = StaticUtils.getBytes(value);
-    writeLength(bytes.length);
-    out.write(bytes);
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeBoolean(final byte type, final boolean booleanValue) throws IOException {
+        out.write(type);
+        writeLength(1);
+        out.write(booleanValue ? BOOLEAN_VALUE_TRUE : BOOLEAN_VALUE_FALSE);
 
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String.format(
-          "WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d, " + "value=%s)", type,
-          bytes.length, value));
-    }
-    return this;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeStartSequence(final byte type) throws IOException
-  {
-    // Write the type in current stream switch to next sub-stream
-    out.write(type);
-
-    // Increment the stack depth and get the sub-stream from the stack
-    ++stackDepth;
-
-    // Make sure we have a cached sub-stream at this depth
-    if (stackDepth >= streamStack.size())
-    {
-      final ByteSequenceOutputStream subStream = new ByteSequenceOutputStream(
-          new ByteStringBuilder());
-      streamStack.add(subStream);
-      out = subStream;
-    }
-    else
-    {
-      out = streamStack.get(stackDepth);
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format(
+                    "WRITE ASN.1 BOOLEAN(type=0x%x, length=%d, value=%s)", type, 1, String
+                            .valueOf(booleanValue)));
+        }
+        return this;
     }
 
-    if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST))
-    {
-      StaticUtils.DEBUG_LOG.finest(String.format(
-          "WRITE ASN.1 START SEQUENCE(type=0x%x)", type));
-    }
-    return this;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeEndSequence() throws IOException {
+        if (stackDepth < 0) {
+            final LocalizableMessage message = ERR_ASN1_SEQUENCE_WRITE_NOT_STARTED.get();
+            throw new IllegalStateException(message.toString());
+        }
 
+        final ByteSequenceOutputStream childStream = streamStack.get(stackDepth);
 
+        // Decrement the stack depth and get the parent stream
+        --stackDepth;
 
-  /**
-   * {@inheritDoc}
-   */
-  public ASN1Writer writeStartSet(final byte type) throws IOException
-  {
-    // From an implementation point of view, a set is equivalent to a
-    // sequence.
-    return writeStartSequence(type);
-  }
+        final OutputStream parentStream = stackDepth < 0 ? rootStream : streamStack.get(stackDepth);
 
+        // Switch to parent stream and reset the sub-stream
+        out = parentStream;
 
+        // Write the length and contents of the sub-stream
+        writeLength(childStream.length());
+        childStream.writeTo(parentStream);
 
-  /**
-   * Writes the provided value for use as the length of an ASN.1 element.
-   *
-   * @param length
-   *          The length to encode for use in an ASN.1 element.
-   * @throws IOException
-   *           if an error occurs while writing.
-   */
-  private void writeLength(final int length) throws IOException
-  {
-    if (length < 128)
-    {
-      out.write((byte) length);
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format("WRITE ASN.1 END SEQUENCE(length=%d)",
+                    childStream.length()));
+        }
+
+        childStream.reset();
+        return this;
     }
-    else if ((length & 0x000000FF) == length)
-    {
-      out.write((byte) 0x81);
-      out.write((byte) (length & 0xFF));
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeEndSet() throws IOException {
+        return writeEndSequence();
     }
-    else if ((length & 0x0000FFFF) == length)
-    {
-      out.write((byte) 0x82);
-      out.write((byte) ((length >> 8) & 0xFF));
-      out.write((byte) (length & 0xFF));
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeEnumerated(final byte type, final int intValue) throws IOException {
+        return writeInteger(type, intValue);
     }
-    else if ((length & 0x00FFFFFF) == length)
-    {
-      out.write((byte) 0x83);
-      out.write((byte) ((length >> 16) & 0xFF));
-      out.write((byte) ((length >> 8) & 0xFF));
-      out.write((byte) (length & 0xFF));
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeInteger(final byte type, final int intValue) throws IOException {
+        out.write(type);
+        if (((intValue < 0) && ((intValue & 0xFFFFFF80) == 0xFFFFFF80))
+                || ((intValue & 0x0000007F) == intValue)) {
+            writeLength(1);
+            out.write((byte) (intValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 1, intValue));
+            }
+        } else if (((intValue < 0) && ((intValue & 0xFFFF8000) == 0xFFFF8000))
+                || ((intValue & 0x00007FFF) == intValue)) {
+            writeLength(2);
+            out.write((byte) ((intValue >> 8) & 0xFF));
+            out.write((byte) (intValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 2, intValue));
+            }
+        } else if (((intValue < 0) && ((intValue & 0xFF800000) == 0xFF800000))
+                || ((intValue & 0x007FFFFF) == intValue)) {
+            writeLength(3);
+            out.write((byte) ((intValue >> 16) & 0xFF));
+            out.write((byte) ((intValue >> 8) & 0xFF));
+            out.write((byte) (intValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 3, intValue));
+            }
+        } else {
+            writeLength(4);
+            out.write((byte) ((intValue >> 24) & 0xFF));
+            out.write((byte) ((intValue >> 16) & 0xFF));
+            out.write((byte) ((intValue >> 8) & 0xFF));
+            out.write((byte) (intValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 4, intValue));
+            }
+        }
+        return this;
     }
-    else
-    {
-      out.write((byte) 0x84);
-      out.write((byte) ((length >> 24) & 0xFF));
-      out.write((byte) ((length >> 16) & 0xFF));
-      out.write((byte) ((length >> 8) & 0xFF));
-      out.write((byte) (length & 0xFF));
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeInteger(final byte type, final long longValue) throws IOException {
+        out.write(type);
+        if (((longValue < 0) && ((longValue & 0xFFFFFFFFFFFFFF80L) == 0xFFFFFFFFFFFFFF80L))
+                || ((longValue & 0x000000000000007FL) == longValue)) {
+            writeLength(1);
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 1, longValue));
+            }
+        } else if (((longValue < 0) && ((longValue & 0xFFFFFFFFFFFF8000L) == 0xFFFFFFFFFFFF8000L))
+                || ((longValue & 0x0000000000007FFFL) == longValue)) {
+            writeLength(2);
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 2, longValue));
+            }
+        } else if (((longValue < 0) && ((longValue & 0xFFFFFFFFFF800000L) == 0xFFFFFFFFFF800000L))
+                || ((longValue & 0x00000000007FFFFFL) == longValue)) {
+            writeLength(3);
+            out.write((byte) ((longValue >> 16) & 0xFF));
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 3, longValue));
+            }
+        } else if (((longValue < 0) && ((longValue & 0xFFFFFFFF80000000L) == 0xFFFFFFFF80000000L))
+                || ((longValue & 0x000000007FFFFFFFL) == longValue)) {
+            writeLength(4);
+            out.write((byte) ((longValue >> 24) & 0xFF));
+            out.write((byte) ((longValue >> 16) & 0xFF));
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 4, longValue));
+            }
+        } else if (((longValue < 0) && ((longValue & 0xFFFFFF8000000000L) == 0xFFFFFF8000000000L))
+                || ((longValue & 0x0000007FFFFFFFFFL) == longValue)) {
+            writeLength(5);
+            out.write((byte) ((longValue >> 32) & 0xFF));
+            out.write((byte) ((longValue >> 24) & 0xFF));
+            out.write((byte) ((longValue >> 16) & 0xFF));
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 5, longValue));
+            }
+        } else if (((longValue < 0) && ((longValue & 0xFFFF800000000000L) == 0xFFFF800000000000L))
+                || ((longValue & 0x00007FFFFFFFFFFFL) == longValue)) {
+            writeLength(6);
+            out.write((byte) ((longValue >> 40) & 0xFF));
+            out.write((byte) ((longValue >> 32) & 0xFF));
+            out.write((byte) ((longValue >> 24) & 0xFF));
+            out.write((byte) ((longValue >> 16) & 0xFF));
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 6, longValue));
+            }
+        } else if (((longValue < 0) && ((longValue & 0xFF80000000000000L) == 0xFF80000000000000L))
+                || ((longValue & 0x007FFFFFFFFFFFFFL) == longValue)) {
+            writeLength(7);
+            out.write((byte) ((longValue >> 48) & 0xFF));
+            out.write((byte) ((longValue >> 40) & 0xFF));
+            out.write((byte) ((longValue >> 32) & 0xFF));
+            out.write((byte) ((longValue >> 24) & 0xFF));
+            out.write((byte) ((longValue >> 16) & 0xFF));
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 7, longValue));
+            }
+        } else {
+            writeLength(8);
+            out.write((byte) ((longValue >> 56) & 0xFF));
+            out.write((byte) ((longValue >> 48) & 0xFF));
+            out.write((byte) ((longValue >> 40) & 0xFF));
+            out.write((byte) ((longValue >> 32) & 0xFF));
+            out.write((byte) ((longValue >> 24) & 0xFF));
+            out.write((byte) ((longValue >> 16) & 0xFF));
+            out.write((byte) ((longValue >> 8) & 0xFF));
+            out.write((byte) (longValue & 0xFF));
+            if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+                StaticUtils.DEBUG_LOG.finest(String.format(
+                        "WRITE ASN.1 INTEGER(type=0x%x, length=%d, value=%d)", type, 8, longValue));
+            }
+        }
+        return this;
     }
-  }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeNull(final byte type) throws IOException {
+        out.write(type);
+        writeLength(0);
+
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format("WRITE ASN.1 NULL(type=0x%x, length=%d)",
+                    type, 0));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeOctetString(final byte type, final byte[] value, final int offset,
+            final int length) throws IOException {
+        out.write(type);
+        writeLength(length);
+        out.write(value, offset, length);
+
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format(
+                    "WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d)", type, length));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeOctetString(final byte type, final ByteSequence value)
+            throws IOException {
+        out.write(type);
+        writeLength(value.length());
+        value.copyTo(out);
+
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format(
+                    "WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d)", type, value.length()));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeOctetString(final byte type, final String value) throws IOException {
+        out.write(type);
+
+        if (value == null) {
+            writeLength(0);
+            return this;
+        }
+
+        final byte[] bytes = StaticUtils.getBytes(value);
+        writeLength(bytes.length);
+        out.write(bytes);
+
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format(
+                    "WRITE ASN.1 OCTETSTRING(type=0x%x, length=%d, " + "value=%s)", type,
+                    bytes.length, value));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeStartSequence(final byte type) throws IOException {
+        // Write the type in current stream switch to next sub-stream
+        out.write(type);
+
+        // Increment the stack depth and get the sub-stream from the stack
+        ++stackDepth;
+
+        // Make sure we have a cached sub-stream at this depth
+        if (stackDepth >= streamStack.size()) {
+            final ByteSequenceOutputStream subStream =
+                    new ByteSequenceOutputStream(new ByteStringBuilder());
+            streamStack.add(subStream);
+            out = subStream;
+        } else {
+            out = streamStack.get(stackDepth);
+        }
+
+        if (StaticUtils.DEBUG_LOG.isLoggable(Level.FINEST)) {
+            StaticUtils.DEBUG_LOG.finest(String.format("WRITE ASN.1 START SEQUENCE(type=0x%x)",
+                    type));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ASN1Writer writeStartSet(final byte type) throws IOException {
+        // From an implementation point of view, a set is equivalent to a
+        // sequence.
+        return writeStartSequence(type);
+    }
+
+    /**
+     * Writes the provided value for use as the length of an ASN.1 element.
+     *
+     * @param length
+     *            The length to encode for use in an ASN.1 element.
+     * @throws IOException
+     *             if an error occurs while writing.
+     */
+    private void writeLength(final int length) throws IOException {
+        if (length < 128) {
+            out.write((byte) length);
+        } else if ((length & 0x000000FF) == length) {
+            out.write((byte) 0x81);
+            out.write((byte) (length & 0xFF));
+        } else if ((length & 0x0000FFFF) == length) {
+            out.write((byte) 0x82);
+            out.write((byte) ((length >> 8) & 0xFF));
+            out.write((byte) (length & 0xFF));
+        } else if ((length & 0x00FFFFFF) == length) {
+            out.write((byte) 0x83);
+            out.write((byte) ((length >> 16) & 0xFF));
+            out.write((byte) ((length >> 8) & 0xFF));
+            out.write((byte) (length & 0xFF));
+        } else {
+            out.write((byte) 0x84);
+            out.write((byte) ((length >> 24) & 0xFF));
+            out.write((byte) ((length >> 16) & 0xFF));
+            out.write((byte) ((length >> 8) & 0xFF));
+            out.write((byte) (length & 0xFF));
+        }
+    }
 }

--
Gitblit v1.10.0