sascha@4072: package de.intevation.db;
sascha@4072: 
sascha@4072: import de.intevation.utils.XML;
sascha@4072: 
teichmann@4772: import java.sql.Connection;
teichmann@4772: import java.sql.DatabaseMetaData;
teichmann@4772: import java.sql.DriverManager;
teichmann@4772: import java.sql.SQLException;
teichmann@4773: import java.sql.Statement;
teichmann@4772: 
teichmann@4773: import java.util.ArrayList;
sascha@4072: import java.util.HashMap;
teichmann@4773: import java.util.List;
sascha@4072: 
sascha@4072: import javax.xml.xpath.XPathConstants;
sascha@4072: 
teichmann@4772: import org.apache.log4j.Logger;
sascha@4072: 
teichmann@4772: import org.w3c.dom.Document;
teichmann@4773: import org.w3c.dom.NodeList;
sascha@4072: 
sascha@4072: public class ConnectionBuilder
sascha@4072: {
sascha@4072:     private static Logger log = Logger.getLogger(ConnectionBuilder.class);
sascha@4072: 
teichmann@4773:     public static final String XPATH_DRIVER     = "/sync/side[@name=$type]/db/driver/text()";
teichmann@4773:     public static final String XPATH_USER       = "/sync/side[@name=$type]/db/user/text()";
teichmann@4773:     public static final String XPATH_PASSWORD   = "/sync/side[@name=$type]/db/password/text()";
teichmann@4773:     public static final String XPATH_URL        = "/sync/side[@name=$type]/db/url/text()";
teichmann@4773:     public static final String XPATH_EXEC_LOGIN = "/sync/side[@name=$type]/db/execute-login/statement";
sascha@4072: 
teichmann@4773:     protected String       type;
teichmann@4773:     protected String       driver;
teichmann@4773:     protected String       user;
teichmann@4773:     protected String       password;
teichmann@4773:     protected String       url;
teichmann@4773:     protected List<String> loginStatements;
sascha@4072: 
sascha@4072:     public ConnectionBuilder(String type, Document document) {
sascha@4072:         this.type = type;
sascha@4072:         extractCredentials(document);
sascha@4072:     }
sascha@4072: 
teichmann@4773:     protected static List<String> extractStrings(NodeList nodes) {
teichmann@4773:         int N = nodes.getLength();
teichmann@4773:         List<String> result = new ArrayList<String>(N);
teichmann@4773:         for (int i = 0; i < N; ++i) {
teichmann@4773:             result.add(nodes.item(i).getTextContent());
teichmann@4773:         }
teichmann@4773:         return result;
teichmann@4773:     }
teichmann@4773: 
sascha@4072:     protected void extractCredentials(Document document) {
sascha@4072:         HashMap<String, String> map = new HashMap<String, String>();
sascha@4072:         map.put("type", type);
sascha@4072: 
sascha@4072:         driver = (String)XML.xpath(
sascha@4072:             document, XPATH_DRIVER, XPathConstants.STRING, null, map);
sascha@4072:         user = (String)XML.xpath(
sascha@4072:             document, XPATH_USER, XPathConstants.STRING, null, map);
sascha@4072:         password = (String)XML.xpath(
sascha@4072:             document, XPATH_PASSWORD, XPathConstants.STRING, null, map);
sascha@4072:         url = (String)XML.xpath(
sascha@4072:             document, XPATH_URL, XPathConstants.STRING, null, map);
teichmann@4773:         loginStatements = extractStrings((NodeList)XML.xpath(
teichmann@4773:             document, XPATH_EXEC_LOGIN, XPathConstants.NODESET, null, map));
sascha@4072: 
sascha@4072:         if (log.isDebugEnabled()) {
sascha@4072:             log.debug("driver: " + driver);
sascha@4072:             log.debug("user: " + user);
sascha@4072:             log.debug("password: *******");
sascha@4072:             log.debug("url: " + url);
teichmann@4773:             log.debug("number of login statements: " + loginStatements.size());
sascha@4072:         }
sascha@4072:     }
sascha@4072: 
sascha@4072:     public Connection getConnection() throws SQLException {
sascha@4072: 
sascha@4072:         if (driver != null && driver.length() > 0) {
sascha@4072:             try {
sascha@4072:                 Class.forName(driver);
sascha@4072:             }
sascha@4072:             catch (ClassNotFoundException cnfe) {
sascha@4072:                 throw new SQLException(cnfe);
sascha@4072:             }
sascha@4072:         }
sascha@4072: 
sascha@4086:         Connection connection =
sascha@4086:             DriverManager.getConnection(url, user, password);
sascha@4086: 
sascha@4086:         connection.setAutoCommit(false);
sascha@4086: 
sascha@4086:         DatabaseMetaData metaData = connection.getMetaData();
sascha@4086: 
sascha@4086:         if (metaData.supportsTransactionIsolationLevel(
sascha@4086:             Connection.TRANSACTION_READ_UNCOMMITTED)) {
sascha@4086:             connection.setTransactionIsolation(
sascha@4086:                 Connection.TRANSACTION_READ_UNCOMMITTED);
sascha@4086:         }
sascha@4086: 
teichmann@4773:         for (String sql: loginStatements) {
teichmann@4773:             Statement stmnt = connection.createStatement();
teichmann@4773:             try {
teichmann@4773:                 stmnt.execute(sql);
teichmann@4773:             }
teichmann@4773:             finally {
teichmann@4773:                 stmnt.close();
teichmann@4773:             }
teichmann@4773:         }
teichmann@4773: 
sascha@4086:         return connection;
sascha@4072:     }
sascha@4073: 
sascha@4074:     public ConnectedStatements getConnectedStatements() throws SQLException {
sascha@4074:         return new ConnectedStatements(
sascha@4074:             getConnection(),
sascha@4074:             new Statements(type, driver != null ? driver : "")
sascha@4074:                 .getStatements());
sascha@4073:     }
sascha@4072: }
sascha@4072: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :