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/ldap/LDAPControl.java |  388 +++++--------------------------------------------------
 1 files changed, 38 insertions(+), 350 deletions(-)

diff --git a/opends/src/server/org/opends/server/protocols/ldap/LDAPControl.java b/opends/src/server/org/opends/server/protocols/ldap/LDAPControl.java
index e3aaace..b3fb484 100644
--- a/opends/src/server/org/opends/server/protocols/ldap/LDAPControl.java
+++ b/opends/src/server/org/opends/server/protocols/ldap/LDAPControl.java
@@ -25,55 +25,25 @@
  *      Copyright 2006-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.protocols.ldap;
-import org.opends.messages.Message;
 
 
+import java.io.IOException;
 
-import java.util.ArrayList;
-
-import org.opends.server.protocols.asn1.ASN1Boolean;
-import org.opends.server.protocols.asn1.ASN1Element;
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.protocols.asn1.ASN1Sequence;
+import org.opends.server.protocols.asn1.*;
 import org.opends.server.types.Control;
-import org.opends.server.types.DebugLogLevel;
-import org.opends.server.types.LDAPException;
+import org.opends.server.types.ByteString;
 
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import org.opends.server.loggers.debug.DebugTracer;
-import static org.opends.messages.ProtocolMessages.*;
-import static org.opends.server.protocols.asn1.ASN1Constants.*;
-import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import static org.opends.server.protocols.ldap.LDAPResultCode.*;
 import static org.opends.server.util.ServerConstants.*;
 
 
-
 /**
  * This class defines the data structures and methods to use when interacting
- * with a generic LDAP control or set of controls.
+ * with a generic LDAP control.
  */
-public class LDAPControl
+public class LDAPControl extends Control
 {
-  /**
-   * The tracer object for the debug logger.
-   */
-  private static final DebugTracer TRACER = getTracer();
-
-  // The control wrapped by this LDAP control.
-  private Control control;
-
-
-
-  /**
-   * Creates a new LDAP control with the information in the provided control.
-   *
-   * @param  control  The control to use to create this LDAP control.
-   */
-  public LDAPControl(Control control)
-  {
-    this.control = control;
-  }
+  // The control value.
+  private ByteString value;
 
 
 
@@ -85,7 +55,7 @@
    */
   public LDAPControl(String oid)
   {
-    control = new Control(oid, false);
+    super(oid, false);
   }
 
 
@@ -100,7 +70,7 @@
    */
   public LDAPControl(String oid, boolean isCritical)
   {
-    control = new Control(oid, isCritical);
+    super(oid, isCritical);
   }
 
 
@@ -113,326 +83,46 @@
    *                     critical.
    * @param  value       The value for this LDAP control.
    */
-  public LDAPControl(String oid, boolean isCritical, ASN1OctetString value)
+  public LDAPControl(String oid, boolean isCritical, ByteString value)
   {
-    control = new Control(oid, isCritical, value);
+    super(oid, isCritical);
+    this.value = value;
   }
 
 
-
-  /**
-   * Retrieves the control wrapped by this LDAP control.
-   *
-   * @return  The control wrapped by this LDAP control.
-   */
-  public Control getControl()
-  {
-    return control;
-  }
-
-
-
-  /**
-   * Encodes this control to an ASN.1 element.
-   *
-   * @return  The ASN.1 element containing the encoded control.
-   */
-  public ASN1Element encode()
-  {
-    ArrayList<ASN1Element> elements = new ArrayList<ASN1Element>(3);
-    elements.add(new ASN1OctetString(control.getOID()));
-
-    if (control.isCritical())
-    {
-      elements.add(new ASN1Boolean(control.isCritical()));
-    }
-
-    ASN1OctetString value = control.getValue();
-    if (value != null)
-    {
-      elements.add(value);
-    }
-
-    return new ASN1Sequence(elements);
-  }
-
-
-
-  /**
-   * Encodes the provided set of controls into an ASN.1 sequence.
-   *
-   * @param  controls  The set of controls to encode.
-   *
-   * @return  The ASN.1 element containing the encoded set of controls.
-   */
-  public static ASN1Element encodeControls(ArrayList<LDAPControl> controls)
-  {
-    ArrayList<ASN1Element> elements =
-         new ArrayList<ASN1Element>(controls.size());
-    for (LDAPControl c : controls)
-    {
-      elements.add(c.encode());
-    }
-
-    return new ASN1Sequence(TYPE_CONTROL_SEQUENCE, elements);
-  }
-
-
-
-  /**
-   * Decodes the provided ASN.1 element as an LDAP control.
-   *
-   * @param  element  The ASN.1 element to decode.
-   *
-   * @return  The decoded LDAP control.
-   *
-   * @throws  LDAPException  If a problem occurs while attempting to decode the
-   *                         provided ASN.1 element as an LDAP control.
-   */
-  public static LDAPControl decode(ASN1Element element)
-         throws LDAPException
-  {
-    if (element == null)
-    {
-      Message message = ERR_LDAP_CONTROL_DECODE_NULL.get();
-      throw new LDAPException(PROTOCOL_ERROR, message);
-    }
-
-
-    ArrayList<ASN1Element> elements;
-    try
-    {
-      elements = element.decodeAsSequence().elements();
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      Message message = ERR_LDAP_CONTROL_DECODE_SEQUENCE.get(String.valueOf(e));
-      throw new LDAPException(PROTOCOL_ERROR, message, e);
-    }
-
-
-    int numElements = elements.size();
-    if ((numElements < 1) || (numElements > 3))
-    {
-      Message message =
-          ERR_LDAP_CONTROL_DECODE_INVALID_ELEMENT_COUNT.get(numElements);
-      throw new LDAPException(PROTOCOL_ERROR, message);
-    }
-
-
-    String oid;
-    try
-    {
-      oid = elements.get(0).decodeAsOctetString().stringValue();
-    }
-    catch (Exception e)
-    {
-      if (debugEnabled())
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      }
-
-      Message message = ERR_LDAP_CONTROL_DECODE_OID.get(String.valueOf(e));
-      throw new LDAPException(PROTOCOL_ERROR, message, e);
-    }
-
-
-    if (numElements == 1)
-    {
-      return new LDAPControl(oid);
-    }
-    else if (numElements == 2)
-    {
-      boolean         isCritical;
-      ASN1OctetString value;
-
-      ASN1Element e = elements.get(1);
-      switch (e.getType())
-      {
-        case UNIVERSAL_BOOLEAN_TYPE:
-          value = null;
-
-          try
-          {
-            isCritical = e.decodeAsBoolean().booleanValue();
-          }
-          catch (Exception e2)
-          {
-            if (debugEnabled())
-            {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-            }
-
-            Message message =
-                ERR_LDAP_CONTROL_DECODE_CRITICALITY.get(String.valueOf(e));
-            throw new LDAPException(PROTOCOL_ERROR, message, e2);
-          }
-          break;
-        case UNIVERSAL_OCTET_STRING_TYPE:
-          isCritical = false;
-
-          try
-          {
-            value = e.decodeAsOctetString();
-          }
-          catch (Exception e2)
-          {
-            if (debugEnabled())
-            {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e2);
-            }
-
-            Message message =
-                ERR_LDAP_CONTROL_DECODE_VALUE.get(String.valueOf(e));
-            throw new LDAPException(PROTOCOL_ERROR, message, e2);
-          }
-          break;
-        default:
-          Message message =
-              ERR_LDAP_CONTROL_DECODE_INVALID_TYPE.get(e.getType());
-          throw new LDAPException(PROTOCOL_ERROR, message);
-      }
-
-      return new LDAPControl(oid, isCritical, value);
-    }
-    else
-    {
-      boolean isCritical;
-      try
-      {
-        isCritical = elements.get(1).decodeAsBoolean().booleanValue();
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        Message message =
-            ERR_LDAP_CONTROL_DECODE_CRITICALITY.get(String.valueOf(e));
-        throw new LDAPException(PROTOCOL_ERROR, message, e);
-      }
-
-      ASN1OctetString value;
-      try
-      {
-        value = elements.get(2).decodeAsOctetString();
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        Message message = ERR_LDAP_CONTROL_DECODE_VALUE.get(String.valueOf(e));
-        throw new LDAPException(PROTOCOL_ERROR, message, e);
-      }
-
-      return new LDAPControl(oid, isCritical, value);
-    }
-  }
-
-
-
-  /**
-   * Decodes the provided ASN.1 element as a set of controls.
-   *
-   * @param  element  The ASN.1 element containing the encoded set of controls.
-   *
-   * @return  The decoded set of controls.
-   *
-   * @throws  LDAPException  If a problem occurs while attempting to decode the
-   *                         controls.
-   */
-  public static ArrayList<LDAPControl> decodeControls(ASN1Element element)
-         throws LDAPException
-  {
-    if (element == null)
-    {
-      Message message = ERR_LDAP_CONTROL_DECODE_CONTROLS_NULL.get();
-      throw new LDAPException(PROTOCOL_ERROR, message);
-    }
-
-
-    ArrayList<ASN1Element> elements;
-    try
-    {
-      elements = element.decodeAsSequence().elements();
-    }
-    catch (Exception e)
-    {
-      Message message =
-          ERR_LDAP_CONTROL_DECODE_CONTROLS_SEQUENCE.get(String.valueOf(e));
-      throw new LDAPException(PROTOCOL_ERROR, message, e);
-    }
-
-
-    ArrayList<LDAPControl> controls =
-         new ArrayList<LDAPControl>(elements.size());
-    for (ASN1Element e : elements)
-    {
-      controls.add(decode(e));
-    }
-
-    return controls;
-  }
-
-
-
-  /**
-   * Retrieves the OID for this control.
-   *
-   * @return  The OID for this control.
-   */
-  public String getOID()
-  {
-    return control.getOID();
-  }
-
-
-
-  /**
-   * Indicates whether this control should be considered critical.
-   *
-   * @return  <CODE>true</CODE> if this control should be considered critical,
-   *          or <CODE>false</CODE> if not.
-   */
-  public boolean isCritical()
-  {
-    return control.isCritical();
-  }
-
-
-
   /**
    * Retrieves the value for this control.
    *
-   * @return  The value for this control, or <CODE>null</CODE> if there is none.
+   * @return  The value for this control, or <CODE>null</CODE> if
+   *          there is no value.
    */
-  public ASN1OctetString getValue()
+  public final ByteString getValue()
   {
-    return control.getValue();
+    return value;
   }
 
 
 
   /**
-   * Retrieves a string representation of this LDAP control.
+   * Indicates whether this control has a value.
    *
-   * @return  A string representation of this LDAP control.
+   * @return  <CODE>true</CODE> if this control has a value, or
+   *          <CODE>false</CODE> if it does not.
    */
-  public String toString()
+  public final boolean hasValue()
   {
-    StringBuilder buffer = new StringBuilder();
-    toString(buffer);
-    return buffer.toString();
+    return (value != null);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void writeValue(ASN1Writer stream) throws IOException
+  {
+    if (value != null)
+    {
+      stream.writeOctetString(value);
+    }
   }
 
 
@@ -446,15 +136,14 @@
   public void toString(StringBuilder buffer)
   {
     buffer.append("LDAPControl(oid=");
-    buffer.append(control.getOID());
+    buffer.append(getOID());
     buffer.append(", criticality=");
-    buffer.append(control.isCritical());
+    buffer.append(isCritical());
 
-    ASN1OctetString value = control.getValue();
     if (value != null)
     {
       buffer.append(", value=");
-      buffer.append(String.valueOf(value));
+      value.toHexPlusAscii(buffer, 4);
     }
 
     buffer.append(")");
@@ -483,20 +172,19 @@
 
     buffer.append(indentBuf);
     buffer.append("  OID:  ");
-    buffer.append(control.getOID());
+    buffer.append(getOID());
     buffer.append(EOL);
 
     buffer.append(indentBuf);
     buffer.append("  Criticality:  ");
-    buffer.append(control.isCritical());
+    buffer.append(isCritical());
     buffer.append(EOL);
 
-    ASN1OctetString value = control.getValue();
     if (value != null)
     {
       buffer.append(indentBuf);
       buffer.append("  Value:");
-      value.toString(buffer, indent+4);
+      value.toHexPlusAscii(buffer, indent+4);
     }
   }
 }

--
Gitblit v1.10.0