001    //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_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    
021    package org.deegree.io.rtree;
022    
023    import java.io.Serializable;
024    
025    /**
026     * <p>
027     * Abstract class implementing general methods of a PageFile.
028     * </p>
029     *
030     * @author Wolfgang Baer - WBaer@gmx.de
031     * @author last edited by: $Author: aschmitz $
032     *
033     * @version $Revision: 12519 $, $Date: 2008-06-25 11:37:30 +0200 (Mi, 25 Jun 2008) $
034     */
035    abstract class PageFile implements Serializable {
036    
037        /** dimension of saved data */
038        protected int dimension;
039    
040        /** capacity of a node (= MaxLoad + 1) */
041        protected int capacity;
042    
043        /** minimum load of a node */
044        protected int minimum;
045    
046        /**
047         * Returns the dimension of the PageFile
048         *
049         * @return int
050         *
051         */
052        protected int getDimension() {
053            return dimension;
054        }
055    
056        /**
057         * Returns the minimum load of a node
058         *
059         * @return int
060         */
061        protected int getMinimum() {
062            return minimum;
063        }
064    
065        /**
066         * Returns the capacity of a node in the PageFile. Capacity is defined a maximum load of a node
067         * plus 1 for overflow
068         *
069         * @return int
070         */
071        protected int getCapacity() {
072            return capacity;
073        }
074    
075        /**
076         * Reads a node from the PageFile for given index
077         *
078         * @param pageFileNumber -
079         *            index of page file number where node is saved
080         * @return Node
081         * @throws PageFileException
082         */
083        protected abstract Node readNode( int pageFileNumber )
084                                throws PageFileException;
085    
086        /**
087         * Writes a node into the PageFile Method tests if node has already a PageNumber, otherwise a
088         * new page number is assigned and returned.
089         *
090         * @param node -
091         *            Node to write
092         * @return int - page number
093         * @throws PageFileException
094         */
095        protected abstract int writeNode( Node node )
096                                throws PageFileException;
097    
098        /**
099         * Marks the node at given page number as deleted.
100         *
101         * @param pageFileNumber -
102         *            page number
103         * @return Node - deleted node
104         * @throws PageFileException
105         */
106        protected abstract Node deleteNode( int pageFileNumber )
107                                throws PageFileException;
108    
109        /**
110         * Initializes the PageFile.
111         *
112         * @param dimension -
113         *            dimension of the data
114         * @param capacity -
115         *            capacity of a node
116         * @throws PageFileException
117         */
118        protected void initialize( int dimension, int capacity )
119                                throws PageFileException {
120            this.dimension = dimension;
121            this.capacity = capacity;
122            this.minimum = (int) Math.round( ( capacity - 1 ) * 0.5 );
123            if ( this.minimum < 2 )
124                this.minimum = 2;
125        }
126    
127        /**
128         * Closes the pagefile.
129         *
130         * @throws PageFileException
131         */
132        protected abstract void close()
133                                throws PageFileException;
134    
135    }