001: //$HeadURL: svn+ssh://mschneider@svn.wald.intevation.org/deegree/base/trunk/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.HashSet;
047: import java.util.Iterator;
048: import java.util.List;
049: import java.util.Set;
050:
051: import org.deegree.datatypes.QualifiedName;
052: import org.deegree.io.datastore.PropertyPathResolvingException;
053: import org.deegree.model.spatialschema.Envelope;
054: import org.deegree.model.spatialschema.GeometryException;
055: import org.deegree.ogcbase.PropertyPath;
056:
057: /**
058: * Represents a {@link FeatureCollection} that only contains <code>wfs:featureTuple</code>
059: * elements (as introduced by the draft WFS 1.2 spec).
060: * <p>
061: * NOTE: Some concepts of ordinary feature collections (like adding and removing of features) do not
062: * match well to this special kind of feature collection, mostly because it uses a
063: * <code>FeatureArrayPropertyType</code> for the <code>wfs:featureTuple</code> element. Thus,
064: * many methods inherited from {@link AbstractFeatureCollection} have no clear semantic and are not
065: * available.
066: *
067: * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a>
068: * @version $Revision: 6840 $ $Date: 2007-05-07 10:27:43 +0200 (Mo, 07 Mai 2007) $
069: */
070: public class FeatureTupleCollection extends AbstractFeatureCollection
071: implements Serializable {
072:
073: private static final long serialVersionUID = 2651676067288914826L;
074:
075: private int tupleLength;
076:
077: private List<Feature[]> tuples;
078:
079: private Set<Feature> allFeatures = new HashSet<Feature>();
080:
081: private Envelope envelope;
082:
083: FeatureTupleCollection(String id, List<Feature[]> tuples,
084: int tupleLength) {
085: super (id);
086: this .tuples = tuples;
087: this .tupleLength = tupleLength;
088: for (Feature[] features : tuples) {
089: assert features.length == tupleLength;
090: for (Feature feature : features) {
091: allFeatures.add(feature);
092: }
093: }
094: }
095:
096: /*
097: * (non-Javadoc)
098: *
099: * @see org.deegree.model.feature.FeatureCollection#clear()
100: */
101: public void clear() {
102: allFeatures.clear();
103: }
104:
105: /**
106: * Returns the feature tuple at the given index.
107: *
108: * @param index
109: * @return the feature tuple at the given index
110: */
111: public Feature[] getTuple(int index) {
112: return this .tuples.get(index);
113: }
114:
115: /**
116: * Returns the number of feature tuples contained in this collection.
117: *
118: * @return the number of feature tuples contained in this collection
119: */
120: public int numTuples() {
121: return this .tuples.size();
122: }
123:
124: /**
125: * Returns the length (number of features) of each tuple.
126: *
127: * @return the length (number of features) of each tuple.
128: */
129: public int tupleLength() {
130: return this .tupleLength;
131: }
132:
133: @Override
134: public synchronized Envelope getBoundedBy()
135: throws GeometryException {
136:
137: Envelope combinedEnvelope = this .envelope;
138:
139: if (combinedEnvelope == null && this .allFeatures.size() > 0) {
140: for (Feature feature : this .allFeatures) {
141: Envelope nextFeatureEnvelope = feature.getBoundedBy();
142: if (combinedEnvelope == null) {
143: combinedEnvelope = nextFeatureEnvelope;
144: } else if (nextFeatureEnvelope != null) {
145: combinedEnvelope = combinedEnvelope
146: .merge(nextFeatureEnvelope);
147: }
148: }
149: this .envelope = combinedEnvelope;
150: }
151: return combinedEnvelope;
152: }
153:
154: public int size() {
155: return this .tuples.size();
156: }
157:
158: public void add(Feature feature) {
159: throw new NoSuchMethodError();
160: }
161:
162: public Feature getFeature(int index) {
163: return null;
164: }
165:
166: public Feature getFeature(String id) {
167: throw new NoSuchMethodError();
168: }
169:
170: public Iterator iterator() {
171: throw new NoSuchMethodError();
172: }
173:
174: public Feature remove(Feature feature) {
175: throw new NoSuchMethodError();
176: }
177:
178: public Feature remove(int index) {
179: throw new NoSuchMethodError();
180: }
181:
182: public Feature[] toArray() {
183: throw new NoSuchMethodError();
184: }
185:
186: public void addProperty(FeatureProperty property) {
187: throw new NoSuchMethodError();
188: }
189:
190: public FeatureProperty getDefaultProperty(PropertyPath path)
191: throws PropertyPathResolvingException {
192: throw new NoSuchMethodError();
193: }
194:
195: public void removeProperty(QualifiedName propertyName) {
196: throw new NoSuchMethodError();
197: }
198:
199: public void replaceProperty(FeatureProperty oldProperty,
200: FeatureProperty newProperty) {
201: throw new NoSuchMethodError();
202: }
203:
204: public void setProperty(FeatureProperty property, int index) {
205: throw new NoSuchMethodError();
206: }
207: }
|