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    }