KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > datasystem > indexsystem > FileNodeManager


1 package com.daffodilwoods.daffodildb.server.datasystem.indexsystem;
2
3 import com.daffodilwoods.daffodildb.server.datasystem.btree.*;
4 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*;
5 import com.daffodilwoods.database.resource.DException;
6 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.
7
    ClusterCharacteristics;
8 import java.util.*;
9 import com.daffodilwoods.daffodildb.utils.byteconverter.CbCzufIboemfs;
10 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.Cluster;
11 import com.daffodilwoods.daffodildb.utils.byteconverter.CUbcmfLfzIboemfs;
12 import com.daffodilwoods.daffodildb.utils.byteconverter.CbCUsffWbmvfIboemfs;
13 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.
14
    PersistentDatabase;
15 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.*;
16
17 /**
18  * FileNodeManager is used to create new node and providing any existing filenode with the help
19  * of clusterProvider for read or write operations. it maintains a map to have mapping of btreeNodes
20  * corresponing to clusterCharacteristics of cluster of these nodes.to provide any node first it checks
21  * in map if it gets node from map then returns otherwise makes new BtreeNode Object and puts in Map.
22  * It also maintains BtreeControlClutser operations with the help of BTreeControlCluster class. It provides
23  * a root node also , if root node already exists then returns it otherwise makes new node and stores root
24  * node address and btree size in control cluster.
25  *
26  *
27  * <p>Title: FileNodeManager
28  */

29
30 public class FileNodeManager implements _NodeManager {
31
32    /**
33     * Used for getting a new node or already existed node
34     */

35
36    private _ClusterProvider clusterProvider;
37
38    /**
39     * IndexInformation of Btree for which this Manager is
40     */

41    private IndexColumnInformation iinf;
42
43    /**
44     * Control Cluster of Btree
45     */

46    private BTreeControlCluster btreeControl;
47
48    /**
49     * size of btree
50     */

51
52    private int size;
53
54    /**
55     * both contains the already loaded node
56     */

57    private Map nodeMap;
58
59    /**
60     * Btree for which this manager is.It is also required while creating a new node.
61     */

62    private _Index btree;
63
64    /**
65     * Maximum nodes which can reside in node map .
66     */

67    private static int Node_Limit = 10;
68    private CbCUsffWbmvfIboemfs handler;
69
70    private boolean isTempDatabase;
71
72    /**
73     * Constructs FileNodeManager and initializes IndexInforamtions , clusterProvider and constructs
74     * BtreeControlCluster with the help of given Btree control Cluster address.
75     * @param iinf1 indexinformations to provide handlers to convert bytes of keys into Object in BtreeElement
76     * class
77     * @param clusterProvider0 To provide cluster of btreeNodes for read and write
78     * @param address address of btree control cluster
79     */

80
81    public FileNodeManager(IndexColumnInformation iinf1,
82                           _ClusterProvider clusterProvider0, int address,
83                           CbCUsffWbmvfIboemfs handler0,boolean isDefault) throws DException {
84       iinf = iinf1;
85       clusterProvider = clusterProvider0;
86       double version = clusterProvider.getVersionHandler().getDbVersion();
87       btreeControl = address == -1 ? new TempIndexBtreeControlCluster(address, clusterProvider) :
88                      version > 3.2 && !isDefault ? (BTreeControlCluster)new IndexBtreeControlCluster(address, clusterProvider):
89                      new DefaultBTreeControlCluster(address, clusterProvider);
90
91       size = btreeControl.getSize();
92       nodeMap = new HashMap();
93       handler = handler0;
94       isTempDatabase =( (PersistentDatabase)clusterProvider).getDatabaseName().equalsIgnoreCase(DatabaseConstants.TEMPDATABASE ) ;
95    }
96
97    /**
98     * provides child node of given element if exists otherwise returns null. first it checks node
99     * corresponding to clustercharacteristics of child node in Map. if it finds in map then ckecks if this
100     * node is required for write then adds cluster corresponding to this node in user and then returns.
101     * If it does not get from map then gets cluster for read or write from clusterProvider, makes File
102     * Node and btreeNode Object, puts its entry in map and returns BTreeNode.
103     *
104     * @param user if node is required for write then adds cluster corresponding to node in user
105     * @param ele whose child node is required
106     * @return ChildNode of given element
107     */

108
109    /**
110     * Returns root node of btree. First it checks in control cluster if root node address is null then
111     * returns null.Then it checks cluster corresponding to this rootClusteraddress in map if it finds in
112     * map then ckecks if this node is required for write then adds cluster corresponding to this node in
113     * user and then returns.If it does not get from map then gets cluster for read or write from
114     * clusterProvider, makes File Node and btreeNode Object, puts its entry in map and returns BTreeNode.
115     * gets root node address from control cluster otherwise returns null.
116     * @param user if node is required for write then adds cluster corresponding to node in user
117     * @return rootNode if exists otherwise null
118     */

119
120    public BTreeNode getRootNode(_DatabaseUser user) throws DException {
121       int rootClusterAddress = btreeControl.getRootClusterAddress();
122       if (rootClusterAddress == 0)
123          return null;
124       ClusterCharacteristics cc = new ClusterCharacteristics(rootClusterAddress, true);
125       BTreeNode btreeNode = (BTreeNode) nodeMap.get(cc);
126       if (btreeNode != null) {
127          if (user != null) {
128             Cluster cls = ( (FixedFileNode) btreeNode.getNode()).cluster;
129             if (cls.readMode)
130                cls = clusterProvider.getCluster(user, cc);
131             user.addCluster(cls);
132          }
133          return btreeNode;
134       }
135       return getNode(user,cc);
136       /*
137       FixedBTreeCluster cluster = null;
138       cluster = user == null ?
139           (FixedBTreeCluster) clusterProvider.getReadCluster(cc) :
140           (FixedBTreeCluster) clusterProvider.getCluster(user, cc);
141       FixedFileNode fileNode = iinf.isVariableColumn() ?
142           new VariableFileNode(cluster, iinf, handler) :
143           new FixedFileNode(cluster, iinf, handler);
144       btreeNode = new BTreeNode(btree, fileNode);
145       updateNodeMapping(cc, btreeNode);
146       return btreeNode;
147 }*/

148    }
149
150    /**
151     * Makes new cluster with the help of clusterProvider, Initializes cluster header.makes File Node
152     * and BtreeNode and puts BtreeNode Entry in Map.
153     * @param user to get Node For Write Operations
154     * @return New Btree Node
155     */

156
157    public synchronized BTreeNode getNewNode(_DatabaseUser user) throws DException {
158       FixedBTreeCluster cluster = (FixedBTreeCluster) clusterProvider.getNewCluster(user);
159       cluster.setHeader();
160       FixedFileNode fileNode = iinf.isVariableColumn() ?
161           new VariableFileNode(cluster, iinf, handler) :
162           new FixedFileNode(cluster, iinf, handler);
163       BTreeNode node = new BTreeNode(btree, fileNode);
164       updateNodeMapping(cluster.getClusterCharacteristics(), node);
165       return node;
166    }
167
168    /**
169     * Updates Total Btree size, if incremnent variable is true then it increments size by 1 otherwise
170     * decreases size by 1
171     * Updates root node address and BtreeSize in BtreeControl Cluster with the help of BtreeControlCluster
172     * @param increment whether btreeSize has to increase or decrease
173     * @param user To get control cluster for write
174     */

175    public void updateSizeAndBTreeInfo(_DatabaseUser user, boolean increment,
176                                       BTreeNode rootNode) throws DException {
177       size += increment ? 1 : -1;
178       if (size == 0)
179          addInFreeList(user, rootNode);
180       btreeControl.updateBTreeInfo(user, rootNode, size);
181    }
182
183    /**
184     * returns total BtreeSize
185     * @returns total BtreeSize
186     */

187    public int getSize() {
188       return size;
189    }
190
191    /**
192     * provides node corresponding to given nodeKey. First it checks node corresponding to
193     * clustercharacteristics of node in Map. if it finds in map then ckecks if this
194     * node is required for write then adds cluster corresponding to this node in user and then returns.
195     * If it does not get from map then gets cluster for read or write from clusterProvider, makes File
196     * Node and btreeNode Object, puts its entry in map and returns BTreeNode.
197     *
198     * @param user if node is required for write then adds cluster corresponding to node in user
199     * @param nodeKey whose corresponding node is required
200     * @return BTreeNode corresponding to given nodeKey
201     */

202
203    public synchronized BTreeNode getNode(_DatabaseUser user, Object JavaDoc nodekey) throws
204        DException {
205       ClusterCharacteristics cc = (ClusterCharacteristics) nodekey;
206       BTreeNode btreeNode = (BTreeNode) nodeMap.get(cc);
207       if (btreeNode != null ) {
208         if( user != null){
209           _Node node = btreeNode.getNode();
210           Cluster cls = ( (FixedFileNode) node).cluster;
211           if (cls.readMode)
212             cls = clusterProvider.getCluster(user, cc);
213           user.addCluster(cls);
214         }
215          return btreeNode;
216       }
217       FixedBTreeCluster cluster = user == null ?
218           (FixedBTreeCluster) clusterProvider.getReadCluster(cc)
219           : (FixedBTreeCluster) clusterProvider.getCluster(user, cc);
220       FixedFileNode fileNode = iinf.isVariableColumn() ?
221           new VariableFileNode(cluster, iinf, handler) :
222           new FixedFileNode(cluster, iinf, handler);
223       btreeNode = new BTreeNode(btree, fileNode);
224       updateNodeMapping(cc, btreeNode);
225       return btreeNode;
226    }
227
228    /**
229     * sets Btree which is required to set In BtreeNode
230     * @param btree0 To set in BtreeNode
231     */

232    public void setBTree(_Index btree0) {
233       btree = btree0;
234    }
235
236    /**
237     * returns handlers corresponing to columns types of columns in Btree from IndexInformations
238     * @return handlers corresponing to columns types of columns in Btree from IndexInformations
239     */

240
241    public CbCzufIboemfs[] getByteHandlers() throws DException {
242       return iinf.getHandlers();
243    }
244
245    /**
246     * returns column types of columns on which Btree is maintained from IndexInformations
247     * @return column types of columns on which Btree is maintained from IndexInformations
248     */

249
250    public int[] getColumnTypes() throws DException {
251       return iinf.getTypeOfColumns();
252    }
253
254    final void updateNodeMapping(ClusterCharacteristics clusterCharacteristics,
255                                 BTreeNode node) throws DException {
256       if (nodeMap.size() > Node_Limit) {
257          synchronized (this) {
258             if (nodeMap.size() > Node_Limit) {
259                ArrayList arr = new ArrayList(5);
260                Iterator iter = nodeMap.keySet().iterator();
261                int cnt = 0;
262                while (iter.hasNext() && ++cnt < Node_Limit / 2) {
263                  BTreeNode obj = (BTreeNode) nodeMap.get(iter.next());
264                  /* Here we check that those nodes which are currently
265                         used in insert method of btree does not removed so
266                       we have to skip those nodes by checking of this flag */

267                  if(!obj.isNodeCanBeRemovedFromMap() ){
268                    cnt--;
269                    continue;
270                  }
271                   arr.add( obj);
272
273                }
274                for (int i = 0; i < arr.size(); i++) {
275                   BTreeNode kv = (BTreeNode) arr.get(i);
276                   kv.setFlagForNodeRemovedFromMap();
277                   FixedFileNode fixedFileNode = (FixedFileNode) kv.getNode();
278                   Cluster cluster = fixedFileNode.cluster;
279                ClusterCharacteristics cc = cluster.
280                    getClusterCharacteristics();
281                kv.clearReferences();
282                fixedFileNode.clearReferences();
283                if(cluster.isDirty() )
284                  clusterProvider.updateWriteClusters(cluster );
285
286                   fixedFileNode.clearReferences();
287                   nodeMap.remove(cc);
288                }
289                arr.clear();
290              Object JavaDoc isFirstTime = nodeMap.put(clusterCharacteristics, node);
291              if(isFirstTime != null)
292                new Exception JavaDoc(" Error in FileNodeManager class getNode or getNewNode method node already found in map from if consult to Kuldeep kumar " ).printStackTrace() ;
293             } else {
294              Object JavaDoc isFirstTime = nodeMap.put(clusterCharacteristics, node);
295              if(isFirstTime != null)
296                new Exception JavaDoc(" Error in FileNodeManager class getNode or getNewNode method node already found in map from else consult to Kuldeep kumar " ).printStackTrace() ;
297             }
298          }
299        } else {
300               Object JavaDoc isFirstTime = nodeMap.put(clusterCharacteristics, node);
301               if(isFirstTime != null)
302                 new Exception JavaDoc(" Error in FileNodeManager class getNode or getNewNode method node already found in map from outer else consult to Kuldeep kumar " ).printStackTrace() ;
303              }
304
305    }
306
307    private void addInFreeList(_DatabaseUser user, BTreeNode rootNode) throws
308        DException {
309       if (rootNode.isLeaf())
310          return;
311       ArrayList freeNodeList = new ArrayList(0);
312       BTreeNode childNode;
313       for (int i = 0; i < rootNode.getElementCount(); i++) {
314          childNode = rootNode.getElement(i, null).getChild();
315          if (childNode != null)
316             addInFreeList(user,childNode, freeNodeList);
317       }
318       ClusterCharacteristics cc;
319       for (int i = freeNodeList.size() - 1; i >= 0; i--) {
320           if(isTempDatabase && user.getSize() >= 10)
321              user.writeToFileWithLock() ;
322          cc = (ClusterCharacteristics) freeNodeList.get(i);
323          nodeMap.remove(cc);
324          clusterProvider.addFreeCluster(user, cc.getStartAddress());
325       }
326       FixedBTreeCluster cluster = ( (FixedFileNode) rootNode.getNode()).cluster;
327       cluster.setHeader();
328       cluster.reInitializeActiveRecordCount();
329       cluster.reInitializeActualRecordCount();
330       ( (FixedFileNode) rootNode.getNode()).clearCache();
331       BTreeElement element = new BTreeElement();
332       element.setCurrentNode(rootNode);
333       ( (FixedFileNode) rootNode.getNode()).insertDummyElement(element);
334
335
336    }
337
338    private void addInFreeListCompletely(_DatabaseUser user, BTreeNode rootNode) throws
339        DException {
340
341       ArrayList freeNodeList = new ArrayList(0);
342       BTreeNode childNode;
343       for (int i = 0; i < rootNode.getElementCount(); i++) {
344          childNode = rootNode.getElement(i, null).getChild();
345          if (childNode != null)
346             addInFreeList(user,childNode, freeNodeList);
347       }
348       freeNodeList.add( (ClusterCharacteristics) rootNode.getNode().getNodeKey());
349       ClusterCharacteristics cc;
350       for (int i = freeNodeList.size() - 1; i >= 0; i--) {
351          cc = (ClusterCharacteristics) freeNodeList.get(i);
352          nodeMap.remove(cc);
353          clusterProvider.addFreeCluster(user, cc.getStartAddress());
354          if(isTempDatabase && user.getSize() >= 10)
355              user.writeToFileWithLock() ;
356       }
357       btreeControl.releaseControlCluster(user);
358
359    }
360
361    private void addInFreeList(_DatabaseUser user,BTreeNode node,
362                               ArrayList freeNodeList) throws DException {
363        if(isTempDatabase && user.getSize() >= 10)
364              user.writeToFileWithLock() ;
365        if (!node.isLeaf()) {
366          BTreeNode childNode;
367          if(node.isNodeRemovedFromMap() )
368           node = getNode(user,node.getNodeKey() );
369          for (int i = 0; i < node.getElementCount(); i++) {
370             childNode = node.getElement(i, null).getChild();
371             if (childNode != null)
372                addInFreeList(user,childNode, freeNodeList);
373          }
374       }
375       freeNodeList.add( (ClusterCharacteristics) node.getNode().getNodeKey());
376    }
377
378    public int getTotalSizeOfNodeMapAndWeakNodeMap() {
379       return nodeMap.size();
380    }
381
382    public Map getNodeMap() {
383       return nodeMap;
384    }
385
386    public PersistentDatabase getUnderlyingDatabase() {
387       return (PersistentDatabase) clusterProvider;
388    }
389
390    public CUbcmfLfzIboemfs getTableKeyHandler() {
391       return (CUbcmfLfzIboemfs) handler;
392    }
393
394    public void releaseResource(_DatabaseUser user, boolean releaseCompletely) throws
395        DException {
396       BTreeNode rootNode = getRootNode(user);
397
398       if (rootNode != null) {
399          if (releaseCompletely)
400             addInFreeListCompletely(user, rootNode);
401          else
402             addInFreeList(user, rootNode);
403       }
404    }
405
406    public void setSize(int size0){
407      size = size0;
408    }
409
410 }
411
Popular Tags