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.memory;
21
22
23 import java.io.IOException;
24 import java.util.LinkedList;
25
26 import org.apache.directory.mavibot.btree.serializer.ElementSerializer;
27
28
29
30
31
32
33
34
35
36
37 public class BTreeFactory
38 {
39
40
41
42
43
44 public static <K, V> BTree<K, V> createBTree()
45 {
46 BTree<K, V> btree = new BTree<K, V>();
47
48 return btree;
49 }
50
51
52
53
54
55
56
57
58
59
60 public static <K, V> Node<K, V> createNode( BTree<K, V> btree, long revision, int nbElems )
61 {
62 Node<K, V> node = new Node<K, V>( btree, revision, nbElems );
63
64 return node;
65 }
66
67
68
69
70
71
72
73
74
75
76 public static <K, V> Leaf<K, V> createLeaf( BTree<K, V> btree, long revision, int nbElems )
77 {
78 Leaf<K, V> leaf = new Leaf<K, V>( btree, revision, nbElems );
79
80 return leaf;
81 }
82
83
84
85
86
87
88
89
90 public static <K, V> void setRoot( BTree<K, V> btree, Page<K, V> root )
91 {
92 btree.setRoot( root );
93 }
94
95
96
97
98
99
100
101
102 public static <K, V> Page<K, V> getRoot( BTree<K, V> btree )
103 {
104 return btree.rootPage;
105 }
106
107
108
109
110
111 public static <K, V> void setNbElems( BTree<K, V> btree, long nbElems )
112 {
113 btree.setNbElems( nbElems );
114 }
115
116
117
118
119
120 public static <K, V> void setRevision( BTree<K, V> btree, long revision )
121 {
122 btree.setRevision( revision );
123 }
124
125
126
127
128
129 public static <K, V> void setRootPageOffset( BTree<K, V> btree, long rootPageOffset )
130 {
131 btree.setRootPageOffset( rootPageOffset );
132 }
133
134
135
136
137
138 public static <K, V> void setNextBTreeOffset( BTree<K, V> btree, long nextBTreeOffset )
139 {
140 btree.setNextBTreeOffset( nextBTreeOffset );
141 }
142
143
144
145
146
147 public static <K, V> void setName( BTree<K, V> btree, String name )
148 {
149 btree.setName( name );
150 }
151
152
153
154
155
156
157
158
159
160
161
162 public static <K, V> void setKeySerializer( BTree<K, V> btree, String keySerializerFqcn )
163 throws ClassNotFoundException, IllegalAccessException, InstantiationException
164 {
165 Class<?> keySerializer = Class.forName( keySerializerFqcn );
166 @SuppressWarnings("unchecked")
167 ElementSerializer<K> instance = ( ElementSerializer<K> ) keySerializer.newInstance();
168 btree.setKeySerializer( instance );
169
170 btree.setComparator( instance.getComparator() );
171 }
172
173
174
175
176
177
178
179
180
181
182
183 public static <K, V> void setValueSerializer( BTree<K, V> btree, String valueSerializerFqcn )
184 throws ClassNotFoundException, IllegalAccessException, InstantiationException
185 {
186 Class<?> valueSerializer = Class.forName( valueSerializerFqcn );
187 @SuppressWarnings("unchecked")
188 ElementSerializer<V> instance = ( ElementSerializer<V> ) valueSerializer.newInstance();
189 btree.setValueSerializer( instance );
190 }
191
192
193
194
195
196
197
198 public static <K, V> void setPageSize( BTree<K, V> btree, int pageSize )
199 {
200 btree.setPageSize( pageSize );
201 }
202
203
204
205
206
207
208
209 public static <K, V> void setKey( Page<K, V> page, int pos, K key )
210 {
211 ( ( AbstractPage<K, V> ) page ).setKey( pos, key );
212 }
213
214
215
216
217
218
219
220 public static <K, V> void setValue( Leaf<K, V> page, int pos, ElementHolder<V, K, V> value )
221 {
222 page.setValue( pos, value );
223 }
224
225
226
227
228
229
230
231 public static <K, V> void setValue( Node<K, V> page, int pos, ElementHolder<Page<K, V>, K, V> value )
232 {
233 page.setValue( pos, value );
234 }
235
236
237
238
239
240
241
242
243
244 public static <K, V> LinkedList<ParentPos<K, V>> getPathToRightMostLeaf( BTree<K, V> btree ) throws IOException
245 {
246 LinkedList<ParentPos<K, V>> stack = new LinkedList<ParentPos<K, V>>();
247
248 ParentPos<K, V> last = new ParentPos<K, V>( btree.rootPage, btree.rootPage.getNbElems() );
249 stack.push( last );
250
251 if ( btree.rootPage instanceof Leaf )
252 {
253 InternalUtil.setLastDupsContainer( last, btree );
254 }
255 else
256 {
257 Node<K, V> node = ( Node<K, V> ) btree.rootPage;
258
259 while ( true )
260 {
261 Page<K, V> p = node.children[node.getNbElems()].getValue( btree );
262
263 last = new ParentPos<K, V>( p, p.getNbElems() );
264 stack.push( last );
265
266 if ( p instanceof Leaf )
267 {
268 InternalUtil.setLastDupsContainer( last, btree );
269 break;
270 }
271 }
272 }
273
274 return stack;
275 }
276 }