tim@130: package de.intevation.gnv.geobackend.sde.connectionpool;
tim@130:
sascha@886: import de.intevation.gnv.geobackend.base.connectionpool.exception.ConnectionException;
sascha@886:
sascha@886: import de.intevation.gnv.geobackend.sde.datasources.ArcSDEConnection;
sascha@886:
tim@130: import java.sql.Connection;
tim@265: import java.sql.SQLException;
sascha@886:
tim@130: import java.util.Properties;
tim@130:
tim@130: import org.apache.commons.pool.PoolableObjectFactory;
tim@130:
sascha@886: import org.apache.log4j.Logger;
tim@884:
tim@130: /**
tim@884: * ArcSDE specific Implementation of an PoolableObjectFactory.
tim@884: * This factory instantiate Objects of type ArcSDEConnection.
sascha@885: *
sascha@887: * @author Tim Englich
sascha@887: * @author Sascha L. Teichmann
tim@130: */
tim@130: public class ArcSDEPoolableObjectFactory implements PoolableObjectFactory {
tim@130:
tim@274: /**
tim@130: * the logger, used to log exceptions and additonaly information
tim@130: */
sascha@553: private static Logger log = Logger.getLogger(
sascha@553: ArcSDEPoolableObjectFactory.class);
sascha@553:
tim@884: /**
tim@884: * The 5 seconds are inspired by GeoTools's testServer() usage.
tim@884: */
sascha@885: private int serverRoundtripInterval = 5;
tim@884: /**
sascha@885: * The value of the maximum Time a Connection is allowed to
tim@884: * be inactive without the validation of the Connection.
tim@884: */
sascha@553: private long serverInactiveInterval = 5L*60L*1000L; // 5 minutes
tim@274: /**
tim@274: * The URL to the ArcSDE Server
tim@274: */
tim@274: private String server = null;
tim@274: /**
tim@274: * The Port the ArcSDE Server is connected to.
tim@274: */
tim@274: private String port = null;
tim@274: /**
tim@274: * The Name of the Database
tim@274: */
tim@274: private String database = null;
tim@274: /**
tim@274: * The Username for the Authentication
tim@274: */
tim@274: private String username = null;
tim@274: /**
tim@274: * The Credentials which belongs to the User
tim@274: */
tim@274: private String credentials = null;
sascha@885:
tim@274: /**
tim@274: * Constructor of this Class
tim@274: * @param properties the Properties which includes the ConnectionParams to the Database
tim@274: */
tim@274: public ArcSDEPoolableObjectFactory(Properties properties) {
sascha@553:
tim@274: log.debug("ArcSDEPoolableObjectFactory.Constructor");
sascha@553:
sascha@553: server = properties.getProperty("server");
sascha@553: port = properties.getProperty("port");
sascha@553: database = properties.getProperty("database");
sascha@553: username = properties.getProperty("username");
sascha@553: credentials = properties.getProperty("credentials");
sascha@553:
sascha@553: String serverRoundtripIntervalValue =
sascha@553: properties.getProperty("serverRoundtripInterval");
sascha@553: String serverInactiveIntervalValue =
sascha@553: properties.getProperty("serverInactiveInterval");
sascha@885:
tim@551: try {
sascha@553: if (serverRoundtripIntervalValue != null) {
sascha@553: serverRoundtripInterval =
sascha@553: Integer.parseInt(serverRoundtripIntervalValue);
tim@551: }
sascha@553: }
sascha@553: catch (NumberFormatException e) {
sascha@553: log.error(e,e);
sascha@553: }
sascha@553:
sascha@553: try {
sascha@553: if (serverInactiveIntervalValue != null) {
sascha@553: serverInactiveInterval = 1000L * // input in seconds!
sascha@553: Long.parseLong(serverInactiveIntervalValue);
sascha@553: }
sascha@553: }
sascha@553: catch (NumberFormatException e) {
tim@551: log.error(e,e);
tim@551: }
sascha@885:
tim@274: log.info("ArcSDEPoolableObjectFactory initialized");
sascha@553: log.info("Server: " + server);
sascha@553: log.info("Port: " + port);
sascha@553: log.info("Database: " + database);
sascha@553: log.info("User: " + username);
sascha@553: log.info("Roundtrip check interval: " + serverRoundtripInterval);
sascha@553: log.info("Inactive check interval: " + serverInactiveInterval);
sascha@553: }
tim@130:
tim@274: /**
tim@274: * @see org.apache.commons.pool.PoolableObjectFactory#activateObject(java.lang.Object)
tim@274: */
tim@274: public void activateObject(Object arg0) throws Exception {
tim@274: log.debug("ArcSDEPoolableObjectFactory.activateObject");
tim@274: }
tim@130:
tim@274: /**
tim@274: * @see org.apache.commons.pool.PoolableObjectFactory#destroyObject(java.lang.Object)
tim@274: */
tim@274: public void destroyObject(Object arg0) throws Exception {
tim@274: log.debug("ArcSDEPoolableObjectFactory.destroyObjectb");
tim@274: if (arg0 instanceof ArcSDEConnection) {
tim@274: ((ArcSDEConnection)arg0).close();
tim@274: }else{
tim@274: log.warn("Object cannot be handled");
tim@274: }
tim@274: }
tim@130:
tim@274: /**
tim@274: * @see org.apache.commons.pool.PoolableObjectFactory#makeObject()
tim@274: */
tim@274: public Object makeObject() throws Exception {
tim@274: log.debug("ArcSDEPoolableObjectFactory.makeObject");
tim@274: Connection con;
tim@274: try {
sascha@553: con = new ArcSDEConnection(
sascha@885: server,
sascha@553: port,
sascha@885: database,
sascha@553: username,
sascha@553: credentials,
sascha@553: serverRoundtripInterval,
sascha@553: serverInactiveInterval);
tim@130: }
tim@130: catch (ConnectionException e) {
sascha@553: throw new ConnectionException(
sascha@553: "Establishing a connection to database failed: " +
sascha@553: e.toString(), e);
tim@130: }
tim@130: return con;
tim@274: }
tim@130:
tim@274: /**
tim@274: * @see org.apache.commons.pool.PoolableObjectFactory#passivateObject(java.lang.Object)
tim@274: */
tim@274: public void passivateObject(Object arg0) throws Exception {
sascha@553:
sascha@553: boolean debug = log.isDebugEnabled();
sascha@553:
sascha@553: if (debug) {
sascha@553: log.debug("ArcSDEPoolableObjectFactory.passivateObject");
sascha@553: }
sascha@553:
sascha@553: if (arg0 instanceof ArcSDEConnection) {
sascha@553: if (debug) {
sascha@553: log.debug(" touching connection");
sascha@553: }
sascha@553: ((ArcSDEConnection)arg0).touch();
sascha@553: }
tim@274: }
tim@130:
tim@274: /**
tim@274: * @see org.apache.commons.pool.PoolableObjectFactory#validateObject(java.lang.Object)
tim@274: */
tim@274: public boolean validateObject(Object arg0) {
sascha@553:
sascha@553: boolean debug = log.isDebugEnabled();
sascha@553:
sascha@553: if (debug) {
sascha@553: log.debug("ArcSDEPoolableObjectFactory.validateObject");
sascha@553: }
sascha@553:
sascha@553: if (!(arg0 instanceof ArcSDEConnection)) {
sascha@553: return false;
sascha@553: }
sascha@553:
tim@274: try {
sascha@553: ArcSDEConnection con = (ArcSDEConnection)arg0;
sascha@553:
sascha@553: boolean isValid =
sascha@553: con.isActive() && con.isValid(serverRoundtripInterval);
sascha@553:
sascha@553: if (!isValid && debug) {
sascha@553: log.debug("connection is invalid!");
sascha@553: }
sascha@553:
sascha@553: return isValid;
tim@265: }
sascha@553: catch (SQLException sqle) {
sascha@553: log.error(sqle, sqle);
sascha@553: }
sascha@553:
sascha@553: return false;
tim@274: }
tim@265: }