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