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/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java |  212 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 134 insertions(+), 78 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
index 3e5da05..016d9db 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/ShortCircuitPlugin.java
@@ -28,26 +28,31 @@
 
 
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Set;
 import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
+import java.io.IOException;
 
 import org.opends.server.admin.std.server.PluginCfg;
 import org.opends.server.api.plugin.*;
 import org.opends.server.config.ConfigException;
-import org.opends.server.protocols.asn1.ASN1Element;
-import org.opends.server.protocols.asn1.ASN1Enumerated;
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.protocols.asn1.ASN1Sequence;
-import org.opends.server.protocols.ldap.LDAPControl;
+import org.opends.server.protocols.asn1.ASN1;
+import org.opends.server.protocols.asn1.ASN1Writer;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.types.ByteString;
 import org.opends.server.types.Control;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.OperationType;
 import org.opends.server.types.operation.*;
+import org.opends.server.controls.ControlDecoder;
 import org.opends.messages.Message;
 
+import static org.opends.server.protocols.asn1.ASN1Constants.
+    UNIVERSAL_OCTET_STRING_TYPE;
+
 
 /**
  * This class defines a very simple plugin that causes request processing to end
@@ -66,6 +71,114 @@
   public static final String OID_SHORT_CIRCUIT_REQUEST =
        "1.3.6.1.4.1.26027.1.999.3";
 
+  /**
+   * The control used by this plugin.
+   */
+  public static class ShortCircuitRequestControl extends Control
+  {
+    /**
+     * ControlDecoder implentation to decode this control from a ByteString.
+     */
+    private final static class Decoder
+        implements ControlDecoder<ShortCircuitRequestControl>
+    {
+      /**
+       * {@inheritDoc}
+       */
+      public ShortCircuitRequestControl decode(boolean isCritical,
+                                               ByteString value)
+          throws DirectoryException
+      {
+        ASN1Reader reader = ASN1.getReader(value);
+
+        try
+        {
+          reader.readStartSequence();
+          int resultCode = (int)reader.readInteger();
+          String section = reader.readOctetStringAsString();
+          reader.readEndSequence();
+
+          return new ShortCircuitRequestControl(isCritical,
+              resultCode, section);
+        }
+        catch (Exception e)
+        {
+          // TODO: Need a better message
+          throw new DirectoryException(ResultCode.PROTOCOL_ERROR, null, e);
+        }
+      }
+
+      public String getOID()
+      {
+        return OID_SHORT_CIRCUIT_REQUEST;
+      }
+
+    }
+
+    /**
+     * The Control Decoder that can be used to decode this control.
+     */
+    public static final ControlDecoder<ShortCircuitRequestControl> DECODER =
+      new Decoder();
+
+
+    private int resultCode;
+    private String section;
+
+    /**
+     * Constructs a new change number control.
+     *
+     * @param  isCritical   Indicates whether support for this control should be
+     *                      considered a critical part of the server processing.
+   * @param  resultCode  The result code to return to the client.
+   * @param  section     The section to use to determine when to short circuit.
+     */
+    public ShortCircuitRequestControl(boolean isCritical, int resultCode,
+                                      String section)
+    {
+      super(OID_SHORT_CIRCUIT_REQUEST, isCritical);
+      this.resultCode = resultCode;
+      this.section = section;
+    }
+
+    /**
+     * Writes this control's value to an ASN.1 writer. The value (if any)
+     * must be written as an ASN1OctetString.
+     *
+     * @param writer The ASN.1 writer to use.
+     * @throws IOException If a problem occurs while writing to the stream.
+     */
+    @Override
+    protected void writeValue(ASN1Writer writer) throws IOException {
+      writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+      writer.writeStartSequence();
+      writer.writeInteger(resultCode);
+      writer.writeOctetString(section);
+      writer.writeEndSequence();
+      writer.writeEndSequence();
+    }
+
+    /**
+     * Retrieves the resultCode.
+     *
+     * @return The resultCode.
+     */
+    public int getResultCode()
+    {
+      return resultCode;
+    }
+
+    /**
+     * Retrieves the section.
+     *
+     * @return The section.
+     */
+    public String getSection()
+    {
+      return section;
+    }
+  }
+
 
 
   /**
@@ -530,36 +643,23 @@
    */
   private int shortCircuitInternal(PluginOperation operation, String section)
   {
-    List<Control> requestControls = operation.getRequestControls();
-    if (requestControls != null)
+    try
     {
-      for (Control c : requestControls)
+      ShortCircuitRequestControl control =
+          operation.getRequestControl(ShortCircuitRequestControl.DECODER);
+      
+      if (control != null && section.equalsIgnoreCase(control.getSection()))
       {
-        if (c.getOID().equals(OID_SHORT_CIRCUIT_REQUEST))
-        {
-          try
-          {
-            ASN1Sequence sequence =
-                 ASN1Sequence.decodeAsSequence(c.getValue().value());
-            ArrayList<ASN1Element> elements = sequence.elements();
-            int resultCode = elements.get(0).decodeAsEnumerated().intValue();
-            String controlSection =
-                        elements.get(1).decodeAsOctetString().stringValue();
-            if (section.equalsIgnoreCase(controlSection))
-            {
-              return resultCode;
-            }
-          }
-          catch (Exception e)
-          {
-            System.err.println("***** ERROR:  Could not decode short circuit " +
-                               "control value:  " + e);
-            e.printStackTrace();
-            return -1;
-          }
-        }
+        return control.resultCode;
       }
     }
+    catch (Exception e)
+    {
+      System.err.println("***** ERROR:  Could not decode short circuit " +
+          "control value:  " + e);
+      e.printStackTrace();
+      return -1;
+    }
 
     // Check for registered short circuits.
     Integer resultCode = shortCircuits.get(
@@ -588,14 +688,7 @@
   public static Control createShortCircuitControl(int resultCode,
                                                   String section)
   {
-    ArrayList<ASN1Element> elements = new ArrayList<ASN1Element>(2);
-    elements.add(new ASN1Enumerated(resultCode));
-    elements.add(new ASN1OctetString(section));
-
-    ASN1OctetString controlValue =
-         new ASN1OctetString(new ASN1Sequence(elements).encode());
-
-    return new Control(OID_SHORT_CIRCUIT_REQUEST, false, controlValue);
+    return new ShortCircuitRequestControl(false, resultCode, section);
   }
 
 
@@ -617,43 +710,6 @@
     return controlList;
   }
 
-
-
-  /**
-   * Creates a short circuit LDAP request control with the specified result code
-   * and section.
-   *
-   * @param  resultCode  The result code to return to the client.
-   * @param  section     The section to use to determine when to short circuit.
-   *
-   * @return  The appropriate short circuit LDAP request control.
-   */
-  public static LDAPControl createShortCircuitLDAPControl(int resultCode,
-                                                          String section)
-  {
-    return new LDAPControl(createShortCircuitControl(resultCode, section));
-  }
-
-
-
-  /**
-   * Retrieves a list containing a short circuit LDAP control with the specified
-   * result code and section.
-   *
-   * @param  resultCode  The result code to return to the client.
-   * @param  section     The section to use to determine when to short circuit.
-   *
-   * @return  A list containing the appropriate short circuit LDAP request
-   *          control.
-   */
-  public static ArrayList<LDAPControl> createShortCircuitLDAPControlList(
-                                            int resultCode, String section)
-  {
-    ArrayList<LDAPControl> controlList = new ArrayList<LDAPControl>(1);
-    controlList.add(createShortCircuitLDAPControl(resultCode, section));
-    return controlList;
-  }
-
   /**
    * Registered short circuits for operations regardless of controls.
    */

--
Gitblit v1.10.0