001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/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 15:41:50 +0200 (Fr, 04 Mai 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()
132 throws PageFileException;
133
134 }