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
25 import net.sf.ehcache.Cache;
26 import net.sf.ehcache.Element;
27
28 import org.apache.directory.mavibot.btree.exception.BTreeOperationException;
29 import org.apache.directory.mavibot.btree.exception.EndOfFileExceededException;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 {
45
46 private RecordManager recordManager;
47
48
49 private Cache cache;
50
51
52 private long offset;
53
54
55 private long lastOffset;
56
57
58
59
60
61
62
63 public PersistedPageHolder( BTree<K, V> btree, Page<K, V> page )
64 {
65 super( btree, page );
66 cache = ( ( PersistedBTree<K, V> ) btree ).getCache();
67 recordManager = ( ( PersistedBTree<K, V> ) btree ).getRecordManager();
68 offset = ( ( AbstractPage<K, V> ) page ).getOffset();
69 lastOffset = ( ( AbstractPage<K, V> ) page ).getLastOffset();
70
71 ( ( AbstractPage<K, V> ) page ).setOffset( offset );
72 ( ( AbstractPage<K, V> ) page ).setLastOffset( lastOffset );
73
74 cache.put( new Element( offset, page ) );
75 }
76
77
78
79
80
81
82
83 public PersistedPageHolder( BTree<K, V> btree, Page<K, V> page, long offset, long lastOffset )
84 {
85 super( btree, page );
86 cache = ( ( PersistedBTree<K, V> ) btree ).getCache();
87 recordManager = ( ( PersistedBTree<K, V> ) btree ).getRecordManager();
88 this.offset = offset;
89 this.lastOffset = lastOffset;
90
91 if ( page != null )
92 {
93 ( ( AbstractPage<K, V> ) page ).setOffset( offset );
94 ( ( AbstractPage<K, V> ) page ).setLastOffset( lastOffset );
95 }
96
97 cache.put( new Element( offset, page ) );
98 }
99
100
101
102
103
104
105
106 public Page<K, V> getValue()
107 {
108 Element element = cache.get( offset );
109
110 if ( element == null )
111 {
112
113
114 Page<K, V> page = fetchElement();
115
116 cache.put( new Element( offset, page ) );
117
118 return page;
119 }
120
121 Page<K, V> page = ( Page<K, V> ) element.getObjectValue();
122
123 if ( page == null )
124 {
125
126 page = fetchElement();
127
128 ( ( AbstractPage<K, V> ) page ).setOffset( offset );
129 ( ( AbstractPage<K, V> ) page ).setLastOffset( lastOffset );
130
131 cache.put( new Element( offset, page ) );
132 }
133
134 return page;
135 }
136
137
138
139
140
141
142 private Page<K, V> fetchElement()
143 {
144 try
145 {
146 Page<K, V> element = recordManager.deserialize( btree, offset );
147
148 return element;
149 }
150 catch ( EndOfFileExceededException eofee )
151 {
152 throw new BTreeOperationException( eofee.getMessage() );
153 }
154 catch ( IOException ioe )
155 {
156 throw new BTreeOperationException( ioe.getMessage() );
157 }
158 }
159
160
161
162
163
164
165 {
166 return offset;
167 }
168
169
170
171
172
173
174 {
175 return lastOffset;
176 }
177
178
179
180
181
182 public String toString()
183 {
184 StringBuilder sb = new StringBuilder();
185
186 Page<K, V> page = getValue();
187
188 if ( page != null )
189 {
190 sb.append( btree.getName() ).append( "[" ).append( offset ).append( ", " ).append( lastOffset )
191 .append( "]:" ).append( page );
192 }
193 else
194 {
195 sb.append( btree.getName() ).append( "[" ).append( offset ).append( ", " ).append( lastOffset )
196 .append( "]" );
197 }
198
199 return sb.toString();
200 }
201 }