/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-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.postgis;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.geotools.data.DataSourceException;
import org.geotools.data.Query;
import org.geotools.data.Transaction;
import org.geotools.data.jdbc.FeatureTypeHandler;
import org.geotools.data.jdbc.JDBCDataStoreConfig;
import org.geotools.data.jdbc.fidmapper.FIDMapperFactory;
import org.geotools.data.postgis.fidmapper.PostgisFIDMapperFactory;
import org.geotools.data.postgis.fidmapper.VersionedFIDMapperFactory;
/**
* A postgis datastore subclass that provides extra accessors so that the versioned datastore can
* work.<br>
* This class is needed because this way all the JDBC datastore infrastructure can work without the
* need to break its assumptions.<br>
* For example, getSchema() usually returns a feature type that mimics the table structure, but for
* versioned data we have to return one that does not have the versioning columns.
*
* @author aaime
* @since 2.4
*
*/
class WrappedPostgisDataStore extends PostgisDataStore {
public WrappedPostgisDataStore(DataSource dataSource, JDBCDataStoreConfig config,
int optimizeMode) throws IOException {
super(dataSource, config, optimizeMode);
}
public WrappedPostgisDataStore(DataSource dataSource, String schema, String namespace,
int optimizeMode) throws IOException {
super(dataSource, schema, namespace, optimizeMode);
}
public WrappedPostgisDataStore(DataSource dataSource, String schema, String namespace)
throws IOException {
super(dataSource, schema, namespace);
}
public WrappedPostgisDataStore(DataSource dataSource, String namespace) throws IOException {
super(dataSource, namespace);
}
public WrappedPostgisDataStore(DataSource dataSource) throws IOException {
super(dataSource);
}
/**
* Overridden to store a versioned jdbc transaction state instead
*/
public Connection getConnection(Transaction transaction) throws IOException {
if (transaction != Transaction.AUTO_COMMIT) {
// we will need to save a JDBC connection is
// transaction.putState( connectionPool, JDBCState )
// throw new UnsupportedOperationException("Transactions not
// supported yet");
VersionedJdbcTransactionState state;
state = getVersionedJdbcTransactionState(transaction);
return state.getConnection();
}
try {
return createConnection();
} catch (SQLException sqle) {
throw new DataSourceException("Connection failed:" + sqle, sqle);
}
}
/**
* Returns the versioned jdbc transaction state, eventually
*
* @param transaction
* @return
* @throws IOException
* @throws DataSourceException
*/
protected VersionedJdbcTransactionState getVersionedJdbcTransactionState(Transaction transaction)
throws IOException, DataSourceException {
synchronized (transaction) {
VersionedJdbcTransactionState state;
state = (VersionedJdbcTransactionState) transaction.getState(this);
if (state == null) {
try {
Connection conn = createConnection();
conn.setAutoCommit(requireAutoCommit());
if (getTransactionIsolation() != Connection.TRANSACTION_NONE) {
// for us, NONE means use the default, which is
// usually READ_COMMITTED
conn.setTransactionIsolation(getTransactionIsolation());
}
state = new VersionedJdbcTransactionState(conn, this);
transaction.putState(this, state);
} catch (SQLException eep) {
throw new DataSourceException("Connection failed:" + eep, eep);
}
}
return state;
}
}
protected FIDMapperFactory buildFIDMapperFactory(JDBCDataStoreConfig config) {
return new VersionedFIDMapperFactory(new PostgisFIDMapperFactory(config));
}
public String[] propertyNames(Query query) throws IOException {
return super.propertyNames(query);
}
public JDBCDataStoreConfig getConfig() {
return config;
}
public FeatureTypeHandler getTypeHandler() {
return typeHandler;
}
}