001    //$HeadURL: http://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/model/feature/Feature.java $
002    /*----------------------------------------------------------------------------
003     This file is part of deegree, http://deegree.org/
004     Copyright (C) 2001-2009 by:
005       Department of Geography, University of Bonn
006     and
007       lat/lon GmbH
008    
009     This library is free software; you can redistribute it and/or modify it under
010     the terms of the GNU Lesser General Public License as published by the Free
011     Software Foundation; either version 2.1 of the License, or (at your option)
012     any later version.
013     This library is distributed in the hope that it will be useful, but WITHOUT
014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016     details.
017     You should have received a copy of the GNU Lesser General Public License
018     along with this library; if not, write to the Free Software Foundation, Inc.,
019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020    
021     Contact information:
022    
023     lat/lon GmbH
024     Aennchenstr. 19, 53177 Bonn
025     Germany
026     http://lat-lon.de/
027    
028     Department of Geography, University of Bonn
029     Prof. Dr. Klaus Greve
030     Postfach 1147, 53001 Bonn
031     Germany
032     http://www.geographie.uni-bonn.de/deegree/
033    
034     e-mail: info@deegree.org
035    ----------------------------------------------------------------------------*/
036    
037    package org.deegree.model.feature;
038    
039    import java.util.Map;
040    
041    import org.deegree.datatypes.QualifiedName;
042    import org.deegree.io.datastore.PropertyPathResolvingException;
043    import org.deegree.model.feature.schema.FeatureType;
044    import org.deegree.model.spatialschema.Envelope;
045    import org.deegree.model.spatialschema.Geometry;
046    import org.deegree.model.spatialschema.GeometryException;
047    import org.deegree.ogcbase.PropertyPath;
048    
049    /**
050     * Features are, according to the Abstract Specification, digital representations of real world
051     * entities. Feature Identity thus refers to mechanisms to identify such representations: not to
052     * identify the real world entities that are the subject of a representation. Thus two different
053     * representations of a real world entity (say the Mississippi River) will be two different features
054     * with distinct identities. Real world identification systems, such as title numbers, while
055     * possibly forming a sound basis for an implementation of a feature identity mechanism, are not of
056     * themselves such a mechanism.
057     *
058     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
059     * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider</a>
060     * @version $Revision: 29966 $ $Date: 2011-03-09 15:19:04 +0100 (Wed, 09 Mar 2011) $
061     */
062    public interface Feature {
063    
064        /**
065         * Returns the qualified name of the feature.
066         *
067         * @return the qualified name of the feature
068         */
069        QualifiedName getName();
070      
071        /**
072         * Returns the id of the feature.
073         *
074         * @return the id of the feature
075         */
076        String getId();
077    
078        /**
079         * Sets the id of the feature.
080         *
081         * @param fid
082         *            the id of the feature to be set
083         */
084        void setId( String fid );
085    
086        /**
087         * Returns the feature type of this feature.
088         *
089         * @return the feature type of this feature
090         */
091        FeatureType getFeatureType();
092    
093        /**
094         * Sets the feature type of this feature.
095         *
096         * @param ft
097         *            feature type to set
098         */
099        void setFeatureType( FeatureType ft );
100    
101        /**
102         * Returns all properties of the feature in their original order.
103         *
104         * @return all properties of the feature
105         */
106        FeatureProperty[] getProperties();
107    
108        /**
109         * Returns the first property of the feature with the given name.
110         *
111         * @param name
112         *            name of the property to look up
113         * @return the first property of the feature with the given name or null if the feature has no
114         *         such property
115         */
116        FeatureProperty getDefaultProperty( QualifiedName name );
117    
118        /**
119         * Returns the property of the feature identified by the given {@link PropertyPath}.
120         *
121         * NOTE: Current implementation does not handle multiple properties (on the path) or index
122         * addressing in the path.
123         *
124         * @param path
125         *            the path of the property to look up
126         * @return the property of the feature identified by the given PropertyPath
127         * @throws PropertyPathResolvingException
128         *
129         * @see PropertyPath
130         */
131        FeatureProperty getDefaultProperty( PropertyPath path )
132                                throws PropertyPathResolvingException;
133    
134        /**
135         * Returns the properties of the feature with the given name in their original order.
136         *
137         * @param name
138         *            name of the properties to look up
139         * @return the properties of the feature with the given name or null if the feature has no
140         *         property with that name
141         */
142        FeatureProperty[] getProperties( QualifiedName name );
143    
144      
145        /**
146         * Returns the values of all geometry properties of the feature.
147         *
148         * @return the values of all geometry properties of the feature, or a zero-length array if the
149         *         feature has no geometry properties
150         */
151        Geometry[] getGeometryPropertyValues();
152    
153        /**
154         * Returns the value of the default geometry property of the feature. If the feature has no
155         * geometry property, this is a Point at the coordinates (0,0).
156         *
157         * @return default geometry or Point at (0,0) if feature has no geometry
158         */
159        Geometry getDefaultGeometryPropertyValue();
160    
161        /**
162         * Sets the value for the given property. The index is needed to specify the occurences of the
163         * property that is to be replaced. Set to 0 for properties that may only occur once.
164         *
165         * @param property
166         *            property name and the property's new value
167         * @param index
168         *            position of the property that is to be replaced
169         */
170        void setProperty( FeatureProperty property, int index );
171    
172        /**
173         * Adds the given property to the feature's properties. The position of the property is
174         * determined by the feature type. If the feature already has a property with this name, it is
175         * inserted behind it.
176         *
177         * @param property
178         *            property to insert
179         */
180        void addProperty( FeatureProperty property );
181    
182        /**
183         * Removes the properties with the given name.
184         *
185         * @param propertyName
186         *            name of the properties to remove
187         */
188        void removeProperty( QualifiedName propertyName );
189    
190        /**
191         * Replaces the given property with a new one.
192         *
193         * @param oldProperty
194         *            property to be replaced
195         * @param newProperty
196         *            new property
197         */
198        void replaceProperty( FeatureProperty oldProperty, FeatureProperty newProperty );
199    
200        /**
201         * Returns the envelope / bounding box of the feature.
202         *
203         * @return the envelope / bounding box of the feature
204         * @throws GeometryException
205         */
206        Envelope getBoundedBy()
207                                throws GeometryException;
208    
209        /**
210         * Returns the owner of the feature. This is the feature property that has this feature as value
211         * or null if this feature is a root feature.
212         *
213         * @return the owner of the feature, or null if the feature does not belong to a feature
214         *         property
215         */
216        FeatureProperty getOwner();
217    
218        /**
219         * Returns the attribute value of the attribute with the specified name.
220         *
221         * @param name
222         *            name of the attribute
223         * @return the attribute value
224         */
225        String getAttribute( String name );
226    
227        /**
228         * Returns all attributes of the feature.
229         *
230         * @return all attributes, keys are names, values are attribute values
231         */
232        Map<String, String> getAttributes();
233    
234        /**
235         * Sets the value of the attribute with the given name.
236         *
237         * @param name
238         *            name of the attribute
239         * @param value
240         *            value to set
241         */
242        void setAttribute( String name, String value );
243    
244        /**
245         * Signals that the envelopes of the geometry properties have been updated.
246         */
247        public void setEnvelopesUpdated();
248    
249        /**
250         * @return a shallow clone of a feature. Property values will not be cloned except for
251         *         properties that are features (DefaultFeature) or feature collections
252         *         (DefaultFeatureCollection)
253         */
254        public Object clone() throws CloneNotSupportedException;
255    
256        /**
257         * @return a deep clone of a feature. All not simple properties (incl. geometries) will be cloned
258         */
259        public Feature cloneDeep() throws CloneNotSupportedException;
260    
261    }