ingo@1127: /* ingo@1127: * Copyright (c) 2010 by Intevation GmbH ingo@1127: * ingo@1127: * This program is free software under the LGPL (>=v2.1) ingo@1127: * Read the file LGPL.txt coming with the software for details ingo@1127: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1127: */ ingo@1127: 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: }