001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/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 package org.deegree.io.rtree;
021
022 import java.io.Serializable;
023
024 /**
025 * <p>
026 * Abstract class for common implementation and definition of abstract methods for both concrete
027 * classes LeafNode and NoneLeafNode.
028 * </p>
029 *
030 * @author Wolfgang Baer - WBaer@gmx.de
031 * @author last edited by: $Author: bezema $
032 *
033 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
034 */
035 abstract class Node implements Serializable {
036
037 protected transient PageFile file;
038
039 protected int parentNode;
040
041 protected int pageNumber;
042
043 protected int counter;
044
045 protected HyperBoundingBox unionMinBB;
046
047 protected HyperBoundingBox[] hyperBBs;
048
049 protected int place;
050
051 /**
052 * Constructor.
053 *
054 * @param pageNumber -
055 * number of this node in page file
056 * @param pageFile -
057 * the PageFile of this node
058 */
059 protected Node( int pageNumber, PageFile pageFile ) {
060 this.file = pageFile;
061 this.pageNumber = pageNumber;
062 parentNode = 0;
063 hyperBBs = new HyperBoundingBox[file.getCapacity()];
064
065 for ( int i = 0; i < file.getCapacity(); i++ )
066 hyperBBs[i] = HyperBoundingBox.getNullHyperBoundingBox( file.getDimension() );
067
068 unionMinBB = HyperBoundingBox.getNullHyperBoundingBox( file.getDimension() );
069 counter = 0;
070 }
071
072 /**
073 * Inserts the given data into the node
074 *
075 * @param obj -
076 * object to insert (Typ Integer oder AbstractNode)
077 * @param box -
078 * the associated HyperBoundingBox
079 */
080 protected abstract void insertData( Object obj, HyperBoundingBox box );
081
082 /**
083 * Deletes a the entry with given index from node
084 *
085 * @param index -
086 * index of entry
087 */
088 protected abstract void deleteData( int index );
089
090 /**
091 * Fetches the data for given index from node
092 *
093 * @param index -
094 * index of data
095 * @return
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 ;
160 for ( int i = 0; i < this.getUsedSpace(); i++ )
161 this.unionMinBB = this.unionMinBB.unionBoundingBox( this.hyperBBs[i] );
162 }
163
164 /**
165 * Returns an array of HyperBoundingBox objects of the entries of the node. The array may be
166 * empty - for used place in the node see getUsedSpace.
167 *
168 * @return HyperBoundingBox[] - boxes of the entries
169 * @see #getUsedSpace()
170 */
171 protected HyperBoundingBox[] getHyperBoundingBoxes() {
172 return hyperBBs;
173 }
174
175 /**
176 * Returns the HyperBoundingBox for entrie with given index.
177 *
178 * @param index -
179 * index of entry
180 * @return HyperBoundingBox
181 */
182 protected HyperBoundingBox getHyperBoundingBox( int index ) {
183 return hyperBBs[index];
184 }
185
186 /**
187 * Tests if this is the root node.
188 *
189 * @return boolean
190 */
191 protected boolean isRoot() {
192 return pageNumber == 0;
193 }
194
195 /**
196 * Deep copy without data entries (only HyperBoundingBox objects)
197 *
198 * @see java.lang.Object#clone()
199 */
200 protected abstract Object clone();
201
202 /**
203 * String-Representation of Node
204 *
205 * @return
206 */
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 }
219
220 /***************************************************************************************************
221 * <code>
222 Changes to this class. What the people have been up to:
223
224 $Log$
225 Revision 1.6 2007/03/06 13:20:56 wanhoff
226 Fixed Javadoc (@param)
227
228 Revision 1.5 2006/07/12 14:46:17 poth
229 comment footer added
230
231 </code>
232 **************************************************************************************************/