tim@130: package de.intevation.gnv.geobackend.sde.connectionpool; tim@130: sascha@553: import de.intevation.gnv.geobackend.base.connectionpool.exception.ConnectionException; sascha@553: sascha@553: import de.intevation.gnv.geobackend.sde.datasources.ArcSDEConnection; sascha@553: tim@130: import java.sql.Connection; tim@265: import java.sql.SQLException; sascha@553: tim@130: import java.util.Properties; tim@130: tim@130: import org.apache.commons.pool.PoolableObjectFactory; sascha@553: tim@130: import org.apache.log4j.Logger; tim@130: tim@130: /** sascha@553: * @author Tim Englich (tim.englich@intevation.de) sascha@553: * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) 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: sascha@553: // The 5 seconds are inspired by GeoTools's testServer() usage. sascha@553: private int serverRoundtripInterval = 5; sascha@553: 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; tim@130: 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"); tim@274: 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: } tim@551: 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@553: server, sascha@553: port, sascha@553: 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: }