diff --git a/build.gradle b/build.gradle index 9a9c205f92736a4df905f285bb501e23f4c94b15..a4e4b0ec236d20ad5caeb4d2d74bc27841fe03f1 100644 --- a/build.gradle +++ b/build.gradle @@ -128,7 +128,6 @@ buildscript { } dependencies { - compile group: 'commons-dbutils', name: 'commons-dbutils', version: '+' compile group: 'commons-io', name: 'commons-io', version: '+' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '+' compile group: 'com.jolbox', name: 'bonecp', version: '+' diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java index 97b7c298ed7848ef82924baefa854c4e0c486e98..6dc27633b253faa118215d979384acf58b63ff9e 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java @@ -10,6 +10,7 @@ import com.tngtech.configbuilder.annotation.typetransformer.TypeTransformer; import com.tngtech.configbuilder.annotation.typetransformer.TypeTransformers; import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue; +import it.unibz.inf.isochrone.db.DbUtils; import it.unibz.inf.isochrone.db.TableEntry; import it.unibz.inf.isochrone.util.EnumContainer.TableType; import it.unibz.inf.isochrone.util.ResourceHelper; @@ -17,6 +18,7 @@ import it.unibz.inf.isochrone.util.ResourceHelper; import java.io.File; import java.io.IOException; import java.net.URL; +import java.sql.SQLException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -426,10 +428,17 @@ public class ConfigDataset { private static Collection<String> filterInvalidDatasets(final Collection<String> datasets) { LOGGER.info("Filtering invalid datasets (e.g. which have no database tables)"); - final ConfigIsochrone config = ConfigIsochrone.getInstance(); + + final Collection<String> allTables; + try { + allTables = DbUtils.getAllTables(config.getConnection()); + } catch (SQLException e) { + LOGGER.warn("Could not get tables from database... datasets will not be filtered at all"); + return datasets; + } + final Collection<String> filteredList = new ArrayList<>(datasets.size()); - final Collection<String> allTables = config.getAllTables(); for (final String ds : datasets) { final ConfigDataset c = ConfigDataset.createInstance(ds); if (c.hasValidDatabase(allTables)) { diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java index ae992b1c76b9b450db9d88f82997762ee1a01e83..69816331ca4bc9149d72f881b1f7d439c86288d7 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java @@ -10,16 +10,11 @@ import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue; import it.unibz.inf.isochrone.db.ConnectionFactory; -import java.sql.CallableStatement; import java.sql.Connection; -import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; import javax.validation.constraints.NotNull; -import org.apache.commons.dbutils.DbUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -163,32 +158,4 @@ public final class ConfigIsochrone { } } - public Collection<String> getAllTables() { - final Connection connection = getConnection(); - if (connection == null) { - throw new NullPointerException("Connection to database could not be initialized"); - } - - final Collection<String> result = new ArrayList<>(); - final String query = "SELECT tablename FROM pg_tables WHERE schemaname='public'"; - - ResultSet rs = null; - CallableStatement stmt = null; - try { - stmt = connection.prepareCall(query); - rs = stmt.executeQuery(); - while (rs.next()) { - result.add(rs.getString("tablename")); - } - } catch (SQLException e) { - LOGGER.warn("Could not get tables from database"); - } finally { - DbUtils.closeQuietly(rs); - DbUtils.closeQuietly(stmt); - DbUtils.closeQuietly(connection); - } - - return result; - } - } diff --git a/src/main/java/it/unibz/inf/isochrone/db/Database.java b/src/main/java/it/unibz/inf/isochrone/db/Database.java index eb976e8f7cabbf6613cc00924984e29aa2069f3f..4a33c06545ad376314a59be3e7c92f8a5b93388b 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/Database.java +++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java @@ -21,8 +21,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.commons.dbutils.DbUtils; - /** * <p> * Database layer. Contains all database queries for the different diff --git a/src/main/java/it/unibz/inf/isochrone/db/DbUtils.java b/src/main/java/it/unibz/inf/isochrone/db/DbUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..ba476d595bf4ad53ca3736192c5a9d35fc729416 --- /dev/null +++ b/src/main/java/it/unibz/inf/isochrone/db/DbUtils.java @@ -0,0 +1,145 @@ +package it.unibz.inf.isochrone.db; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; + +/** + * A collection of JDBC helper methods. This class is thread safe. + */ + +public final class DbUtils { + // CHECKSTYLE:OFF EmptyBlock + + private DbUtils() { } + + /** + * Close a <code>Connection</code>, avoid closing if null. + * + * @param conn Connection to close. + * @throws SQLException if a database access error occurs + */ + public static void close(final Connection conn) throws SQLException { + if (conn != null) { + conn.close(); + } + } + + /** + * Close a <code>ResultSet</code>, avoid closing if null. + * + * @param rs ResultSet to close. + * @throws SQLException if a database access error occurs + */ + public static void close(final ResultSet rs) throws SQLException { + if (rs != null) { + rs.close(); + } + } + + /** + * Close a <code>Statement</code>, avoid closing if null. + * + * @param stmt Statement to close. + * @throws SQLException if a database access error occurs + */ + public static void close(final Statement stmt) throws SQLException { + if (stmt != null) { + stmt.close(); + } + } + + /** + * Close a <code>Connection</code>, avoid closing if null and hide + * any SQLExceptions that occur. + * + * @param conn Connection to close. + */ + public static void closeQuietly(final Connection conn) { + try { + close(conn); + } catch (SQLException e) { + // quiet + } + } + + /** + * Close a <code>Connection</code>, <code>Statement</code> and <code>ResultSet</code>. Avoid closing if null and hide any + * SQLExceptions that occur. + * + * @param conn Connection to close. + * @param stmt Statement to close. + * @param rs ResultSet to close. + */ + public static void closeQuietly(final Connection conn, final Statement stmt, final ResultSet rs) { + try { + closeQuietly(rs); + } finally { + try { + closeQuietly(stmt); + } finally { + closeQuietly(conn); + } + } + } + + /** + * Close a <code>ResultSet</code>, avoid closing if null and hide any + * SQLExceptions that occur. + * + * @param rs ResultSet to close. + */ + public static void closeQuietly(final ResultSet rs) { + try { + close(rs); + } catch (SQLException e) { + // quiet + } + } + + /** + * Close a <code>Statement</code>, avoid closing if null and hide + * any SQLExceptions that occur. + * + * @param stmt Statement to close. + */ + public static void closeQuietly(final Statement stmt) { + try { + close(stmt); + } catch (SQLException e) { + // quiet + } + } + + // CHECKSTYLE:ON EmptyBlock + + public static Collection<String> getAllTables(final Connection connection) throws SQLException { + if (connection == null) { + throw new NullPointerException("Connection to database could not be initialized"); + } + + final Collection<String> result = new ArrayList<>(); + final String query = "SELECT tablename FROM pg_tables WHERE schemaname='public'"; + + ResultSet rs = null; + CallableStatement stmt = null; + try { + stmt = connection.prepareCall(query); + rs = stmt.executeQuery(); + while (rs.next()) { + result.add(rs.getString("tablename")); + } + } finally { + DbUtils.closeQuietly(rs); + DbUtils.closeQuietly(stmt); + DbUtils.closeQuietly(connection); + } + + return result; + } + +}