/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data; import java.io.IOException; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.Name; import org.opengis.filter.Filter; import org.geotools.data.simple.SimpleFeatureSource; /** * This represents a physical source of feature data, such as a shapefiles or * database, where the features will be instances of {@code SimpleFeature}. * It is derived from the {@code DataAccess} interface (which works at the more * general {@code Feature} level. * * @see DataAccess * @see org.opengis.feature.Feature * @see SimpleFeature * * @author Jody Garnett, Refractions Research * * @source $URL$ * @version $Id$ */ public interface DataStore extends DataAccess<SimpleFeatureType, SimpleFeature>{ /** * Applies a new schema to the given feature type. This can be used * to add or remove properties. The resulting update will be persistent. * * @param typeName name of the feature type to update * * @param featureType the new schema to apply * * @throws IOException on error */ void updateSchema(String typeName, SimpleFeatureType featureType) throws IOException; /** * Gets the names of feature types available in this {@code DataStore}. * Please note that this is not guaranteed to return a list of unique * names since the same unqualified name may be present in separate * namespaces within the {@code DataStore}. * * @return names of feature types available in this {@code DataStore} * * @throws IOException if data access errors occur */ String[] getTypeNames() throws IOException; /** * Gets the type information (schema) for the specified feature type. * * @param typeName the feature type name * * @return the requested feature type * * @throws IOException if {@code typeName} is not available */ SimpleFeatureType getSchema(String typeName) throws IOException; /** * Gets a {@code SimpleFeatureSource} for features of the specified * type. {@code SimpleFeatureSource} provides a high-level API for * feature operations. * <p> * The resulting {@code SimpleFeatureSource} may implment more functionality * as in this example: * <pre><code> * * SimpleFeatureSource fsource = dataStore.getFeatureSource("roads"); * if (fsource instanceof SimpleFeatureStore) { * // we have write access to the feature data * SimpleFeatureStore fstore = (SimpleFeatureStore) fs; * } * else { * System.out.println("We do not have write access to roads"); * } * </code></pre> * * @param typeName the feature type * * @return a {@code SimpleFeatureSource} (or possibly a subclass) providing * operations for features of the specified type * * @throws IOException if data access errors occur * * @see SimpleFeatureSource * @see org.geotools.data.simple.SimpleFeatureStore */ SimpleFeatureSource getFeatureSource(String typeName) throws IOException; /** * Gets a {@code SimpleFeatureSource} for features of the type * specified by a qualified name (namespace plus type name). * * @param typeName the qualified name of the feature type * * @return a {@code SimpleFeatureSource} (or possibly a subclass) providing * operations for features of the specified type * * @throws IOException if data access errors occur * * @see #getFeatureSource(String) * @see SimpleFeatureSource * @see org.geotools.data.simple.SimpleFeatureStore */ SimpleFeatureSource getFeatureSource(Name typeName) throws IOException; /** * Gets a {@code FeatureReader} for features selected by the given * {@code Query}. {@code FeatureReader} provies an iterator-style * API to feature data. * <p> * The {@code Query} provides the schema for the form of the returned * features as well as a {@code Filter} to constrain the features * available via the reader. * <p> * The {@code Transaction} can be used to externalize the state of the * {@code DataStore}. Examples of this include a {@code JDBCDataStore} * sharing a connection for use across several {@code FeatureReader} requests; * and a {@code ShapefileDataStore} redirecting requests to an alternate file * during the course of a {@code Transaction}. * * @param query a query providing the schema and constraints for * features that the reader will return * * @param transaction a transaction that this reader will operate against * * @throws IOException if data access errors occur * * @return an instance of {@code FeatureReader} */ FeatureReader<SimpleFeatureType, SimpleFeature> getFeatureReader(Query query, Transaction transaction) throws IOException; /** * Gets a {@code FeatureWriter} to modify features in this {@code DataStore}. * {@code FeatureWriter} provides an iterator style API to features. * <p> * The returned writer does <b>not</b> allow features to be added. * * @param typeName the type name for features that will be accessible * * @param filter defines additional constraints on the features that will * be accessible * * @param transaction the transation that the returned writer operates * against * * @return an instance of {@code FeatureWriter} * * @throws IOException if data access errors occur * * @see #getFeatureWriterAppend(String, Transaction) */ FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Filter filter, Transaction transaction) throws IOException; /** * Gets a {@code FeatureWriter} to modify features in this {@code DataStore}. * {@code FeatureWriter} provides an iterator style API to features. * <p> * The returned writer does <b>not</b> allow features to be added. * * @param typeName the type name for features that will be accessible * * @param transaction the transation that the returned writer operates * against * * @return an instance of {@code FeatureWriter} * * @throws IOException if data access errors occur * * @see #getFeatureWriterAppend(String, Transaction) */ FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Transaction transaction) throws IOException; /** * Gets a {@code FeatureWriter} that can add new features to the {@code DataStore}. * <p> * The {@code FeatureWriter} will return {@code false} when its {@code hasNext()} * method is called, but {@code next()} can be used to acquire new features. * * @param typeName name of the feature type for which features will be added * * @param transaction the transaction to operate against * * @return an instance of {@code FeatureWriter} that can only be used to * append new features * * @throws IOException if data access errors occur */ FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriterAppend(String typeName, Transaction transaction) throws IOException; /** * Retrieve a per featureID based locking service from this {@code DataStore}. * * @return an instance of {@code LockingManager}; or {@code null} if locking * is handled by the {@code DataStore} in a different fashion */ LockingManager getLockingManager(); }