001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/io/rtree/Node.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 for common implementation and definition of abstract methods for both concrete
028     * classes LeafNode and NoneLeafNode.
029     * </p>
030     *
031     * @author Wolfgang Baer - WBaer@gmx.de
032     * @author last edited by: $Author: aschmitz $
033     *
034     * @version $Revision: 12519 $, $Date: 2008-06-25 11:37:30 +0200 (Mi, 25. Jun 2008) $
035     */
036    abstract class Node implements Serializable {
037    
038        protected transient PageFile file;
039    
040        protected int parentNode;
041    
042        protected int pageNumber;
043    
044        protected int counter;
045    
046        protected HyperBoundingBox unionMinBB;
047    
048        protected HyperBoundingBox[] hyperBBs;
049    
050        protected int place;
051    
052        /**
053         * Constructor.
054         *
055         * @param pageNumber -
056         *            number of this node in page file
057         * @param pageFile -
058         *            the PageFile of this node
059         */
060        protected Node( int pageNumber, PageFile pageFile ) {
061            this.file = pageFile;
062            this.pageNumber = pageNumber;
063            parentNode = 0;
064            hyperBBs = new HyperBoundingBox[file.getCapacity()];
065    
066            for ( int i = 0; i < file.getCapacity(); i++ )
067                hyperBBs[i] = HyperBoundingBox.getNullHyperBoundingBox( file.getDimension() );
068    
069            unionMinBB = HyperBoundingBox.getNullHyperBoundingBox( file.getDimension() );
070            counter = 0;
071        }
072    
073        /**
074         * Inserts the given data into the node
075         *
076         * @param obj -
077         *            object to insert (Typ Integer oder AbstractNode)
078         * @param box -
079         *            the associated HyperBoundingBox
080         */
081        protected abstract void insertData( Object obj, HyperBoundingBox box );
082    
083        /**
084         * Deletes a the entry with given index from node
085         *
086         * @param index -
087         *            index of entry
088         */
089        protected abstract void deleteData( int index );
090    
091        /**
092         * Fetches the data for given index from node
093         *
094         * @param index -
095         *            index of data
096         */
097        protected abstract Object getData( int index );
098    
099        /**
100         * Returns the parent node of this.
101         *
102         * @return Node
103         */
104        protected Node getParent() {
105    
106            Node node = null;
107            try {
108                node = file.readNode( parentNode );
109            } catch ( PageFileException e ) {
110                // PageFileException: AbstractNode.getParent() - readNode
111                e.printStackTrace();
112            }
113    
114            return node;
115        }
116    
117        /**
118         * Returns the page number of this.
119         *
120         * @return int
121         */
122        protected int getPageNumber() {
123            return pageNumber;
124        }
125    
126        /**
127         * Sets the page number of this to given number
128         *
129         * @param number -
130         *            int
131         */
132        protected void setPageNumber( int number ) {
133            this.pageNumber = number;
134        }
135    
136        /**
137         * Currently used space in the node
138         *
139         * @return int
140         */
141        protected int getUsedSpace() {
142            return counter;
143        }
144    
145        /**
146         * Returns the HyperBoundingBox over all Entries currently in the node
147         *
148         * @return HyperBoundingBox
149         */
150        protected HyperBoundingBox getUnionMinBB() {
151            return unionMinBB;
152        }
153    
154        /**
155         * Updates the HyperBoundingBox over all Entries currently in the node
156         */
157        protected void updateNodeBoundingBox() {
158            this.unionMinBB = HyperBoundingBox.getNullHyperBoundingBox( file.getDimension() );
159            for ( int i = 0; i < this.getUsedSpace(); i++ )
160                this.unionMinBB = this.unionMinBB.unionBoundingBox( this.hyperBBs[i] );
161        }
162    
163        /**
164         * Returns an array of HyperBoundingBox objects of the entries of the node. The array may be
165         * empty - for used place in the node see getUsedSpace.
166         *
167         * @return HyperBoundingBox[] - boxes of the entries
168         * @see #getUsedSpace()
169         */
170        protected HyperBoundingBox[] getHyperBoundingBoxes() {
171            return hyperBBs;
172        }
173    
174        /**
175         * Returns the HyperBoundingBox for entrie with given index.
176         *
177         * @param index -
178         *            index of entry
179         * @return HyperBoundingBox
180         */
181        protected HyperBoundingBox getHyperBoundingBox( int index ) {
182            return hyperBBs[index];
183        }
184    
185        /**
186         * Tests if this is the root node.
187         *
188         * @return boolean
189         */
190        protected boolean isRoot() {
191            return pageNumber == 0;
192        }
193    
194        /**
195         * Deep copy without data entries (only HyperBoundingBox objects)
196         *
197         * @see java.lang.Object#clone()
198         */
199        @Override
200        protected abstract Object clone();
201    
202        /**
203         * String-Representation of Node
204         *
205         */
206        @Override
207        public String toString() {
208            String str = "";
209    
210            if ( this instanceof LeafNode ) {
211                str = "LeafNode: " + unionMinBB.toString();
212            } else {
213                str = "NoneLeafNode: " + unionMinBB.toString();
214            }
215    
216            return str;
217        }
218    }