001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/feature/DefaultFeatureCollection.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2007 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstraße 19 030 53177 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 ---------------------------------------------------------------------------*/ 043 package org.deegree.model.feature; 044 045 import java.io.Serializable; 046 import java.util.ArrayList; 047 import java.util.Iterator; 048 import java.util.List; 049 050 import org.deegree.datatypes.QualifiedName; 051 import org.deegree.io.datastore.PropertyPathResolvingException; 052 import org.deegree.model.feature.schema.FeatureType; 053 import org.deegree.model.spatialschema.Envelope; 054 import org.deegree.model.spatialschema.GeometryException; 055 import org.deegree.ogcbase.PropertyPath; 056 057 /** 058 * This interface provides services for the management of groups of features. These groups can come 059 * into being for a number of reasons: e.g. a project as a whole, for the scope of a query, as the 060 * result of a query or arbitrarily selected by a user for some common manipulation. A feature's 061 * membership of a particular FeatureCollection does not necessarily imply any relationship with 062 * other member features. Composite or compound features which own constituent member Features (e.g. 063 * an Airport composed of Terminals, Runways, Aprons, Hangars, etc) may also support the 064 * FeatureCollection interface to provide a generic means for clients to access constituent members 065 * without needing to be aware of the internal implementation details of the compound feature. 066 * <p> 067 * ----------------------------------------------------------------------- 068 * </p> 069 * 070 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 071 * @version $Revision: 6840 $ $Date: 2007-05-07 10:27:43 +0200 (Mo, 07 Mai 2007) $ 072 */ 073 class DefaultFeatureCollection extends AbstractFeatureCollection implements Serializable { 074 075 private List<Feature> collection = null; 076 077 private Envelope envelope = null; 078 079 DefaultFeatureCollection( String id, int initialCapacity ) { 080 super( id ); 081 collection = new ArrayList<Feature>( initialCapacity ); 082 } 083 084 /** 085 * constructor for initializing a featur collection with an id and an array of features. 086 */ 087 DefaultFeatureCollection( String id, Feature[] feature ) { 088 this( id, feature.length ); 089 for ( int i = 0; i < feature.length; i++ ) { 090 add( feature[i] ); 091 } 092 } 093 094 /** 095 * returns the FeatureType of this Feature(Collection) 096 */ 097 public FeatureType getFeatureType() { 098 return this.featureType; 099 } 100 101 /** 102 * returns an array of all features 103 */ 104 public Feature[] toArray() { 105 return collection.toArray( new Feature[collection.size()] ); 106 } 107 108 /** 109 * returns an <tt>Iterator</tt> on the feature contained in a collection 110 * 111 * @return an <tt>Iterator</tt> on the feature contained in a collection 112 */ 113 public Iterator iterator() { 114 return collection.iterator(); 115 } 116 117 /** 118 * returns the feature that is assigned to the submitted index. If the submitted value for 119 * <tt>index</tt> is smaller 0 and larger then the number features within the 120 * featurecollection-1 an exeption will be thrown. 121 */ 122 public Feature getFeature( int index ) { 123 return collection.get( index ); 124 } 125 126 /** 127 * returns the feature that is assigned to the submitted id. If no valid feature could be found 128 * an <tt>Object[]</tt> with zero length will be returned. 129 */ 130 public Feature getFeature( String id ) { 131 Feature feature = null; 132 for ( int i = 0; i < collection.size(); i++ ) { 133 feature = collection.get( i ); 134 if ( feature.getId().equals( id ) ) { 135 break; 136 } 137 } 138 return feature; 139 } 140 141 /** 142 * removes the submitted feature from the collection 143 */ 144 public Feature remove( Feature feature ) { 145 int index = collection.indexOf( feature ); 146 return remove( index ); 147 } 148 149 /** 150 * removes a feature identified by its index from the feature collection. The removed feature 151 * will be returned. If the submitted value for <tt>index</tt> is smaller 0 and larger then 152 * the number features within the featurecollection-1 an ArrayIndexOutOfBoundsExcpetion will 153 * raise 154 */ 155 public Feature remove( int index ) { 156 return collection.remove( index ); 157 } 158 159 /** 160 * Appends a feature to the collection. If the submitted feature doesn't matches the feature 161 * type defined for all features within the collection an exception will be thrown. 162 */ 163 public void add( Feature feature ) { 164 collection.add( feature ); 165 } 166 167 /** 168 * returns the number of features within the collection 169 */ 170 public int size() { 171 return collection.size(); 172 } 173 174 public void setProperty( FeatureProperty property, int index ) { 175 // TODO Auto-generated method stub 176 } 177 178 public void addProperty( FeatureProperty property ) { 179 // TODO Auto-generated method stub 180 } 181 182 public void removeProperty( QualifiedName propertyName ) { 183 // TODO Auto-generated method stub 184 } 185 186 public void replaceProperty( FeatureProperty oldProperty, FeatureProperty newProperty ) { 187 // TODO Auto-generated method stub 188 } 189 190 /** 191 * returns the envelope / boundingbox of the feature collection 192 */ 193 @Override 194 public synchronized Envelope getBoundedBy() 195 throws GeometryException { 196 197 Envelope combinedEnvelope = this.envelope; 198 199 if ( combinedEnvelope == null && this.collection.size() > 0 ) { 200 for ( int i = 0; i < this.collection.size(); i++ ) { 201 Envelope nextFeatureEnvelope = this.collection.get( i ).getBoundedBy(); 202 if ( combinedEnvelope == null ) { 203 combinedEnvelope = nextFeatureEnvelope; 204 } else if ( nextFeatureEnvelope != null ) { 205 combinedEnvelope = combinedEnvelope.merge( nextFeatureEnvelope ); 206 } 207 } 208 this.envelope = combinedEnvelope; 209 } 210 return combinedEnvelope; 211 } 212 213 @Override 214 public String toString() { 215 String ret = null; 216 ret = "collection = " + collection + "\n"; 217 return ret; 218 } 219 220 public FeatureProperty getDefaultProperty( PropertyPath path ) 221 throws PropertyPathResolvingException { 222 // TODO Auto-generated method stub 223 return null; 224 } 225 226 }