KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jofti > store > LRUStoreManager


1 package com.jofti.store;
2
3 import java.nio.ByteBuffer JavaDoc;
4 import java.util.LinkedHashMap JavaDoc;
5 import java.util.Map JavaDoc;
6 import java.util.Properties JavaDoc;
7 import java.util.Map.Entry;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11
12 import com.jofti.btree.BTree;
13 import com.jofti.btree.IPage;
14 import com.jofti.btree.LeafNodeEntry;
15 import com.jofti.core.IStoreKey;
16 import com.jofti.exception.JoftiException;
17
18 public class LRUStoreManager extends AbstractStoreManager
19 {
20
21     private static Log log = LogFactory
22                                           .getLog(AbstractStoreManager.class);
23
24     protected Map JavaDoc lruMap = null;
25
26     private Object JavaDoc objectLock = new Object JavaDoc();
27
28     public void init(Properties JavaDoc properties) throws JoftiException
29     {
30
31         if (log.isInfoEnabled()) {
32             log.info("Initialising LRU store manager");
33         }
34
35         super.init(properties);
36
37         lruMap = new LinkedHashMap JavaDoc() {
38             protected final int limit = maxNodes;
39
40             /*
41              * (non-Javadoc)
42              *
43              * @see java.util.LinkedHashMap#removeEldestEntry(java.util.Map.Entry)
44              */

45             protected boolean removeEldestEntry(Entry eldest)
46             {
47                 // TODO Auto-generated method stub
48
if (size() > limit) {
49                     StoreWrapper wrapper = (StoreWrapper) eldest.getValue();
50                     CachedPage page = (CachedPage) wrapper.page;
51                     if (!page.hasReferences()) {
52                         pageManager.releasePage(page.page);
53                     } else {
54                         log.debug("reference held - unable to release page "
55                                 + page.page);
56                     }
57                     return true;
58                 }
59
60                 return false;
61             }
62         };
63
64         if (log.isInfoEnabled()) {
65             log.info("Initialised LRu store manager");
66         }
67     }
68
69     public IStoreKey store(IStoreKey key, IPage page) throws JoftiException
70     {
71
72         StoreWrapper wrapper = null;
73
74         // get the number of positions we need to store the data
75
int limit = page.getBuffer().limit();
76         FilePositionHolder[] array = allocatePositions(key.getFilePositions(),
77                 limit);
78         key.setFilePositions(array);
79
80         // make sure we are storing a copy here
81
ByteBuffer JavaDoc buf = pageManager.acquireBuffer(limit);
82
83         doStore(key, page.copyBuffer(buf));
84         // release the buffer we have just stored
85
pageManager.releaseBuffer(buf);
86
87         wrapper = new StoreWrapper(key, page);
88
89         // doStore(key,obj);
90
synchronized (objectLock) {
91             ((CachedPage) page).releaseReference();
92             lruMap.put(key, wrapper);
93         }
94
95         return null;
96     }
97
98     protected IPage getNewPage(int size)
99     {
100         IPage temp = doGetNewPage(size);
101
102         // wrap the page
103
CachedPage cPage = new CachedPage(temp);
104         cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()];
105         // add a usage reference here
106
cPage.acquireReference();
107         return cPage;
108     }
109
110     public void releasePage(IStoreKey key, IPage page)
111     {
112      synchronized (objectLock) {
113             ((CachedPage) page).releaseReference();
114         }
115     }
116
117     public StoreWrapper retrieve(IStoreKey key) throws JoftiException
118     {
119         StoreWrapper obj = null;
120         synchronized (objectLock) {
121             obj = (StoreWrapper) lruMap.get(key);
122             if (obj != null) {
123                 ((CachedPage) obj.page).acquireReference();
124                 return obj;
125             }
126         }
127
128         // otherwise replace the val
129

130         IPage page = doRetrieve(key);
131         // got to get from store
132

133         CachedPage cPage = new CachedPage(page);
134         cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()];
135         cPage.acquireReference();
136
137         obj = new StoreWrapper(key, cPage);
138         synchronized (objectLock) {
139             lruMap.put(key, obj);
140         }
141         return obj;
142
143     }
144
145     public void remove(IStoreKey key, IPage page) throws JoftiException
146     {
147         releasePage(key, page);
148         synchronized (objectLock) {
149
150             StoreWrapper wrapper = (StoreWrapper) lruMap.remove(key);
151             CachedPage cPage = (CachedPage) wrapper.page;
152             cPage.releaseReference();
153             if (!cPage.hasReferences()) {
154                 pageManager.releasePage(cPage.page);
155             }
156         }
157         doRemove(key);
158
159     }
160
161     public void removeAll() throws JoftiException
162     {
163         java.util.Iterator JavaDoc it = lruMap.entrySet().iterator();
164         int size = lruMap.size();
165         for (int i = 0; i < size; i++) {
166             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
167             StoreWrapper wrap = (StoreWrapper) entry.getValue();
168
169             CachedPage old = (CachedPage) wrap.page;
170             old.releaseReference();
171             if (!old.hasReferences()) {
172                 pageManager.releasePage(old.page);
173             }
174
175         }
176         lruMap.clear();
177         doRemoveAll();
178     }
179
180
181 }
182
Popular Tags