/*
* 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 java.util.List;
import org.geotools.feature.FeatureCollection;
import org.opengis.feature.Feature;
import org.opengis.feature.type.FeatureType;
import org.opengis.feature.type.Name;
/**
* Access to Feature content from a service or file.
* <p>
* <h2>Description</h2>
* The DataAccess interface provides the following information about its contents:
* <ul>
* <li>{@link DataAccess.getInfo()} - information about the file or server itself
* <li>{@link DataAccess.getNames()} - list of the available contents (each is an individual resource)
* <li>{@link DataAccess.getSchema( Name )} - FeatureType describing the information available in the named resource
* </ul>
* <p>
* <h2>Contents</h2>
* You can access the contents of a service or file using getFeatureSource( Name ). Depending the
* abilities of your implementation and your credentials you will have access to
* <ul>
* <li>{@link FeatureSource}: read-only api similar to the WFS getFeature operations. Please note the reutrned
* FeatureCollection may be *lazy*; for many implementations no actual access will occur until you
* use the FetaureCollection for the first time.
* <li>{@link FeatureStore}: read/write api similar to the WFS Transaction operation. Batch changes such as
* addFeatures, modifyFeatures and removeFeatures are supported.
* <li>{@link FeatureLocking}: concurrency control; the Data Access API is thread safe; one consequence of this
* is modifications being held up while other threads read the contents. You may wish to Lock a selection
* of features for your exclusive use. Locks are timed; and will expire after the indicated period.
* </ul>
* <p>
* Please note that all interaction occurs within the context of a Transaction, this
* facility provides session management and is strongly advised. Please note that
* your application is responsible for managing its own Transactions; as an example
* they are often associated with a single Map in a desktop application; or a single
* session in a J2EE web app.
* <p>
* The use of Transaction.AUTO_COMMIT is suitable for read-only access when you wish
* to minimize the number of connections in use, when used for writing performance
* will often be terrible.
*
* <h2>Lifecycle</h2>
*
* Normal use:
* <ul>
* <li>Connect using a DataAccessFactory.createDataStore using a set of connection parameters
* <li>Application is responsible for holding a single instance to the service or file, DataAccess
* implementations will hold onto database connections, internal caches and so on - and as such
* should not be duplicated.
* <li>DataAccess.dispose() is called when the application is shut down
* </ul>
*
* Creation:
* <ul>
* <li>Created using a DataAccessFactory.createNewDataStore using a set of creation parameters
* <li>DataAccess.createSchema( T ) is called to set up the contents
* <li>DataAccess.getFetaureSource( Name ) is called, and FeatureStore.addFeatures( collection ) used to populate the contents
* <li>DataAccess.dispose() is called when the application is shut down
* </ul>
* <p>
* Applications are responsible for holding a single instance to the service or file, The
* DataAccess implementations will hold onto database connections, internal caches and so on - and as such
* should not be duplicated.
*
* @see DataStore Subclass restricted to working with simple content
* @param <T> Type of Feature Content, may be SimpleFeatureType
* @param <F> Feature Content, may be SimpleFetaure
*
* @source $URL$
*/
public interface DataAccess<T extends FeatureType, F extends Feature> {
/**
* Information about this service.
* <p>
* This method offers access to a summary of header or metadata
* information describing the service.
* </p>
* Subclasses may return a specific ServiceInfo instance that has
* additional information (such as FilterCapabilities).
* @return SeviceInfo
*/
ServiceInfo getInfo();
/**
* Creates storage for a new <code>featureType</code>.
*
* <p>
* The provided <code>featureType</code> we be accessable by the typeName
* provided by featureType.getTypeName().
* </p>
*
* @param featureType FetureType to add to DataStore
*
* @throws IOException If featureType cannot be created
*/
void createSchema(T featureType) throws IOException;
/**
* Used to update a schema in place.
* <p>
* This functionality is similar to an "alter table" statement in SQL. Implementation
* is optional; it may not be supported by all servers or files.
* @param typeName
* @param featureType
* @throws IOException if the operation failed
* @throws UnsupportedOperation if functionality is not available
*/
void updateSchema(Name typeName, T featureType)
throws IOException;
/**
* Names of the available Resources.
* <p>
* For additional information please see getInfo( Name ) and getSchema( Name ).
* </p>
* @return Names of the available contents.
* @throws IOException
*/
List<Name> getNames() throws IOException;
/**
* Description of the named resource.
* <p>
* The FeatureType returned describes the contents being published. For
* additional metadata please review getInfo( Name ).
*
* @param name Type name a the resource from getNames()
* @return Description of the FeatureType being made avaialble
* @throws IOException
*/
T getSchema(Name name) throws IOException;
/**
* Access to the named resource.
* <p>
* The level of access is represented by the instance of the FeatureSource
* being returned.
* <p>
* Formally:
* <ul>
* <li>FeatureSource - read-only access
* <li>FeatureStore - read-write access
* <li>FetureLocking - concurrency control
* <ul>
* Additional interfaces may be supported by the implementation you are using.
* @param typeName
* @return Access to the named resource being made available
* @throws IOException
*/
FeatureSource<T,F> getFeatureSource(Name typeName) throws IOException;
/**
* Disposes of this data store and releases any resource that it is using.
* <p>
* A <code>DataStore</code> cannot be used after <code>dispose</code> has
* been called, neither can any data access object it helped create, such
* as {@link FeatureReader}, {@link FeatureSource} or {@link FeatureCollection}.
* <p>
* This operation can be called more than once without side effects.
* <p>
* There is no thread safety assurance associated with this method. For example,
* client code will have to make sure this method is not called while retrieving/saving data
* from/to the storage, or be prepared for the consequences.
*/
void dispose();
//FeatureSource<T,F> getView(Query query) throws IOException, SchemaException;
//FeatureReader<T,F> getFeatureReader(Query query, Transaction transaction)
// throws IOException;
//FeatureWriter<T,F> getFeatureWriter(Name typeName, Filter filter, Transaction transaction)
// throws IOException;
//FeatureWriter<T,F> getFeatureWriter(Name typeName, Transaction transaction)
// throws IOException;
//FeatureWriter<T,F> getFeatureWriterAppend(Name typeName, Transaction transaction)
// throws IOException;
}