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/replication/protocol/MonitorMsg.java |  290 +++++++++++++++++----------------------------------------
 1 files changed, 86 insertions(+), 204 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/protocol/MonitorMsg.java b/opends/src/server/org/opends/server/replication/protocol/MonitorMsg.java
index fa3a16c..1b61c9b 100644
--- a/opends/src/server/org/opends/server/replication/protocol/MonitorMsg.java
+++ b/opends/src/server/org/opends/server/replication/protocol/MonitorMsg.java
@@ -26,7 +26,6 @@
  */
 package org.opends.server.replication.protocol;
 
-import java.io.UnsupportedEncodingException;
 import java.util.zip.DataFormatException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -34,10 +33,13 @@
 import java.util.Set;
 
 import org.opends.server.replication.common.ServerState;
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.protocols.asn1.ASN1Sequence;
-import org.opends.server.protocols.asn1.ASN1Element;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.protocols.asn1.ASN1;
+import org.opends.server.protocols.asn1.ASN1Writer;
 import org.opends.server.replication.common.ChangeNumber;
+import org.opends.server.types.ByteStringBuilder;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.ByteSequenceReader;
 
 /**
  * This message is part of the replication protocol.
@@ -178,93 +180,75 @@
    */
   public MonitorMsg(byte[] in) throws DataFormatException
   {
+    ByteSequenceReader reader = ByteString.wrap(in).asReader();
+
+    /* first byte is the type */
+    if (reader.get() != MSG_TYPE_REPL_SERVER_MONITOR)
+      throw new DataFormatException("input is not a valid " +
+          this.getClass().getCanonicalName());
+    int pos = 1;
+
+    // sender
+    this.senderID = reader.getShort();
+
+    // destination
+    this.destination = reader.getShort();
+
+    ASN1Reader asn1Reader = ASN1.getReader(reader);
     try
     {
-      /* first byte is the type */
-      if (in[0] != MSG_TYPE_REPL_SERVER_MONITOR)
-        throw new DataFormatException("input is not a valid " +
-            this.getClass().getCanonicalName());
-      int pos = 1;
-
-      // sender
-      int length = getNextLength(in, pos);
-      String senderIDString = new String(in, pos, length, "UTF-8");
-      this.senderID = Short.valueOf(senderIDString);
-      pos += length +1;
-
-      // destination
-      length = getNextLength(in, pos);
-      String destinationString = new String(in, pos, length, "UTF-8");
-      this.destination = Short.valueOf(destinationString);
-      pos += length +1;
-
-       /* Read the states : all the remaining bytes but the terminating 0 */
-      byte[] encodedS = new byte[in.length-pos-1];
-      int i =0;
-      while (pos<in.length-1)
+      asn1Reader.readStartSequence();
+      // loop on the servers
+      while(asn1Reader.hasNextElement())
       {
-        encodedS[i++] = in[pos++];
-      }
+        ServerState newState = new ServerState();
+        short serverId = 0;
+        Long outime = (long)0;
+        boolean isLDAPServer = false;
 
-
-      try
-      {
-        ASN1Sequence s0 = ASN1Sequence.decodeAsSequence(encodedS);
-        // loop on the servers
-        for (ASN1Element el0 : s0.elements())
+        asn1Reader.readStartSequence();
+        // loop on the list of CN of the state
+        while(asn1Reader.hasNextElement())
         {
-          ServerState newState = new ServerState();
-          short serverId = 0;
-          Long outime = (long)0;
-          boolean isLDAPServer = false;
-          ASN1Sequence s1 = el0.decodeAsSequence();
-
-          // loop on the list of CN of the state
-          for (ASN1Element el1 : s1.elements())
+          String s = asn1Reader.readOctetStringAsString();
+          ChangeNumber cn = new ChangeNumber(s);
+          if ((data.replServerDbState != null) && (serverId == 0))
           {
-            ASN1OctetString o = el1.decodeAsOctetString();
-            String s = o.stringValue();
-            ChangeNumber cn = new ChangeNumber(s);
-            if ((data.replServerDbState != null) && (serverId == 0))
-            {
-              // we are on the first CN that is a fake CN to store the serverId
-              // and the older update time
-              serverId = cn.getServerId();
-              outime = cn.getTime();
-              isLDAPServer = (cn.getSeqnum()>0);
-            }
-            else
-            {
-              // we are on a normal CN
-              newState.update(cn);
-            }
-          }
-
-          if (data.replServerDbState == null)
-          {
-            // the first state is the replication state
-            data.replServerDbState = newState;
+            // we are on the first CN that is a fake CN to store the serverId
+            // and the older update time
+            serverId = cn.getServerId();
+            outime = cn.getTime();
+            isLDAPServer = (cn.getSeqnum()>0);
           }
           else
           {
-            // the next states are the server states
-            ServerData sd = new ServerData();
-            sd.state = newState;
-            sd.approxFirstMissingDate = outime;
-            if (isLDAPServer)
-              data.ldapStates.put(serverId, sd);
-            else
-              data.rsStates.put(serverId, sd);
+            // we are on a normal CN
+            newState.update(cn);
           }
         }
-      } catch(Exception e)
-      {
+        asn1Reader.readEndSequence();
 
+        if (data.replServerDbState == null)
+        {
+          // the first state is the replication state
+          data.replServerDbState = newState;
+        }
+        else
+        {
+          // the next states are the server states
+          ServerData sd = new ServerData();
+          sd.state = newState;
+          sd.approxFirstMissingDate = outime;
+          if (isLDAPServer)
+            data.ldapStates.put(serverId, sd);
+          else
+            data.rsStates.put(serverId, sd);
+        }
       }
-    }
-    catch (UnsupportedEncodingException e)
+      asn1Reader.readEndSequence();
+    } catch(Exception e)
     {
-      throw new DataFormatException("UTF-8 is not supported by this jvm.");
+
     }
   }
 
@@ -276,128 +260,30 @@
   {
     try
     {
-      byte[] senderBytes = String.valueOf(senderID).getBytes("UTF-8");
-      byte[] destinationBytes = String.valueOf(destination).getBytes("UTF-8");
-
-      int length = 1 + senderBytes.length +
-                   1 + destinationBytes.length;
-
-      ASN1Sequence stateElementSequence = new ASN1Sequence();
-      ArrayList<ASN1Element> stateElementList = new ArrayList<ASN1Element>();
-
-      /**
-       * First loop computes the length
-       */
-
-      /* Put the serverStates ... */
-      stateElementSequence = new ASN1Sequence();
-      stateElementList = new ArrayList<ASN1Element>();
-
-      /* first put the Replication Server state */
-      ArrayList<ASN1OctetString> cnOctetList =
-        data.replServerDbState.toASN1ArrayList();
-      ArrayList<ASN1Element> cnElementList = new ArrayList<ASN1Element>();
-      for (ASN1OctetString soci : cnOctetList)
-      {
-        cnElementList.add(soci);
-      }
-      ASN1Sequence cnSequence = new ASN1Sequence(cnElementList);
-      stateElementList.add(cnSequence);
-
-      // then the LDAP server data
-      Set<Short> servers = data.ldapStates.keySet();
-      for (Short sid : servers)
-      {
-        // State
-        ServerState statei = data.ldapStates.get(sid).state;
-        // First missing date
-        Long outime =  data.ldapStates.get(sid).approxFirstMissingDate;
-
-        // retrieves the change numbers as an arrayList of ANSN1OctetString
-        cnOctetList = statei.toASN1ArrayList();
-        cnElementList = new ArrayList<ASN1Element>();
-
-        // a fake changenumber helps storing the LDAP server ID
-        // and the olderupdatetime
-        ChangeNumber cn = new ChangeNumber(outime,0,sid);
-        cnElementList.add(new ASN1OctetString(cn.toString()));
-
-        // the changenumbers
-        for (ASN1OctetString soci : cnOctetList)
-        {
-          cnElementList.add(soci);
-        }
-
-        cnSequence = new ASN1Sequence(cnElementList);
-        stateElementList.add(cnSequence);
-      }
-
-      // then the rs server data
-      servers = data.rsStates.keySet();
-      for (Short sid : servers)
-      {
-        // State
-        ServerState statei = data.rsStates.get(sid).state;
-        // First missing date
-        Long outime =  data.rsStates.get(sid).approxFirstMissingDate;
-
-        // retrieves the change numbers as an arrayList of ANSN1OctetString
-        cnOctetList = statei.toASN1ArrayList();
-        cnElementList = new ArrayList<ASN1Element>();
-
-        // a fake changenumber helps storing the LDAP server ID
-        // and the olderupdatetime
-        ChangeNumber cn = new ChangeNumber(outime,0,sid);
-        cnElementList.add(new ASN1OctetString(cn.toString()));
-
-        // the changenumbers
-        for (ASN1OctetString soci : cnOctetList)
-        {
-          cnElementList.add(soci);
-        }
-
-        cnSequence = new ASN1Sequence(cnElementList);
-        stateElementList.add(cnSequence);
-      }
-
-      stateElementSequence.setElements(stateElementList);
-      int seqLen = stateElementSequence.encode().length;
-
-      //
-      length += seqLen;
-      length += 2;
-
-      // Allocate the array sized from the computed length
-      byte[] resultByteArray = new byte[length];
-
-      /**
-       * Second loop really builds the array
-       */
+      ByteStringBuilder byteBuilder = new ByteStringBuilder();
+      ASN1Writer writer = ASN1.getWriter(byteBuilder);
 
       /* put the type of the operation */
-      resultByteArray[0] = MSG_TYPE_REPL_SERVER_MONITOR;
-      int pos = 1;
+      byteBuilder.append(MSG_TYPE_REPL_SERVER_MONITOR);
 
-      pos = addByteArray(senderBytes, resultByteArray, pos);
-      pos = addByteArray(destinationBytes, resultByteArray, pos);
+      byteBuilder.append(senderID);
+      byteBuilder.append(destination);
 
       /* Put the serverStates ... */
-      stateElementSequence = new ASN1Sequence();
-      stateElementList = new ArrayList<ASN1Element>();
+      writer.writeStartSequence();
 
       /* first put the Replication Server state */
-      cnOctetList =
+      writer.writeStartSequence();
+      ArrayList<ByteString> cnOctetList =
         data.replServerDbState.toASN1ArrayList();
-      cnElementList = new ArrayList<ASN1Element>();
-      for (ASN1OctetString soci : cnOctetList)
+      for (ByteString soci : cnOctetList)
       {
-        cnElementList.add(soci);
+        writer.writeOctetString(soci);
       }
-      cnSequence = new ASN1Sequence(cnElementList);
-      stateElementList.add(cnSequence);
+      writer.writeEndSequence();
 
       // then the LDAP server datas
-      servers = data.ldapStates.keySet();
+      Set<Short> servers = data.ldapStates.keySet();
       for (Short sid : servers)
       {
         ServerState statei = data.ldapStates.get(sid).state;
@@ -405,20 +291,19 @@
 
         // retrieves the change numbers as an arrayList of ANSN1OctetString
         cnOctetList = statei.toASN1ArrayList();
-        cnElementList = new ArrayList<ASN1Element>();
 
+        writer.writeStartSequence();
         // a fake changenumber helps storing the LDAP server ID
         ChangeNumber cn = new ChangeNumber(outime,1,sid);
-        cnElementList.add(new ASN1OctetString(cn.toString()));
+        writer.writeOctetString(cn.toString());
 
         // the changenumbers that make the state
-        for (ASN1OctetString soci : cnOctetList)
+        for (ByteString soci : cnOctetList)
         {
-          cnElementList.add(soci);
+          writer.writeOctetString(soci);
         }
 
-        cnSequence = new ASN1Sequence(cnElementList);
-        stateElementList.add(cnSequence);
+        writer.writeEndSequence();
       }
 
       // then the RS server datas
@@ -430,29 +315,26 @@
 
         // retrieves the change numbers as an arrayList of ANSN1OctetString
         cnOctetList = statei.toASN1ArrayList();
-        cnElementList = new ArrayList<ASN1Element>();
 
+        writer.writeStartSequence();
         // a fake changenumber helps storing the LDAP server ID
         ChangeNumber cn = new ChangeNumber(outime,0,sid);
-        cnElementList.add(new ASN1OctetString(cn.toString()));
+        writer.writeOctetString(cn.toString());
 
         // the changenumbers that make the state
-        for (ASN1OctetString soci : cnOctetList)
+        for (ByteString soci : cnOctetList)
         {
-          cnElementList.add(soci);
+          writer.writeOctetString(soci);
         }
 
-        cnSequence = new ASN1Sequence(cnElementList);
-        stateElementList.add(cnSequence);
+        writer.writeEndSequence();
       }
 
+      writer.writeEndSequence();
 
-      stateElementSequence.setElements(stateElementList);
-      pos = addByteArray(stateElementSequence.encode(), resultByteArray, pos);
-
-      return resultByteArray;
+      return byteBuilder.toByteArray();
     }
-    catch (UnsupportedEncodingException e)
+    catch (Exception e)
     {
       return null;
     }

--
Gitblit v1.10.0