/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.database; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import org.apache.metamodel.util.CollectionUtils; import org.datacleaner.user.UserPreferences; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A catalog of metadata about database drivers and their current installation * status. */ @Singleton public class DatabaseDriverCatalog implements Serializable { public static final String DATABASE_NAME_JDBC_ODBC_BRIDGE = "JDBC-ODBC bridge"; public static final String DATABASE_NAME_TERADATA = "Teradata"; public static final String DATABASE_NAME_H2 = "H2"; public static final String DATABASE_NAME_HSQLDB_HYPER_SQL = "Hsqldb/HyperSQL"; public static final String DATABASE_NAME_ORACLE = "Oracle"; public static final String DATABASE_NAME_APACHE_DERBY_EMBEDDED = "Apache Derby (embedded)"; public static final String DATABASE_NAME_APACHE_DERBY_CLIENT = "Apache Derby (client)"; public static final String DATABASE_NAME_SQLITE = "SQLite"; public static final String DATABASE_NAME_SYBASE = "Sybase"; public static final String DATABASE_NAME_MICROSOFT_SQL_SERVER_JTDS = "Microsoft SQL Server"; public static final String DATABASE_NAME_MICROSOFT_SQL_SERVER_OFFICIAL = "Microsoft SQL Server (official)"; public static final String DATABASE_NAME_POSTGRESQL = "PostgreSQL"; public static final String DATABASE_NAME_SAP_DB = "SAP DB"; public static final String DATABASE_NAME_FIREBIRD = "Firebird"; public static final String DATABASE_NAME_INGRES = "Ingres"; public static final String DATABASE_NAME_DB2 = "DB2"; public static final String DATABASE_NAME_MYSQL = "MySQL"; public static final String DATABASE_NAME_PENTAHO_DATA_INTEGRATION = "Pentaho Data Integration"; public static final String DATABASE_NAME_LUCIDDB = "LucidDB"; public static final String DATABASE_NAME_PERVASIVE = "Pervasive"; public static final String DATABASE_NAME_CUBRID = "Cubrid"; public static final String DATABASE_NAME_HIVE = "Apache Hive"; private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(DatabaseDriverCatalog.class); private static final List<DatabaseDriverDescriptor> _databaseDrivers; static { // @formatter:off // @checkstyle:off _databaseDrivers = new ArrayList<>(); add(DATABASE_NAME_MYSQL, "images/datastore-types/databases/mysql.png", "com.mysql.jdbc.Driver", "http://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.18/mysql-connector-java-5.1.18.jar", "jdbc:mysql://<hostname>:3306/<database>?defaultFetchSize=" + Integer.MIN_VALUE + "&largeRowSizeThreshold=1024", "jdbc:mysql://<hostname>:<port>/<database>?defaultFetchSize=" + Integer.MIN_VALUE + "&largeRowSizeThreshold=1024"); add(DATABASE_NAME_DB2, "images/datastore-types/databases/db2.png", "com.ibm.db2.jcc.DB2Driver", null, "jdbc:db2://<hostname>:<port>/<database>", "jdbc:db2j:net://<hostname>:<port>/<database>"); add(DATABASE_NAME_INGRES, "images/datastore-types/databases/ingres.png", "com.ingres.jdbc.IngresDriver", "http://repo1.maven.org/maven2/com/ingres/jdbc/iijdbc/9.3-3.8.2/iijdbc-9.3-3.8.2.jar", "jdbc:ingres://<hostname>:II7/<database>"); add(DATABASE_NAME_FIREBIRD, "images/datastore-types/databases/firebird.png", "org.firebirdsql.jdbc.FBDriver", // firebird's driver also depends on the j2ee spec new String[] { "http://repo1.maven.org/maven2/org/firebirdsql/jdbc/jaybird/2.1.6/jaybird-2.1.6.jar", "http://repo1.maven.org/maven2/geronimo-spec/geronimo-spec-j2ee/1.4-rc4/geronimo-spec-j2ee-1.4-rc4.jar" }, new String[] { "jdbc:firebirdsql:<hostname>:<path/to/database>.fdb" }); add(DATABASE_NAME_SAP_DB, "images/datastore-types/databases/sapdb.png", "com.sap.dbtech.jdbc.DriverSapDB", null, "jdbc:sapdb://<hostname>/<database>"); add(DATABASE_NAME_POSTGRESQL, "images/datastore-types/databases/postgresql.png", "org.postgresql.Driver", "http://repo1.maven.org/maven2/postgresql/postgresql/9.3-1102-jdbc4/postgresql-9.3-1102-jdbc4.jar", "jdbc:postgresql://<hostname>:5432/<database>"); add(DATABASE_NAME_MICROSOFT_SQL_SERVER_JTDS, "images/datastore-types/databases/microsoft.png", "net.sourceforge.jtds.jdbc.Driver", "http://repo1.maven.org/maven2/net/sourceforge/jtds/jtds/1.3.1/jtds-1.3.1.jar", "jdbc:jtds:sqlserver://<hostname>/<database>;useUnicode=true;characterEncoding=UTF-8", "jdbc:jtds:sqlserver://<hostname>:<port>/<database>;instance=<instance>;useUnicode=true;characterEncoding=UTF-8"); add(DATABASE_NAME_SYBASE, "images/datastore-types/databases/sybase.png", "net.sourceforge.jtds.jdbc.Driver", "http://repo1.maven.org/maven2/net/sourceforge/jtds/jtds/1.2.4/jtds-1.2.4.jar", "jdbc:jtds:sybase://<hostname>/<database>"); add(DATABASE_NAME_SQLITE, "images/datastore-types/databases/sqlite.png", "org.sqlite.JDBC", "http://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.7.2/sqlite-jdbc-3.7.2.jar", "jdbc:sqlite:<path/to/database>.db"); add(DATABASE_NAME_APACHE_DERBY_CLIENT, "images/datastore-types/databases/derby.png", "org.apache.derby.jdbc.ClientDriver", "http://repo1.maven.org/maven2/org/apache/derby/derbyclient/10.8.2.2/derbyclient-10.8.2.2.jar", "jdbc:derby://<hostname>:1527/<path/to/database>"); add(DATABASE_NAME_APACHE_DERBY_EMBEDDED, "images/datastore-types/databases/derby.png", "org.apache.derby.jdbc.EmbeddedDriver", "http://repo1.maven.org/maven2/org/apache/derby/derby/10.8.2.2/derby-10.8.2.2.jar", "jdbc:derby:<database>"); add(DATABASE_NAME_ORACLE, "images/datastore-types/databases/oracle.png", "oracle.jdbc.OracleDriver", null, "jdbc:oracle:thin:@<hostname>:1521:<sid>", "jdbc:oracle:thin:@<hostname>:<port>:<sid>", "jdbc:oracle:thin:@<hostname>:<port>/<service>:<server>/<instance>"); add(DATABASE_NAME_MICROSOFT_SQL_SERVER_OFFICIAL, "images/datastore-types/databases/microsoft.png", "com.microsoft.sqlserver.jdbc.SQLServerDriver", null, "jdbc:sqlserver://<hostname>:3341;databaseName=<database>", "jdbc:sqlserver://<hostname>:<port>;databaseName=<database>;integratedSecurity=true"); add(DATABASE_NAME_HSQLDB_HYPER_SQL, "images/datastore-types/databases/hsqldb.png", "org.hsqldb.jdbcDriver", "http://repo1.maven.org/maven2/hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.jar", "jdbc:hsqldb:hsql://<hostname>:9001/<database>", "jdbc:hsqldb:file:<path/to/database>"); add(DATABASE_NAME_H2, "images/datastore-types/databases/h2.png", "org.h2.Driver", "http://repo1.maven.org/maven2/com/h2database/h2/1.3.162/h2-1.3.162.jar", "jdbc:h2:<path/to/database>"); add(DATABASE_NAME_TERADATA, "images/datastore-types/databases/teradata.png", "com.teradata.jdbc.TeraDriver", null, "jdbc:teradata:<hostname>", "jdbc:teradata:<hostname>/database=<database>"); add(DATABASE_NAME_PERVASIVE, "images/datastore-types/databases/pervasive.png", "com.pervasive.jdbc.v2.Driver", null, "jdbc:pervasive://<hostname>:1583/<datasource>"); add(DATABASE_NAME_CUBRID, "images/datastore-types/databases/cubrid.png", "cubrid.jdbc.driver.CUBRIDDriver", "http://clojars.org/repo/cubrid/cubrid-jdbc/8.4.1.0564/cubrid-jdbc-8.4.1.0564.jar", "jdbc:cubrid:<hostname>:30000:<database>:::"); add(DATABASE_NAME_LUCIDDB, "images/datastore-types/databases/luciddb.png", "org.luciddb.jdbc.LucidDbClientDriver", "http://repository.pentaho.org/artifactory/third-party/luciddb/LucidDbClient-minimal/0.9.4/LucidDbClient-minimal-0.9.4.jar", "jdbc:luciddb:http://<hostname>"); add(DATABASE_NAME_PENTAHO_DATA_INTEGRATION, "images/datastore-types/databases/kettle.png", "org.pentaho.di.jdbc.KettleDriver", null, "jdbc:kettle:file://<filename>"); add(DATABASE_NAME_JDBC_ODBC_BRIDGE, "images/datastore-types/databases/odbc.png", "sun.jdbc.odbc.JdbcOdbcDriver", null, "jdbc:odbc:<data-source-name>"); add(DATABASE_NAME_HIVE, "images/datastore-types/databases/hive.png", new HiveDriverPreparer(), "org.apache.hive.jdbc.HiveDriver", "http://repo1.maven.org/maven2/org/apache/hive/hive-jdbc/1.2.1/hive-jdbc-1.2.1.jar", "jdbc:hive2://<hostname>:10000/<database>"); // @checkstyle:on // @formatter:on Collections.sort(_databaseDrivers); } private final UserPreferences _userPreferences; @Inject public DatabaseDriverCatalog(final UserPreferences userPreferences) { _userPreferences = userPreferences; } private static void add(final String databaseName, final String iconImagePath, final String driverClassName, final String[] downloadUrls, final String[] urlTemplates) { _databaseDrivers.add(new DatabaseDescriptorImpl(databaseName, iconImagePath, driverClassName, downloadUrls, urlTemplates)); } private static void add(final String databaseName, final String iconImagePath, final String driverClassName, final String downloadUrl, final String... urlTemplates) { final String[] urls; if (downloadUrl == null) { urls = null; } else { urls = new String[] { downloadUrl }; } add(databaseName, iconImagePath, driverClassName, urls, urlTemplates); } private static void add(final String databaseName, final String iconImagePath, final DriverPreparer driverPreparer, final String driverClassName, final String downloadUrl, final String... urlTemplates) { if (driverPreparer != null) { try { driverPreparer.prepare(); } catch (final Exception e) { logger.warn("Could not run driver preparation", e); } } add(databaseName, iconImagePath, driverClassName, downloadUrl, urlTemplates); } public static String getIconImagePath(final DatabaseDriverDescriptor dd) { String iconImagePath = null; if (dd != null) { iconImagePath = dd.getIconImagePath(); } if (iconImagePath == null) { iconImagePath = "images/model/datastore.png"; } return iconImagePath; } public static DatabaseDriverDescriptor getDatabaseDriverByDriverDatabaseName(final String databaseName) { if (databaseName == null) { return null; } for (final DatabaseDriverDescriptor databaseDriver : _databaseDrivers) { if (databaseName.equals(databaseDriver.getDisplayName())) { return databaseDriver; } } return null; } public static DatabaseDriverDescriptor getDatabaseDriverByDriverClassName(final String driverClass) { if (driverClass == null) { return null; } for (final DatabaseDriverDescriptor databaseDriver : _databaseDrivers) { if (driverClass.equals(databaseDriver.getDriverClassName())) { return databaseDriver; } } return null; } public List<DatabaseDriverDescriptor> getDatabaseDrivers() { return _databaseDrivers; } public List<DatabaseDriverDescriptor> getInstalledWorkingDatabaseDrivers() { return CollectionUtils.filter(_databaseDrivers, input -> { if (getState(input) == DatabaseDriverState.INSTALLED_WORKING) { return true; } return false; }); } public DatabaseDriverState getState(final DatabaseDriverDescriptor databaseDescriptor) { final String driverClassName = databaseDescriptor.getDriverClassName(); if (_userPreferences != null) { final List<UserDatabaseDriver> drivers = _userPreferences.getDatabaseDrivers(); for (final UserDatabaseDriver userDatabaseDriver : drivers) { if (userDatabaseDriver.getDriverClassName().equals(driverClassName)) { return userDatabaseDriver.getState(); } } } try { Class.forName(driverClassName); return DatabaseDriverState.INSTALLED_WORKING; } catch (final ClassNotFoundException e) { return DatabaseDriverState.NOT_INSTALLED; } catch (final Exception e) { logger.warn("Unexpected error occurred while initializing driver class: " + driverClassName, e); return DatabaseDriverState.INSTALLED_NOT_WORKING; } } public boolean isInstalled(final String databaseName) { final DatabaseDriverDescriptor databaseDriver = getDatabaseDriverByDriverDatabaseName(databaseName); if (databaseDriver == null) { return false; } return getState(databaseDriver) == DatabaseDriverState.INSTALLED_WORKING; } }