package org.jabref.shared; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.HashSet; import java.util.Set; import org.jabref.logic.l10n.Localization; import org.jabref.shared.exception.InvalidDBMSConnectionPropertiesException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class DBMSConnection { private static final Log LOGGER = LogFactory.getLog(DBMSConnection.class); private final Connection connection; private final DBMSConnectionProperties properties; public DBMSConnection(DBMSConnectionProperties properties) throws SQLException, InvalidDBMSConnectionPropertiesException { if (!properties.isValid()) { throw new InvalidDBMSConnectionPropertiesException(); } this.properties = properties; try { DriverManager.setLoginTimeout(3); // ensure that all SQL drivers are loaded - source: http://stackoverflow.com/a/22384826/873282 // we use the side effect of getAvailableDBMSTypes() - it loads all available drivers DBMSConnection.getAvailableDBMSTypes(); this.connection = DriverManager.getConnection( properties.getType().getUrl(properties.getHost(), properties.getPort(), properties.getDatabase()), properties.getUser(), properties.getPassword()); } catch (SQLException e) { // Some systems like PostgreSQL retrieves 0 to every exception. // Therefore a stable error determination is not possible. LOGGER.error("Could not connect to database: " + e.getMessage() + " - Error code: " + e.getErrorCode()); throw e; } } public Connection getConnection() { return this.connection; } public DBMSConnectionProperties getProperties() { return this.properties; } /** * Returns a Set of {@link DBMSType} which is supported by available drivers. */ public static Set<DBMSType> getAvailableDBMSTypes() { Set<DBMSType> dbmsTypes = new HashSet<>(); for (DBMSType dbms : DBMSType.values()) { try { Class.forName(dbms.getDriverClassPath()); dbmsTypes.add(dbms); } catch (ClassNotFoundException e) { // In case that the driver is not available do not perform tests for this system. LOGGER.info(Localization.lang("%0 driver not available.", dbms.toString())); } } return dbmsTypes; } }