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.plugin;
028    
029    import java.util.LinkedHashSet;
030    import java.util.Set;
031    
032    import org.opends.server.core.DirectoryServer;
033    import org.opends.server.replication.common.ChangeNumber;
034    import org.opends.server.types.Attribute;
035    import org.opends.server.types.AttributeType;
036    import org.opends.server.types.AttributeValue;
037    import org.opends.server.types.Modification;
038    import org.opends.server.types.ModificationType;
039    
040    
041    /**
042     * This Class is used to encode/decode historical information
043     * from the String form to the internal usable form.
044     *
045     * @author Gilles Bellaton
046     */
047    public class HistVal
048    {
049      private AttributeType attrType;
050      private String attrString;
051      private AttributeValue attributeValue;
052      private ChangeNumber cn;
053      private LinkedHashSet<String> options;
054      private HistKey histKey;
055      private String stringValue;
056    
057      /**
058       * Create a new HistVal form the String encoded form.
059       *
060       * @param strVal The String encoded form of historical information.
061       */
062      public HistVal(String strVal)
063      {
064        /*
065         * an historical attribute value looks like :
066         *  description:00000108b3a6554100000001:add:added_value
067         *  or
068         *  description:00000108b3a6cbb800000001:del:deleted_value
069         *  or
070         *  description:00000108b3a6cbb800000001:repl:new_value
071         *  or
072         *  description:00000108b3a6cbb800000001:delAttr
073         *  or
074         *  description:00000108b3a6554100000001:add
075         *  or
076         *
077         *  so after split
078         *  token[0] will contain the attribute name
079         *  token[1] will contain the changenumber
080         *  token[2] will contain the type of historical information
081         *  token[3] will contain the attribute value
082         *
083         *  options are stored with the attribute names using; as a separator
084         *  example :
085         *  description;FR;France:00000108b3a6554100000001:add:added_value
086         */
087        String[] token = strVal.split(":", 4);
088    
089        options = new LinkedHashSet<String>();
090        if (token[0].contains(";"))
091        {
092          String[] optionsToken = token[0].split(";");
093          int index = 1;
094          while (index < optionsToken.length)
095          {
096            options.add(optionsToken[index]);
097            index ++;
098          }
099          attrString = optionsToken[0];
100        }
101        else
102        {
103          attrString = token[0];
104        }
105    
106        attrType = DirectoryServer.getSchema().getAttributeType(attrString);
107        if (attrType == null)
108          attrType = DirectoryServer.getDefaultAttributeType(attrString);
109    
110        cn = new ChangeNumber(token[1]);
111        histKey = HistKey.decodeKey(token[2]);
112        stringValue = null;
113        if (histKey != HistKey.DELATTR)
114        {
115          if (token.length == 4)
116          {
117            stringValue = token[3];
118            attributeValue = new AttributeValue(attrType, stringValue);
119          }
120          else
121            attributeValue = null;
122        }
123        else
124        {
125          stringValue = null;
126          attributeValue = null;
127        }
128      }
129    
130      /**
131       * Get the String form of the attribute type.
132       *
133       * @return Returns the String form of the attribute type.
134       */
135      public String getAttrString()
136      {
137        return attrString;
138      }
139    
140      /**
141       * Get the type of this HistVal.
142       * @return Returns the type of this HistVal.
143       */
144      public AttributeType getAttrType()
145      {
146        return attrType;
147      }
148    
149      /**
150       * Get the ChangeNUmber of this HistVal.
151       * @return Returns the ChangeNumber of this HistVal.
152       */
153      public ChangeNumber getCn()
154      {
155        return cn;
156      }
157    
158      /**
159       * Get the HistKey.
160       * @return Returns the histKey.
161       */
162      public HistKey getHistKey()
163      {
164        return histKey;
165      }
166    
167      /**
168       * Get the options or an empty set if there are no options.
169       * @return Returns the options.
170       */
171      public Set<String> getOptions()
172      {
173        return options;
174      }
175    
176      /**
177       * Get the String form of the attribute.
178       * @return The String form of the attribute.
179       */
180      public String getStringValue()
181      {
182        return stringValue;
183      }
184    
185      /**
186       * Get the Attribute Value.
187       * @return The Attribute Value.
188       */
189      public AttributeValue getAttributeValue()
190      {
191        return attributeValue;
192      }
193    
194      /**
195       * Generate a Modification equivalent to this HistVal.
196       *
197       * @return A Modification equivalent to this HistVal.
198       */
199      public Modification generateMod()
200      {
201        Attribute attr = new Attribute(attrType, attrString, options, null);
202        Modification mod;
203        if (histKey != HistKey.DELATTR)
204        {
205          LinkedHashSet<AttributeValue> values =
206                                     new LinkedHashSet<AttributeValue>(1);
207          values.add(attributeValue);
208          attr.setValues(values);
209        }
210        switch (histKey)
211        {
212          case ADD : mod = new Modification(ModificationType.ADD, attr);
213          break;
214          case DEL : mod = new Modification(ModificationType.DELETE, attr);
215          break;
216          case REPL: mod = new Modification(ModificationType.REPLACE, attr);
217          break;
218          case DELATTR: mod = new Modification(ModificationType.DELETE, attr);
219          break;
220          default: mod = null;
221        }
222        return mod;
223      }
224    }