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 b726043e4a5bb38ad864f3c5e5b64b423738e493..c895dc9a4752e8a02ee48d4cec10bbc9cd026860 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java @@ -6,6 +6,7 @@ import it.unibz.inf.isochrone.network.Location; import it.unibz.inf.isochrone.network.MemoryOutput; import it.unibz.inf.isochrone.network.Node; import it.unibz.inf.isochrone.network.Output; +import it.unibz.inf.isochrone.util.Config; import it.unibz.inf.isochrone.util.EnumContainer.Direction; import it.unibz.inf.isochrone.util.EnumContainer.Mode; import it.unibz.inf.isochrone.util.Query; @@ -32,7 +33,7 @@ public abstract class Isochrone { private final PriorityQueue<Node> queue; private Set<Integer> codes; - protected Database db; + protected Database<Config> db; /** * Instantiates a new isochrone object. diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/MDijkstra.java b/src/main/java/it/unibz/inf/isochrone/algorithm/MDijkstra.java index e2987fe1ca227f85d698b87277562d8e1c3dddce..0182255e0ba36e2f1d4a319a6b9a3b5048130275 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/MDijkstra.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/MDijkstra.java @@ -3,6 +3,7 @@ package it.unibz.inf.isochrone.algorithm; import it.unibz.inf.isochrone.db.Database; import it.unibz.inf.isochrone.network.Link; import it.unibz.inf.isochrone.network.Node; +import it.unibz.inf.isochrone.util.Config; import it.unibz.inf.isochrone.util.EnumContainer.Mode; import it.unibz.inf.isochrone.util.Query; @@ -11,6 +12,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * The Dijkstra isochrone algorithm. Loads all data at the beginning, @@ -19,16 +21,16 @@ import java.util.List; * that is in the database. */ public class MDijkstra extends Isochrone { - - private HashMap<Integer, Node> nodes; - private LinkedHashMap<Integer, Link> links; + private Map<Integer, Node> nodes; + private Map<Integer, Link> links; public MDijkstra(final Query query) { super(query); nodes = new HashMap<Integer, Node>(); links = new LinkedHashMap<Integer, Link>(); - db = new Database(query.getDs(), query.getMode(), query.getDir()); + final Config config = new Config(query.getDs()); + db = new Database<Config>(config, query.getMode(), query.getDir()); db.readNetwork(nodes, links); initDateCodes(); } diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/MineX.java b/src/main/java/it/unibz/inf/isochrone/algorithm/MineX.java index cd17a135b6e45c0af59df9c9eeacc74fc8d6f625..036e016fcdcce892bf7acc39610d8d41d0fcd8e3 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/MineX.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/MineX.java @@ -3,26 +3,28 @@ package it.unibz.inf.isochrone.algorithm; import it.unibz.inf.isochrone.db.Database; import it.unibz.inf.isochrone.network.Link; import it.unibz.inf.isochrone.network.Node; -import it.unibz.inf.isochrone.util.Query; +import it.unibz.inf.isochrone.util.Config; import it.unibz.inf.isochrone.util.EnumContainer.Mode; +import it.unibz.inf.isochrone.util.Query; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * The MineX isochrone algorithm. Loads the nodes and links from the * database as soon as they are needed. */ public class MineX extends Isochrone { - - private final HashMap<Integer, Node> nodes; + private final Map<Integer, Node> nodes; public MineX(final Query query) { super(query); - nodes = new HashMap<Integer, Node>(); - db = new Database(query.getDs(), query.getMode(), query.getDir()); + + final Config config = new Config(query.getDs()); + db = new Database<Config>(config, query.getMode(), query.getDir()); initDateCodes(); } diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/MrneX.java b/src/main/java/it/unibz/inf/isochrone/algorithm/MrneX.java index ae06c1be7e367bbb14aa2d0d1026f7b656ff0715..40efd5ecaee4fb3268592abb8ef146129ea98436 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/MrneX.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/MrneX.java @@ -3,6 +3,7 @@ package it.unibz.inf.isochrone.algorithm; import it.unibz.inf.isochrone.db.Database; import it.unibz.inf.isochrone.network.Link; import it.unibz.inf.isochrone.network.Node; +import it.unibz.inf.isochrone.util.Config; import it.unibz.inf.isochrone.util.DistanceAlgorithm; import it.unibz.inf.isochrone.util.EnumContainer.Mode; import it.unibz.inf.isochrone.util.Query; @@ -12,16 +13,17 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * The MrneX isochrone algorithm. Loads the data in circles * surrounding the currently explored node. */ public class MrneX extends Isochrone { - private HashMap<Integer, Node> nodes; - private HashMap<Integer, Node> loadedIERNodes = new HashMap<Integer, Node>(); + private Map<Integer, Node> nodes; + private Map<Integer, Node> loadedIERNodes = new HashMap<Integer, Node>(); - private final HashMap<Integer, List<Link>> adjList = new HashMap<Integer, List<Link>>(); + private final Map<Integer, List<Link>> adjList = new HashMap<Integer, List<Link>>(); private final int maxDuration, maxMemorySize; private final double walkingSpeed; @@ -33,7 +35,9 @@ public class MrneX extends Isochrone { public MrneX(final Query query, final int maxMemorySize) { super(query); - db = new Database(query.getDs(), query.getMode(), query.getDir()); + + final Config config = new Config(query.getDs()); + db = new Database<Config>(config, query.getMode(), query.getDir()); initDateCodes(); nodes = new HashMap<Integer, Node>(); 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 363088bb9500999bb7b976c5717d3da451320015..b7fad147cfeaa0596e1faefc49f084fbaf7c163c 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/Database.java +++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java @@ -3,7 +3,6 @@ package it.unibz.inf.isochrone.db; import it.unibz.inf.isochrone.network.Link; import it.unibz.inf.isochrone.network.Node; import it.unibz.inf.isochrone.util.Config; -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.Point; @@ -42,7 +41,7 @@ import org.apache.commons.dbutils.DbUtils; * @author <a href="mailto:markus.innerebner@inf.unibz.it">Markus Innerebner</a>. * @version 2.2 */ -public class Database { +public class Database<T extends Config> { protected static final byte NW_MODE_CONTINUOUS = 0; protected static final byte NW_MODE_DISCRETE = 1; @@ -62,17 +61,17 @@ public class Database { private final String queryGetLinksInRange; private final String queryGetRange; private final String queryLoadLinksFromIER; - protected final Config config; + protected final T config; protected Mode mode; protected boolean isIncoming; protected Connection connection; - public Database(final Dataset dataset, final Mode mode, final Direction direction) { - this(new Config(dataset), direction); + public Database(final T config, final Mode mode, final Direction direction) { + this(config, direction); setMode(mode); } - protected Database(final Config config, final Direction direction) { + protected Database(final T config, final Direction direction) { this.config = config; this.isIncoming = (direction == Direction.INCOMING); @@ -96,7 +95,7 @@ public class Database { queryGetDateCodes = "SELECT DISTINCT SERVICE_ID " + " FROM " - + config.getDaymarkerTable() + + config.getTableDaymarker() + " WHERE (((MONDAY::int::bit || TUESDAY::int::bit || WEDNESDAY::int::bit || THURSDAY::int::bit" + " || FRIDAY::int::bit || SATURDAY::int::bit || SUNDAY::int::bit) & ?::bit(7))::int) > 0" + " AND START_DATE <= ? AND END_DATE >= ? " diff --git a/src/main/java/it/unibz/inf/isochrone/util/Config.java b/src/main/java/it/unibz/inf/isochrone/util/Config.java index bd6922a408be996a85b37a794744c450574f1270..cbf7938798e3cab727407cddc60f9d0c749a27d4 100644 --- a/src/main/java/it/unibz/inf/isochrone/util/Config.java +++ b/src/main/java/it/unibz/inf/isochrone/util/Config.java @@ -77,10 +77,6 @@ public class Config { // Public methods - public int getClientSRID() { - return Integer.parseInt(getProperty("cfg.clientSRID")); - } - public Connection getConnection() { try { return factory.getConnection(); @@ -106,10 +102,6 @@ public class Config { return resultList; } - public String getDaymarkerTable() { - return getProperty("tbl.dateCodes"); - } - public String getDBName() { return getProperty("org.postgresql.database"); } @@ -138,6 +130,10 @@ public class Config { return Integer.parseInt(getProperty("sql.spatial.srid")); } + public String getTableDaymarker() { + return getProperty("tbl.dateCodes"); + } + public String getTableEdges() { return getProperty("tbl.links"); } diff --git a/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java b/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java index e300c73e0d39a7f0771a50807004d35ca71c6548..968cbeea968e154bc363d235ddb7972378aad2af 100644 --- a/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java +++ b/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java @@ -42,7 +42,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; * interface. (Mostly inserting vertices and links into the tables * used for the GeoServer) */ -public class IsogaDatabase extends Database { +public class IsogaDatabase extends Database<ConfigWeb> { private final String queryGetIsoEdges; private final String queryStoreLinks; private final String queryStorePartialLinks; @@ -165,7 +165,7 @@ public class IsogaDatabase extends Database { } final IsoEdge edge = new IsoEdge(edgeId, sourceId, targetId, length, adjNodeDistance, geometry); - if (((ConfigWeb) config).isIncoming()) { + if (config.isIncoming()) { edge.setStartOffset(adjNodeOffset); edge.setEndOffset(length); edge.setRemainingDistance(adjNodeOffset > 0 ? 0 : dMax - edge.getAdjNodeDistance() * speed); @@ -210,7 +210,7 @@ public class IsogaDatabase extends Database { geometryString = polygon.getTypeString() + polygon.getValue(); final StringBuilder b = new StringBuilder(); - b.append("INSERT INTO ").append(((ConfigWeb) config).getDestinationAreaBufferTableEntry().getTableName()); + b.append("INSERT INTO ").append(config.getDestinationAreaBufferTableEntry().getTableName()); b.append("(\"ID\",\"GEOMETRY\") VALUES(?,ST_MULTI(ST_Buffer(ST_MakeValid(ST_GeomFromText(?," + config.getServerSRID() + ")),?,'endcap=round join=round')))"); PreparedStatement statement = null; try { @@ -233,8 +233,8 @@ public class IsogaDatabase extends Database { final List<Integer> edges = new ArrayList<Integer>(); final StringBuilder b1 = new StringBuilder(); b1.append("SELECT L.\"ID\" FROM "); - b1.append(((ConfigWeb) config).getDestinationEdgeTableEntry().getTableName()).append(" L, "); - b1.append(((ConfigWeb) config).getDestinationAreaBufferTableEntry().getTableName()).append(" A "); + b1.append(config.getDestinationEdgeTableEntry().getTableName()).append(" L, "); + b1.append(config.getDestinationAreaBufferTableEntry().getTableName()).append(" A "); b1.append("WHERE A.\"ID\"=? AND ST_Within(L.\"GEOMETRY\",A.\"GEOMETRY\")=TRUE"); PreparedStatement statement = null; @@ -260,8 +260,8 @@ public class IsogaDatabase extends Database { int reachedInhabitants = 0; final StringBuilder b = new StringBuilder(); b.append("SELECT SUM(I.INHABITANTS) FROM (SELECT DISTINCT B.ID, B.INHABITANTS FROM "); - b.append(((ConfigWeb) config).getTableBuilding()).append(" B, "); - b.append(((ConfigWeb) config).getDestinationAreaBufferTableEntry().getTableName()).append(" A "); + b.append(config.getTableBuilding()).append(" B, "); + b.append(config.getDestinationAreaBufferTableEntry().getTableName()).append(" A "); b.append("WHERE ST_Within(B.GEOMETRY, A.GEOMETRY)='TRUE') I"); PreparedStatement statement = null; @@ -283,7 +283,7 @@ public class IsogaDatabase extends Database { } public int totalInhabitants() { - final String query = "SELECT SUM(INHABITANTS) FROM " + ((ConfigWeb) config).getTableBuilding(); + final String query = "SELECT SUM(INHABITANTS) FROM " + config.getTableBuilding(); int totalInhabitants = 0; PreparedStatement statement = null; @@ -382,7 +382,7 @@ public class IsogaDatabase extends Database { statement.setInt(2, config.getClientSRID()); // CHECKSTYLE:OFF MagicNumber - final int tolerance = ((ConfigWeb) config).getDistanceTolerance(); + final int tolerance = config.getDistanceTolerance(); if (config.getClientSRID() != config.getServerSRID()) { statement.setInt(3, config.getServerSRID()); statement.setInt(4, tolerance); diff --git a/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java b/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java index a1080fe0aa6ecbb4008d93972cf6b81c7257ba83..760c75aa4fefdfb5cebd9bdcdd773a502e6453f7 100644 --- a/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java +++ b/src/main/java/it/unibz/inf/isoga/util/ConfigWeb.java @@ -73,6 +73,10 @@ public class ConfigWeb extends Config { return new Point(Double.valueOf(poiProperty[0]), Double.valueOf(poiProperty[1])); } + public int getClientSRID() { + return Integer.parseInt(getProperty("cfg.clientSRID")); + } + public TableEntry getDestinationAreaBufferTableEntry() { return destinationAreaBufferTableEntry; } 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 abd86205fde9aec9ef051ce14c8095b1b81c9840..604715530275a66034667cdd8b622578737142c7 100644 --- a/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java +++ b/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java @@ -2,6 +2,7 @@ package it.unibz.inf.isochrone.db; import it.unibz.inf.isochrone.network.Link; import it.unibz.inf.isochrone.network.Node; +import it.unibz.inf.isochrone.util.Config; import it.unibz.inf.isochrone.util.EnumContainer.Dataset; import it.unibz.inf.isochrone.util.EnumContainer.Direction; import it.unibz.inf.isochrone.util.EnumContainer.Mode; @@ -42,7 +43,8 @@ public class DatabaseTest { @Test public void testCreateDatabaseObject() { - final Database db = new Database(Dataset.BZ, Mode.MULTIMODAL, Direction.INCOMING); + final Config bzConfig = new Config(Dataset.BZ); + final Database<Config> db = new Database<Config>(bzConfig, Mode.MULTIMODAL, Direction.INCOMING); Assert.assertNotNull(db, "Database object could not be created!"); } @@ -71,8 +73,9 @@ public class DatabaseTest { // Private methods - private Database initDb() { - final Database db = new Database(Dataset.BZ, Mode.MULTIMODAL, Direction.INCOMING); + private Database<Config> initDb() { + final Config config = new Config(Dataset.BZ); + final Database<Config> db = new Database<Config>(config, Mode.MULTIMODAL, Direction.INCOMING); db.readNetwork(nodes, links); return db;