001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2006-2008 Sun Microsystems, Inc.
026     */
027    package org.opends.server.replication.protocol;
028    
029    import java.io.Serializable;
030    import java.io.UnsupportedEncodingException;
031    import java.util.zip.DataFormatException;
032    
033    import org.opends.server.types.DN;
034    import org.opends.server.types.DirectoryException;
035    
036    /**
037     * This message is part of the replication protocol.
038     * This message is sent by a server to another server in order to
039     * request this other server to do an export to the server sender
040     * of this message.
041     */
042    public class InitializeRequestMessage extends RoutableMessage implements
043        Serializable
044    {
045      private static final long serialVersionUID = 8303271162942249215L;
046    
047      private String baseDn = null;
048    
049      /**
050       * Creates a InitializeRequestMessage message.
051       *
052       * @param baseDn The base DN of the replication domain.
053       * @param destination destination of this message
054       * @param senderID serverID of the server that will send this message
055       */
056      public InitializeRequestMessage(DN baseDn, short senderID, short destination)
057      {
058        super(senderID, destination);
059        this.baseDn = baseDn.toNormalizedString();
060      }
061    
062      /**
063       * Creates a new InitializeRequestMessage by decoding the provided byte array.
064       * @param in A byte array containing the encoded information for the Message
065       * @throws DataFormatException If the in does not contain a properly
066       *                             encoded InitializeMessage.
067       */
068      public InitializeRequestMessage(byte[] in) throws DataFormatException
069      {
070        super();
071        try
072        {
073          /* first byte is the type */
074          if (in[0] != MSG_TYPE_INITIALIZE_REQUEST)
075            throw new DataFormatException(
076                "input is not a valid InitializeRequestMessage");
077          int pos = 1;
078    
079          // baseDn
080          int length = getNextLength(in, pos);
081          baseDn = new String(in, pos, length, "UTF-8");
082          pos += length +1;
083    
084          // sender
085          length = getNextLength(in, pos);
086          String sourceServerIdString = new String(in, pos, length, "UTF-8");
087          senderID = Short.valueOf(sourceServerIdString);
088          pos += length +1;
089    
090          // destination
091          length = getNextLength(in, pos);
092          String destinationServerIdString = new String(in, pos, length, "UTF-8");
093          destination = Short.valueOf(destinationServerIdString);
094          pos += length +1;
095    
096    
097        } catch (UnsupportedEncodingException e)
098        {
099          throw new DataFormatException("UTF-8 is not supported by this jvm.");
100        }
101      }
102    
103      /**
104       * Get the base DN from this InitializeRequestMessage.
105       *
106       * @return the base DN from this InitializeRequestMessage.
107       */
108      public DN getBaseDn()
109      {
110        if (baseDn == null)
111          return null;
112        try
113        {
114          return DN.decode(baseDn);
115        } catch (DirectoryException e)
116        {
117          return null;
118        }
119      }
120    
121      /**
122       * {@inheritDoc}
123       */
124      @Override
125      public byte[] getBytes()
126      {
127        try {
128          byte[] baseDNBytes = baseDn.getBytes("UTF-8");
129          byte[] senderBytes = String.valueOf(senderID).getBytes("UTF-8");
130          byte[] destinationBytes = String.valueOf(destination).
131          getBytes("UTF-8");
132    
133          int length = 1 + baseDNBytes.length + 1 + senderBytes.length + 1
134            + destinationBytes.length + 1;
135    
136          byte[] resultByteArray = new byte[length];
137    
138          // type of the operation
139          resultByteArray[0] = MSG_TYPE_INITIALIZE_REQUEST;
140          int pos = 1;
141    
142          // baseDN
143          pos = addByteArray(baseDNBytes, resultByteArray, pos);
144    
145          // sender
146          pos = addByteArray(senderBytes, resultByteArray, pos);
147    
148          // destination
149          pos = addByteArray(destinationBytes, resultByteArray, pos);
150    
151          return resultByteArray;
152        }
153        catch (UnsupportedEncodingException e)
154        {
155          return null;
156        }
157      }
158    
159      /**
160       * Get a string representation of this object.
161       * @return A string representation of this object.
162       */
163      public String toString()
164      {
165        return "InitializeRequestMessage: baseDn="+baseDn+" senderId="+senderID +
166        " destination=" + destination;
167      }
168    }