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 d797249aab360c0db60204621f49b30aff0b4904..776725036e8d8eb73af541f833876f7bfbe1dc1e 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java @@ -22,6 +22,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Collections; @@ -74,7 +75,7 @@ public class ConfigDataset { } private static final Logger LOGGER = LoggerFactory.getLogger(ConfigDataset.class); - private static final Collection<String> ALL_DATASETS = initDatasets(); + private static final Collection<String> ALL_DATASETS = getAvailableDatasets(true); private static final String DS_CONFIG_PATTERN = ".*config\\_(.*)\\.xml"; private static Map<String, ConfigDataset> instanceMap = new HashMap<>(); @@ -174,14 +175,12 @@ public class ConfigDataset { protected TableEntry vertexTableEntry; public static ConfigDataset getInstance(final String datasetName) { - final List<String> propertyFiles = new ArrayList<>(1); - propertyFiles.add("config_" + datasetName); + if (!ALL_DATASETS.contains(datasetName)) { + return null; + } if (!instanceMap.containsKey(datasetName)) { - final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(propertyFiles).build(); - config.datasetName = datasetName; - config.initTableEntries(); - + final ConfigDataset config = createInstance(datasetName); instanceMap.put(datasetName, config); return config; } @@ -369,8 +368,57 @@ public class ConfigDataset { return clientArrivalTime; } + // Protected static methods + + protected static Collection<String> getAvailableDatasets(final boolean filterInvalid) { + final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN); + + Collection<String> fileCollection = null; + try { + fileCollection = ResourceHelper.getResources(dsConfigPattern); + } catch (IOException e) { + fileCollection = null; + LOGGER.warn("Datasets could not be read. There might be no configured datasets available!"); + } + + if (fileCollection == null) { + return Collections.emptyList(); + } + + final List<String> datasets = new ArrayList<>(fileCollection.size()); + for (String fileName : fileCollection) { + final Matcher m = dsConfigPattern.matcher(fileName); + if (m.matches()) { + datasets.add(m.group(1)); + } + } + + Collections.sort(datasets); + if (filterInvalid) { + return filterInvalidDatasets(datasets); + } + + return datasets; + } + // Private methods + private boolean hasValidDatabase(final Collection<String> allTables) { + Collection<String> configTables = new ArrayList<>(); + configTables.add(getTableDatecodes()); + configTables.add(getTableEdges()); +// configTables.add(getTableIsoAreaBuffer()); +// configTables.add(getTableIsoLinks()); +// configTables.add(getTableIsoNodes()); +// configTables.add(getTableIsoNodesAnnotations()); + configTables.add(getTableRoutes()); + configTables.add(getTableSchedule()); + configTables.add(getTableVertex()); + configTables.add(getTableVertexDensity()); + + return allTables.containsAll(configTables); + }; + private void initTableEntries() { edgeTableEntry = createTableEntry(getTableIsoLinks(), getIndexIsoLinks(), TableType.EDGE); areaBufferTableEntry = createTableEntry(getTableIsoAreaBuffer(), getIndexIsoAreaBuffer(), TableType.COVERAGE); @@ -380,6 +428,15 @@ public class ConfigDataset { // Private static methods + private static ConfigDataset createInstance(final String datasetName) { + final List<String> baseNames = Arrays.asList(new String[]{"config_" + datasetName}); + final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(baseNames).build(); + config.datasetName = datasetName; + config.initTableEntries(); + + return config; + } + private static TableEntry createTableEntry(final String tblName) { return createTableEntry(tblName, null, null); } @@ -395,32 +452,21 @@ public class ConfigDataset { return new TableEntry(tblName.trim(), idxName.trim(), type); } - private static Collection<String> initDatasets() { - final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN); - - Collection<String> fileCollection = null; - try { - fileCollection = ResourceHelper.getResources(dsConfigPattern); - } catch (IOException e) { - fileCollection = null; - LOGGER.warn("Datasets could not be read. There might be no configured datasets available!"); - } - - if (fileCollection == null) { - return Collections.emptyList(); - } - - final List<String> dsConfigCollection = new ArrayList<>(fileCollection.size()); - for (String fileName : fileCollection) { - final Matcher m = dsConfigPattern.matcher(fileName); - if (m.matches()) { - dsConfigCollection.add(m.group(1)); + private static Collection<String> filterInvalidDatasets(final Collection<String> datasets) { + final Collection<String> filteredList = new ArrayList<String>(datasets.size()); + final ConfigIsochrone config = ConfigIsochrone.getInstance(); + final Collection<String> allTables = config.getAllTables(); + for (final String ds : datasets) { + final ConfigDataset c = ConfigDataset.createInstance(ds); + if (c.hasValidDatabase(allTables)) { + LOGGER.info("Dataset configuration \"" + ds + "\" will be available to clients"); + filteredList.add(ds); + } else { + LOGGER.warn("Not using dataset configuration \"" + ds + "\" since configured tables are not available!"); } } - // TODO: Remove datasets, which are not configured correctly or have no data (or datatables) int - Collections.sort(dsConfigCollection); - - return dsConfigCollection; + return filteredList; } + } 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 a20536aac0f265c5b2d610dea990ce1edf348003..3053c0ef3ed7c146f843406717585b406eebbea3 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java @@ -11,10 +11,14 @@ import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue; import it.unibz.inf.isochrone.db.ConnectionFactory; 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; @@ -174,4 +178,23 @@ public final class ConfigIsochrone { } } + public Collection<String> getAllTables() { + final Collection<String> result = new ArrayList<>(); + final String query = "SELECT tablename FROM pg_tables WHERE schemaname='public'"; + + ResultSet rs = null; + try { + rs = getConnection().prepareCall(query).executeQuery(); + while (rs.next()) { + result.add(rs.getString("tablename")); + } + } catch (SQLException e) { + LOGGER.warn("Could not get tables from database"); + } finally { + DbUtils.closeQuietly(rs); + } + + return result; + } + } diff --git a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java index 0d381af52dd19ef12ec559e17ed2f7a5092640a0..6cb7673421e9b7667a92a14a8cd3fe98b50a7fd5 100644 --- a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java +++ b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java @@ -8,20 +8,35 @@ import org.testng.annotations.Test; public class ConfigDatasetTest { private static final int EXPECTED_NUM_DATASETS = 4; + private static final int EXPECTED_NUM_DATASETS_FILTERED = 1; private static final String[] EXPECTED_DATASETS = new String[] {"bz", "it", "sf", "st"}; + private static final String[] EXPECTED_DATASETS_FILTERED = new String[] {"bz"}; @Test public void testDatasetCount() throws URISyntaxException { - final Collection<String> datasetCollection = ConfigDataset.getAllDatasets(); + final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false); Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS, "Unexpected number of configured datasets"); } @Test public void testDatasetNames() throws URISyntaxException { - final Collection<String> datasetCollection = ConfigDataset.getAllDatasets(); - + final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false); for (String dsName : EXPECTED_DATASETS) { Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured"); } } + + @Test + public void testDatasetCountFiltered() throws URISyntaxException { + final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(true); + Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS_FILTERED, "Unexpected number of configured datasets"); + } + + @Test + public void testDatasetNamesFiltered() throws URISyntaxException { + final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(true); + for (String dsName : EXPECTED_DATASETS_FILTERED) { + Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured"); + } + } }