Class JDBCFeatureStore
- Object
-
- ContentFeatureSource
-
- ContentFeatureStore
-
- JDBCFeatureStore
-
- All Implemented Interfaces:
FeatureLocking<SimpleFeatureType,SimpleFeature>
,FeatureSource<SimpleFeatureType,SimpleFeature>
,FeatureStore<SimpleFeatureType,SimpleFeature>
,SimpleFeatureLocking
,SimpleFeatureSource
,SimpleFeatureStore
public final class JDBCFeatureStore extends ContentFeatureStore
FeatureStore implementation for jdbc based relational database tables.All read only methods are delegated to
JDBCFeatureSource
.- Author:
- Justin Deoliveira, The Open Planning Project
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface FeatureLocking
FeatureLocking.Response
-
-
Field Summary
Fields Modifier and Type Field Description JDBCFeatureSource
delegate
jdbc feature source to delegate to, we do this b/c we can't inherit from both ContentFeatureStore and JDBCFeatureSource at the same time-
Fields inherited from class ContentFeatureStore
ORIGINAL_FEATURE_KEY, WRITER_ADD, WRITER_COMMIT, WRITER_UPDATE
-
Fields inherited from class ContentFeatureSource
entry, hints, lock, query, queryCapabilities, schema, transaction
-
-
Constructor Summary
Constructors Constructor Description JDBCFeatureStore(ContentEntry entry, Query query)
Creates the new feature store.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected SimpleFeatureType
buildFeatureType()
Creates the feature type or schema for the feature source.protected boolean
canEvent()
We handle events internallyprotected boolean
canFilter(Query query)
Determines if the datastore can natively perform a filtering.protected boolean
canLimit(Query query)
Determines if the datastore can natively limit the number of features returned in a query.protected boolean
canOffset(Query query)
Determines if the datastore can natively skip the firstoffset
number of features returned in a query.protected boolean
canRetype(Query query)
Determines if the datastore can natively perform "retyping" which includes limiting the number of attributes returned and reordering of those attributesprotected boolean
canSort(Query query)
Determines if the datastore can natively perform sorting.protected boolean
canTransact()
Determines if the store can natively manage transactions.protected ReferencedEnvelope
getBoundsInternal(Query query)
Calculates the bounds of a specified query.protected int
getCountInternal(Query query)
Calculates the number of features of a specified query.JDBCDataStore
getDataStore()
The datastore that this feature source originated from.ContentEntry
getEntry()
The entry for the feature source.JDBCFeatureSource
getFeatureSource()
ResourceInfo
getInfo()
A default ResourceInfo with a generic description.Name
getName()
Returns the same name than the feature type (ie,getSchema().getName()
to honor the simple feature land common practice of calling the same both the Features produces and their typesPrimaryKey
getPrimaryKey()
QueryCapabilities
getQueryCapabilities()
SimpleFeatureCollection optimized for read-only access.protected FeatureReader<SimpleFeatureType,SimpleFeature>
getReaderInternal(Query query)
Subclass method for returning a native reader from the datastore.JDBCState
getState()
The current state for the feature source.Transaction
getTransaction()
The current transaction the feature source is working against.protected FeatureWriter<SimpleFeatureType,SimpleFeature>
getWriterInternal(Query query, int flags)
Subclass method for returning a native writer from the datastore.protected boolean
handleVisitor(Query query, FeatureVisitor visitor)
Subclass method which allows subclasses to natively handle a visitor.boolean
isExposePrimaryKeyColumns()
The flag which will expose columns which compose a tables identifying or primary key, through feature type attributes.void
modifyFeatures(Name[] names, Object[] values, Filter filter)
Modifies/updates the features of the store which match the specified filter.void
removeFeatures(Filter filter)
Removes the features from the store which match the specified filter.void
setExposePrimaryKeyColumns(boolean exposePrimaryKeyColumns)
Sets the flag which will expose columns which compose a tables identifying or primary key, through feature type attributes.void
setTransaction(Transaction transaction)
Sets the current transaction the feature source is working against.-
Methods inherited from class ContentFeatureStore
addFeatures, addFeatures, getWriter, getWriter, getWriter, getWriter, modifyFeatures, modifyFeatures, modifyFeatures, modifyFeatures, modifyFeatures, setFeatures
-
Methods inherited from class ContentFeatureSource
accepts, addFeatureListener, addHints, buildQueryCapabilities, canFilter, canLimit, canLock, canOffset, canReproject, canRetype, canSort, doLockInternal, doUnlockInternal, getAbsoluteSchema, getBounds, getBounds, getCount, getFeatures, getFeatures, getFeatures, getReader, getReader, getReader, getSchema, getSupportedHints, getView, getView, isView, joinQuery, lockFeatures, lockFeatures, lockFeatures, processLock, removeFeatureListener, resolvePropertyNames, resolvePropertyNames, setFeatureLock, unLockFeatures, unLockFeatures, unLockFeatures
-
Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface FeatureLocking
lockFeatures, lockFeatures, lockFeatures, setFeatureLock, unLockFeatures, unLockFeatures, unLockFeatures
-
Methods inherited from interface FeatureSource
addFeatureListener, getBounds, getBounds, getCount, getSchema, getSupportedHints, removeFeatureListener
-
Methods inherited from interface SimpleFeatureStore
getFeatures, getFeatures, getFeatures
-
-
-
-
Field Detail
-
delegate
public JDBCFeatureSource delegate
jdbc feature source to delegate to, we do this b/c we can't inherit from both ContentFeatureStore and JDBCFeatureSource at the same time
-
-
Constructor Detail
-
JDBCFeatureStore
public JDBCFeatureStore(ContentEntry entry, Query query) throws IOException
Creates the new feature store.- Parameters:
entry
- The datastore entry.query
- The defining query.- Throws:
IOException
-
-
Method Detail
-
canEvent
protected boolean canEvent()
We handle events internally- Overrides:
canEvent
in classContentFeatureSource
- Returns:
- true if event notification has custom implementation
-
getDataStore
public JDBCDataStore getDataStore()
Description copied from class:ContentFeatureSource
The datastore that this feature source originated from.Subclasses may wish to extend this method in order to type narrow its return type.
- Specified by:
getDataStore
in interfaceFeatureSource<SimpleFeatureType,SimpleFeature>
- Overrides:
getDataStore
in classContentFeatureSource
- Returns:
- the data source providing this
FeatureSource
-
getFeatureSource
public JDBCFeatureSource getFeatureSource()
-
getEntry
public ContentEntry getEntry()
Description copied from class:ContentFeatureSource
The entry for the feature source.- Overrides:
getEntry
in classContentFeatureSource
-
getInfo
public ResourceInfo getInfo()
Description copied from class:ContentFeatureSource
A default ResourceInfo with a generic description.Subclasses should override to provide an explicit ResourceInfo object for their content.
- Specified by:
getInfo
in interfaceFeatureSource<SimpleFeatureType,SimpleFeature>
- Overrides:
getInfo
in classContentFeatureSource
- Returns:
- description of features contents
-
getName
public Name getName()
Description copied from class:ContentFeatureSource
Returns the same name than the feature type (ie,getSchema().getName()
to honor the simple feature land common practice of calling the same both the Features produces and their types- Specified by:
getName
in interfaceFeatureSource<SimpleFeatureType,SimpleFeature>
- Overrides:
getName
in classContentFeatureSource
- Returns:
- the name of the features accessible through this
FeatureSource
- See Also:
FeatureSource.getName()
-
getQueryCapabilities
public QueryCapabilities getQueryCapabilities()
Description copied from class:ContentFeatureSource
SimpleFeatureCollection optimized for read-only access.Available via getView( filter ):
- getFeatures().sort( sort )
- getFeatures( filter ).sort( sort )
In particular this method of data access is intended for rendering and other high speed operations; care should be taken to optimize the use of FeatureVisitor.
- Specified by:
getQueryCapabilities
in interfaceFeatureSource<SimpleFeatureType,SimpleFeature>
- Overrides:
getQueryCapabilities
in classContentFeatureSource
- Returns:
- readonly access
-
getState
public JDBCState getState()
Description copied from class:ContentFeatureSource
The current state for the feature source.This value is derived from current transaction of the feature source.
- Overrides:
getState
in classContentFeatureSource
-
getTransaction
public Transaction getTransaction()
Description copied from class:ContentFeatureSource
The current transaction the feature source is working against.This transaction is used to derive the state for the feature source. A
null
value for a transaction represents the auto commit transaction:Transaction.AUTO_COMMIT
.- Specified by:
getTransaction
in interfaceFeatureStore<SimpleFeatureType,SimpleFeature>
- Overrides:
getTransaction
in classContentFeatureSource
- Returns:
- Transaction in use, or Transaction.AUTO_COMMIT
-
setTransaction
public void setTransaction(Transaction transaction)
Description copied from class:ContentFeatureSource
Sets the current transaction the feature source is working against.transaction may be
null
. This signifies that the auto-commit transaction is used:Transaction.AUTO_COMMIT
.- Specified by:
setTransaction
in interfaceFeatureStore<SimpleFeatureType,SimpleFeature>
- Overrides:
setTransaction
in classContentFeatureSource
- Parameters:
transaction
- The new transaction, ornull
.
-
getPrimaryKey
public PrimaryKey getPrimaryKey()
-
setExposePrimaryKeyColumns
public void setExposePrimaryKeyColumns(boolean exposePrimaryKeyColumns)
Sets the flag which will expose columns which compose a tables identifying or primary key, through feature type attributes.Note: setting this flag which affect all feature sources created from or working against the current transaction.
-
isExposePrimaryKeyColumns
public boolean isExposePrimaryKeyColumns()
The flag which will expose columns which compose a tables identifying or primary key, through feature type attributes.
-
buildFeatureType
protected SimpleFeatureType buildFeatureType() throws IOException
Description copied from class:ContentFeatureSource
Creates the feature type or schema for the feature source.Implementations should use
SimpleFeatureTypeBuilder
to build the feature type. Also, the builder should be injected with the feature factory which has been set on the DataStore (seeContentDataStore.getFeatureFactory()
. Example:SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder(); b.setFeatureTypeFactory( getDataStore().getFeatureTypeFactory() ); //build the feature type ...
- Specified by:
buildFeatureType
in classContentFeatureSource
- Throws:
IOException
-
getCountInternal
protected int getCountInternal(Query query) throws IOException
Description copied from class:ContentFeatureSource
Calculates the number of features of a specified query. Subclasses must implement this method. If the computation is not fast, it's possible to return -1.- Specified by:
getCountInternal
in classContentFeatureSource
- Throws:
IOException
-
getBoundsInternal
protected ReferencedEnvelope getBoundsInternal(Query query) throws IOException
Description copied from class:ContentFeatureSource
Calculates the bounds of a specified query. Subclasses must implement this method. If the computation is not fast, subclasses can returnnull
.- Specified by:
getBoundsInternal
in classContentFeatureSource
- Throws:
IOException
-
canFilter
protected boolean canFilter(Query query)
Description copied from class:ContentFeatureSource
Determines if the datastore can natively perform a filtering.If the subclass can handle filtering natively it should override this method to return
true
. In this case it must do the filtering or throw an exception. This includes the case of partial native filtering where the datastore can only handle part of the filter natively. In these cases it is up to the subclass to apply a decorator to the reader it returns which will handle any part of the filter can was not applied natively. SeeFilteringFeatureReader
.Not overriding this method or returning
false
will cause the feature reader created by the subclass to be wrapped in a filtering feature reader when the query specifies a filter. SeeFilteringFeatureReader
.- Overrides:
canFilter
in classContentFeatureSource
-
canSort
protected boolean canSort(Query query)
Description copied from class:ContentFeatureSource
Determines if the datastore can natively perform sorting.If the subclass can handle retyping natively it should override this method to return
true
. In this case it must do the retyping or throw an exception.Not overriding this method or returning
false
will cause an exception to be thrown when the query specifies sorting.- Overrides:
canSort
in classContentFeatureSource
- See Also:
SortedFeatureReader
-
canRetype
protected boolean canRetype(Query query)
Description copied from class:ContentFeatureSource
Determines if the datastore can natively perform "retyping" which includes limiting the number of attributes returned and reordering of those attributesIf the subclass can handle retyping natively it should override this method to return
true
. In this case it must do the retyping or throw an exception.Not overriding this method or returning
false
will cause the feature reader created by the subclass to be wrapped in a retyping feature reader when the query specifies a retype.- Overrides:
canRetype
in classContentFeatureSource
- See Also:
ReTypeFeatureReader
-
canLimit
protected boolean canLimit(Query query)
Description copied from class:ContentFeatureSource
Determines if the datastore can natively limit the number of features returned in a query.If the subclass can handle a map feature cap natively then it should override this method to return
true
. In this case it must do the cap or throw an exception.Not overriding this method or returning
false
will case the feature reader created by the subclass to be wrapped in a max feature capping decorator when the query specifies a max feature cap.- Overrides:
canLimit
in classContentFeatureSource
- See Also:
MaxFeatureReader
-
canOffset
protected boolean canOffset(Query query)
Description copied from class:ContentFeatureSource
Determines if the datastore can natively skip the firstoffset
number of features returned in a query.If the subclass can handle a map feature cap natively then it should override this method to return
true
. In this case it must do the cap or throw an exception.Not overriding this method or returning
false
will case the feature reader created by the subclass to be accessed offset times before being returned to the caller.- Overrides:
canOffset
in classContentFeatureSource
-
canTransact
protected boolean canTransact()
Description copied from class:ContentFeatureSource
Determines if the store can natively manage transactions.If a subclass can handle transactions natively it should override this method to return
true
and deal with transactions on its own, including firing feature modifications events.- Overrides:
canTransact
in classContentFeatureSource
- Returns:
- true if transaction independence has custom implementation
-
getReaderInternal
protected FeatureReader<SimpleFeatureType,SimpleFeature> getReaderInternal(Query query) throws IOException
Description copied from class:ContentFeatureSource
Subclass method for returning a native reader from the datastore.It is important to note that if the native reader intends to handle any of the following natively:
- reprojection
- filtering
- max feature limiting
- sorting
- locking
- transactions
true
:ContentFeatureSource.canReproject()
- handlesQuery.getCoordinateSystemReproject()
internally. Example would be PostGIS using Proj to handle reproejction internallyContentFeatureSource.canFilter(Query)
- handlesinternally.
- {@link #canLimit(Query)} - handles {@link Query#getMaxFeatures()} and {@link Query#getStartIndex()} internally.
- {@link #canSort(Query)} - handles {@link Query#getSortBy()} natively.
- {@link #canRetype(Query)} - handles {@link Query#getProperties()} natively. Example would be only parsing the properties the user asks for from an XML file
- {@link #canLock()} - handles read-locks natively
- {@link #canTransact()} - handles transactions natively
- Specified by:
getReaderInternal
in classContentFeatureSource
- Throws:
IOException
-
handleVisitor
protected boolean handleVisitor(Query query, FeatureVisitor visitor) throws IOException
Description copied from class:ContentFeatureSource
Subclass method which allows subclasses to natively handle a visitor.Subclasses would override this method and return true in cases where the specific visitor could be handled without iterating over the entire result set of query. An example would be handling visitors that calculate aggregate values.
- Overrides:
handleVisitor
in classContentFeatureSource
- Parameters:
query
- The query being made.visitor
- The visitor to- Returns:
- true if the visitor can be handled natively, otherwise false.
- Throws:
IOException
-
getWriterInternal
protected FeatureWriter<SimpleFeatureType,SimpleFeature> getWriterInternal(Query query, int flags) throws IOException
Description copied from class:ContentFeatureStore
Subclass method for returning a native writer from the datastore.It is important to note that if the native writer intends to handle any of the following natively:
- reprojection
- filtering
- events
- max feature limiting
- sorting
- locking
true
:- Specified by:
getWriterInternal
in classContentFeatureStore
- Parameters:
query
- Queryflags
- SeeContentFeatureStore.WRITER_ADD
andContentFeatureStore.WRITER_UPDATE
- Throws:
IOException
-
modifyFeatures
public void modifyFeatures(Name[] names, Object[] values, Filter filter) throws IOException
Description copied from class:ContentFeatureStore
Modifies/updates the features of the store which match the specified filter.This method operates by obtaining an updating feature writer based on the specified filter and writing the updated values to it.
The filter must not be
null
, in this case this method will throw anIllegalArgumentException
.- Specified by:
modifyFeatures
in interfaceFeatureStore<SimpleFeatureType,SimpleFeature>
- Overrides:
modifyFeatures
in classContentFeatureStore
- Parameters:
names
- the attributes to modifyvalues
- the new values for the attributesfilter
- an OpenGIS filter- Throws:
IOException
- if the attribute and object arrays are not equal in length; if the value types do not match the attribute types; if modification is not supported; or if there errors accessing the data source
-
removeFeatures
public void removeFeatures(Filter filter) throws IOException
Description copied from class:ContentFeatureStore
Removes the features from the store which match the specified filter.This method operates by obtaining an updating feature writer based on the specified filter and removing every feature from it.
The filter must not be
null
, in this case this method will throw anIllegalArgumentException
.- Specified by:
removeFeatures
in interfaceFeatureStore<SimpleFeatureType,SimpleFeature>
- Overrides:
removeFeatures
in classContentFeatureStore
- Parameters:
filter
- an OpenGIS filter- Throws:
IOException
- if an error occurs modifying the data source
-
-