blob: c40626240734bc842048af16d13a5577d18f9382 [file] [log] [blame]
/*
*
* Derby - Class org.apache.derbyTesting.junit.XADataSourceConnector
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
package org.apache.derbyTesting.junit;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Properties;
import javax.sql.XADataSource;
import junit.framework.Assert;
/**
* Connection factory using javax.sql.XADataSource.
* Returns a connection in local mode obtained from
* getXAConnection().getConnection().
*
*/
public class XADataSourceConnector implements Connector {
private TestConfiguration config;
/**
* DataSource that maps to the database for the
* configuration. The no-arg getXAConnection() method
* maps to the default user and password for the
* configuration.
*/
private XADataSource ds;
public void setConfiguration(TestConfiguration config) {
this.config = config;
ds = J2EEDataSource.getXADataSource(config, (HashMap) null);
}
public Connection openConnection() throws SQLException {
try {
return ds.getXAConnection().getConnection();
} catch (SQLException e) {
// Expected state for database not found.
// For the client the generic 08004 is returned,
// will just retry on that.
String expectedState =
config.getJDBCClient().isEmbedded() ? "XJ004" : "08004";
// If there is a database not found exception
// then retry the connection request with
// a new DataSource with the createDtabase property set.
if (!expectedState.equals(e.getSQLState()))
throw e;
return singleUseDS( DataSourceConnector.makeCreateDBAttributes( config ) ).
getXAConnection().getConnection();
}
}
public Connection openConnection(String databaseName) throws SQLException {
JDBCDataSource.setBeanProperty(ds, "databaseName", databaseName);
try {
return ds.getXAConnection().getConnection();
} catch (SQLException e) {
// Expected state for database not found.
// For the client the generic 08004 is returned,
// will just retry on that.
String expectedState =
config.getJDBCClient().isEmbedded() ? "XJ004" : "08004";
// If there is a database not found exception
// then retry the connection request with
// a new DataSource with the createDtabase property set.
if (!expectedState.equals(e.getSQLState()))
throw e;
XADataSource tmpDs = singleUseDS( DataSourceConnector.makeCreateDBAttributes( config ) );
JDBCDataSource.setBeanProperty(tmpDs, "databaseName", databaseName);
return tmpDs.getXAConnection().getConnection();
}
}
public Connection openConnection(String user, String password)
throws SQLException {
try {
return ds.getXAConnection(user, password).getConnection();
} catch (SQLException e) {
// If there is a database not found exception
// then retry the connection request with
// a new DataSource with the createDatabase property set.
if (!"XJ004".equals(e.getSQLState()))
throw e;
return singleUseDS( DataSourceConnector.makeCreateDBAttributes( config ) ).
getXAConnection(user, password).getConnection();
}
}
public Connection openConnection(String databaseName, String user, String password)
throws SQLException
{
return openConnection( databaseName, user, password, null );
}
public Connection openConnection
(String databaseName, String user, String password, Properties connectionProperties)
throws SQLException
{
JDBCDataSource.setBeanProperty(ds, "databaseName", databaseName);
try {
return ds.getXAConnection(user, password).getConnection();
} catch (SQLException e) {
// If there is a database not found exception
// then retry the connection request with
// a new DataSource with the createDatabase property set.
if (!"XJ004".equals(e.getSQLState()))
throw e;
HashMap<String, Object> hm =
DataSourceConnector.makeCreateDBAttributes( config );
DataSourceConnector.copyProperties(connectionProperties, hm);
XADataSource tmpDs = singleUseDS( hm );
JDBCDataSource.setBeanProperty(tmpDs, "databaseName", databaseName);
return tmpDs.getXAConnection(user, password).getConnection();
}
}
public void shutDatabase() throws SQLException {
singleUseDS( DataSourceConnector.makeShutdownDBAttributes( config ) )
.getXAConnection().getConnection();
config.waitForShutdownComplete(getDatabaseName());
}
public void shutEngine(boolean deregisterDriver) throws SQLException {
Assert.fail("shutdown engine not implemened");
}
public void setLoginTimeout( int seconds ) throws SQLException
{
ds.setLoginTimeout( seconds );
}
public int getLoginTimeout() throws SQLException
{
return ds.getLoginTimeout();
}
public String getDatabaseName() {
String databaseName=null;
try {
// get the physical database name
databaseName = (String) JDBCDataSource.getBeanProperty(ds, "databaseName");
} catch (Exception e) {
e.printStackTrace();
}
return databaseName;
}
/**
* Get a connection from a single use XADataSource configured
* from the configuration but with the passed in property set.
*/
private XADataSource singleUseDS( HashMap hm )
throws SQLException {
XADataSource sds = J2EEDataSource.getXADataSource(config, hm);
return sds;
}
}