001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/io/rtree/PageFile.java $
002: //
003: //RTree implementation.
004: //Copyright (C) 2002-2004 Wolfgang Baer - WBaer@gmx.de
005: //
006: //This library is free software; you can redistribute it and/or
007: //modify it under the terms of the GNU Lesser General Public
008: //License as published by the Free Software Foundation; either
009: //version 2.1 of the License, or (at your option) any later version.
010: //
011: //This library is distributed in the hope that it will be useful,
012: //but WITHOUT ANY WARRANTY; without even the implied warranty of
013: //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: //Lesser General Public License for more details.
015: //
016: //You should have received a copy of the GNU Lesser General Public
017: //License along with this library; if not, write to the Free Software
018: //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019:
020: package org.deegree.io.rtree;
021:
022: import java.io.Serializable;
023:
024: /**
025: * <p>
026: * Abstract class implementing general methods of a PageFile.
027: * </p>
028: *
029: * @author Wolfgang Baer - WBaer@gmx.de
030: * @author last edited by: $Author: apoth $
031: *
032: * @version $Revision: 6813 $, $Date: 2007-05-04 06:41:50 -0700 (Fri, 04 May 2007) $
033: */
034: abstract class PageFile implements Serializable {
035:
036: /** dimension of saved data */
037: protected int dimension;
038:
039: /** capacity of a node (= MaxLoad + 1) */
040: protected int capacity;
041:
042: /** minimum load of a node */
043: protected int minimum;
044:
045: /**
046: * Returns the dimension of the PageFile
047: *
048: * @return int
049: *
050: */
051: protected int getDimension() {
052: return dimension;
053: }
054:
055: /**
056: * Returns the minimum load of a node
057: *
058: * @return int
059: */
060: protected int getMinimum() {
061: return minimum;
062: }
063:
064: /**
065: * Returns the capacity of a node in the PageFile. Capacity is defined a maximum load of a node
066: * plus 1 for overflow
067: *
068: * @return int
069: */
070: protected int getCapacity() {
071: return capacity;
072: }
073:
074: /**
075: * Reads a node from the PageFile for given index
076: *
077: * @param pageFileNumber -
078: * index of page file number where node is saved
079: * @return Node
080: * @throws PageFileException
081: */
082: protected abstract Node readNode(int pageFileNumber)
083: throws PageFileException;
084:
085: /**
086: * Writes a node into the PageFile Method tests if node has already a PageNumber, otherwise a
087: * new page number is assigned and returned.
088: *
089: * @param node -
090: * Node to write
091: * @return int - page number
092: * @throws PageFileException
093: */
094: protected abstract int writeNode(Node node)
095: throws PageFileException;
096:
097: /**
098: * Marks the node at given page number as deleted.
099: *
100: * @param pageFileNumber -
101: * page number
102: * @return Node - deleted node
103: * @throws PageFileException
104: */
105: protected abstract Node deleteNode(int pageFileNumber)
106: throws PageFileException;
107:
108: /**
109: * Initializes the PageFile.
110: *
111: * @param dimension -
112: * dimension of the data
113: * @param capacity -
114: * capacity of a node
115: * @throws PageFileException
116: */
117: protected void initialize(int dimension, int capacity)
118: throws PageFileException {
119: this .dimension = dimension;
120: this .capacity = capacity;
121: this .minimum = (int) Math.round((capacity - 1) * 0.5);
122: if (this .minimum < 2)
123: this .minimum = 2;
124: }
125:
126: /**
127: * Closes the pagefile.
128: *
129: * @throws PageFileException
130: */
131: protected abstract void close() throws PageFileException;
132:
133: }
|