001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/feature/DefaultFeatureCollection.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 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: 11341 $ $Date: 2008-04-22 12:08:33 +0200 (Di, 22 Apr 2008) $
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 * (non-Javadoc)
096 *
097 * @see org.deegree.model.feature.FeatureCollection#clear()
098 */
099 public void clear() {
100 collection.clear();
101 }
102
103 /**
104 * returns the FeatureType of this Feature(Collection)
105 */
106 public FeatureType getFeatureType() {
107 return this.featureType;
108 }
109
110 /**
111 * returns an array of all features
112 */
113 public Feature[] toArray() {
114 return collection.toArray( new Feature[collection.size()] );
115 }
116
117 /**
118 * returns an <tt>Iterator</tt> on the feature contained in a collection
119 *
120 * @return an <tt>Iterator</tt> on the feature contained in a collection
121 */
122 public Iterator<Feature> iterator() {
123 return collection.iterator();
124 }
125
126 /**
127 * returns the feature that is assigned to the submitted index. If the submitted value for
128 * <tt>index</tt> is smaller 0 and larger then the number features within the
129 * featurecollection-1 an exeption will be thrown.
130 */
131 public Feature getFeature( int index ) {
132 return collection.get( index );
133 }
134
135 /**
136 * returns the feature that is assigned to the submitted id. If no valid feature could be found
137 * an <tt>Object[]</tt> with zero length will be returned.
138 */
139 public Feature getFeature( String id ) {
140 Feature feature = null;
141 for ( int i = 0; i < collection.size(); i++ ) {
142 feature = collection.get( i );
143 if ( feature.getId().equals( id ) ) {
144 break;
145 }
146 }
147 return feature;
148 }
149
150 /**
151 * removes the submitted feature from the collection
152 */
153 public Feature remove( Feature feature ) {
154 int index = collection.indexOf( feature );
155 return remove( index );
156 }
157
158 /**
159 * removes a feature identified by its index from the feature collection. The removed feature
160 * will be returned. If the submitted value for <tt>index</tt> is smaller 0 and larger then
161 * the number features within the featurecollection-1 an ArrayIndexOutOfBoundsExcpetion will
162 * raise
163 */
164 public Feature remove( int index ) {
165 return collection.remove( index );
166 }
167
168 /**
169 * Appends a feature to the collection. If the submitted feature doesn't matches the feature
170 * type defined for all features within the collection an exception will be thrown.
171 */
172 public void add( Feature feature ) {
173 collection.add( feature );
174 }
175
176 /**
177 * returns the number of features within the collection
178 */
179 public int size() {
180 return collection.size();
181 }
182
183 public void setProperty( FeatureProperty property, int index ) {
184 // TODO Auto-generated method stub
185 }
186
187 public void addProperty( FeatureProperty property ) {
188 // TODO Auto-generated method stub
189 }
190
191 public void removeProperty( QualifiedName propertyName ) {
192 // TODO Auto-generated method stub
193 }
194
195 public void replaceProperty( FeatureProperty oldProperty, FeatureProperty newProperty ) {
196 // TODO Auto-generated method stub
197 }
198
199 /**
200 * returns the envelope / boundingbox of the feature collection
201 */
202 @Override
203 public synchronized Envelope getBoundedBy()
204 throws GeometryException {
205
206 Envelope combinedEnvelope = this.envelope;
207
208 if ( combinedEnvelope == null && this.collection.size() > 0 ) {
209 for ( int i = 0; i < this.collection.size(); i++ ) {
210 Envelope nextFeatureEnvelope = this.collection.get( i ).getBoundedBy();
211 if ( combinedEnvelope == null ) {
212 combinedEnvelope = nextFeatureEnvelope;
213 } else if ( nextFeatureEnvelope != null ) {
214 combinedEnvelope = combinedEnvelope.merge( nextFeatureEnvelope );
215 }
216 }
217 this.envelope = combinedEnvelope;
218 }
219 return combinedEnvelope;
220 }
221
222 @Override
223 public void setEnvelopesUpdated(){
224 this.envelope = null;
225 }
226
227 @Override
228 public String toString() {
229 String ret = null;
230 ret = "collection = " + collection + "\n";
231 return ret;
232 }
233
234 public FeatureProperty getDefaultProperty( PropertyPath path )
235 throws PropertyPathResolvingException {
236 // TODO Auto-generated method stub
237 return null;
238 }
239
240 }