From 0b6b0d2b8ed522e553f51314da237794512c6d37 Mon Sep 17 00:00:00 2001
From: Nikolaus Krismer <niko@krismer.de>
Date: Wed, 5 Mar 2014 15:58:46 +0100
Subject: [PATCH] reworked enums and enumContainer reworked BBoxOutput added
 todo

---
 .../inf/isochrone/algorithm/Isochrone.java    |  10 +-
 .../inf/isochrone/network/MemoryOutput.java   |  37 ++++--
 .../unibz/inf/isochrone/network/Output.java   |   4 +-
 .../inf/isochrone/util/EnumContainer.java     |  26 ++++-
 .../inf/isoga/coverage/CoverageBuilder.java   |   7 +-
 .../java/it/unibz/inf/isoga/db/DbUtility.java |   8 --
 .../it/unibz/inf/isoga/db/TableEntry.java     |   2 +-
 .../unibz/inf/isoga/network/BBoxOutput.java   | 110 ++++++++++++++++++
 .../inf/isoga/network/MemoryBBoxOutput.java   |  73 ------------
 .../inf/isoga/service/AbstractService.java    |   2 +
 .../inf/isoga/service/ServiceIsochrone.java   |  52 +++++----
 .../isoga/service/dto/RequestIsochrone.java   |  65 +++++------
 .../webapp/js/service/serviceIsochrone.js     |   2 +-
 13 files changed, 235 insertions(+), 163 deletions(-)
 create mode 100644 src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java
 delete mode 100644 src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java

diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java
index 42ae3d5a..29e502ab 100644
--- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java
+++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java
@@ -88,7 +88,7 @@ public abstract class Isochrone {
 				if (locationOffset > 0 && locationOffset < link.getLength()) {
 					link.setStartOffset(Math.max(0, locationOffset - query.getDuration() * query.getWalkingSpeed()));
 					link.setEndOffset(locationOffset);
-					output.output(link);
+					output.addLink(link);
 				}
 			} else {
 				node = getNode(link.getEndNode());
@@ -96,7 +96,7 @@ public abstract class Isochrone {
 				if (locationOffset > 0 && locationOffset < link.getLength()) {
 					link.setStartOffset(locationOffset);
 					link.setEndOffset(Math.min(link.getLength(), Math.abs(link.getLength() - locationOffset - query.getDuration() * query.getWalkingSpeed())));
-					output.output(link);
+					output.addLink(link);
 				}
 			}
 
@@ -130,13 +130,13 @@ public abstract class Isochrone {
 		Node node = null;
 		while ((node = queue.poll()) != null) {
 			final Collection<Link> adjacents = calcAdjLinks(node.getID());
-			output.outputNode(node);
+			output.addNode(node);
 			node.close();
 			for (final Link link : adjacents) {
 				if (link.isContinuous()) {
 					updateQueue(expandContinuousLink(node, link));
 					if (Math.abs(link.getStartOffset() - Double.MIN_VALUE) < COMPARE_PRECISION) {
-						output.output(link);
+						output.addLink(link);
 					}
 				} else {
 					updateQueue(expandDiscreteLink(node, link));
@@ -149,7 +149,7 @@ public abstract class Isochrone {
 		}
 
 		for (final Node n : getNodes()) {
-			output.outputNode(n);
+			output.addNode(n);
 		}
 
 		return output;
diff --git a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java
index 3e3ae420..523e8210 100644
--- a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java
+++ b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java
@@ -1,25 +1,44 @@
 package it.unibz.inf.isochrone.network;
 
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * A sample output class, which simply stores all nodes and returns if needed.
- * Will be maily used for tests.
+ * This is mainly used for testing purposes.
  */
 public class MemoryOutput implements Output {
-	protected HashMap<Integer, Link> links = new HashMap<Integer, Link>();
+	private final Map<Integer, Link> links;
+	private final Set<Node> nodes;
 
-	@Override
-	public void output(final Link link) {
-		links.put(link.getID(), link);
+	// Constructor
+
+	public MemoryOutput() {
+		links = new HashMap<Integer, Link>();
+		nodes = new HashSet<Node>();
+	}
+
+	// Getter
+
+	public Map<Integer, Link> getLinks() {
+		return links;
 	}
 
+	public Set<Node> getNodes() {
+		return nodes;
+	}
+
+	// Public methods
+
 	@Override
-	public void outputNode(final Node node) {
-		// Do nothing, we don't care about the nodes in the memorynetwork
+	public void addLink(final Link link) {
+		links.put(link.getID(), link);
 	}
 
-	public HashMap<Integer, Link> getLinks() {
-		return links;
+	@Override
+	public void addNode(final Node node) {
+		nodes.add(node);
 	}
 }
diff --git a/src/main/java/it/unibz/inf/isochrone/network/Output.java b/src/main/java/it/unibz/inf/isochrone/network/Output.java
index 32605416..84104741 100644
--- a/src/main/java/it/unibz/inf/isochrone/network/Output.java
+++ b/src/main/java/it/unibz/inf/isochrone/network/Output.java
@@ -10,13 +10,13 @@ public interface Output {
 	 *
 	 * @param link The link that should be stored
 	 */
-	void output(Link link);
+	void addLink(Link link);
 
 	/**
 	 * Stores a node which belongs to the network.
 	 *
 	 * @param node The node that should be stored
 	 */
-	void outputNode(Node node);
+	void addNode(Node node);
 
 }
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 ac9d4e01..8e4ebe8d 100644
--- a/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java
+++ b/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java
@@ -3,7 +3,16 @@ package it.unibz.inf.isochrone.util;
 /**
  * Stores all the enums used in the project in one place.
  */
-public class EnumContainer {
+public final class EnumContainer {
+
+	private EnumContainer() { }
+
+	/**
+	 * Lists of all algorithms available.
+	 */
+	public enum Algorithm {
+		MDIJKSTRA, MINEX, MRNEX
+	}
 
 	/**
 	 * Lists of all datasets available in the database.
@@ -20,6 +29,10 @@ public class EnumContainer {
 		UNIMODAL, MULTIMODAL
 	}
 
+	public enum CoverageMode {
+		BUFFER, SURFACE
+	}
+
 	/**
 	 * Direction in which the isochrone should be computed.
 	 */
@@ -63,4 +76,15 @@ public class EnumContainer {
 	public enum QueryType {
 		SUM, COUNT, SELECT, INVALID
 	}
+
+	public static <T extends Enum<T>> T getByName(final Class<T> enumType, final String str) {
+		T result = null;
+		try {
+			result = Enum.valueOf(enumType, str.toUpperCase());
+		} catch (IllegalArgumentException e) {
+			result = null;
+		}
+
+		return result;
+	}
 }
diff --git a/src/main/java/it/unibz/inf/isoga/coverage/CoverageBuilder.java b/src/main/java/it/unibz/inf/isoga/coverage/CoverageBuilder.java
index d002d11c..24264f67 100644
--- a/src/main/java/it/unibz/inf/isoga/coverage/CoverageBuilder.java
+++ b/src/main/java/it/unibz/inf/isoga/coverage/CoverageBuilder.java
@@ -23,16 +23,17 @@ public class CoverageBuilder {
 	private final ConfigClient config;
 	private final Mode mode;
 	private final DatabaseWeb db;
-	private final Set<Integer> exploredEdges = new HashSet<Integer>();
+	private final Set<Integer> exploredEdges;
 	private long timeBufferQuery;
 	private final Direction direction;
 
-	public CoverageBuilder(final ConfigClient config, final Mode mode, final Direction direction) {
+	public CoverageBuilder(final DatabaseWeb db, final ConfigClient config, final Mode mode, final Direction direction) {
 		this.config = config;
 		this.mode = mode;
 		this.direction = direction;
+		this.db = db;
 
-		db = new DatabaseWeb(config, direction);
+		exploredEdges = new HashSet<Integer>();
 	}
 
 	/**
diff --git a/src/main/java/it/unibz/inf/isoga/db/DbUtility.java b/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
index f6f06a34..166aae8c 100644
--- a/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
+++ b/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
@@ -54,14 +54,6 @@ public final class DbUtility {
 		executeStatement(connection, "DROP INDEX IF EXISTS " + indexName);
 	}
 
-	public static void controlIndex(final Connection connection, final TableEntry tableEntry, final boolean disabled) {
-		if (disabled) {
-			dropIndex(connection, tableEntry.getIndexName());
-		} else {
-			createSpatialIndex(connection, tableEntry);
-		}
-	}
-
 	public static void createTargetEdgeTable(final Connection connection, final String edgeTableName) {
 		executeStatement(connection, "CREATE TABLE " + edgeTableName
 				+ " (\"ID\" integer NOT NULL, \"SOURCE\" integer, \"TARGET\" integer, \"OFFSET\" double precision, \"LENGTH\" double precision)");
diff --git a/src/main/java/it/unibz/inf/isoga/db/TableEntry.java b/src/main/java/it/unibz/inf/isoga/db/TableEntry.java
index eaa57f89..95497ee5 100644
--- a/src/main/java/it/unibz/inf/isoga/db/TableEntry.java
+++ b/src/main/java/it/unibz/inf/isoga/db/TableEntry.java
@@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
- * Describes a database table for the isoga web interface.
+ * Describes a database table for the web interface.
  */
 public class TableEntry {
 	private String indexName;
diff --git a/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java b/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java
new file mode 100644
index 00000000..699913cf
--- /dev/null
+++ b/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java
@@ -0,0 +1,110 @@
+package it.unibz.inf.isoga.network;
+
+import it.unibz.inf.isochrone.config.ConfigDataset;
+import it.unibz.inf.isochrone.config.ConfigIsochrone;
+import it.unibz.inf.isochrone.network.Link;
+import it.unibz.inf.isochrone.network.MemoryOutput;
+import it.unibz.inf.isochrone.network.Node;
+import it.unibz.inf.isochrone.util.EnumContainer.Direction;
+import it.unibz.inf.isoga.db.DatabaseWeb;
+import it.unibz.inf.isoga.db.DbUtility;
+import it.unibz.inf.isoga.db.TableEntry;
+import it.unibz.inf.isoga.geometry.BBox;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.commons.dbutils.DbUtils;
+
+/**
+ * An output which stores links and vertices to the database for calculating the bounding box.
+ */
+public class BBoxOutput extends MemoryOutput {
+	private BBox boundingBox;
+	private boolean isSaved;
+	private final String query;
+	private final int serverSRID;
+	private final TableEntry edgeTableEntry;
+	private final TableEntry vertexTableEntry;
+
+	// Constructors
+
+	public BBoxOutput(final ConfigDataset config) {
+		super();
+
+		isSaved = false;
+		edgeTableEntry = config.getEdgeTableEntry();
+		vertexTableEntry = config.getVertexTableEntry();
+		serverSRID = config.getServerSRID();
+
+		query = "SELECT ST_XMin(mbr.geo) min_x, ST_yMin(mbr.geo) min_y, ST_XMax(mbr.geo) max_x, ST_yMax(mbr.geo) max_y FROM "
+				+ "(SELECT st_transform(ST_SetSRID(st_extent(\"GEOMETRY\"),?),?) GEO FROM " + edgeTableEntry.getTableName() + ") MBR";
+	}
+
+	// Public methods
+
+	@Override
+	public void addLink(final Link link) {
+		boundingBox = null;
+		isSaved = false;
+
+		super.addLink(link);
+	}
+
+	@Override
+	public void addNode(final Node node) {
+		boundingBox = null;
+		isSaved = false;
+
+		super.addNode(node);
+	}
+
+	public BBox getBoundingBox() {
+		if (!isSaved) {
+			throw new IllegalStateException("Can not calculate bounding box, since results have not been saved to database");
+		}
+		if (boundingBox == null) {
+			calculateBoundingBox();
+		}
+
+		return boundingBox;
+	}
+
+	private void calculateBoundingBox() {
+		final ConfigIsochrone configIso = ConfigIsochrone.getInstance();
+		final Connection connection = configIso.getConnection();
+
+		PreparedStatement statement = null;
+		ResultSet rSet = null;
+		try {
+			statement = connection.prepareStatement(query);
+			statement.setInt(1, serverSRID);
+			statement.setInt(2, configIso.getClientSRID());
+			rSet = statement.executeQuery();
+			if (rSet.next()) {
+				long minX = Math.round(rSet.getDouble("min_x"));
+				long minY = Math.round(rSet.getDouble("min_y"));
+				long maxX = Math.round(rSet.getDouble("max_x"));
+				long maxY = Math.round(rSet.getDouble("max_y"));
+
+				boundingBox = new BBox(minX, minY, maxX, maxY);
+			}
+		} catch (final SQLException e) {
+			boundingBox = null;
+		} finally {
+			DbUtils.closeQuietly(rSet);
+			DbUtils.closeQuietly(statement);
+		}
+	}
+
+	public void saveInDatabase(final DatabaseWeb db, final Direction direction) {
+		db.storeLinks(getLinks().values(), direction);
+		db.storeVertices(getNodes());
+		DbUtility.createSpatialIndex(db.getConnection(), vertexTableEntry);
+		db.updateVertexTable();
+
+		isSaved = true;
+	}
+}
diff --git a/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java b/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java
deleted file mode 100644
index a7dd05d4..00000000
--- a/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package it.unibz.inf.isoga.network;
-
-import it.unibz.inf.isochrone.config.ConfigDataset;
-import it.unibz.inf.isochrone.config.ConfigIsochrone;
-import it.unibz.inf.isochrone.network.MemoryOutput;
-import it.unibz.inf.isochrone.network.Node;
-import it.unibz.inf.isochrone.util.EnumContainer.Direction;
-import it.unibz.inf.isoga.db.DatabaseWeb;
-import it.unibz.inf.isoga.geometry.BBox;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.dbutils.DbUtils;
-
-/**
- * An output which outputs the Links and Vertices to the database for
- * calculating the bounding box.
- */
-public class MemoryBBoxOutput extends MemoryOutput {
-	private final Set<Node> nodes = new HashSet<Node>();
-
-	public void storeAll(final DatabaseWeb db, final Direction direction) {
-		db.storeLinks(links.values(), direction);
-		db.storeVertices(nodes);
-	}
-
-	public BBox getBoundingBox(final ConfigDataset config) {
-		final String q = "select ST_XMin(mbr.geo) min_x, ST_yMin(mbr.geo) min_y, ST_XMax(mbr.geo) max_x, ST_yMax(mbr.geo) max_y from "
-				+ "(SELECT st_transform(ST_SetSRID(st_extent(\"GEOMETRY\"),?),?) GEO FROM "
-				+ config.getEdgeTableEntry().getTableName() + ") mbr";
-
-		long minX = Long.MAX_VALUE;
-		long minY = minX;
-		long maxX = Long.MIN_VALUE;
-		long maxY = maxX;
-
-		final ConfigIsochrone configIso = ConfigIsochrone.getInstance();
-		final Connection connection = configIso.getConnection();
-
-		PreparedStatement statement = null;
-		ResultSet rSet = null;
-		try {
-			statement = connection.prepareStatement(q);
-			statement.setInt(1, config.getServerSRID());
-			statement.setInt(2, configIso.getClientSRID());
-			rSet = statement.executeQuery();
-			if (rSet.next()) {
-				minX = Math.round(rSet.getDouble("min_x"));
-				minY = Math.round(rSet.getDouble("min_y"));
-				maxX = Math.round(rSet.getDouble("max_x"));
-				maxY = Math.round(rSet.getDouble("max_y"));
-			}
-			return new BBox(minX, minY, maxX, maxY);
-		} catch (final SQLException e) {
-			e.printStackTrace();
-		} finally {
-			DbUtils.closeQuietly(rSet);
-			DbUtils.closeQuietly(statement);
-		}
-
-		return null;
-	}
-
-	@Override
-	public void outputNode(final Node node) {
-		nodes.add(node);
-	}
-}
diff --git a/src/main/java/it/unibz/inf/isoga/service/AbstractService.java b/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
index a1604c9b..429eb267 100644
--- a/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
+++ b/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
@@ -55,6 +55,7 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 		DbUtility.createTargetEdgeTable(connection, edgeTableEntry.getTableName());
 		DbUtility.insertGeometryMetadata(connection, edgeTableEntry, serverSrid);
 		DbUtility.createSpatialIndex(connection, edgeTableEntry);
+		// TODO: Log database table creation
 		final GSFeatureTypeEncoder edgeFeatureTypeEncoder = getFeatureEncoder(edgeTableEntry, serverExtend, srs);
 		final GSLayerEncoder edgeLayerEncoder = new GSLayerEncoder();
 		edgeLayerEncoder.setDefaultStyle("STYLE_ISO_EDGES");
@@ -67,6 +68,7 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 		// create vertex annotation table
 		final TableEntry annotatedTableEntry = configClient.getVertexAnnotatedTableEntry();
 		DbUtility.createVertexAnnotationTable(connection, annotatedTableEntry.getTableName());
+		LOGGER.debug("Successfully created vertex annotation table \"" + annotatedTableEntry.getTableName() + "\"");
 
 		// register vertex table
 		final TableEntry vertexTableEntry = configClient.getVertexTableEntry();
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 4e2d704b..d969bafb 100644
--- a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java
+++ b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java
@@ -9,13 +9,16 @@ import it.unibz.inf.isochrone.algorithm.MrneX;
 import it.unibz.inf.isochrone.config.ConfigDataset;
 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;
 import it.unibz.inf.isoga.coverage.CoverageBuilder;
 import it.unibz.inf.isoga.db.DatabaseWeb;
 import it.unibz.inf.isoga.db.DbUtility;
-import it.unibz.inf.isoga.network.MemoryBBoxOutput;
+import it.unibz.inf.isoga.network.BBoxOutput;
 import it.unibz.inf.isoga.network.QueryNode;
 import it.unibz.inf.isoga.service.dto.RequestIsochrone;
 import it.unibz.inf.isoga.service.dto.ResponseIsochrone;
@@ -46,6 +49,7 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response
 	public ResponseIsochrone onJsonMessage(final Session session, final RequestIsochrone request) throws Exception {
 		final long startRequestTiming = System.currentTimeMillis();
 		final String clientId = session.getId();
+		final Direction direction = request.getDirection();
 		final Dataset dataset = request.getDataset();
 		if (dataset == null) {
 			throw new IllegalArgumentException("Invalid dataset specified!");
@@ -61,33 +65,30 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response
 		// Timing start
 
 		final long startComputationTiming = System.currentTimeMillis();
-		final DatabaseWeb db = new DatabaseWeb(config, request.getMode(), request.getDirection());
+		final DatabaseWeb db = new DatabaseWeb(config, request.getMode(), direction);
 		truncateTables(config);
-		final Query query = new Query(request.getDirection(), request.getSpeed(), request.getDmax(), request.getDate(), true, request.getMode());
+		final Query query = new Query(direction, request.getSpeed(), request.getDmax(), request.getDate(), true, request.getMode());
 		query.setLocations(locationsFromQueryNodes(request.getQueryNodes(), db));
 
-		final Isochrone isochrone = getAlgorithm(config, request.getAlgorithm(), query);
-		final MemoryBBoxOutput output = isochrone.compute(new MemoryBBoxOutput());
+		final Isochrone isochrone = getAlgorithm(request.getAlgorithm(), config, query);
+		final BBoxOutput output = isochrone.compute(new BBoxOutput(config));
+		output.saveInDatabase(db, direction);
 		final long timeIsochrone = System.currentTimeMillis() - startComputationTiming;
-		output.storeAll(db, request.getDirection());
-		DbUtility.controlIndex(db.getConnection(), config.getVertexTableEntry(), false);
-		db.updateVertexTable();
 
-		final ResponseIsochrone response = new ResponseIsochrone();
 		long startCoverageTiming = 0;
 		if (!request.isExpiringMode()) {
 			startCoverageTiming = System.currentTimeMillis();
-			final CoverageBuilder coverage = new CoverageBuilder(config, request.getMode(), request.getDirection());
-			final String coverageMode = request.getCoverageMode();
-			if (coverageMode.equalsIgnoreCase("Buffer")) {
+			final CoverageBuilder coverage = new CoverageBuilder(db, config, request.getMode(), direction);
+			final CoverageMode coverageMode = request.getCoverageMode();
+			if (coverageMode == CoverageMode.BUFFER) {
 				coverage.createIsoAreaLBA(BUFFER_DISTANCE);
-			} else if (coverageMode.equalsIgnoreCase("Surface")) {
+			} else if (coverageMode == CoverageMode.SURFACE) {
 				coverage.createIsoAreaSBA(request.getDmax(), BUFFER_DISTANCE, request.getSpeed());
 			}
-
 		}
 
-		response.setBoundingBox(output.getBoundingBox(config));
+		final ResponseIsochrone response = new ResponseIsochrone();
+		response.setBoundingBox(output.getBoundingBox());
 
 		final long currentTime = System.currentTimeMillis();
 		final long totalRequestTime = currentTime - startRequestTiming;
@@ -101,15 +102,20 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response
 
 	// Private methods
 
-	public Isochrone getAlgorithm(final ConfigDataset config, final String algorithm, final Query query) throws AlgorithmException {
-		if (algorithm.equals("MrneX")) {
-			return new MrneX(config, query);
-		}
-		if (algorithm.equals("MDijkstra")) {
-			return new MDijkstra(config, query);
+	public Isochrone getAlgorithm(final Algorithm algorithm, final ConfigDataset config, final Query query) throws AlgorithmException {
+		final Isochrone result;
+		switch (algorithm) {
+			case MINEX:
+				result = new MineX(config, query);
+				break;
+			case MRNEX:
+				result = new MrneX(config, query);
+				break;
+			default:
+				result = new MDijkstra(config, query);
 		}
 
-		return new MineX(config, query);
+		return result;
 	}
 
 	private Set<Location> locationsFromQueryNodes(final Collection<QueryNode> queryNodes, final DatabaseWeb db) {
@@ -126,7 +132,7 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response
 
 		DbUtility.truncateTable(conn, config.getEdgeTableEntry().getTableName());
 		DbUtility.truncateTable(conn, config.getVertexTableEntry().getTableName());
-		DbUtility.controlIndex(conn, config.getVertexTableEntry(), true);
+		DbUtility.dropIndex(conn, config.getVertexTableEntry().getIndexName());
 		DbUtility.truncateTable(conn, config.getVertexAnnotatedTableEntry().getTableName());
 		DbUtility.truncateTable(conn, config.getAreaBufferTableEntry().getTableName());
 	}
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 869522d0..1cb3e831 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,5 +1,8 @@
 package it.unibz.inf.isoga.service.dto;
 
+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;
@@ -9,47 +12,42 @@ import java.util.Calendar;
 import java.util.Collection;
 
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class RequestIsochrone implements IRequest {
-	private String algorithm;
-	private String coverageMode;
-	private String datasetString;
+	private Algorithm algorithm;
+	private CoverageMode coverageMode;
+	private Dataset dataset;
 	private Calendar date;
-	private String directionString;
+	private Direction direction;
 	private Long dmax;
 	private Boolean expirationMode;
-	private String modeString;
+	private Mode mode;
 	private Collection<QueryNode> queryNodes;
 	private Double speed;
 
 	// Constructor
 
-	public RequestIsochrone() { }
+	public RequestIsochrone() {
+		super();
+	}
 
 	// Getter
 
 	@NotNull
-	@Pattern(regexp = "MDijkstra|MineX|MrneX")
-	public String getAlgorithm() {
+	public Algorithm getAlgorithm() {
 		return algorithm;
 	}
 
 	@NotNull
-	@Pattern(regexp = "Buffer|Surface")
-	public String getCoverageMode() {
+	public CoverageMode getCoverageMode() {
 		return coverageMode;
 	}
 
 	@NotNull
 	public Dataset getDataset() {
-		if (datasetString == null) {
-			return null;
-		}
-
-		return Dataset.valueOf(datasetString.toUpperCase());
+		return dataset;
 	}
 
 	@NotNull
@@ -59,11 +57,7 @@ public class RequestIsochrone implements IRequest {
 
 	@NotNull
 	public Direction getDirection() {
-		if (directionString == null) {
-			return null;
-		}
-
-		return Direction.valueOf(directionString.toUpperCase());
+		return direction;
 	}
 
 	@NotNull
@@ -82,11 +76,7 @@ public class RequestIsochrone implements IRequest {
 
 	@NotNull
 	public Mode getMode() {
-		if (modeString == null) {
-			return null;
-		}
-
-		return Mode.valueOf(modeString.toUpperCase());
+		return mode;
 	}
 
 	@NotNull
@@ -111,17 +101,17 @@ public class RequestIsochrone implements IRequest {
 
 	@JsonProperty
 	public void setAlgorithm(final String algorithm) {
-		this.algorithm = algorithm;
+		this.algorithm = EnumContainer.getByName(Algorithm.class, algorithm);
 	}
 
 	@JsonProperty
 	public void setCoverageMode(final String coverageMode) {
-		this.coverageMode = coverageMode;
+		this.coverageMode = EnumContainer.getByName(CoverageMode.class, coverageMode);
 	}
 
-	@JsonProperty(value = "dataset")
-	public void setDatasetString(final String datasetString) {
-		this.datasetString = datasetString;
+	@JsonProperty
+	public void setDataset(final String dataset) {
+		this.dataset = EnumContainer.getByName(Dataset.class, dataset);
 	}
 
 	@JsonProperty
@@ -129,9 +119,9 @@ public class RequestIsochrone implements IRequest {
 		this.date = date;
 	}
 
-	@JsonProperty(value = "direction")
-	public void setDirectionString(final String directionString) {
-		this.directionString = directionString;
+	@JsonProperty
+	public void setDirection(final String direction) {
+		this.direction = EnumContainer.getByName(Direction.class, direction);
 	}
 
 	@JsonProperty
@@ -144,9 +134,9 @@ public class RequestIsochrone implements IRequest {
 		this.expirationMode = expirationMode;
 	}
 
-	@JsonProperty(value = "mode")
-	public void setModeString(final String modeString) {
-		this.modeString = modeString;
+	@JsonProperty
+	public void setMode(final String mode) {
+		this.mode = EnumContainer.getByName(Mode.class, mode);
 	}
 
 	@JsonProperty
@@ -158,4 +148,5 @@ public class RequestIsochrone implements IRequest {
 	public void setSpeed(final Double speed) {
 		this.speed = speed;
 	}
+
 }
diff --git a/src/main/webapp/js/service/serviceIsochrone.js b/src/main/webapp/js/service/serviceIsochrone.js
index a1fb127a..e707fff7 100644
--- a/src/main/webapp/js/service/serviceIsochrone.js
+++ b/src/main/webapp/js/service/serviceIsochrone.js
@@ -75,7 +75,7 @@ define(['jQuery', 'leaflet', 'console', 'spinner', 'isochrone/isochrone', 'util/
 			}
 
 			if ((bBoxSize.x + bBoxSize.y) <= 0) {
-				logger.warn('Calculated empty isochrone... now showing anything on the map');
+				logger.warn('Calculated empty isochrone... not showing anything on the map');
 				return;
 			}
 
-- 
GitLab