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