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/tools/ManageAccount.java |  503 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 257 insertions(+), 246 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/ManageAccount.java b/opends/src/server/org/opends/server/tools/ManageAccount.java
index 73dca13..10cb1c0 100644
--- a/opends/src/server/org/opends/server/tools/ManageAccount.java
+++ b/opends/src/server/org/opends/server/tools/ManageAccount.java
@@ -32,20 +32,21 @@
 
 import java.io.OutputStream;
 import java.io.PrintStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.HashSet;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.net.ssl.SSLException;
-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.protocols.ldap.ExtendedRequestProtocolOp;
 import org.opends.server.protocols.ldap.ExtendedResponseProtocolOp;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.types.NullOutputStream;
+import org.opends.server.types.ByteStringBuilder;
 import org.opends.server.util.args.Argument;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.BooleanArgument;
@@ -569,28 +570,35 @@
 
     try
     {
-      // Use the subcommand provided to figure out how to encode the request.
-      ArrayList<ASN1Element> opElements = new ArrayList<ASN1Element>(1);
-      result = processSubcommand(opElements);
-      if (result != LDAPResultCode.SUCCESS)
+      ByteStringBuilder builder = new ByteStringBuilder();
+      ASN1Writer writer = ASN1.getWriter(builder);
+
+      try
       {
-        return result;
+        writer.writeStartSequence();
+        writer.writeOctetString(targetDNString);
+
+        // Use the subcommand provided to figure out how to encode the request.
+        writer.writeStartSequence();
+        result = processSubcommand(writer);
+        if (result != LDAPResultCode.SUCCESS)
+        {
+          return result;
+        }
+        writer.writeEndSequence();
+
+        writer.writeEndSequence();
+      }
+      catch(Exception e)
+      {
+        // TODO: Better message
+        err.println(e);
       }
 
 
-      // Generate the extended request and send it to the server.
-      ArrayList<ASN1Element> valueElements = new ArrayList<ASN1Element>(2);
-      valueElements.add(new ASN1OctetString(targetDNString));
-      if (! opElements.isEmpty())
-      {
-        valueElements.add(new ASN1Sequence(opElements));
-      }
-      ASN1OctetString requestValue =
-           new ASN1OctetString(new ASN1Sequence(valueElements).encode());
-
       ExtendedRequestProtocolOp extendedRequest =
            new ExtendedRequestProtocolOp(OID_PASSWORD_POLICY_STATE_EXTOP,
-                                         requestValue);
+                                         builder.toByteString());
 
       LDAPMessage requestMessage =
            new LDAPMessage(nextMessageID.getAndIncrement(), extendedRequest);
@@ -609,7 +617,6 @@
 
 
       // Read the response from the server.
-      ArrayList<ASN1Element> responseOpElements;
       try
       {
         LDAPMessage responseMessage = ldapReader.readMessage();
@@ -635,169 +642,174 @@
           return resultCode;
         }
 
-        ASN1Sequence valueSequence =
-             ASN1Sequence.decodeAsSequence(extendedResponse.getValue().value());
-        responseOpElements =
-             valueSequence.elements().get(1).decodeAsSequence().elements();
+        ASN1Reader reader = ASN1.getReader(extendedResponse.getValue());
+        reader.readStartSequence();
+
+        // Skip the target user DN element
+        reader.skipElement();
+        reader.readStartSequence();
+
+        while(reader.hasNextElement())
+        {
+          // Get the response value and parse its individual elements.
+          int opType;
+          ArrayList<String> opValues;
+
+          try
+          {
+            reader.readStartSequence();
+            opType = (int)reader.readInteger();
+            opValues = new ArrayList<String>();
+            if (reader.hasNextElement())
+            {
+              reader.readStartSequence();
+              while(reader.hasNextElement())
+              {
+                opValues.add(reader.readOctetStringAsString());
+              }
+              reader.readEndSequence();
+            }
+            reader.readEndSequence();
+          }
+          catch (Exception e)
+          {
+            Message message = ERR_PWPSTATE_CANNOT_DECODE_RESPONSE_OP.get(
+                getExceptionMessage(e));
+            err.println(wrapText(message, MAX_LINE_WIDTH));
+            continue;
+          }
+
+          switch (opType)
+          {
+            case OP_GET_PASSWORD_POLICY_DN:
+              Message message = INFO_PWPSTATE_LABEL_PASSWORD_POLICY_DN.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_ACCOUNT_DISABLED_STATE:
+              message = INFO_PWPSTATE_LABEL_ACCOUNT_DISABLED_STATE.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_ACCOUNT_EXPIRATION_TIME:
+              message = INFO_PWPSTATE_LABEL_ACCOUNT_EXPIRATION_TIME.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_ACCOUNT_EXPIRATION:
+              message =
+                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_ACCOUNT_EXPIRATION.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_PASSWORD_CHANGED_TIME:
+              message = INFO_PWPSTATE_LABEL_PASSWORD_CHANGED_TIME.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_PASSWORD_EXPIRATION_WARNED_TIME:
+              message =
+                  INFO_PWPSTATE_LABEL_PASSWORD_EXPIRATION_WARNED_TIME.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION:
+              message =
+                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_PASSWORD_EXPIRATION.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING:
+              message =
+                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING
+                      .get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_AUTHENTICATION_FAILURE_TIMES:
+              message = INFO_PWPSTATE_LABEL_AUTH_FAILURE_TIMES.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_AUTHENTICATION_FAILURE_UNLOCK:
+              message =
+                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_AUTH_FAILURE_UNLOCK.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_REMAINING_AUTHENTICATION_FAILURE_COUNT:
+              message = INFO_PWPSTATE_LABEL_REMAINING_AUTH_FAILURE_COUNT.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_LAST_LOGIN_TIME:
+              message = INFO_PWPSTATE_LABEL_LAST_LOGIN_TIME.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_IDLE_LOCKOUT:
+              message = INFO_PWPSTATE_LABEL_SECONDS_UNTIL_IDLE_LOCKOUT.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_PASSWORD_RESET_STATE:
+              message = INFO_PWPSTATE_LABEL_PASSWORD_RESET_STATE.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT:
+              message =
+                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT
+                      .get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_GRACE_LOGIN_USE_TIMES:
+              message = INFO_PWPSTATE_LABEL_GRACE_LOGIN_USE_TIMES.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_REMAINING_GRACE_LOGIN_COUNT:
+              message = INFO_PWPSTATE_LABEL_REMAINING_GRACE_LOGIN_COUNT.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_PASSWORD_CHANGED_BY_REQUIRED_TIME:
+              message =
+                  INFO_PWPSTATE_LABEL_PASSWORD_CHANGED_BY_REQUIRED_TIME.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_SECONDS_UNTIL_REQUIRED_CHANGE_TIME:
+              message =
+                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_REQUIRED_CHANGE_TIME
+                      .get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            case OP_GET_PASSWORD_HISTORY:
+              message = INFO_PWPSTATE_LABEL_PASSWORD_HISTORY.get();
+              printLabelAndValues(message, opValues);
+              break;
+
+            default:
+              message = ERR_PWPSTATE_INVALID_RESPONSE_OP_TYPE.get(
+                  String.valueOf(opType));
+              err.println(wrapText(message, MAX_LINE_WIDTH));
+              break;
+          }
+        }
+        reader.readEndSequence();
+        reader.readEndSequence();
       }
       catch (Exception e)
       {
         Message message = ERR_PWPSTATE_CANNOT_DECODE_RESPONSE_MESSAGE.get(
-                getExceptionMessage(e));
+            getExceptionMessage(e));
         err.println(wrapText(message, MAX_LINE_WIDTH));
         return LDAPResultCode.CLIENT_SIDE_SERVER_DOWN;
       }
 
-
-      // Get the response value and parse its individual elements.
-      for (ASN1Element opElement : responseOpElements)
-      {
-        int opType;
-        ArrayList<String> opValues;
-
-        try
-        {
-          ASN1Sequence opSequence = opElement.decodeAsSequence();
-          ArrayList<ASN1Element> elements = opSequence.elements();
-          opType = elements.get(0).decodeAsEnumerated().intValue();
-          opValues = new ArrayList<String>();
-          if (elements.size() == 2)
-          {
-            for (ASN1Element e : elements.get(1).decodeAsSequence().elements())
-            {
-              opValues.add(e.decodeAsOctetString().stringValue());
-            }
-          }
-        }
-        catch (Exception e)
-        {
-          Message message = ERR_PWPSTATE_CANNOT_DECODE_RESPONSE_OP.get(
-                  getExceptionMessage(e));
-          err.println(wrapText(message, MAX_LINE_WIDTH));
-          continue;
-        }
-
-        switch (opType)
-        {
-          case OP_GET_PASSWORD_POLICY_DN:
-            Message message = INFO_PWPSTATE_LABEL_PASSWORD_POLICY_DN.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_ACCOUNT_DISABLED_STATE:
-            message = INFO_PWPSTATE_LABEL_ACCOUNT_DISABLED_STATE.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_ACCOUNT_EXPIRATION_TIME:
-            message = INFO_PWPSTATE_LABEL_ACCOUNT_EXPIRATION_TIME.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_ACCOUNT_EXPIRATION:
-            message =
-                    INFO_PWPSTATE_LABEL_SECONDS_UNTIL_ACCOUNT_EXPIRATION.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_PASSWORD_CHANGED_TIME:
-            message = INFO_PWPSTATE_LABEL_PASSWORD_CHANGED_TIME.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_PASSWORD_EXPIRATION_WARNED_TIME:
-            message = INFO_PWPSTATE_LABEL_PASSWORD_EXPIRATION_WARNED_TIME.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION:
-            message =
-                    INFO_PWPSTATE_LABEL_SECONDS_UNTIL_PASSWORD_EXPIRATION.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING:
-            message =
-                  INFO_PWPSTATE_LABEL_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING
-                          .get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_AUTHENTICATION_FAILURE_TIMES:
-            message = INFO_PWPSTATE_LABEL_AUTH_FAILURE_TIMES.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_AUTHENTICATION_FAILURE_UNLOCK:
-            message =
-                    INFO_PWPSTATE_LABEL_SECONDS_UNTIL_AUTH_FAILURE_UNLOCK.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_REMAINING_AUTHENTICATION_FAILURE_COUNT:
-            message = INFO_PWPSTATE_LABEL_REMAINING_AUTH_FAILURE_COUNT.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_LAST_LOGIN_TIME:
-            message = INFO_PWPSTATE_LABEL_LAST_LOGIN_TIME.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_IDLE_LOCKOUT:
-            message = INFO_PWPSTATE_LABEL_SECONDS_UNTIL_IDLE_LOCKOUT.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_PASSWORD_RESET_STATE:
-            message = INFO_PWPSTATE_LABEL_PASSWORD_RESET_STATE.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT:
-            message =
-                    INFO_PWPSTATE_LABEL_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT
-                            .get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_GRACE_LOGIN_USE_TIMES:
-            message = INFO_PWPSTATE_LABEL_GRACE_LOGIN_USE_TIMES.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_REMAINING_GRACE_LOGIN_COUNT:
-            message = INFO_PWPSTATE_LABEL_REMAINING_GRACE_LOGIN_COUNT.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_PASSWORD_CHANGED_BY_REQUIRED_TIME:
-            message =
-                    INFO_PWPSTATE_LABEL_PASSWORD_CHANGED_BY_REQUIRED_TIME.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_SECONDS_UNTIL_REQUIRED_CHANGE_TIME:
-            message =
-                    INFO_PWPSTATE_LABEL_SECONDS_UNTIL_REQUIRED_CHANGE_TIME
-                            .get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          case OP_GET_PASSWORD_HISTORY:
-            message = INFO_PWPSTATE_LABEL_PASSWORD_HISTORY.get();
-            printLabelAndValues(message, opValues);
-            break;
-
-          default:
-            message = ERR_PWPSTATE_INVALID_RESPONSE_OP_TYPE.get(
-                    String.valueOf(opType));
-            err.println(wrapText(message, MAX_LINE_WIDTH));
-            break;
-        }
-      }
-
-
       // If we've gotten here, then everything completed successfully.
       return 0;
     }
@@ -1382,15 +1394,14 @@
 
 
   /**
-   * Processes the subcommand from the provided argument parser and appends the
-   * appropriate operation elements to the given list.
+   * Processes the subcommand from the provided argument parser and writes the
+   * appropriate operation elements to the given writer.
    *
-   * @param  opElements  A list into which the operation elements shouold be
-   *                     placed.
+   * @param  writer The ASN.1 writer used to write the operation elements.
    *
    * @return  A result code indicating the results of the processing.
    */
-  private static int processSubcommand(ArrayList<ASN1Element> opElements)
+  private static int processSubcommand(ASN1Writer writer) throws IOException
   {
     SubCommand subCommand = argParser.getSubCommand();
     if (subCommand == null)
@@ -1408,11 +1419,11 @@
     }
     else if (subCommandName.equals(SC_GET_PASSWORD_POLICY_DN))
     {
-      opElements.add(encode(OP_GET_PASSWORD_POLICY_DN, NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_POLICY_DN, NO_VALUE);
     }
     else if (subCommandName.equals(SC_GET_ACCOUNT_DISABLED_STATE))
     {
-      opElements.add(encode(OP_GET_ACCOUNT_DISABLED_STATE, NO_VALUE));
+      encode(writer, OP_GET_ACCOUNT_DISABLED_STATE, NO_VALUE);
     }
     else if (subCommandName.equals(SC_SET_ACCOUNT_DISABLED_STATE))
     {
@@ -1422,11 +1433,11 @@
         String valueStr = a.getValue();
         if (isTrueValue(valueStr))
         {
-          opElements.add(encode(OP_SET_ACCOUNT_DISABLED_STATE, "true"));
+          encode(writer, OP_SET_ACCOUNT_DISABLED_STATE, "true");
         }
         else if (isFalseValue(valueStr))
         {
-          opElements.add(encode(OP_SET_ACCOUNT_DISABLED_STATE, "false"));
+          encode(writer, OP_SET_ACCOUNT_DISABLED_STATE, "false");
         }
         else
         {
@@ -1444,101 +1455,101 @@
     }
     else if (subCommandName.equals(SC_CLEAR_ACCOUNT_DISABLED_STATE))
     {
-      opElements.add(encode(OP_CLEAR_ACCOUNT_DISABLED_STATE, NO_VALUE));
+      encode(writer, OP_CLEAR_ACCOUNT_DISABLED_STATE, NO_VALUE);
     }
     else if (subCommandName.equals(SC_GET_ACCOUNT_EXPIRATION_TIME))
     {
-      opElements.add(encode(OP_GET_ACCOUNT_EXPIRATION_TIME, NO_VALUE));
+      encode(writer, OP_GET_ACCOUNT_EXPIRATION_TIME, NO_VALUE);
     }
     else if (subCommandName.equals(SC_SET_ACCOUNT_EXPIRATION_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_SET_ACCOUNT_EXPIRATION_TIME, a.getValue()));
+        encode(writer, OP_SET_ACCOUNT_EXPIRATION_TIME, a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_SET_ACCOUNT_EXPIRATION_TIME, NO_VALUE));
+        encode(writer, OP_SET_ACCOUNT_EXPIRATION_TIME, NO_VALUE);
       }
     }
     else if (subCommandName.equals(SC_CLEAR_ACCOUNT_EXPIRATION_TIME))
     {
-      opElements.add(encode(OP_CLEAR_ACCOUNT_EXPIRATION_TIME, NO_VALUE));
+      encode(writer, OP_CLEAR_ACCOUNT_EXPIRATION_TIME, NO_VALUE);
     }
     else if (subCommandName.equals(SC_GET_SECONDS_UNTIL_ACCOUNT_EXPIRATION))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_ACCOUNT_EXPIRATION, NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_ACCOUNT_EXPIRATION, NO_VALUE);
     }
     else if (subCommandName.equals(SC_GET_PASSWORD_CHANGED_TIME))
     {
-      opElements.add(encode(OP_GET_PASSWORD_CHANGED_TIME, NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_CHANGED_TIME, NO_VALUE);
     }
     else if (subCommandName.equals(SC_SET_PASSWORD_CHANGED_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_SET_PASSWORD_CHANGED_TIME, a.getValue()));
+        encode(writer, OP_SET_PASSWORD_CHANGED_TIME, a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_SET_PASSWORD_CHANGED_TIME, NO_VALUE));
+        encode(writer, OP_SET_PASSWORD_CHANGED_TIME, NO_VALUE);
       }
     }
     else if (subCommandName.equals(SC_CLEAR_PASSWORD_CHANGED_TIME))
     {
-      opElements.add(encode(OP_CLEAR_PASSWORD_CHANGED_TIME, NO_VALUE));
+      encode(writer, OP_CLEAR_PASSWORD_CHANGED_TIME, NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_PASSWORD_EXP_WARNED_TIME))
     {
-      opElements.add(encode(OP_GET_PASSWORD_EXPIRATION_WARNED_TIME, NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_EXPIRATION_WARNED_TIME, NO_VALUE);
     }
     else if(subCommandName.equals(SC_SET_PASSWORD_EXP_WARNED_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_SET_PASSWORD_EXPIRATION_WARNED_TIME,
-                              a.getValue()));
+        encode(writer, OP_SET_PASSWORD_EXPIRATION_WARNED_TIME,
+                              a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_SET_PASSWORD_EXPIRATION_WARNED_TIME,
-                              NO_VALUE));
+        encode(writer, OP_SET_PASSWORD_EXPIRATION_WARNED_TIME,
+                              NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_CLEAR_PASSWORD_EXP_WARNED_TIME))
     {
-      opElements.add(encode(OP_CLEAR_PASSWORD_EXPIRATION_WARNED_TIME,
-                            NO_VALUE));
+      encode(writer, OP_CLEAR_PASSWORD_EXPIRATION_WARNED_TIME,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION,
-                            NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(
                  SC_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING,
-                            NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_PASSWORD_EXPIRATION_WARNING,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_AUTHENTICATION_FAILURE_TIMES))
     {
-      opElements.add(encode(OP_GET_AUTHENTICATION_FAILURE_TIMES, NO_VALUE));
+      encode(writer, OP_GET_AUTHENTICATION_FAILURE_TIMES, NO_VALUE);
     }
     else if(subCommandName.equals(SC_ADD_AUTHENTICATION_FAILURE_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_ADD_AUTHENTICATION_FAILURE_TIME,
-                              a.getValue()));
+        encode(writer, OP_ADD_AUTHENTICATION_FAILURE_TIME,
+                              a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_ADD_AUTHENTICATION_FAILURE_TIME, NO_VALUE));
+        encode(writer, OP_ADD_AUTHENTICATION_FAILURE_TIME, NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_SET_AUTHENTICATION_FAILURE_TIMES))
@@ -1550,56 +1561,56 @@
         String[] values = new String[valueList.size()];
         valueList.toArray(values);
 
-        opElements.add(encode(OP_SET_AUTHENTICATION_FAILURE_TIMES, values));
+        encode(writer, OP_SET_AUTHENTICATION_FAILURE_TIMES, values);
       }
       else
       {
-        opElements.add(encode(OP_SET_AUTHENTICATION_FAILURE_TIMES, NO_VALUE));
+        encode(writer, OP_SET_AUTHENTICATION_FAILURE_TIMES, NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_CLEAR_AUTHENTICATION_FAILURE_TIMES))
     {
-      opElements.add(encode(OP_CLEAR_AUTHENTICATION_FAILURE_TIMES, NO_VALUE));
+      encode(writer, OP_CLEAR_AUTHENTICATION_FAILURE_TIMES, NO_VALUE);
     }
     else if(subCommandName.equals(
                  SC_GET_SECONDS_UNTIL_AUTHENTICATION_FAILURE_UNLOCK))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_AUTHENTICATION_FAILURE_UNLOCK,
-                            NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_AUTHENTICATION_FAILURE_UNLOCK,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(
                  SC_GET_REMAINING_AUTHENTICATION_FAILURE_COUNT))
     {
-      opElements.add(encode(OP_GET_REMAINING_AUTHENTICATION_FAILURE_COUNT,
-                            NO_VALUE));
+      encode(writer, OP_GET_REMAINING_AUTHENTICATION_FAILURE_COUNT,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_LAST_LOGIN_TIME))
     {
-      opElements.add(encode(OP_GET_LAST_LOGIN_TIME, NO_VALUE));
+      encode(writer, OP_GET_LAST_LOGIN_TIME, NO_VALUE);
     }
     else if(subCommandName.equals(SC_SET_LAST_LOGIN_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_SET_LAST_LOGIN_TIME, a.getValue()));
+        encode(writer, OP_SET_LAST_LOGIN_TIME, a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_SET_LAST_LOGIN_TIME, NO_VALUE));
+        encode(writer, OP_SET_LAST_LOGIN_TIME, NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_CLEAR_LAST_LOGIN_TIME))
     {
-      opElements.add(encode(OP_CLEAR_LAST_LOGIN_TIME, NO_VALUE));
+      encode(writer, OP_CLEAR_LAST_LOGIN_TIME, NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_SECONDS_UNTIL_IDLE_LOCKOUT))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_IDLE_LOCKOUT, NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_IDLE_LOCKOUT, NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_PASSWORD_RESET_STATE))
     {
-      opElements.add(encode(OP_GET_PASSWORD_RESET_STATE, NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_RESET_STATE, NO_VALUE);
     }
     else if(subCommandName.equals(SC_SET_PASSWORD_RESET_STATE))
     {
@@ -1609,11 +1620,11 @@
         String valueStr = a.getValue();
         if (isTrueValue(valueStr))
         {
-          opElements.add(encode(OP_SET_PASSWORD_RESET_STATE, "true"));
+          encode(writer, OP_SET_PASSWORD_RESET_STATE, "true");
         }
         else if (isFalseValue(valueStr))
         {
-          opElements.add(encode(OP_SET_PASSWORD_RESET_STATE, "false"));
+          encode(writer, OP_SET_PASSWORD_RESET_STATE, "false");
         }
         else
         {
@@ -1631,27 +1642,27 @@
     }
     else if(subCommandName.equals(SC_CLEAR_PASSWORD_RESET_STATE))
     {
-      opElements.add(encode(OP_GET_PASSWORD_RESET_STATE, NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_RESET_STATE, NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT,
-                            NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_PASSWORD_RESET_LOCKOUT,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_GRACE_LOGIN_USE_TIMES))
     {
-      opElements.add(encode(OP_GET_GRACE_LOGIN_USE_TIMES, NO_VALUE));
+      encode(writer, OP_GET_GRACE_LOGIN_USE_TIMES, NO_VALUE);
     }
     else if(subCommandName.equals(SC_ADD_GRACE_LOGIN_USE_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_ADD_GRACE_LOGIN_USE_TIME, a.getValue()));
+        encode(writer, OP_ADD_GRACE_LOGIN_USE_TIME, a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_ADD_GRACE_LOGIN_USE_TIME, NO_VALUE));
+        encode(writer, OP_ADD_GRACE_LOGIN_USE_TIME, NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_SET_GRACE_LOGIN_USE_TIMES))
@@ -1663,57 +1674,57 @@
         String[] values = new String[valueList.size()];
         valueList.toArray(values);
 
-        opElements.add(encode(OP_SET_GRACE_LOGIN_USE_TIMES, values));
+        encode(writer, OP_SET_GRACE_LOGIN_USE_TIMES, values);
       }
       else
       {
-        opElements.add(encode(OP_SET_GRACE_LOGIN_USE_TIMES, NO_VALUE));
+        encode(writer, OP_SET_GRACE_LOGIN_USE_TIMES, NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_CLEAR_GRACE_LOGIN_USE_TIMES))
     {
-      opElements.add(encode(OP_CLEAR_GRACE_LOGIN_USE_TIMES, NO_VALUE));
+      encode(writer, OP_CLEAR_GRACE_LOGIN_USE_TIMES, NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_REMAINING_GRACE_LOGIN_COUNT))
     {
-      opElements.add(encode(OP_GET_REMAINING_GRACE_LOGIN_COUNT, NO_VALUE));
+      encode(writer, OP_GET_REMAINING_GRACE_LOGIN_COUNT, NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_PASSWORD_CHANGED_BY_REQUIRED_TIME))
     {
-      opElements.add(encode(OP_GET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
-                            NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(SC_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME))
     {
       Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
       if ((a != null) && a.isPresent())
       {
-        opElements.add(encode(OP_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
-                              a.getValue()));
+        encode(writer, OP_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
+                              a.getValue());
       }
       else
       {
-        opElements.add(encode(OP_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
-                              NO_VALUE));
+        encode(writer, OP_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
+                              NO_VALUE);
       }
     }
     else if(subCommandName.equals(SC_CLEAR_PASSWORD_CHANGED_BY_REQUIRED_TIME))
     {
-      opElements.add(encode(OP_CLEAR_PASSWORD_CHANGED_BY_REQUIRED_TIME,
-                            NO_VALUE));
+      encode(writer, OP_CLEAR_PASSWORD_CHANGED_BY_REQUIRED_TIME,
+                            NO_VALUE);
     }
     else if(subCommandName.equals(SC_GET_SECONDS_UNTIL_REQUIRED_CHANGE_TIME))
     {
-      opElements.add(encode(OP_GET_SECONDS_UNTIL_REQUIRED_CHANGE_TIME,
-                            NO_VALUE));
+      encode(writer, OP_GET_SECONDS_UNTIL_REQUIRED_CHANGE_TIME,
+                            NO_VALUE);
     }
     else if (subCommandName.equals(SC_GET_PASSWORD_HISTORY))
     {
-      opElements.add(encode(OP_GET_PASSWORD_HISTORY, NO_VALUE));
+      encode(writer, OP_GET_PASSWORD_HISTORY, NO_VALUE);
     }
     else if (subCommandName.equals(SC_CLEAR_PASSWORD_HISTORY))
     {
-      opElements.add(encode(OP_CLEAR_PASSWORD_HISTORY, NO_VALUE));
+      encode(writer, OP_CLEAR_PASSWORD_HISTORY, NO_VALUE);
     }
     else
     {

--
Gitblit v1.10.0