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.ref.SoftReference;
25 import java.util.UUID;
26
27 import org.apache.directory.mavibot.btree.exception.BTreeAlreadyManagedException;
28
29
30
31
32
33
34
35
36
37
38
39 public class DuplicateKeyMemoryHolder<K, V> implements ElementHolder<V, K, V>
40 {
41
42 private BTree<K, V> btree;
43
44
45 private long valContainerOffset = -1;
46
47
48 private BTree<V, V> valueContainer;
49
50
51 private SoftReference<BTree<V, V>> reference;
52
53
54
55
56
57
58
59
60 public DuplicateKeyMemoryHolder( BTree<K, V> btree, V value )
61 {
62 this.btree = btree;
63
64 try
65 {
66 BTree<V, V> valueContainer = new BTree<V, V>( UUID.randomUUID().toString(), btree.getValueSerializer(),
67 btree.getValueSerializer() );
68
69 if ( btree.isManaged() )
70 {
71 try
72 {
73 btree.getRecordManager().manage( valueContainer, true );
74 valContainerOffset = valueContainer.getBtreeOffset();
75 }
76 catch ( BTreeAlreadyManagedException e )
77 {
78
79 throw new RuntimeException( e );
80 }
81
82 reference = new SoftReference<BTree<V, V>>( valueContainer );
83 }
84 else
85 {
86 this.valueContainer = valueContainer;
87 }
88
89 valueContainer.insert( value, null, 0 );
90 }
91 catch ( IOException e )
92 {
93 throw new RuntimeException( e );
94 }
95 }
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 {
112 this.btree = btree;
113
114 if ( btree.isManaged() )
115 {
116 valContainerOffset = valueContainer.getBtreeOffset();
117 reference = new SoftReference<BTree<V, V>>( valueContainer );
118 }
119 else
120 {
121 this.valueContainer = valueContainer;
122 }
123 }
124
125
126
127
128
129 @Override
130 public V getValue( BTree<K, V> btree )
131 {
132 if ( !btree.isManaged() )
133 {
134
135 return ( V ) valueContainer;
136 }
137
138 BTree<V, V> valueContainer = reference.get();
139
140 if ( valueContainer == null )
141 {
142 valueContainer = btree.getRecordManager().loadDupsBTree( valContainerOffset );
143 reference = new SoftReference<BTree<V, V>>( valueContainer );
144 }
145
146 return ( V ) valueContainer;
147 }
148
149
150
151
152
153 public String toString()
154 {
155 StringBuilder sb = new StringBuilder();
156
157 sb.append( "'" );
158
159 V value = getValue( btree );
160
161 sb.append( value );
162
163 sb.append( "'" );
164
165 return sb.toString();
166 }
167 }