1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.mavibot.btree;
21
22
23 import java.io.IOException;
24 import java.lang.reflect.Array;
25 import java.util.Comparator;
26 import java.util.UUID;
27
28 import org.apache.directory.mavibot.btree.exception.BTreeOperationException;
29 import org.apache.directory.mavibot.btree.exception.EndOfFileExceededException;
30 import org.apache.directory.mavibot.btree.exception.KeyNotFoundException;
31
32
33
34
35
36
37
38
39 class InMemoryValueHolder<V> extends AbstractValueHolder<V>
40 {
41
42
43
44
45
46
47
48
49
50 InMemoryValueHolder( BTree<?, V> parentBtree, int nbValues )
51 {
52 valueSerializer = parentBtree.getValueSerializer();
53
54 if ( nbValues <= 1 )
55 {
56 valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), nbValues );
57 }
58 }
59
60
61
62
63
64
65
66
67
68 InMemoryValueHolder( BTree<?, V> parentBtree, V... values )
69 {
70 valueSerializer = parentBtree.getValueSerializer();
71
72 if ( ( values != null ) && ( values.length > 0 ) )
73 {
74 int nbValues = values.length;
75
76 if ( nbValues == 1 )
77 {
78
79 valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), nbValues );
80 valueArray[0] = values[0];
81 nbArrayElems = nbValues;
82 }
83 else
84 {
85
86 createSubTree();
87
88
89 for ( V value : values )
90 {
91 try
92 {
93 valueBtree.insert( value, value );
94 }
95 catch ( IOException e )
96 {
97 e.printStackTrace();
98 }
99 }
100 }
101 }
102 }
103
104
105
106
107
108 public int size()
109 {
110 if ( valueBtree != null )
111 {
112 return ( int ) valueBtree.getNbElems();
113 }
114 else
115 {
116 return nbArrayElems;
117 }
118 }
119
120
121
122
123
124 protected void createSubTree()
125 {
126 InMemoryBTreeConfiguration<V, V> configuration = new InMemoryBTreeConfiguration<V, V>();
127 configuration.setAllowDuplicates( false );
128 configuration.setName( UUID.randomUUID().toString() );
129 configuration.setKeySerializer( valueSerializer );
130 configuration.setValueSerializer( valueSerializer );
131
132 valueBtree = BTreeFactory.createInMemoryBTree( configuration );
133 }
134
135
136
137
138
139 void setSubBtree( BTree<V, V> subBtree )
140 {
141 valueBtree = subBtree;
142 valueArray = null;
143 }
144
145
146
147
148
149 public V remove( V value )
150 {
151 V removedValue = null;
152
153 if ( valueArray != null )
154 {
155 removedValue = removeFromArray( value );
156 }
157 else
158 {
159 removedValue = removeFromBtree( value );
160 }
161
162 return removedValue;
163 }
164
165
166
167
168
169 private V removeFromBtree( V removedValue )
170 {
171 V returnedValue = null;
172
173 try
174 {
175 Tuple<V, V> removedTuple = valueBtree.delete( removedValue );
176
177 if ( removedTuple != null )
178 {
179 returnedValue = removedTuple.getKey();
180 }
181 }
182 catch ( IOException e )
183 {
184 throw new BTreeOperationException( e );
185 }
186
187 if ( valueBtree.getNbElems() == 1 )
188 {
189 try
190 {
191 valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), 1 );
192 valueArray[0] = valueBtree.browse().next().getKey();
193 nbArrayElems = 1;
194 valueBtree.close();
195 valueBtree = null;
196 }
197 catch ( EndOfFileExceededException e )
198 {
199 throw new BTreeOperationException( e );
200 }
201 catch ( IOException e )
202 {
203 throw new BTreeOperationException( e );
204 }
205 catch ( KeyNotFoundException knfe )
206 {
207 throw new BTreeOperationException( knfe );
208 }
209 }
210
211 return returnedValue;
212 }
213
214
215
216
217
218 private V removeFromArray( V value )
219 {
220
221 Comparator<V> comparator = valueSerializer.getComparator();
222
223 int result = comparator.compare( valueArray[0], value );
224
225 if ( result != 0 )
226 {
227
228 return null;
229 }
230 else
231 {
232 V returnedValue = valueArray[0];
233 nbArrayElems = 0;
234
235 return returnedValue;
236 }
237 }
238
239
240
241
242
243 public boolean contains( V checkedValue )
244 {
245 if ( valueBtree != null )
246 {
247 try
248 {
249 return valueBtree.hasKey( checkedValue );
250 }
251 catch ( IOException e )
252 {
253
254 e.printStackTrace();
255 return false;
256 }
257 catch ( KeyNotFoundException knfe )
258 {
259
260 knfe.printStackTrace();
261 return false;
262 }
263 }
264 else
265 {
266 Comparator<V> comparator = valueSerializer.getComparator();
267
268 int result = comparator.compare( checkedValue, valueArray[0] );
269
270 return result == 0;
271 }
272 }
273
274
275
276
277
278 public String toString()
279 {
280 StringBuilder sb = new StringBuilder();
281
282 sb.append( "ValueHolder[" ).append( valueSerializer.getClass().getSimpleName() );
283
284 if ( valueBtree != null )
285 {
286 sb.append( ", SubBTree" );
287 }
288 else
289 {
290 sb.append( ", {" );
291
292 if ( size() != 0 )
293 {
294 sb.append( valueArray[0] );
295 }
296
297 sb.append( "}" );
298 }
299
300 sb.append( "]" );
301
302 return sb.toString();
303 }
304 }