org.geotools.data.dir
Class DirectoryDataStore

java.lang.Object
  extended byorg.geotools.data.dir.DirectoryDataStore
All Implemented Interfaces:
DataStore, LockingManager

public class DirectoryDataStore
extends java.lang.Object
implements DataStore, LockingManager

This datastore represents methods of reading an enture directory. It propagates actual reading / writing of the data to the dataStore which reads / writes the requested format.

Author:
dzwiers

Constructor Summary
DirectoryDataStore(java.io.File f, java.lang.String[] co)
          Creates a new DirectoryDataStore object.
 
Method Summary
 void createSchema(FeatureType featureType)
          Creates storage for a new featureType.
 boolean exists(java.lang.String authID)
          Check if any locks exist held by the authorization lockID.
 FeatureReader getFeatureReader(Query query, Transaction transaction)
          Access a FeatureReader providing access to Feature information.
 FeatureSource getFeatureSource(java.lang.String typeName)
          Access a FeatureSource for typeName providing a high-level API.
 FeatureWriter getFeatureWriter(java.lang.String typeName, Filter filter, Transaction transaction)
          Access FeatureWriter for modification of existing DataStore contents.
 FeatureWriter getFeatureWriter(java.lang.String typeName, Transaction transaction)
          Access FeatureWriter for modification of the DataStore typeName.
 FeatureWriter getFeatureWriterAppend(java.lang.String typeName, Transaction transaction)
          Aquire a FeatureWriter for adding new content to a FeatureType.
 LockingManager getLockingManager()
          Retrieve a per featureID based locking service from this DataStore.
 FeatureType getSchema(java.lang.String typeName)
          Retrieve FeatureType metadata by typeName.
 java.lang.String[] getTypeNames()
          Retrieves a list of of the available FeatureTypes.
 FeatureSource getView(Query query)
          Access a FeatureSource for Query providing a high-level API.
 void lockFeatureID(java.lang.String typeName, java.lang.String authID, Transaction transaction, FeatureLock featureLock)
          FeatureID based locking.
 boolean refresh(java.lang.String authID, Transaction transaction)
          Refresh locks held by the authorization lockID.
 boolean release(java.lang.String authID, Transaction transaction)
          Release locks held by the authorization lockID.
 void unLockFeatureID(java.lang.String typeName, java.lang.String authID, Transaction transaction, FeatureLock featureLock)
          FeatureID based unlocking.
 void updateSchema(java.lang.String typeName, FeatureType featureType)
          Used to force namespace and CS info into a persistent change.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

DirectoryDataStore

public DirectoryDataStore(java.io.File f,
                          java.lang.String[] co)
                   throws java.net.MalformedURLException,
                          java.io.IOException
Creates a new DirectoryDataStore object.

Parameters:
f - File the directory
co - list of file suffixes in order of preference for creating new FTs
Throws:
java.net.MalformedURLException
java.io.IOException
Method Detail

getView

public FeatureSource getView(Query query)
                      throws java.io.IOException,
                             SchemaException
Description copied from interface: DataStore
Access a FeatureSource for Query providing a high-level API.

The provided Query does not need to completely cover the existing schema for Query.getTypeName(). The result will mostly likely only be a FeatureSource and probably wont' allow write access by the FeatureStore method.

By using Query we allow support for reprojection, in addition to overriding the CoordinateSystem used by the native FeatureType.

We may wish to limit this method to only support Queries using Filter.ALL.

Update - GeoServer has an elegatent implementation of this functionality that we could steal. GeoServerFeatureSource, GeoServerFeatureStore and GeoServerFeatureLocking serve as a working prototype.

Specified by:
getView in interface DataStore
Returns:
FeatureSource providing opperations for featureType
Throws:
SchemaException - If fetureType is not covered by existing schema
java.io.IOException - If FeatureSource is not available

getTypeNames

public java.lang.String[] getTypeNames()
                                throws java.io.IOException
Description copied from interface: DataStore
Retrieves a list of of the available FeatureTypes.

This is simply a list of the FeatureType names as aquiring the actual FeatureType schemas may be expensive.

Warning: this list may not be unique - the types may be in separate namespaces.

If you need to worry about such things please consider the use of the Catalog and CatalogEntry interface - many DataStores support this. getTypeNames is really a convience method for a Catalog.iterator() where the name of each entry is returned.

Specified by:
getTypeNames in interface DataStore
Returns:
typeNames for available FeatureTypes.
Throws:
java.io.IOException
See Also:
DataStore.getTypeNames()

getSchema

public FeatureType getSchema(java.lang.String typeName)
                      throws java.io.IOException
Description copied from interface: DataStore
Retrieve FeatureType metadata by typeName.

Retrieves the Schema information as a FeatureType object.

Specified by:
getSchema in interface DataStore
Parameters:
typeName - typeName of requested FeatureType
Returns:
FeatureType for the provided typeName
Throws:
java.io.IOException - If typeName cannot be found
See Also:
DataStore.getSchema(java.lang.String)

createSchema

public void createSchema(FeatureType featureType)
                  throws java.io.IOException
Description copied from interface: DataStore
Creates storage for a new featureType.

The provided featureType we be accessable by the typeName provided by featureType.getTypeName().

Specified by:
createSchema in interface DataStore
Parameters:
featureType - FetureType to add to DataStore
Throws:
java.io.IOException - If featureType cannot be created
See Also:
DataStore.createSchema(org.geotools.feature.FeatureType)

updateSchema

public void updateSchema(java.lang.String typeName,
                         FeatureType featureType)
                  throws java.io.IOException
Description copied from interface: DataStore
Used to force namespace and CS info into a persistent change.

The provided featureType should completely cover the existing schema. All attributes should be accounted for and the typeName should match.

Suggestions:

Specified by:
updateSchema in interface DataStore
Parameters:
typeName -
Throws:
java.io.IOException
See Also:
DataStore.updateSchema(java.lang.String, org.geotools.feature.FeatureType)

getFeatureSource

public FeatureSource getFeatureSource(java.lang.String typeName)
                               throws java.io.IOException
Description copied from interface: DataStore
Access a FeatureSource for typeName providing a high-level API.

The resulting FeatureSource may implment more functionality:


 
 FeatureSource fsource = dataStore.getFeatureSource( "roads" );
 FeatureStore fstore = null;
 if( fsource instanceof FeatureLocking ){
     fstore = (FeatureStore) fs;
 }
 else {
     System.out.println("We do not have write access to roads");
 }
 
 

Specified by:
getFeatureSource in interface DataStore
Parameters:
typeName -
Returns:
FeatureSource (or subclass) providing opperations for typeName
Throws:
java.io.IOException
See Also:
DataStore.getFeatureSource(java.lang.String)

getFeatureReader

public FeatureReader getFeatureReader(Query query,
                                      Transaction transaction)
                               throws java.io.IOException
Description copied from interface: DataStore
Access a FeatureReader providing access to Feature information.

Filter is used as a low-level indication of constraints. (Implementations may resort to using a FilteredFeatureReader, or provide their own optimizations)

FeatureType provides a template for the returned FeatureReader

Transaction to externalize DataStore state on a per Transaction basis. The most common example is a JDBC datastore saving a Connection for use across several FeatureReader requests. Similarly a Shapefile reader may wish to redirect FeatureReader requests to a alternate filename over the course of a Transaction.

Notes For Implementing DataStore

Subclasses may need to retrieve additional attributes, beyond those requested by featureType.getAttributeTypes(), in order to correctly apply the filter.
These Additional attribtues should be not be returned by FeatureReader. Subclasses may use ReTypeFeatureReader to aid in acomplishing this.

Helper classes for implementing a FeatureReader (in order):

Sample use (not optimized):


 if (filter == Filter.ALL) {
      return new EmptyFeatureReader(featureType);
  }

  String typeName = featureType.getTypeName();
  FeatureType schema = getSchema( typeName );
  FeatureReader reader = new DefaultFeatureReader( getAttributeReaders(), schema );

  if (filter != Filter.NONE) {
      reader = new FilteringFeatureReader(reader, filter);
  }

  if (transaction != Transaction.AUTO_COMMIT) {
      Map diff = state(transaction).diff(typeName);
      reader = new DiffFeatureReader(reader, diff);
  }

  if (!featureType.equals(reader.getFeatureType())) {
      reader = new ReTypeFeatureReader(reader, featureType);
  }
 return reader
 

Locking support does not need to be provided for FeatureReaders.

Specified by:
getFeatureReader in interface DataStore
Parameters:
query - Requested form of the returned Features and the filter used to constraints the results
transaction - Transaction this query opperates against
Returns:
FeatureReader Allows Sequential Processing of featureType
Throws:
java.io.IOException
See Also:
DataStore.getFeatureReader(org.geotools.data.Query, org.geotools.data.Transaction)

getFeatureWriter

public FeatureWriter getFeatureWriter(java.lang.String typeName,
                                      Filter filter,
                                      Transaction transaction)
                               throws java.io.IOException
Description copied from interface: DataStore
Access FeatureWriter for modification of existing DataStore contents.

To limit FeatureWriter to the FeatureTypes defined by this DataStore, typeName is used to indicate FeatureType. The resulting feature writer will allow modifications against the same FeatureType provided by getSchema( typeName )

The FeatureWriter will provide access to the existing contents of the FeatureType referenced by typeName. The provided filter will be used to skip over Features as required.

Notes For Implementing DataStore

The returned FeatureWriter does not support the addition of new Features to FeatureType (it would need to police your modifications to agree with filer). As such it will return false for getNext() when it reaches the end of the Query and NoSuchElementException when next() is called.

Helper classes for implementing a FeatureWriter (in order):

  • InProcessLockingManager.checkedWriter( writer ) - provides a check against locks before allowing modification
  • FilteringFeatureWriter - filtering support for FeatureWriter (does not allow new content)
  • DiffFeatureWriter - In-Process Transaction Support (see TransactionStateDiff)
  • EmptyFeatureWriter - provides no content for Filter.ALL optimizations
  • Specified by:
    getFeatureWriter in interface DataStore
    Parameters:
    typeName - Indicates featureType to be modified
    filter - constraints used to limit the modification
    transaction - Transaction this query opperates against
    Returns:
    FeatureWriter Allows Sequential Modification of featureType
    Throws:
    java.io.IOException
    See Also:
    DataStore.getFeatureWriter(java.lang.String, org.geotools.filter.Filter, org.geotools.data.Transaction)

    getFeatureWriter

    public FeatureWriter getFeatureWriter(java.lang.String typeName,
                                          Transaction transaction)
                                   throws java.io.IOException
    Description copied from interface: DataStore
    Access FeatureWriter for modification of the DataStore typeName.

    FeatureWriters will need to be limited to the FeatureTypes defined by the DataStore, the easiest way to express this limitation is to the FeatureType by a provided typeName.

    The returned FeatureWriter will return false for getNext() when it reaches the end of the Query.

    Specified by:
    getFeatureWriter in interface DataStore
    Parameters:
    typeName - Indicates featureType to be modified
    transaction - Transaction to opperates against
    Returns:
    FeatureReader Allows Sequential Processing of featureType
    Throws:
    java.io.IOException
    See Also:
    DataStore.getFeatureWriter(java.lang.String, org.geotools.data.Transaction)

    getFeatureWriterAppend

    public FeatureWriter getFeatureWriterAppend(java.lang.String typeName,
                                                Transaction transaction)
                                         throws java.io.IOException
    Description copied from interface: DataStore
    Aquire a FeatureWriter for adding new content to a FeatureType.

    This FeatureWriter will return false for hasNext(), however next() may be used to aquire new Features that may be writen out to add new content.

    Specified by:
    getFeatureWriterAppend in interface DataStore
    Parameters:
    typeName - Indicates featureType to be modified
    transaction - Transaction to opperates against
    Returns:
    FeatureWriter that may only be used to append new content
    Throws:
    java.io.IOException
    See Also:
    DataStore.getFeatureWriterAppend(java.lang.String, org.geotools.data.Transaction)

    getLockingManager

    public LockingManager getLockingManager()
    Description copied from interface: DataStore
    Retrieve a per featureID based locking service from this DataStore.

    It is common to return an instanceof InProcessLockingManager for DataStores that do not provide native locking.

    AbstractFeatureLocking makes use of this service to provide locking support. You are not limitied by this implementation and may simply return null for this value.

    Specified by:
    getLockingManager in interface DataStore
    Returns:
    DataStores may return null, if the handling locking in another fashion.
    See Also:
    DataStore.getLockingManager()

    exists

    public boolean exists(java.lang.String authID)
    Description copied from interface: LockingManager
    Check if any locks exist held by the authorization lockID.

    (remember that the lock may have expired)

    Specified by:
    exists in interface LockingManager
    Parameters:
    authID - Authorization for lock
    Returns:
    true if lock was found
    See Also:
    LockingManager.exists(java.lang.String)

    release

    public boolean release(java.lang.String authID,
                           Transaction transaction)
                    throws java.io.IOException
    Description copied from interface: LockingManager
    Release locks held by the authorization lockID.

    (remember that the lock may have expired)

    Specified by:
    release in interface LockingManager
    Parameters:
    authID - Authorization for lock
    transaction - Transaction with authorization for lockID
    Returns:
    true if lock was found and released
    Throws:
    java.io.IOException - DOCUMENT ME!
    See Also:
    LockingManager.release(java.lang.String, org.geotools.data.Transaction)

    refresh

    public boolean refresh(java.lang.String authID,
                           Transaction transaction)
                    throws java.io.IOException
    Description copied from interface: LockingManager
    Refresh locks held by the authorization lockID.

    All features locked with the provied lockID will be locked for additional time (the origional duration requested).

    (remember that the lock may have expired)

    Specified by:
    refresh in interface LockingManager
    Parameters:
    authID - Authorization for lock
    transaction - Transaction with authorization for lockID
    Returns:
    true if lock was found and refreshed
    Throws:
    java.io.IOException - DOCUMENT ME!
    See Also:
    LockingManager.refresh(java.lang.String, org.geotools.data.Transaction)

    unLockFeatureID

    public void unLockFeatureID(java.lang.String typeName,
                                java.lang.String authID,
                                Transaction transaction,
                                FeatureLock featureLock)
                         throws java.io.IOException
    Description copied from interface: LockingManager
    FeatureID based unlocking.

    Specified by:
    unLockFeatureID in interface LockingManager
    Parameters:
    typeName -
    authID -
    transaction -
    featureLock -
    Throws:
    java.io.IOException - DOCUMENT ME!
    See Also:
    LockingManager.unLockFeatureID(java.lang.String, java.lang.String, org.geotools.data.Transaction, org.geotools.data.FeatureLock)

    lockFeatureID

    public void lockFeatureID(java.lang.String typeName,
                              java.lang.String authID,
                              Transaction transaction,
                              FeatureLock featureLock)
                       throws java.io.IOException
    Description copied from interface: LockingManager
    FeatureID based locking.

    Specified by:
    lockFeatureID in interface LockingManager
    Parameters:
    typeName -
    authID -
    transaction -
    featureLock -
    Throws:
    java.io.IOException - DOCUMENT ME!
    See Also:
    LockingManager.lockFeatureID(java.lang.String, java.lang.String, org.geotools.data.Transaction, org.geotools.data.FeatureLock)


    Copyright © GeoTools. All Rights Reserved.