All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.ac.ebi.interpro.scan.jms.activemq.ExternalDriverDataSource Maven / Gradle / Ivy

The newest version!
package uk.ac.ebi.interpro.scan.jms.activemq;

import org.apache.log4j.Logger;
import org.springframework.jdbc.datasource.AbstractDriverBasedDataSource;
import uk.ac.ebi.interpro.scan.io.TemporaryDirectoryManager;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * Datasource which loads a driver from a specified jar file.
 */

public class ExternalDriverDataSource extends AbstractDriverBasedDataSource {

    private static final Logger LOGGER = Logger.getLogger(ExternalDriverDataSource.class.getName());

    private volatile boolean loaded;
    private SQLException failure;
    private Driver driver;
    private String driverJar;
    private String driverClassName;
    private final Object driverLoadLock = new Object();

    private static Map driverCache = new HashMap();

    /**
     * can be used to filter the URL for the database connection.
     */
    private final TemporaryDirectoryManager directoryManager;


    public ExternalDriverDataSource(TemporaryDirectoryManager directoryManager) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Directory manager " + directoryManager);
        }
        this.directoryManager = directoryManager;
    }


    /**
     * Set the JDBC URL to use for connecting through the Driver.
     *
     * @see java.sql.Driver#connect(String, java.util.Properties)
     */
    @Override
    public void setUrl(String url) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Directory manager " + directoryManager);
        }
        try {
            super.setUrl(directoryManager.replacePath(url));
        } catch (Exception e) {
            LOGGER.error("Exception thrown when setting URL ", e);
            throw new IllegalStateException(e);
        }
    }

    /**
     * Set location of jar file and optionally the class name of the JDBC driver.
     * path/to/driver.jar
     * path/to/driver.jar:className
     * 

* If the className is not supplied then the driver class will be located from * the file META-INF/services/java.sql.Driver in the jar. * * @param driverJar file name of jar file containing driver. */ public void setDriverJar(String driverJar) { this.driverJar = driverJar; } /** * Set driver class. * This should only be set to a class in the default class path. * This will be overridden by a specified driverJar * * @param driverClassName class name of driver class */ public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } /** * Get the driver class. *

* Load from the specified jar file, * or if not specified, * the context class loader of the calling method. * * @return the driver class * @throws SQLException wrapping any error in class construction of the driver */ public Driver getDriver() throws SQLException { if (!loaded) { synchronized (driverLoadLock) { try { loadDriver(); } catch (SQLException sqle) { failure = sqle; } catch (Exception e) { failure = new SQLException("Unable to load driver", e); } loaded = true; } } if (failure != null) { throw failure; } return driver; } private void loadDriver() throws IOException, SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { driverClassName = setNullIfEmpty(driverClassName); driverJar = setNullIfEmpty(driverJar); if (driverJar == null && driverClassName == null) { throw new IllegalStateException("ExternalDriverDataSource must have a driverJar or a driverClassName set"); } String key = driverJar; if (key == null) { key = driverClassName; } driver = driverCache.get(key); if (driver == null) { ClassLoader driverClassLoader; if (driverJar == null) { driverClassLoader = Thread.currentThread().getContextClassLoader(); } else { String[] parts = driverJar.split(":", 2); if (parts.length == 1) { driverClassName = null; } else { driverClassName = parts[1]; } URL driverFileURL = new File(parts[0]).toURI().toURL(); URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{driverFileURL}); if (driverClassName == null) { driverClassName = discoverDriverClassName(urlClassLoader); } driverClassLoader = urlClassLoader; } if (driverClassName == null) { throw new SQLException("Driver class name not specified or discovered"); } driver = (Driver) driverClassLoader.loadClass(driverClassName).newInstance(); driverCache.put(key, driver); } } /** * Set to null if input contains only whitespace * * @param in string to be checked * @return null or the input string */ private String setNullIfEmpty(String in) { if (in != null && in.trim().length() == 0) { return null; } return in; } /** * Read class name from the service definition. * Reads from META-INF/services/java.sql.Driver * * @param urlClassLoader from which to load the driver definition * @return class name of driver class, or null if not found. * @throws IOException on failure to read */ private String discoverDriverClassName(URLClassLoader urlClassLoader) throws IOException { String className = null; URL resource = urlClassLoader.findResource("META-INF/services/java.sql.Driver"); if (resource != null) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(resource.openStream())); className = br.readLine(); } finally { if (br != null) { br.close(); } } } return className; } @Override public String toString() { return "ExternalDriverDataSource{" + "driverJar='" + driverJar + '\'' + ", driverClassName='" + driverClassName + '\'' + ", loaded=" + loaded + '}'; } @Override protected Connection getConnectionFromDriver(Properties properties) throws SQLException { return getDriver().connect(getUrl(), properties); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy