/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2011, Open Source Geospatial Foundation (OSGeo)
* (C) 2004-2007 Open Geospatial Consortium Inc.
*
* All Rights Reserved. http://www.opengis.org/legal/
*/
package org.opengis.feature;
import java.util.Map;
import org.opengis.feature.type.Name;
import org.opengis.feature.type.PropertyDescriptor;
import org.opengis.feature.type.PropertyType;
/**
* An instance of a {@link PropertyType} relised as a {@link Attribute} or {@link Association}.
* <p>
* A property is a wrapper around an arbitrary object or value. The value is
* available via the {@link #getValue()} and {@link #setValue(Object)}.
*
* <pre>
* Property property = ...;
*
* //set the value
* property.setValue( "foo" );
*
* //get the value
* String value = (String) property.getValue();
* </pre>
*
* </p>
* <p>
* Every property has a type. This {@link PropertyType} defines information
* about the property. This includes which java class the value of the property
* is an instance of, any restrictions on the value, etc...
* The type is available via the {@link #getType()} method.
*
* <pre>
* Property property = ...;
*
* //get the type
* PropertyType type = property.getType();
*
* //get the class of the value
* Class<String> valueClass = (Class<String>)type.getBinding();
*
* </pre>
*
* </p>
* <p>
* A property can often be part of another entity such as a {@link Feature} or {@link ComplexAttribute}.
* When this is the case, the relationship between the property and its "container" is described by
* a {@link PropertyDescriptor}.
* The descriptor of a property defines things like nilablility, multiplicity,
* etc... See the javadoc of {@link PropertyDescriptor} for more details. The
* descriptor is available via the {@link #getDescriptor()} method.
*
* <pre>
* Property property = ...;
*
* //get the descriptor
* PropertyDescriptor descriptor = property.getDescriptor()l
*
* //is the value allowed to be null?
* descriptor.isNillable();
*
* //how many instances of this property are allowed?
* descriptor.getMaxOccurs();
* </pre>
*
* @author Jody Garnett (Refractions Research)
* @author Justin Deoliveira (The Open Planning Project)
*
* @source $URL: http://svn.osgeo.org/geotools/branches/2.7.x/modules/library/opengis/src/main/java/org/opengis/feature/Property.java $
*/
public interface Property {
/**
* The value or content of the property.
* <p>
* The class of this object is defined by
* <code>getType().getBinding()</code>.
* </p>
* <p>
* This value may be <code>null</code>. In this case
* <code>getDescriptor().isNillable()</code> would be <code>true</code>.
* </p>
*
* @return The value of the property.
*/
Object getValue();
/**
* Sets the value or content of the property.
* <p>
* The class of <tt>newValue</tt> should be the same as or a subclass of
* <code>getType().getBinding()</code>.
* </p>
* <p>
* <tt>newValue</tt> may be <code>null</code> if
* <code>getDescriptor().isNillable()</code> is <code>true</code>.
* </p>
*
* @param newValue
* The new value of the property.
*
*/
void setValue(Object newValue);
/**
* The type of the property.
* <p>
* The type contains information about the value or content of the property
* such as its java class.
* </p>
* <p>
* This value is also available via <code>getDescriptor().getType()</code>.
* </p>
*
* @return The property type.
*/
PropertyType getType();
/**
* The {@link PropertyDscriptor} of the property, null if this is a top-level value.
* <p>
* The descriptor provides information about the property with respect to
* its containing entity (more often then not a {@link Feature} or {@link ComplexAttribute}.
* </p>
*
* @return The property descriptor, null if this is a top-level value.
* @see ComplexAttribute
*/
PropertyDescriptor getDescriptor();
/**
* The name of the property with respect to its descriptor.
* <p>
* This method is convenience for <code>getDescriptor().getName()</code>.
* </p>
*
* @return name of the property.
*/
Name getName();
/**
* Flag indicating if <code>null</code> is an acceptable value for the
* property.
* <p>
* This method is convenience for <code>getDescriptor().isNillable()</code>.
* </p>
*
* @return <code>true</code> if the value of the property is allowed to be
* <code>null</code>, otherwise <code>false</code>.
*/
boolean isNillable();
/**
* A map of "user data" which enables applications to store
* "application-specific" information against a property.
* <p>
* An example of information that may wish to be stored along with an
* attribute could be its srs information (in the case of a geometric
* attribute ).
*
* <pre>
* <code>
* GeometryAttribute attribute = ...;
*
* //set the crs
* CoordinateReferenceSystem crs = CRS.decode("EPSG:4326");
* attribute.setCRS( crs );
*
* //set the srs
* attribute.getUserData().put( "srs", "EPSG:4326" );
* </code>
* </pre>
*
* </p>
*
* @return A map of user data.
*/
Map<Object, Object> getUserData();
}