View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.directory.mitosis.common;
21  
22  
23  import java.util.HashMap;
24  import java.util.Iterator;
25  import java.util.Map;
26  import java.util.Set;
27  
28  import org.apache.directory.mitosis.service.protocol.handler.ReplicationClientContextHandler;
29  import org.apache.directory.shared.ldap.util.EqualsBuilder;
30  import org.apache.directory.shared.ldap.util.HashCodeBuilder;
31  
32  
33  /**
34   * Creates a set of {@link CSN}s, which is defined in LDUP specification.
35   * Each {@link CSN} in the same {@link CSNVector} has different
36   * Replica Id from each other.  Its data structure is 
37   * similar to a {@link Map} whose key is the Replica Id.
38   * <p>
39   * {@link CSNVector} is usually used to represent 'Update Vector (UV)' and
40   * 'Purge Vector (PV)'.  Please refer to the LDUP specification and other 
41   * Mitosis classes such as {@link ReplicationClientContextHandler}.
42   *
43   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
44   */
45  public class CSNVector
46  {
47      /**
48       * Declares the Serial Version Uid.
49       *
50       * @see <a
51       *      href="http://c2.com/cgi/wiki?AlwaysDeclareSerialVersionUid">Always
52       *      Declare Serial Version Uid</a>
53       */
54      private static final long serialVersionUID = 1L;
55  
56      /** The internal structure holding the CSNs */
57      private final Map<String,CSN> csns = new HashMap<String,CSN>();
58  
59      /**
60       * Creates a new empty instance.
61       */
62      public CSNVector()
63      {
64      }
65  
66      /**
67       * Adds the specified <tt>csn</tt> to this vector.  If there's a
68       * {@link CSN} with the same ReplicaId, it is replaced by
69       * the specified <tt>csn</tt>.
70       */
71      public void setCSN( CSN csn )
72      {
73          csns.put( csn.getReplicaId(), csn );
74      }
75  
76  
77      /**
78       * Adds all {@link CSN}s that the specified <tt>vector</tt> contains to
79       * this vector.  If there's a {@link CSN} with the same ReplicaId
80       * in this vector, it is replaced by the {@link CSN} in the specified
81       * <tt>vector</tt>.
82       */
83      public void setAllCSN( CSNVector vector )
84      {
85          Iterator<CSN> i = vector.csns.values().iterator();
86          while ( i.hasNext() )
87          {
88              setCSN( i.next() );
89          }
90      }
91  
92      /**
93       * Returns the {@link CSN} with the specified <tt>replicaId</tt> from
94       * this vector.
95       * 
96       * @return <tt>null</tt> if there's no match
97       */
98      public CSN getCSN( String replicaId )
99      {
100         return csns.get( replicaId );
101     }
102 
103 
104     /**
105      * Removed the {@link CSN} with the specified <tt>replicaId</tt> from
106      * this vector and returns the removed {@link CSN}.
107      * 
108      * @return <tt>null</tt> if there's no match
109      */
110     public CSN removeCSN( String replicaId )
111     {
112         return csns.remove( replicaId );
113     }
114 
115 
116     /**
117      * Returns the {@link Set} of the ReplicaIds extracted from
118      * the {@link CSN}s in this vector.
119      */
120     public Set<String> getReplicaIds()
121     {
122         return csns.keySet();
123     }
124 
125     /**
126      * Returns the number of {@link CSN}s that this vector contains.
127      */
128     public int size()
129     {
130         return csns.size();
131     }
132 
133     /**
134      * Returns <tt>true</tt> if and if only the specified <tt>object</tt> is
135      * a {@link CSNVector} and contains the {@link CSN}s with the same values.
136      */
137     public boolean equals( Object object )
138     {
139         if ( object == this )
140         {
141             return true;
142         }
143         
144         if ( !( object instanceof CSNVector ) )
145         {
146             return false;
147         }
148         
149         CSNVector rhs = ( CSNVector ) object;
150         return new EqualsBuilder().append( this.csns, rhs.csns ).isEquals();
151     }
152 
153     /**
154      * Returns the hash code of this vector, calculated from each {@link CSN}
155      * element. 
156      * @return the instance's hashcode 
157      */
158     public int hashCode()
159     {
160         return new HashCodeBuilder( -33446267, -459427867 ).append( this.csns ).toHashCode();
161     }
162     
163 
164     /**
165      * Creates a deep copy of this vector and returns it.
166      */
167     public CSNVector clone()
168     {
169         CSNVector result = new CSNVector();
170         result.csns.putAll( this.csns );
171         return result;
172     }
173     
174 
175     public String toString()
176     {
177         return csns.toString();
178     }
179 }