/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.epl.db;
import com.espertech.esper.client.ConfigurationDBRef;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* Database connection factory using {@link InitialContext} and {@link DataSource} to obtain connections.
*/
public class DatabaseDSConnFactory implements DatabaseConnectionFactory {
private final ConfigurationDBRef.DataSourceConnection dsConfig;
private final ConfigurationDBRef.ConnectionSettings connectionSettings;
private DataSource dataSource;
/**
* Ctor.
*
* @param dsConfig is the datasource object name and initial context properties.
* @param connectionSettings are the connection-level settings
*/
public DatabaseDSConnFactory(ConfigurationDBRef.DataSourceConnection dsConfig,
ConfigurationDBRef.ConnectionSettings connectionSettings) {
this.dsConfig = dsConfig;
this.connectionSettings = connectionSettings;
}
public Connection getConnection() throws DatabaseConfigException {
if (dataSource == null) {
Properties envProps = dsConfig.getEnvProperties();
if (envProps == null) {
envProps = new Properties();
}
InitialContext ctx;
try {
if (!envProps.isEmpty()) {
ctx = new InitialContext(envProps);
} else {
ctx = new InitialContext();
}
} catch (NamingException ex) {
throw new DatabaseConfigException("Error instantiating initial context", ex);
}
DataSource ds;
String lookupName = dsConfig.getContextLookupName();
try {
ds = (DataSource) ctx.lookup(lookupName);
} catch (NamingException ex) {
throw new DatabaseConfigException("Error looking up data source in context using name '" + lookupName + '\'', ex);
}
if (ds == null) {
throw new DatabaseConfigException("Null data source obtained through context using name '" + lookupName + '\'');
}
dataSource = ds;
}
Connection connection;
try {
connection = dataSource.getConnection();
} catch (SQLException ex) {
String detail = "SQLException: " + ex.getMessage() +
" SQLState: " + ex.getSQLState() +
" VendorError: " + ex.getErrorCode();
throw new DatabaseConfigException("Error obtaining database connection using datasource " +
"with detail " + detail, ex);
}
DatabaseDMConnFactory.setConnectionOptions(connection, connectionSettings);
return connection;
}
}