package org.jdbcdslog; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.DriverPropertyInfo; import java.sql.SQLException; import java.util.Properties; import java.util.StringTokenizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DriverLoggingProxy implements Driver { static Logger logger = LoggerFactory.getLogger(DriverLoggingProxy.class); static final String urlPrefix = "jdbc:jdbcdslog:"; static final String targetDriverParameter = "targetDriver"; static { try { DriverManager.registerDriver(new DriverLoggingProxy()); } catch(Exception exception) { } } public DriverLoggingProxy() throws JDBCDSLogException { } public boolean acceptsURL(String url) throws SQLException { return url != null && url.regionMatches(true, 0, urlPrefix, 0, urlPrefix.length()); } public Connection connect(String url, Properties info) throws SQLException { if(ConnectionLogger.logger.isInfoEnabled()) { StringBuffer sb = new StringBuffer(); sb.append("connect to URL ") .append(url) .append(" with properties: ") .append(info.toString()); ConnectionLogger.logger.info(sb.toString()); } if(!acceptsURL(url)) throw new SQLException("Invalid URL" + url); url = "jdbc:" + url.substring(urlPrefix.length()); StringTokenizer ts = new StringTokenizer(url, ":/;=&?", false); String targetDriver = null; while(ts.hasMoreTokens()) { String s = ts.nextToken(); logger.debug("s = " + s); if(targetDriverParameter.equals(s) && ts.hasMoreTokens()) { targetDriver = ts.nextToken(); break; } } if(targetDriver == null) throw new SQLException("Can't find targetDriver parameter in URL: " + url); url = url.substring(0, url.length() - targetDriver.length() - targetDriverParameter.length() - 2); try { Class.forName(targetDriver); return ConnectionLoggingProxy.wrap(DriverManager.getConnection(url, info)); } catch (Exception e) { ConnectionLogger.logger.error(e.getMessage(), e); throw new SQLException(e.getMessage()); } } public int getMajorVersion() { return 1; } public int getMinorVersion() { return 8; } public DriverPropertyInfo[] getPropertyInfo(String url, Properties properties) throws SQLException { String as[] = { "true", "false" }; DriverPropertyInfo adriverpropertyinfo[] = new DriverPropertyInfo[6]; DriverPropertyInfo driverpropertyinfo = new DriverPropertyInfo("user", null); driverpropertyinfo.value = properties.getProperty("user"); driverpropertyinfo.required = true; adriverpropertyinfo[0] = driverpropertyinfo; driverpropertyinfo = new DriverPropertyInfo("password", null); driverpropertyinfo.value = properties.getProperty("password"); driverpropertyinfo.required = true; adriverpropertyinfo[1] = driverpropertyinfo; driverpropertyinfo = new DriverPropertyInfo("get_column_name", null); driverpropertyinfo.value = properties.getProperty("get_column_name", "true"); driverpropertyinfo.required = false; driverpropertyinfo.choices = as; adriverpropertyinfo[2] = driverpropertyinfo; driverpropertyinfo = new DriverPropertyInfo("ifexists", null); driverpropertyinfo.value = properties.getProperty("ifexists"); driverpropertyinfo.required = false; driverpropertyinfo.choices = as; adriverpropertyinfo[3] = driverpropertyinfo; driverpropertyinfo = new DriverPropertyInfo("default_schema", null); driverpropertyinfo.value = properties.getProperty("default_schema"); driverpropertyinfo.required = false; driverpropertyinfo.choices = as; adriverpropertyinfo[4] = driverpropertyinfo; driverpropertyinfo = new DriverPropertyInfo("shutdown", null); driverpropertyinfo.value = properties.getProperty("shutdown"); driverpropertyinfo.required = false; driverpropertyinfo.choices = as; adriverpropertyinfo[5] = driverpropertyinfo; return adriverpropertyinfo; } public boolean jdbcCompliant() { return false; } }