package com.microsoft.sqlserver.jdbc;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.XAConnection;
import javax.transaction.xa.XAResource;
public final class SQLServerXAConnection extends SQLServerPooledConnection implements XAConnection {
private static final long serialVersionUID = -8154621218821899459L;
private SQLServerXAResource XAResource;
private SQLServerConnection physicalControlConnection;
private Logger xaLogger;
SQLServerXAConnection(SQLServerDataSource ds, String user, String pwd) throws java.sql.SQLException {
super(ds, user, pwd);
xaLogger = SQLServerXADataSource.xaLogger;
SQLServerConnection con = getPhysicalConnection();
Properties controlConnectionProperties = (Properties) con.activeConnectionProperties.clone();
controlConnectionProperties
.setProperty(SQLServerDriverBooleanProperty.SEND_STRING_PARAMETERS_AS_UNICODE.toString(), "true");
controlConnectionProperties.remove(SQLServerDriverStringProperty.SELECT_METHOD.toString());
String auth = controlConnectionProperties
.getProperty(SQLServerDriverStringProperty.AUTHENTICATION_SCHEME.toString());
if (null != auth && AuthenticationScheme.ntlm == AuthenticationScheme.valueOfString(auth)) {
controlConnectionProperties.setProperty(SQLServerDriverStringProperty.PASSWORD.toString(), pwd);
}
String trustStorePassword = ds.getTrustStorePassword();
if (null == trustStorePassword) {
Properties urlProps = Util.parseUrl(ds.getURL(), xaLogger);
trustStorePassword = urlProps.getProperty(SQLServerDriverStringProperty.TRUST_STORE_PASSWORD.toString());
}
if (null != trustStorePassword) {
controlConnectionProperties.setProperty(SQLServerDriverStringProperty.TRUST_STORE_PASSWORD.toString(),
trustStorePassword);
}
String clientCertificate = ds.getClientCertificate();
if (null != clientCertificate && clientCertificate.length() > 0) {
Properties urlProps = Util.parseUrl(ds.getURL(), xaLogger);
String clientKeyPassword = urlProps
.getProperty(SQLServerDriverStringProperty.CLIENT_KEY_PASSWORD.toString());
if (null != clientKeyPassword) {
controlConnectionProperties.setProperty(SQLServerDriverStringProperty.CLIENT_KEY_PASSWORD.toString(),
clientKeyPassword);
}
}
if (xaLogger.isLoggable(Level.FINER))
xaLogger.finer("Creating an internal control connection for" + toString());
physicalControlConnection = null;
if (Util.use43Wrapper()) {
physicalControlConnection = new SQLServerConnection43(toString());
} else {
physicalControlConnection = new SQLServerConnection(toString());
}
physicalControlConnection.connect(controlConnectionProperties, null);
if (xaLogger.isLoggable(Level.FINER))
xaLogger.finer("Created an internal control connection" + physicalControlConnection.toString() + " for "
+ toString() + " Physical connection:" + getPhysicalConnection().toString());
if (xaLogger.isLoggable(Level.FINER))
xaLogger.finer(ds.toString() + " user:" + user);
}
@Override
public synchronized XAResource getXAResource() throws java.sql.SQLException {
if (XAResource == null)
XAResource = new SQLServerXAResource(getPhysicalConnection(), physicalControlConnection, toString());
return XAResource;
}
@Override
public void close() throws SQLException {
synchronized (this) {
if (XAResource != null) {
XAResource.close();
XAResource = null;
}
if (null != physicalControlConnection) {
physicalControlConnection.close();
physicalControlConnection = null;
}
}
super.close();
}
}