From bf8b21c9284f25dbc0e5fa88d5719c9ff9d194cd Mon Sep 17 00:00:00 2001
From: Nikolaus Krismer <niko@krismer.de>
Date: Thu, 20 Mar 2014 16:58:41 +0100
Subject: [PATCH] removed static dataset configuration (this is done
 dynamically now) datasets are calculated from configurations now

---
 .../inf/isochrone/config/ConfigDataset.java   | 98 ++++++++++++++-----
 .../inf/isochrone/config/ConfigIsochrone.java |  9 --
 .../inf/isochrone/util/EnumContainer.java     |  7 --
 .../unibz/inf/isoga/config/ConfigClient.java  | 23 +++--
 .../isoga/service/ServiceConfiguration.java   |  9 +-
 .../inf/isoga/service/ServiceFeatureInfo.java |  3 +-
 .../inf/isoga/service/ServiceIsochrone.java   |  3 +-
 .../inf/isoga/service/ServicePoiFeature.java  |  4 +-
 .../unibz/inf/isoga/service/ServiceWps.java   |  3 +-
 .../isoga/service/dto/RequestFeatureInfo.java | 21 ++--
 .../isoga/service/dto/RequestIsochrone.java   | 11 +--
 .../isoga/service/dto/RequestPoiFeature.java  | 20 ++--
 .../inf/isoga/service/dto/RequestWps.java     | 20 ++--
 .../service/dto/ResponseConfiguration.java    |  6 +-
 .../unibz/inf/isoga/web/StartupListener.java  |  6 +-
 src/main/resources/config.xml                 |  1 -
 .../isochrone/config/ConfigDatasetTest.java   | 27 +++++
 ...nfigTest.java => ConfigIsochroneTest.java} | 14 +--
 .../unibz/inf/isochrone/db/DatabaseTest.java  |  6 +-
 .../inf/isochrone/network/AlgorithmTest.java  |  3 +-
 .../inf/isochrone/network/ComparisonTest.java |  3 +-
 .../inf/isochrone/network/RuntimeComplex.java |  9 +-
 .../inf/isochrone/network/TestParameters.java |  9 +-
 23 files changed, 171 insertions(+), 144 deletions(-)
 create mode 100644 src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java
 rename src/test/java/it/unibz/inf/isochrone/config/{ConfigTest.java => ConfigIsochroneTest.java} (96%)

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 aeccfacd..2a9085a6 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
@@ -10,18 +10,21 @@ 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.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.TableType;
 import it.unibz.inf.isochrone.util.Point;
 import it.unibz.inf.isoga.db.DatabaseWeb;
 import it.unibz.inf.isoga.db.TableEntry;
 import it.unibz.inf.isoga.geometry.BBox;
 
+import java.io.File;
+import java.net.URISyntaxException;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -29,6 +32,10 @@ import java.util.Set;
 
 import javax.validation.constraints.NotNull;
 
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * Configuration for individual datasets.
  *
@@ -42,10 +49,10 @@ public class ConfigDataset {
 	public static class CalendarTransformer extends TypeTransformer<String, Calendar> {
 		public static final String DATE_FORMAT = "MM/dd/yyyy HH:mm";
 
-        @Override
-        public Calendar transform(final String str) {
-        	DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
-        	Calendar targetTime = Calendar.getInstance();
+		@Override
+		public Calendar transform(final String str) {
+			DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
+			Calendar targetTime = Calendar.getInstance();
 			try {
 				targetTime.setTimeInMillis(dateFormat.parse(str).getTime());
 			} catch (ParseException e) {
@@ -54,15 +61,22 @@ public class ConfigDataset {
 			}
 
 			return targetTime;
-        }
-    }
+		}
+	}
+
 	public static class PointTransformer extends TypeTransformer<String, Point> {
-        @Override
-        public Point transform(final String str) {
-    		final String[] strProperty = str.split(",");
-    		return new Point(Double.valueOf(strProperty[0]), Double.valueOf(strProperty[1]));
-        }
-    }
+		@Override
+		public Point transform(final String str) {
+			final String[] strProperty = str.split(",");
+			return new Point(Double.valueOf(strProperty[0]), Double.valueOf(strProperty[1]));
+		}
+	}
+
+	private static Map<String, ConfigDataset> instanceMap = new HashMap<>();
+	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigDataset.class);
+	private static final Collection<String> ALL_DATASETS = initDatasets();
+	private static final String[] DS_CONFIG_EXT_ARR = new String[] {"xml"};
+	private static final String DS_CONFIG_PREFIX = "config_";
 
 	@PropertyValue("client.tArrival")
 	@TypeTransformers(CalendarTransformer.class)
@@ -153,31 +167,33 @@ public class ConfigDataset {
 	@PropertyValue("tbl.vertex.density")
 	private String tableVertexDensity;
 
-	// Non-configurable fields
-	private Dataset dataset;
-	private static Map<Dataset, ConfigDataset> instanceMap = new HashMap<>();
+	private String datasetName;
 	protected TableEntry areaBufferTableEntry;
 	protected TableEntry edgeTableEntry;
 	protected TableEntry vertexAnnotatedTableEntry;
 	protected TableEntry vertexTableEntry;
 
-	public static ConfigDataset getInstance(final Dataset dataset) {
+	public static ConfigDataset getInstance(final String datasetName) {
 		final List<String> propertyFiles = new ArrayList<>(1);
-		propertyFiles.add("config_" + dataset.toString().toLowerCase());
+		propertyFiles.add("config_" + datasetName);
 
-		if (!instanceMap.containsKey(dataset)) {
+		if (!instanceMap.containsKey(datasetName)) {
 			final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(propertyFiles).build();
-			config.dataset = dataset;
+			config.datasetName = datasetName;
 			config.initTableEntries();
 
-			instanceMap.put(dataset, config);
+			instanceMap.put(datasetName, config);
 			return config;
 		}
 
-		return instanceMap.get(dataset);
+		return instanceMap.get(datasetName);
+	}
+
+	public static Collection<String> getAllDatasets() {
+		return ALL_DATASETS;
 	}
 
-	public static Set<Dataset> getInstantiatedDatasets() {
+	public static Set<String> getInstantiatedDatasets() {
 		return instanceMap.keySet();
 	}
 
@@ -208,7 +224,7 @@ public class ConfigDataset {
 		tableSchedules = o.tableSchedules;
 		tableVertex = o.tableVertex;
 		tableVertexDensity = o.tableVertexDensity;
-		dataset = o.dataset;
+		datasetName = o.datasetName;
 		areaBufferTableEntry = o.areaBufferTableEntry;
 		edgeTableEntry = o.edgeTableEntry;
 		vertexAnnotatedTableEntry = o.vertexAnnotatedTableEntry;
@@ -241,8 +257,8 @@ public class ConfigDataset {
 	}
 
 	@JsonProperty(value = "name")
-	public Dataset getDataset() {
-		return dataset;
+	public String getDatasetName() {
+		return datasetName;
 	}
 
 	@JsonIgnore
@@ -378,4 +394,34 @@ public class ConfigDataset {
 
 		return new TableEntry(tblName.trim(), idxName.trim(), type);
 	}
+
+	private static Collection<String> initDatasets() {
+		File resourceDir = null;
+		try {
+			resourceDir = new File(ConfigDataset.class.getResource("/").toURI());
+		} catch (URISyntaxException e) {
+			LOGGER.warn("Datasets could not be read. There might be no configured datasets available!");
+		}
+
+		if (resourceDir == null) {
+			return Collections.emptyList();
+		}
+
+		final Collection<File> fileCollection = FileUtils.listFiles(resourceDir, DS_CONFIG_EXT_ARR, false);
+		final List<String> dsConfigCollection = new ArrayList<>(fileCollection.size());
+
+		// TODO: Only add datasets that are also configured in the db
+		final int prefixLength = DS_CONFIG_PREFIX.length();
+		for (File file : fileCollection) {
+			final String fileName = file.getName();
+			if (fileName.startsWith(DS_CONFIG_PREFIX)) {
+				String datasetName = fileName.substring(prefixLength);
+				datasetName = datasetName.substring(0, datasetName.lastIndexOf("."));
+				dsConfigCollection.add(datasetName);
+			}
+		}
+
+		Collections.sort(dsConfigCollection);
+		return dsConfigCollection;
+	}
 }
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 f6605e32..a20536aa 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
@@ -12,7 +12,6 @@ import it.unibz.inf.isochrone.db.ConnectionFactory;
 
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.Collection;
 
 import javax.validation.constraints.NotNull;
 
@@ -42,10 +41,6 @@ public final class ConfigIsochrone {
 	@PropertyValue("cfg.clientSRID")
 	private int clientSRID;
 
-	@NotNull
-	@PropertyValue("cfg.datasets")
-	private Collection<String> datasets;
-
 	@NotNull
 	@PropertyValue("org.postgresql.database")
 	private String database;
@@ -116,10 +111,6 @@ public final class ConfigIsochrone {
 		return null;
 	}
 
-	public Collection<String> getDatasets() {
-		return datasets;
-	}
-
 	public String getDBName() {
 		return database;
 	}
diff --git a/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java b/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java
index 8e4ebe8d..07cde781 100644
--- a/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java
+++ b/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java
@@ -14,13 +14,6 @@ public final class EnumContainer {
 		MDIJKSTRA, MINEX, MRNEX
 	}
 
-	/**
-	 * Lists of all datasets available in the database.
-	 */
-	public enum Dataset {
-		BZ, SF, ST, IT
-	}
-
 	/**
 	 * The network can either be unimodal continuous links only or
 	 * multimodal and include discrete links.
diff --git a/src/main/java/it/unibz/inf/isoga/config/ConfigClient.java b/src/main/java/it/unibz/inf/isoga/config/ConfigClient.java
index 2564aace..89b18d09 100644
--- a/src/main/java/it/unibz/inf/isoga/config/ConfigClient.java
+++ b/src/main/java/it/unibz/inf/isoga/config/ConfigClient.java
@@ -1,8 +1,10 @@
 package it.unibz.inf.isoga.config;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import it.unibz.inf.isochrone.config.ConfigDataset;
 import it.unibz.inf.isochrone.config.ConfigIsochrone;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.TableType;
 import it.unibz.inf.isoga.db.TableEntry;
 
@@ -13,15 +15,12 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 /**
  * Configuration for individual datasets.
  */
 public class ConfigClient extends ConfigDataset {
 	private static final int NAME_MAX_LENGTH = 32;
-	private static final Map<String, Map<Dataset, ConfigClient>> ALL_CONFIGS;
+	private static final Map<String, Map<String, ConfigClient>> ALL_CONFIGS;
 	private boolean registered = false;
 
 	static {
@@ -36,20 +35,20 @@ public class ConfigClient extends ConfigDataset {
 		return Collections.emptyList();
 	}
 
-	public static ConfigClient getInstance(final String clientId, final Dataset ds) {
-		if (getAllConfigMap(clientId).containsKey(ds)) {
-			return ALL_CONFIGS.get(clientId).get(ds);
+	public static ConfigClient getInstance(final String clientId, final String datasetName) {
+		if (getAllConfigMap(clientId).containsKey(datasetName)) {
+			return ALL_CONFIGS.get(clientId).get(datasetName);
 		}
 
-		final ConfigClient createdConfig = new ConfigClient(ConfigDataset.getInstance(ds), clientId);
+		final ConfigClient createdConfig = new ConfigClient(ConfigDataset.getInstance(datasetName), clientId);
 		// configuration for client created ... now add it to the all_configs map
 		if (!ALL_CONFIGS.containsKey(clientId)) {
 			// client had no configuration before... init empty map
-			ALL_CONFIGS.put(clientId, new HashMap<Dataset, ConfigClient>());
+			ALL_CONFIGS.put(clientId, new HashMap<String, ConfigClient>());
 		}
 
 		// add created clientConfig to existing client configs (with different dataset)
-		ALL_CONFIGS.get(clientId).put(ds, createdConfig);
+		ALL_CONFIGS.get(clientId).put(datasetName, createdConfig);
 		return createdConfig;
 	}
 
@@ -114,7 +113,7 @@ public class ConfigClient extends ConfigDataset {
 
 	// Private static methods
 
-	private static Map<Dataset, ConfigClient> getAllConfigMap(final String clientId) {
+	private static Map<String, ConfigClient> getAllConfigMap(final String clientId) {
 		if (ALL_CONFIGS.containsKey(clientId)) {
 			return ALL_CONFIGS.get(clientId);
 		}
diff --git a/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java b/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
index 56a98569..1b3542e0 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceConfiguration.java
@@ -3,7 +3,6 @@ package it.unibz.inf.isoga.service;
 
 import it.unibz.inf.isochrone.config.ConfigDataset;
 import it.unibz.inf.isochrone.config.ConfigIsochrone;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isoga.config.ConfigClient;
 import it.unibz.inf.isoga.service.dto.RequestConfiguration;
 import it.unibz.inf.isoga.service.dto.ResponseConfiguration;
@@ -19,7 +18,7 @@ import javax.websocket.Session;
  * @author Nikolaus Krismer
  */
 public class ServiceConfiguration extends AbstractService<RequestConfiguration, ResponseConfiguration> {
-	private static final Dataset[] PREREGISTERING_DATASETS = new Dataset[] {Dataset.BZ};
+	private static final String[] PREREGISTERING_DATASETS = new String[] {"bz"};
 
 	// Constructor
 
@@ -50,9 +49,9 @@ public class ServiceConfiguration extends AbstractService<RequestConfiguration,
 	// Private methods
 
 	private Collection<ConfigDataset> initClientConfigurations(final String clientId) {
-		final Set<Dataset> instantiatedDatasets = ConfigDataset.getInstantiatedDatasets();
+		final Set<String> instantiatedDatasets = ConfigDataset.getInstantiatedDatasets();
 		final Collection<ConfigDataset> createConfigs = new ArrayList<ConfigDataset>(instantiatedDatasets.size());
-		for (final Dataset dataset : instantiatedDatasets) {
+		for (final String dataset : instantiatedDatasets) {
 			final ConfigClient configClient = ConfigClient.getInstance(clientId, dataset);
 			createConfigs.add(configClient);
 		}
@@ -63,7 +62,7 @@ public class ServiceConfiguration extends AbstractService<RequestConfiguration,
 	private void preregisterClients(final String clientId) {
 		final Connection connection = ConfigIsochrone.getInstance().getConnection();
 
-		for (Dataset dataset : PREREGISTERING_DATASETS) {
+		for (String dataset : PREREGISTERING_DATASETS) {
 			final ConfigClient configClient = ConfigClient.getInstance(clientId, dataset);
 			registerTableAndLayers(connection, configClient);
 		}
diff --git a/src/main/java/it/unibz/inf/isoga/service/ServiceFeatureInfo.java b/src/main/java/it/unibz/inf/isoga/service/ServiceFeatureInfo.java
index d74542e2..b98c0297 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceFeatureInfo.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceFeatureInfo.java
@@ -1,7 +1,6 @@
 package it.unibz.inf.isoga.service;
 
 
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isoga.config.ConfigClient;
 import it.unibz.inf.isoga.db.DbUtility;
@@ -29,7 +28,7 @@ public class ServiceFeatureInfo extends AbstractService<RequestFeatureInfo, Resp
 	@Override
 	public ResponseFeatureInfo onJsonMessage(final Session session, final RequestFeatureInfo request) {
 		final int stopId = request.getStopId();
-		final Dataset ds = request.getDataset();
+		final String ds = request.getDataset();
 		final Direction direction = request.getDirection();
 
 		final String clientId = session.getId();
diff --git a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java
index 650be3e8..fabbefdc 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java
@@ -11,7 +11,6 @@ import it.unibz.inf.isochrone.config.ConfigIsochrone;
 import it.unibz.inf.isochrone.network.Location;
 import it.unibz.inf.isochrone.util.EnumContainer.Algorithm;
 import it.unibz.inf.isochrone.util.EnumContainer.CoverageMode;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.Query;
 import it.unibz.inf.isoga.config.ConfigClient;
@@ -50,7 +49,7 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response
 		final long startRequestTiming = System.currentTimeMillis();
 		final String clientId = session.getId();
 		final Direction direction = request.getDirection();
-		final Dataset dataset = request.getDataset();
+		final String dataset = request.getDataset();
 		if (dataset == null) {
 			throw new IllegalArgumentException("Invalid dataset specified!");
 		}
diff --git a/src/main/java/it/unibz/inf/isoga/service/ServicePoiFeature.java b/src/main/java/it/unibz/inf/isoga/service/ServicePoiFeature.java
index 74e3b02d..06701581 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServicePoiFeature.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServicePoiFeature.java
@@ -2,7 +2,6 @@ package it.unibz.inf.isoga.service;
 
 
 import it.unibz.inf.isochrone.config.ConfigIsochrone;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isoga.config.ConfigClient;
 import it.unibz.inf.isoga.db.DbUtility;
 import it.unibz.inf.isoga.service.dto.RequestPoiFeature;
@@ -25,8 +24,7 @@ public class ServicePoiFeature extends AbstractService<RequestPoiFeature, Respon
 
 	@Override
 	public ResponsePoiFeature onJsonMessage(final Session session, final RequestPoiFeature request) {
-		final Dataset ds = request.getDataset();
-
+		final String ds = request.getDataset();
 		final String clientId = session.getId();
 		final ConfigClient config = ConfigClient.getInstance(clientId, ds);
 		final int clientSRID = ConfigIsochrone.getInstance().getClientSRID();
diff --git a/src/main/java/it/unibz/inf/isoga/service/ServiceWps.java b/src/main/java/it/unibz/inf/isoga/service/ServiceWps.java
index eb463f34..f2d7b08e 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceWps.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceWps.java
@@ -1,7 +1,6 @@
 package it.unibz.inf.isoga.service;
 
 
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.QueryType;
 import it.unibz.inf.isoga.config.ConfigClient;
 import it.unibz.inf.isoga.db.DbUtility;
@@ -22,7 +21,7 @@ public class ServiceWps extends AbstractService<RequestWps, ResponseWps> {
 
 	@Override
 	public ResponseWps onJsonMessage(final Session session, final RequestWps request) {
-		final Dataset ds = request.getDataset();
+		final String ds = request.getDataset();
 		final String sqlMessage = request.getSqlQuery();
 		final String coverageTable = request.getCoverageTable();
 		final String spatialPredicate = request.getSpatialPredicate();
diff --git a/src/main/java/it/unibz/inf/isoga/service/dto/RequestFeatureInfo.java b/src/main/java/it/unibz/inf/isoga/service/dto/RequestFeatureInfo.java
index 34bb583a..2aba349a 100644
--- a/src/main/java/it/unibz/inf/isoga/service/dto/RequestFeatureInfo.java
+++ b/src/main/java/it/unibz/inf/isoga/service/dto/RequestFeatureInfo.java
@@ -1,14 +1,13 @@
 package it.unibz.inf.isoga.service.dto;
 
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 
 import javax.validation.constraints.NotNull;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 public class RequestFeatureInfo implements IRequest {
-	private String datasetString;
+	private String dataset;
 	private String directionString;
 	private int stopId;
 
@@ -19,12 +18,8 @@ public class RequestFeatureInfo implements IRequest {
 	// Getter
 
 	@NotNull
-	public Dataset getDataset() {
-		if (datasetString == null) {
-			return null;
-		}
-
-		return Dataset.valueOf(datasetString.toUpperCase());
+	public String getDataset() {
+		return dataset;
 	}
 
 	@NotNull
@@ -51,9 +46,9 @@ public class RequestFeatureInfo implements IRequest {
 		}
 	}
 
-	@JsonProperty(value = "dataset")
-	public void setDatasetString(final String datasetString) {
-		this.datasetString = datasetString;
+	@JsonProperty
+	public void setDataset(final String dataset) {
+		this.dataset = dataset;
 	}
 
 	@JsonProperty(value = "direction")
diff --git a/src/main/java/it/unibz/inf/isoga/service/dto/RequestIsochrone.java b/src/main/java/it/unibz/inf/isoga/service/dto/RequestIsochrone.java
index 1cb3e831..6816767e 100644
--- a/src/main/java/it/unibz/inf/isoga/service/dto/RequestIsochrone.java
+++ b/src/main/java/it/unibz/inf/isoga/service/dto/RequestIsochrone.java
@@ -1,9 +1,10 @@
 package it.unibz.inf.isoga.service.dto;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import it.unibz.inf.isochrone.util.EnumContainer;
 import it.unibz.inf.isochrone.util.EnumContainer.Algorithm;
 import it.unibz.inf.isochrone.util.EnumContainer.CoverageMode;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.Mode;
 import it.unibz.inf.isoga.network.QueryNode;
@@ -13,12 +14,10 @@ import java.util.Collection;
 
 import javax.validation.constraints.NotNull;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 public class RequestIsochrone implements IRequest {
 	private Algorithm algorithm;
 	private CoverageMode coverageMode;
-	private Dataset dataset;
+	private String dataset;
 	private Calendar date;
 	private Direction direction;
 	private Long dmax;
@@ -46,7 +45,7 @@ public class RequestIsochrone implements IRequest {
 	}
 
 	@NotNull
-	public Dataset getDataset() {
+	public String getDataset() {
 		return dataset;
 	}
 
@@ -111,7 +110,7 @@ public class RequestIsochrone implements IRequest {
 
 	@JsonProperty
 	public void setDataset(final String dataset) {
-		this.dataset = EnumContainer.getByName(Dataset.class, dataset);
+		this.dataset = dataset;
 	}
 
 	@JsonProperty
diff --git a/src/main/java/it/unibz/inf/isoga/service/dto/RequestPoiFeature.java b/src/main/java/it/unibz/inf/isoga/service/dto/RequestPoiFeature.java
index a5c39545..1c188cfd 100644
--- a/src/main/java/it/unibz/inf/isoga/service/dto/RequestPoiFeature.java
+++ b/src/main/java/it/unibz/inf/isoga/service/dto/RequestPoiFeature.java
@@ -1,14 +1,12 @@
 package it.unibz.inf.isoga.service.dto;
 
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import javax.validation.constraints.NotNull;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 
 public class RequestPoiFeature implements IRequest {
-	private String datasetString;
+	private String dataset;
 	private String query;
 
 	// Constructors
@@ -18,12 +16,8 @@ public class RequestPoiFeature implements IRequest {
 	// Getter
 
 	@NotNull
-	public Dataset getDataset() {
-		if (datasetString == null) {
-			return null;
-		}
-
-		return Dataset.valueOf(datasetString.toUpperCase());
+	public String getDataset() {
+		return dataset;
 	}
 
 	@NotNull
@@ -45,9 +39,9 @@ public class RequestPoiFeature implements IRequest {
 		}
 	}
 
-	@JsonProperty(value = "dataset")
-	public void setDatasetString(final String datasetString) {
-		this.datasetString = datasetString;
+	@JsonProperty
+	public void setDataset(final String dataset) {
+		this.dataset = dataset;
 	}
 
 	@JsonProperty
diff --git a/src/main/java/it/unibz/inf/isoga/service/dto/RequestWps.java b/src/main/java/it/unibz/inf/isoga/service/dto/RequestWps.java
index 1e31ab52..9b888ec0 100644
--- a/src/main/java/it/unibz/inf/isoga/service/dto/RequestWps.java
+++ b/src/main/java/it/unibz/inf/isoga/service/dto/RequestWps.java
@@ -1,14 +1,12 @@
 package it.unibz.inf.isoga.service.dto;
 
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import javax.validation.constraints.NotNull;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 public class RequestWps implements IRequest {
 	private String coverageTable;
-	private String datasetString;
+	private String dataset;
 	private String spatialPredicate;
 	private String sqlQuery;
 
@@ -28,12 +26,8 @@ public class RequestWps implements IRequest {
 	}
 
 	@NotNull
-	public Dataset getDataset() {
-		if (datasetString == null) {
-			return null;
-		}
-
-		return Dataset.valueOf(datasetString.toUpperCase());
+	public String getDataset() {
+		return dataset;
 	}
 
 	@NotNull
@@ -69,9 +63,9 @@ public class RequestWps implements IRequest {
 		this.coverageTable = coverageTable;
 	}
 
-	@JsonProperty(value = "dataset")
-	public void setDatasetString(final String datasetString) {
-		this.datasetString = datasetString;
+	@JsonProperty
+	public void setDataset(final String dataset) {
+		this.dataset = dataset;
 	}
 
 	@JsonProperty
diff --git a/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java b/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java
index 81291f8e..963e5069 100644
--- a/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java
+++ b/src/main/java/it/unibz/inf/isoga/service/dto/ResponseConfiguration.java
@@ -1,5 +1,7 @@
 package it.unibz.inf.isoga.service.dto;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import it.unibz.inf.isochrone.config.ConfigDataset;
 import it.unibz.inf.isoga.config.ConfigGeoserver;
 import it.unibz.inf.isoga.service.ServiceConfiguration;
@@ -12,8 +14,6 @@ import java.util.List;
 
 import org.apache.commons.httpclient.HttpStatus;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 public class ResponseConfiguration implements IResponse {
 	private final String mapserverUrl;
 	private final List<ConfigDataset> defaultDatasets;
@@ -44,7 +44,7 @@ public class ResponseConfiguration implements IResponse {
 		Collections.sort(defaultDatasets, new Comparator<ConfigDataset>() {
 			@Override
 			public int compare(final ConfigDataset o1, final ConfigDataset o2) {
-				return o1.getDataset().toString().compareTo(o2.getDataset().toString());
+				return o1.getDatasetName().compareTo(o2.getDatasetName());
 			}
 		});
 
diff --git a/src/main/java/it/unibz/inf/isoga/web/StartupListener.java b/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
index bf4507e5..ba660cc1 100644
--- a/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
+++ b/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
@@ -2,10 +2,10 @@ package it.unibz.inf.isoga.web;
 
 import it.unibz.inf.isochrone.config.ConfigDataset;
 import it.unibz.inf.isochrone.config.ConfigIsochrone;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isoga.db.DbUtility;
 
 import java.sql.Connection;
+import java.util.Collection;
 
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
@@ -40,8 +40,8 @@ public class StartupListener implements ServletContextListener {
 	private void initializeDatasetConfigs() {
 		LOGGER.info("Initializing dataset configuration files");
 
-		final Dataset[] allDatasets = Dataset.values();
-		for (final Dataset dataset : allDatasets) {
+		final Collection<String> allDatasets = ConfigDataset.getAllDatasets();
+		for (final String dataset : allDatasets) {
 			ConfigDataset.getInstance(dataset);
 		}
 	}
diff --git a/src/main/resources/config.xml b/src/main/resources/config.xml
index 25626cc4..9acb4d33 100644
--- a/src/main/resources/config.xml
+++ b/src/main/resources/config.xml
@@ -21,6 +21,5 @@
 
 	<!-- Configuration parameters -->
 	<entry key="cfg.clientSRID">3857</entry>
-	<entry key="cfg.datasets">bz,it,sf,st</entry>
 	<entry key="cfg.clientPrefix"></entry>
 </properties>
diff --git a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java
new file mode 100644
index 00000000..0d381af5
--- /dev/null
+++ b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java
@@ -0,0 +1,27 @@
+package it.unibz.inf.isochrone.config;
+
+import java.net.URISyntaxException;
+import java.util.Collection;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class ConfigDatasetTest {
+	private static final int EXPECTED_NUM_DATASETS = 4;
+	private static final String[] EXPECTED_DATASETS = new String[] {"bz", "it", "sf", "st"};
+
+	@Test
+	public void testDatasetCount() throws URISyntaxException {
+		final Collection<String> datasetCollection = ConfigDataset.getAllDatasets();
+		Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS, "Unexpected number of configured datasets");
+	}
+
+	@Test
+	public void testDatasetNames() throws URISyntaxException {
+		final Collection<String> datasetCollection = ConfigDataset.getAllDatasets();
+
+		for (String dsName : EXPECTED_DATASETS) {
+			Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured");
+		}
+	}
+}
diff --git a/src/test/java/it/unibz/inf/isochrone/config/ConfigTest.java b/src/test/java/it/unibz/inf/isochrone/config/ConfigIsochroneTest.java
similarity index 96%
rename from src/test/java/it/unibz/inf/isochrone/config/ConfigTest.java
rename to src/test/java/it/unibz/inf/isochrone/config/ConfigIsochroneTest.java
index 58a6001c..3561f984 100644
--- a/src/test/java/it/unibz/inf/isochrone/config/ConfigTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/config/ConfigIsochroneTest.java
@@ -7,11 +7,17 @@ import org.testng.annotations.Test;
  * @author Nikolaus Krismer
  * @version 3
  */
-public class ConfigTest {
+public class ConfigIsochroneTest {
 	private static final int EXPECTED_MAX_CONNECTION = 50;
 	private static final int EXPECTED_BACTH_SIZE = 250;
 	private static final int EXPECTED_PORT = 5432;
 
+	@Test
+	public void testDbName() {
+		final ConfigIsochrone config = ConfigIsochrone.getInstance();
+		Assert.assertEquals(config.getDBName(), "isochrone", "Property database name");
+	}
+
 	@Test
 	public void testGetMaxConnection() {
 		final ConfigIsochrone config = ConfigIsochrone.getInstance();
@@ -29,10 +35,4 @@ public class ConfigTest {
 		final ConfigIsochrone config = ConfigIsochrone.getInstance();
 		Assert.assertEquals(config.getDBPort(), EXPECTED_PORT, "Property org.postgresql.servername");
 	}
-
-	@Test
-	public void testDbName() {
-		final ConfigIsochrone config = ConfigIsochrone.getInstance();
-		Assert.assertEquals(config.getDBName(), "isochrone", "Property database name");
-	}
 }
diff --git a/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java b/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java
index 313df499..971b77f7 100644
--- a/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java
@@ -3,7 +3,6 @@ package it.unibz.inf.isochrone.db;
 import it.unibz.inf.isochrone.config.ConfigDataset;
 import it.unibz.inf.isochrone.network.Link;
 import it.unibz.inf.isochrone.network.Node;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.Mode;
 
@@ -23,6 +22,7 @@ public class DatabaseTest {
 	private static final int EXPECTED_NODE_COUNT = 2687;
 	private static final int LINK_ID = 1846;
 	private static final int NODE_ID = 5013;
+	private static final String TEST_DATASET = "bz";
 	private Map<Integer, Node> nodes;
 	private Map<Integer, Link> links;
 
@@ -43,7 +43,7 @@ public class DatabaseTest {
 
 	@Test
 	public void testCreateDatabaseObject() {
-		final ConfigDataset config = ConfigDataset.getInstance(Dataset.BZ);
+		final ConfigDataset config = ConfigDataset.getInstance(TEST_DATASET);
 		final Database<ConfigDataset> db = new Database<>(config, Mode.MULTIMODAL, Direction.INCOMING);
 		Assert.assertNotNull(db, "Database object could not be created!");
 	}
@@ -74,7 +74,7 @@ public class DatabaseTest {
 	// Private methods
 
 	private Database<ConfigDataset> initDb() {
-		final ConfigDataset config = ConfigDataset.getInstance(Dataset.BZ);
+		final ConfigDataset config = ConfigDataset.getInstance(TEST_DATASET);
 		final Database<ConfigDataset> db = new Database<>(config, Mode.MULTIMODAL, Direction.INCOMING);
 		db.readNetwork(nodes, links);
 
diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java
index 563dfc5c..54e2feb2 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java
@@ -3,7 +3,6 @@ package it.unibz.inf.isochrone.network;
 import it.unibz.inf.isochrone.algorithm.MDijkstra;
 import it.unibz.inf.isochrone.algorithm.MineX;
 import it.unibz.inf.isochrone.algorithm.MrneX;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.Mode;
 
@@ -13,7 +12,7 @@ import java.util.GregorianCalendar;
 import org.testng.annotations.Test;
 
 public class AlgorithmTest {
-	private static final Dataset TEST_DATASET = Dataset.BZ;
+	private static final String TEST_DATASET = "bz";
 	private static final Double WALKING_SPEED = 1.0;
 	private static final int DURATION = 50;
 	private static final Calendar TIME = new GregorianCalendar(2011, 6, 1, 12, 0, 0);
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
index 1f971e61..02398ced 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
@@ -6,7 +6,6 @@ import it.unibz.inf.isochrone.algorithm.MDijkstra;
 import it.unibz.inf.isochrone.algorithm.MineX;
 import it.unibz.inf.isochrone.algorithm.MrneX;
 import it.unibz.inf.isochrone.config.ConfigDataset;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.Mode;
 import it.unibz.inf.isochrone.util.Query;
@@ -18,7 +17,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 public class ComparisonTest {
-	private static final Dataset TEST_DATASET = Dataset.BZ;
+	private static final String TEST_DATASET = "bz";
 	private static final Double WALKING_SPEED = 1.0;
 	private static final int DURATION = 50;
 	private static final Calendar TIME = new GregorianCalendar(2011, 6, 1, 12, 0, 0);
diff --git a/src/test/java/it/unibz/inf/isochrone/network/RuntimeComplex.java b/src/test/java/it/unibz/inf/isochrone/network/RuntimeComplex.java
index 4cd07e7c..6027fc9c 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/RuntimeComplex.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/RuntimeComplex.java
@@ -4,7 +4,6 @@ import it.unibz.inf.isochrone.algorithm.Isochrone;
 import it.unibz.inf.isochrone.algorithm.MDijkstra;
 import it.unibz.inf.isochrone.algorithm.MineX;
 import it.unibz.inf.isochrone.algorithm.MrneX;
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.Mode;
 
@@ -112,7 +111,7 @@ public final class RuntimeComplex {
 	private static void addDatasetBZ(final Set<Integer> times) {
 		int i = 0;
 		for (final Integer time : times) {
-			datasets.put(i++, new TestParameters(1.0, time, BZ_TIME, Mode.MULTIMODAL, BZ_NODE_ID, Dataset.BZ, Integer.MAX_VALUE, Direction.INCOMING));
+			datasets.put(i++, new TestParameters(1.0, time, BZ_TIME, Mode.MULTIMODAL, BZ_NODE_ID, "bz", Integer.MAX_VALUE, Direction.INCOMING));
 		}
 	}
 
@@ -120,7 +119,7 @@ public final class RuntimeComplex {
 	private static void addDatasetIT(final Set<Integer> times) {
 		int i = 0;
 		for (final Integer time : times) {
-			datasets.put(i++, new TestParameters(1.0, time, IT_TIME, Mode.MULTIMODAL, IT_NODE_ID, Dataset.IT, Integer.MAX_VALUE, Direction.INCOMING));
+			datasets.put(i++, new TestParameters(1.0, time, IT_TIME, Mode.MULTIMODAL, IT_NODE_ID, "it", Integer.MAX_VALUE, Direction.INCOMING));
 		}
 	}
 
@@ -128,7 +127,7 @@ public final class RuntimeComplex {
 	private static void addDatasetSF(final Set<Integer> times) {
 		int i = 0;
 		for (final Integer time : times) {
-			datasets.put(i++, new TestParameters(1.0, time, SF_TIME, Mode.MULTIMODAL, SF_NODE_ID, Dataset.SF, Integer.MAX_VALUE, Direction.INCOMING));
+			datasets.put(i++, new TestParameters(1.0, time, SF_TIME, Mode.MULTIMODAL, SF_NODE_ID, "sf", Integer.MAX_VALUE, Direction.INCOMING));
 		}
 	}
 
@@ -136,7 +135,7 @@ public final class RuntimeComplex {
 	private static void addDatasetST(final Set<Integer> times) {
 		int i = 0;
 		for (final Integer time : times) {
-			datasets.put(i++, new TestParameters(1.0, time, ST_TIME, Mode.MULTIMODAL, ST_NODE_ID, Dataset.ST, Integer.MAX_VALUE, Direction.INCOMING));
+			datasets.put(i++, new TestParameters(1.0, time, ST_TIME, Mode.MULTIMODAL, ST_NODE_ID, "st", Integer.MAX_VALUE, Direction.INCOMING));
 		}
 	}
 
diff --git a/src/test/java/it/unibz/inf/isochrone/network/TestParameters.java b/src/test/java/it/unibz/inf/isochrone/network/TestParameters.java
index 6b928f2a..42a3fa4c 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/TestParameters.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/TestParameters.java
@@ -1,6 +1,5 @@
 package it.unibz.inf.isochrone.network;
 
-import it.unibz.inf.isochrone.util.EnumContainer.Dataset;
 import it.unibz.inf.isochrone.util.EnumContainer.Direction;
 import it.unibz.inf.isochrone.util.EnumContainer.Mode;
 
@@ -17,7 +16,7 @@ final class TestParameters {
 	private static final Calendar DEFAULT_DATE = new GregorianCalendar(2011, 9, 20, 15, 0, 0);
 	private static final Mode DEFAULT_MODE = Mode.MULTIMODAL;
 	private static final int DEFAULT_NODE_ID = 2000500;
-	private static final Dataset DEFAULT_DATASET = Dataset.BZ;
+	private static final String DEFAULT_DATASET = "bz";
 	private static final int DEFAULT_MAX_MEMORY = Integer.MAX_VALUE;
 	private static final Direction DEFAULT_DIRECTION = Direction.INCOMING;
 
@@ -26,7 +25,7 @@ final class TestParameters {
 	private final Calendar date;
 	private final Mode mode;
 	private final int nodeId;
-	private final Dataset dataset;
+	private final String dataset;
 	private final int maxMemory;
 	private final Direction direction;
 
@@ -42,7 +41,7 @@ final class TestParameters {
 	}
 
 	// CHECKSTYLE:OFF ParameterNumber
-	public TestParameters(final double walkingSpeed, final int runtime, final Calendar date, final Mode mode, final int nodeId, final Dataset dataset, final int maxMemory, final Direction direction) {
+	public TestParameters(final double walkingSpeed, final int runtime, final Calendar date, final Mode mode, final int nodeId, final String dataset, final int maxMemory, final Direction direction) {
 		this.walkingSpeed = walkingSpeed;
 		this.runtime = runtime;
 		this.date = date;
@@ -54,7 +53,7 @@ final class TestParameters {
 	}
 	// CHECKSTYLE:ON ParameterNumber
 
-	public Dataset getDataset() {
+	public String getDataset() {
 		return dataset;
 	}
 
-- 
GitLab