package org.ovirt.engine.core.tools.common.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.SubnodeConfiguration; import org.apache.commons.configuration.XMLConfiguration; import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.ovirt.engine.core.engineencryptutils.EncryptionUtils; public class JbossConnectionFactory implements ConnectionFactory { private ConnectivityCredentials credentials; private Logger log = Logger.getLogger(JbossConnectionFactory.class); public JbossConnectionFactory(String jbossDataSourceFile, String jbossLoginConfigFile) throws ConfigurationException, ClassNotFoundException { this.credentials = getConnectivityCredentials(jbossDataSourceFile, jbossLoginConfigFile); log.debug("getConnection: driver class name=" + credentials.getDriverClassName()); try { Class.forName(credentials.getDriverClassName()); } catch (ClassNotFoundException e) { log.error("faild to load db driver."); throw e; } } @Override public Connection getConnection() throws SQLException{ log.debug("getConnection: URL=" + credentials.getConnectionUrl()); if (StringUtils.isNotEmpty(credentials.getSecurityDomain())){ log.debug("getConnection: Considering encrypted passord. secDomain=" + credentials.getSecurityDomain()); } return DriverManager.getConnection(credentials.getConnectionUrl(), credentials.getUserName(), credentials.getPassword()); } public static ConnectivityCredentials getConnectivityCredentials(String jbossDataSourceFile, String jbossLoginConfigFile) throws ConfigurationException { ConnectivityCredentials credentials = new ConnectivityCredentials(); XMLConfiguration dsFile = new XMLConfiguration(jbossDataSourceFile); credentials.setDriverClassName(dsFile.getString("local-tx-datasource.driver-class")); credentials.setConnectionUrl(dsFile.getString("local-tx-datasource.connection-url")); String secDomain = dsFile.getString("local-tx-datasource.security-domain"); if (StringUtils.isNotEmpty(secDomain)) { credentials.setSecurityDomain(secDomain); XMLConfiguration loginConfigFile = new XMLConfiguration(jbossLoginConfigFile); loginConfigFile.setExpressionEngine(new XPathExpressionEngine()); SubnodeConfiguration root = loginConfigFile.configurationAt("application-policy[@name='" + secDomain + "']"); credentials.setUserName(root.getString("authentication/login-module/module-option[@name='username']")); String password = root.getString("authentication/login-module/module-option[@name='password']"); credentials.setPassword(EncryptionUtils.decode(password, "", "")); } else { credentials.setUserName(dsFile.getString("local-tx-datasource.user-name")); credentials.setPassword(dsFile.getString("local-tx-datasource.password")); } return credentials; } public static class ConnectivityCredentials { private String userName; private String password; private String connectionUrl; private String driverClassName; private String securityDomain = null; public String getSecurityDomain() { return securityDomain; } public void setSecurityDomain(String securityDomain) { this.securityDomain = securityDomain; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConnectionUrl() { return connectionUrl; } public void setConnectionUrl(String connectionUrl) { this.connectionUrl = connectionUrl; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } } }