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.Page;
28 import org.apache.directory.mavibot.btree.exception.EndOfFileExceededException;
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class PageHolder<K, V>
43 {
44
45 private BTree<K, V> btree;
46
47
48 private long offset;
49
50
51 private long lastOffset;
52
53
54
55
56
57
58
59
60 public PageHolder( BTree<K, V> btree, Page<K, V> element, long offset, long lastOffset )
61 {
62 this.btree = btree;
63 this.offset = offset;
64 this.lastOffset = lastOffset;
65
66 if ( element instanceof Page<?, ?> )
67 {
68 ( ( AbstractPage<K, V> ) element ).setOffset( offset );
69 ( ( AbstractPage<K, V> ) element ).setLastOffset( lastOffset );
70 }
71
72 btree.getCache().put( new Element( offset, element ) );
73 }
74
75
76
77
78
79
80
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 = (org.apache.directory.mavibot.btree.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 }