/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.csw.records;
import java.util.LinkedHashSet;
import java.util.List;
import net.opengis.cat.csw20.ElementSetType;
import org.geotools.data.Query;
import org.opengis.feature.type.AttributeDescriptor;
import org.opengis.feature.type.FeatureType;
import org.opengis.feature.type.Name;
import org.opengis.filter.Filter;
import org.opengis.filter.expression.PropertyName;
import org.xml.sax.helpers.NamespaceSupport;
/**
* Describes a record, its schema, its possible representations, in a pluggable way
*
* @author Andrea Aime - GeoSolutions
* @author Niels Charlier
*/
public interface RecordDescriptor {
/**
* The GeoTools feature type representing this kind of record
*
*/
FeatureType getFeatureType();
/**
* The GeoTools descriptor representing this kind of record
*
*
*/
AttributeDescriptor getFeatureDescriptor();
/**
* The outputSchema name for this feature type
*/
String getOutputSchema();
/**
* The set of feature properties to be returned for the specified elementSetName (only needs
* to answer for the ElementSetType#BRIEF and ElementSetType#SUMMARY).
* The chosen Set implementation must respect the order in which the attributes are supposed
* to be encoded ({@link LinkedHashSet} will do)
*/
List<Name> getPropertiesForElementSet(ElementSetType elementSet);
/**
* Provides the namespace support needed to handle all schemas used/referenced by this record
*
*/
NamespaceSupport getNamespaceSupport();
/**
* Allow the descriptor to adjust the query to the internal representation of records.
* For example, in the case of SimpleLiteral we have a complex type with simple content,
* something that we cannot readily represent in GeoTools
*
* @param query
*
*/
Query adaptQuery(Query query);
/**
* Return the property name (with dots) for the bounding box property
*
* @return the bounding box property name
*/
String getBoundingBoxPropertyName();
/**
* Return the queryables for this type of record (for getcapabilities)
*
* @return list of queryable property names
*/
List<Name> getQueryables();
/**
* Return a description of the queriables according to iso standard (for getcapabilities)
*
* @return the description string
*/
String getQueryablesDescription();
/**
* Translate a property from a queryable name to a propertyname, possibly converting to an x-path
*
* @return the property name
*/
PropertyName translateProperty(Name name);
/**
* Checks that the spatial filters are actually referring to a spatial property.
* The {@link SpatialFilterChecker} utility class can be used against simple records (like CSW),
* but more complex record types will need a more sophisticated approach
*
* @param filter
*/
void verifySpatialFilters(Filter filter);
}