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 protected void manageSubTree()
140 {
141
142 }
143
144
145
146
147
148 void setSubBtree( BTree<V, V> subBtree )
149 {
150 valueBtree = subBtree;
151 valueArray = null;
152 }
153
154
155
156
157
158 public V remove( V value )
159 {
160 V removedValue = null;
161
162 if ( valueArray != null )
163 {
164 removedValue = removeFromArray( value );
165 }
166 else
167 {
168 removedValue = removeFromBtree( value );
169 }
170
171 return removedValue;
172 }
173
174
175
176
177
178 private V removeFromBtree( V removedValue )
179 {
180 V returnedValue = null;
181
182 try
183 {
184 Tuple<V, V> removedTuple = valueBtree.delete( removedValue );
185
186 if ( removedTuple != null )
187 {
188 returnedValue = removedTuple.getKey();
189 }
190 }
191 catch ( IOException e )
192 {
193 throw new BTreeOperationException( e );
194 }
195
196 if ( valueBtree.getNbElems() == 1 )
197 {
198 try
199 {
200 valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), 1 );
201 valueArray[0] = valueBtree.browse().next().getKey();
202 nbArrayElems = 1;
203 valueBtree.close();
204 valueBtree = null;
205 }
206 catch ( EndOfFileExceededException e )
207 {
208 throw new BTreeOperationException( e );
209 }
210 catch ( IOException e )
211 {
212 throw new BTreeOperationException( e );
213 }
214 catch ( KeyNotFoundException knfe )
215 {
216 throw new BTreeOperationException( knfe );
217 }
218 }
219
220 return returnedValue;
221 }
222
223
224
225
226
227 private V removeFromArray( V value )
228 {
229
230 Comparator<V> comparator = valueSerializer.getComparator();
231
232 int result = comparator.compare( valueArray[0], value );
233
234 if ( result != 0 )
235 {
236
237 return null;
238 }
239 else
240 {
241 V returnedValue = valueArray[0];
242 nbArrayElems = 0;
243
244 return returnedValue;
245 }
246 }
247
248
249
250
251
252 public boolean contains( V checkedValue )
253 {
254 if ( valueBtree != null )
255 {
256 try
257 {
258 return valueBtree.hasKey( checkedValue );
259 }
260 catch ( IOException e )
261 {
262
263 e.printStackTrace();
264 return false;
265 }
266 catch ( KeyNotFoundException knfe )
267 {
268
269 knfe.printStackTrace();
270 return false;
271 }
272 }
273 else
274 {
275 Comparator<V> comparator = valueSerializer.getComparator();
276
277 int result = comparator.compare( checkedValue, valueArray[0] );
278
279 return result == 0;
280 }
281 }
282
283
284
285
286
287 public String toString()
288 {
289 StringBuilder sb = new StringBuilder();
290
291 sb.append( "ValueHolder[" ).append( valueSerializer.getClass().getSimpleName() );
292
293 if ( valueBtree != null )
294 {
295 sb.append( ", SubBTree" );
296 }
297 else
298 {
299 sb.append( ", {" );
300
301 if ( size() != 0 )
302 {
303 sb.append( valueArray[0] );
304 }
305
306 sb.append( "}" );
307 }
308
309 sb.append( "]" );
310
311 return sb.toString();
312 }
313 }