teichmann@5826: package org.dive4elements.river.etl.db; sascha@4072: teichmann@5826: import org.dive4elements.river.etl.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 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 extractStrings(NodeList nodes) { teichmann@4773: int N = nodes.getLength(); teichmann@4773: List result = new ArrayList(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 map = new HashMap(); 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 :