From 76ebd1ad82e2a1fc421519f09c62b948e9376e8a Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Tue, 06 Oct 2009 12:34:32 +0000
Subject: [PATCH] Entry attributes for ECL - Protocol V4

---
 opends/src/server/org/opends/server/replication/protocol/StartSessionMsg.java |  374 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 289 insertions(+), 85 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/protocol/StartSessionMsg.java b/opends/src/server/org/opends/server/replication/protocol/StartSessionMsg.java
index 5925ee5..3f22529 100644
--- a/opends/src/server/org/opends/server/replication/protocol/StartSessionMsg.java
+++ b/opends/src/server/org/opends/server/replication/protocol/StartSessionMsg.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.replication.protocol;
 
@@ -30,10 +30,19 @@
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.zip.DataFormatException;
+
+import org.opends.server.protocols.asn1.ASN1;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.protocols.asn1.ASN1Writer;
 import org.opends.server.replication.common.AssuredMode;
 import org.opends.server.replication.common.ServerStatus;
+import org.opends.server.types.ByteSequenceReader;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.ByteStringBuilder;
 
 /**
  * This message is used by DS to confirm a RS he wants to connect to him (open
@@ -62,14 +71,271 @@
   // DS safe data level (relevant if assured mode is safe data)
   private byte safeDataLevel = (byte) 1;
 
+  private Set<String> eclIncludes = new HashSet<String>();
+
+  /**
+   * The protocolVersion that should be used when serializing this message.
+   */
+  private final short protocolVersion;
+
   /**
    * Creates a new StartSessionMsg message from its encoded form.
    *
    * @param in The byte array containing the encoded form of the message.
+   * @param version The protocol version to use to decode the msg.
    * @throws java.util.zip.DataFormatException If the byte array does not
    * contain a valid encoded form of the message.
    */
-  public StartSessionMsg(byte[] in) throws DataFormatException
+  public StartSessionMsg(byte[] in, short version) throws DataFormatException
+  {
+    protocolVersion = ProtocolVersion.getCurrentVersion();
+    if (version <= ProtocolVersion.REPLICATION_PROTOCOL_V3)
+    {
+      decode_V23(in);
+    }
+    else
+    {
+      decode_V4(in);
+    }
+  }
+
+  /**
+   * Creates a new StartSessionMsg message from its encoded form.
+   *
+   * Creates a new  message with the given required parameters.
+   * @param status Status we are starting with
+   * @param referralsURLs Referrals URLs to be used by peer DSs
+   * @param assuredFlag If assured mode is enabled or not
+   * @param assuredMode Assured type
+   * @param safeDataLevel Assured mode safe data level
+   * @param replicationProtocol   The protocol version to use.
+   */
+  public StartSessionMsg(ServerStatus status, List<String> referralsURLs,
+      boolean assuredFlag, AssuredMode assuredMode, byte safeDataLevel,
+      short replicationProtocol)
+  {
+    this.referralsURLs = referralsURLs;
+    this.status = status;
+    this.assuredFlag = assuredFlag;
+    this.assuredMode = assuredMode;
+    this.safeDataLevel = safeDataLevel;
+    this.protocolVersion = replicationProtocol;
+  }
+
+  /**
+   * Creates a new  message with the given required parameters.
+   * @param status Status we are starting with
+   * @param referralsURLs Referrals URLs to be used by peer DSs
+   * @param assuredFlag If assured mode is enabled or not
+   * @param assuredMode Assured type
+   * @param safeDataLevel Assured mode safe data level
+   */
+  public StartSessionMsg(ServerStatus status, List<String> referralsURLs,
+    boolean assuredFlag, AssuredMode assuredMode, byte safeDataLevel)
+  {
+    this.referralsURLs = referralsURLs;
+    this.status = status;
+    this.assuredFlag = assuredFlag;
+    this.assuredMode = assuredMode;
+    this.safeDataLevel = safeDataLevel;
+    this.protocolVersion = ProtocolVersion.getCurrentVersion();
+  }
+
+  /**
+   * Creates a new message with the given required parameters.
+   * Assured mode is false.
+   * @param status Status we are starting with
+   * @param referralsURLs Referrals URLs to be used by peer DSs
+   */
+  public StartSessionMsg(ServerStatus status, List<String> referralsURLs)
+  {
+    this.referralsURLs = referralsURLs;
+    this.status = status;
+    this.assuredFlag = false;
+    this.protocolVersion = ProtocolVersion.getCurrentVersion();
+  }
+
+  /**
+   * Creates a new message with the given required parameters.
+   * Assured mode is false.
+   * @param status Status we are starting with
+   * @param referralsURLs Referrals URLs to be used by peer DSs
+   * @param replicationProtocol The requested protocol version.
+   */
+  public StartSessionMsg(ServerStatus status, List<String> referralsURLs,
+    short replicationProtocol)
+  {
+    this.referralsURLs = referralsURLs;
+    this.status = status;
+    this.assuredFlag = false;
+    this.protocolVersion = replicationProtocol;
+  }
+
+  // ============
+  // Msg encoding
+  // ============
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public byte[] getBytes()
+  throws UnsupportedEncodingException
+  {
+    if (protocolVersion <= ProtocolVersion.REPLICATION_PROTOCOL_V3)
+    {
+      return getBytes_V23();
+    }
+    else
+    {
+      return getBytes_V4();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public byte[] getBytes(short reqProtocolVersion)
+    throws UnsupportedEncodingException
+  {
+    if (reqProtocolVersion <= ProtocolVersion.REPLICATION_PROTOCOL_V3)
+    {
+      return getBytes_V23();
+    }
+    else
+    {
+      return getBytes_V4();
+    }
+  }
+
+  private byte[] getBytes_V4()
+  {
+    try
+    {
+      ByteStringBuilder byteBuilder = new ByteStringBuilder();
+      ASN1Writer writer = ASN1.getWriter(byteBuilder);
+
+      byteBuilder.append(MSG_TYPE_START_SESSION);
+      byteBuilder.append(status.getValue());
+      byteBuilder.append(assuredFlag ? (byte) 1 : (byte) 0);
+      byteBuilder.append(assuredMode.getValue());
+      byteBuilder.append(safeDataLevel);
+
+      writer.writeStartSequence();
+      for (String url : referralsURLs)
+        writer.writeOctetString(url);
+      writer.writeEndSequence();
+
+      writer.writeStartSequence();
+      for (String attrDef : eclIncludes)
+        writer.writeOctetString(attrDef);
+      writer.writeEndSequence();
+
+      return byteBuilder.toByteArray();
+    }
+    catch (Exception e)
+    {
+      return null;
+    }
+  }
+
+  private byte[] getBytes_V23()
+  {
+    /*
+     * The message is stored in the form:
+     * <message type><status><assured flag><assured mode><safe data level>
+     * <list of referrals urls>
+     * (each referral url terminates with 0)
+     */
+
+    try
+    {
+      ByteArrayOutputStream oStream = new ByteArrayOutputStream();
+
+      /* Put the message type */
+      oStream.write(MSG_TYPE_START_SESSION);
+
+      // Put the status
+      oStream.write(status.getValue());
+
+      // Put the assured flag
+      oStream.write(assuredFlag ? (byte) 1 : (byte) 0);
+
+      // Put assured mode
+      oStream.write(assuredMode.getValue());
+
+      // Put safe data level
+      oStream.write(safeDataLevel);
+
+      // Put the referrals URLs
+      if (referralsURLs.size() >= 1)
+      {
+        for (String url : referralsURLs)
+        {
+          byte[] byteArrayURL = url.getBytes("UTF-8");
+          oStream.write(byteArrayURL);
+          oStream.write(0);
+        }
+      }
+      return oStream.toByteArray();
+    } catch (IOException e)
+    {
+      // never happens
+      return null;
+    }
+  }
+
+  // ============
+  // Msg decoding
+  // ============
+
+  private void decode_V4(byte[] in)
+  throws DataFormatException
+  {
+    ByteSequenceReader reader = ByteString.wrap(in).asReader();
+    try
+    {
+      if (reader.get() != MSG_TYPE_START_SESSION)
+        throw new DataFormatException("input is not a valid " +
+            this.getClass().getCanonicalName());
+
+      /*
+      status = ServerStatus.valueOf(asn1Reader.readOctetString().byteAt(0));
+      assuredFlag = (asn1Reader.readOctetString().byteAt(0) == 1);
+      assuredMode=AssuredMode.valueOf((asn1Reader.readOctetString().byteAt(0)));
+      safeDataLevel = asn1Reader.readOctetString().byteAt(0);
+      */
+      status = ServerStatus.valueOf(reader.get());
+      assuredFlag = (reader.get() == 1);
+      assuredMode = AssuredMode.valueOf(reader.get());
+      safeDataLevel = reader.get();
+
+      ASN1Reader asn1Reader = ASN1.getReader(reader);
+
+      asn1Reader.readStartSequence();
+      while(asn1Reader.hasNextElement())
+      {
+        String s = asn1Reader.readOctetStringAsString();
+        this.referralsURLs.add(s);
+      }
+      asn1Reader.readEndSequence();
+
+      asn1Reader.readStartSequence();
+      while(asn1Reader.hasNextElement())
+      {
+        String s = asn1Reader.readOctetStringAsString();
+        this.eclIncludes.add(s);
+      }
+      asn1Reader.readEndSequence();
+    }
+    catch (Exception e)
+    {
+    }
+  }
+
+  private void decode_V23(byte[] in)
+  throws DataFormatException
   {
     /*
      * The message is stored in the form:
@@ -128,88 +394,6 @@
   }
 
   /**
-   * Creates a new StartSessionMsg message with the given required parameters.
-   * @param status Status we are starting with
-   * @param referralsURLs Referrals URLs to be used by peer DSs
-   * @param assuredFlag If assured mode is enabled or not
-   * @param assuredMode Assured type
-   * @param safeDataLevel Assured mode safe data level
-   */
-  public StartSessionMsg(ServerStatus status, List<String> referralsURLs,
-    boolean assuredFlag, AssuredMode assuredMode, byte safeDataLevel)
-  {
-    this.referralsURLs = referralsURLs;
-    this.status = status;
-    this.assuredFlag = assuredFlag;
-    this.assuredMode = assuredMode;
-    this.safeDataLevel = safeDataLevel;
-  }
-
-  /**
-   * Creates a new StartSessionMsg message with the given required parameters.
-   * Assured mode is false.
-   * @param status Status we are starting with
-   * @param referralsURLs Referrals URLs to be used by peer DSs
-   */
-  public StartSessionMsg(ServerStatus status, List<String> referralsURLs)
-  {
-    this.referralsURLs = referralsURLs;
-    this.status = status;
-    this.assuredFlag = false;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public byte[] getBytes()
-  {
-    /*
-     * The message is stored in the form:
-     * <message type><status><assured flag><assured mode><safe data level>
-     * <list of referrals urls>
-     * (each referral url terminates with 0)
-     */
-
-    try
-    {
-      ByteArrayOutputStream oStream = new ByteArrayOutputStream();
-
-      /* Put the message type */
-      oStream.write(MSG_TYPE_START_SESSION);
-
-      // Put the status
-      oStream.write(status.getValue());
-
-      // Put the assured flag
-      oStream.write(assuredFlag ? (byte) 1 : (byte) 0);
-
-      // Put assured mode
-      oStream.write(assuredMode.getValue());
-
-      // Put safe data level
-      oStream.write(safeDataLevel);
-
-      // Put the referrals URLs
-      if (referralsURLs.size() >= 1)
-      {
-        for (String url : referralsURLs)
-        {
-          byte[] byteArrayURL = url.getBytes("UTF-8");
-          oStream.write(byteArrayURL);
-          oStream.write(0);
-        }
-      }
-
-      return oStream.toByteArray();
-    } catch (IOException e)
-    {
-      // never happens
-      return null;
-    }
-  }
-
-  /**
    * Get the list of referrals URLs.
    *
    * @return The list of referrals URLs.
@@ -243,7 +427,8 @@
       "\nassuredFlag: " + assuredFlag +
       "\nassuredMode: " + assuredMode +
       "\nsafeDataLevel: " + safeDataLevel +
-      "\nreferralsURLs: " + urls);
+      "\nreferralsURLs: " + urls +
+      "\nEclIncludes: " + eclIncludes);
   }
 
   /**
@@ -273,4 +458,23 @@
     return safeDataLevel;
   }
 
+  /**
+   * Set the list of entry attributes to include in the ECL.
+   * @param eclIncludes The list of attributes.
+   */
+  public void setEclIncludes(Set<String> eclIncludes)
+  {
+    if (eclIncludes != null)
+      this.eclIncludes = eclIncludes;
+  }
+
+  /**
+   * Get the list of entry attributes to include in the ECL..
+   * @return The list of entry attributes to include in the ECL.
+   */
+  public Set<String> getEclIncludes()
+  {
+    return eclIncludes;
+  }
+
 }

--
Gitblit v1.10.0