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 1bcb952c6a85e37ee3fc81c90b3d3dc6087f4212..fb940a772105f609c5c2b64f678d5900b192b42c 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java @@ -26,9 +26,11 @@ import java.util.Set; * algorithms which define the loading of the data from the database. */ public abstract class Isochrone { + private static final double COMPARE_PRECISION = 0.0000001d; private final Query query; private final PriorityQueue<Node> queue; private Set<Integer> codes; + protected Database db; /** @@ -126,7 +128,7 @@ public abstract class Isochrone { for (final Link link : adjacents) { if (link.isContinuous()) { updateQueue(expandContinuousLink(node, link)); - if (link.getStartOffset() != Double.MIN_VALUE) { + if (Math.abs(link.getStartOffset() - Double.MIN_VALUE) < COMPARE_PRECISION) { output.output(link); } } else { diff --git a/src/main/java/it/unibz/inf/isochrone/network/Link.java b/src/main/java/it/unibz/inf/isochrone/network/Link.java index cc6ba0329a018bff69899278bd539bc02768f38e..f3759061929583cde0deeec2096ab50eabf4e46c 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/Link.java +++ b/src/main/java/it/unibz/inf/isochrone/network/Link.java @@ -81,11 +81,6 @@ public class Link { throw new RuntimeException("There is no route for a continuous link"); } - @Override - public int hashCode() { - return getID(); - } - @Override public boolean equals(final Object object) { if (!(object instanceof Link)) { @@ -107,6 +102,29 @@ public class Link { return (getRoute() == l.getRoute()); } + @Override + public int hashCode() { + final int prime = 31; + long temp; + int result = 1; + + // CHECKSTYLE:OFF MagicNumber + result = prime * result + (continuous ? 1231 : 1237); + result = prime * result + endNode; + temp = Double.doubleToLongBits(endOffset); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + id; + temp = Double.doubleToLongBits(length); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + route; + result = prime * result + startNode; + temp = Double.doubleToLongBits(startOffset); + result = prime * result + (int) (temp ^ (temp >>> 32)); + // CHECKSTYLE:ON MagicNumber + + return result; + } + public boolean isContinuous() { return continuous; } diff --git a/src/main/java/it/unibz/inf/isochrone/network/Node.java b/src/main/java/it/unibz/inf/isochrone/network/Node.java index e737ccc27c73667cf22333914cf8171dcc4571a0..e260b9da42d9d9a02edc3c71618095de4b95fe92 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/Node.java +++ b/src/main/java/it/unibz/inf/isochrone/network/Node.java @@ -18,12 +18,12 @@ public class Node implements Comparable<Node> { private boolean closed; private Point coordinates = null; // For MrneX private double radius = Double.NEGATIVE_INFINITY; // MrneX - private List<Link> adjLinks = null; - private Hashtable<Integer, Schedule> routes; private int cheapestReachedRouteId = Integer.MIN_VALUE; + // Constructors + public Node(final int nodeId) { id = nodeId; distance = Double.POSITIVE_INFINITY; @@ -38,52 +38,24 @@ public class Node implements Comparable<Node> { closed = false; } - public int getID() { - return id; - } - - public double getDistance() { - return distance; - } - - public void setDistance(final double distance) { - this.distance = distance; - } - - public void setCoordinates(final Point coordinates) { - this.coordinates = coordinates; - } + // Public methods - public Point getCoordinates() { - return coordinates; - } - - public void setRadius(final double radius) { - this.radius = radius; - } - - public double getRadius() { - return radius; - } - - public void setNrAdjacentLinks(final short nr) { - nrAdjacentLinks = nr; - } - - public short getNrAdjacentLinks() { - return nrAdjacentLinks; - } + public void addAdjLink(final Link link) { + if (adjLinks == null) { + adjLinks = new ArrayList<Link>(); + } - public void visitNrAdjacentLinks(final int links) { - nrAdjacentLinks -= links; + adjLinks.add(link); } - public boolean isExpired() { - return (getNrAdjacentLinks() == 0); - } + public void addRoute(final int routeId) { + if (routes == null) { + routes = new Hashtable<Integer, Schedule>(); + } - public boolean isClosed() { - return closed; + if (!routes.containsKey(routeId)) { + routes.put(routeId, new Schedule()); + } } public void close() { @@ -102,55 +74,56 @@ public class Node implements Comparable<Node> { return 1; } - return 0; + return id - other.id; } - public void setAdjLinks(final List<Link> adjLinks) { - this.adjLinks = adjLinks; + public boolean containsRoutes() { + return routes != null && !routes.isEmpty(); } - public List<Link> getAdjLinks() { - return adjLinks; - } + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } - public void addAdjLink(final Link link) { - if (adjLinks == null) { - adjLinks = new ArrayList<Link>(); + Node other = (Node) obj; + if (Double.doubleToLongBits(distance) != Double.doubleToLongBits(other.distance) || id != other.id) { + return false; } - adjLinks.add(link); + return true; } - public void addRoute(final int routeId) { - if (routes == null) { - routes = new Hashtable<Integer, Schedule>(); - } + public List<Link> getAdjLinks() { + return adjLinks; + } - if (!routes.containsKey(routeId)) { - routes.put(routeId, new Schedule()); - } + public int getCheapestReachedRouteId() { + return cheapestReachedRouteId; } - public void setArrivalTime(final int routeId, final long arrivalTime) { - addRoute(routeId); - routes.get(routeId).setArrivalTime(arrivalTime); + public Point getCoordinates() { + return coordinates; } - public void setDepartureTime(final int routeId, final long departureTime) { - addRoute(routeId); - routes.get(routeId).setDepartureTime(departureTime); + public double getDistance() { + return distance; } - public void setCheapestReachedRouteId(final int cheapestReachedRouteId) { - this.cheapestReachedRouteId = cheapestReachedRouteId; + public int getID() { + return id; } - public int getCheapestReachedRouteId() { - return cheapestReachedRouteId; + public short getNrAdjacentLinks() { + return nrAdjacentLinks; } - public boolean containsRoutes() { - return routes != null && !routes.isEmpty(); + public double getRadius() { + return radius; } public Hashtable<Integer, Schedule> getRouteSchedules() { @@ -167,4 +140,64 @@ public class Node implements Comparable<Node> { return "OPEN"; } + + @Override + public int hashCode() { + int result = 1; + + final int prime = 31; + final long temp = Double.doubleToLongBits(distance); + // CHECKSTYLE:OFF MagicNumber + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + id; + // CHECKSTYLE:ON MagicNumber + + return result; + } + + public boolean isClosed() { + return closed; + } + + public boolean isExpired() { + return (getNrAdjacentLinks() == 0); + } + + public void setAdjLinks(final List<Link> adjLinks) { + this.adjLinks = adjLinks; + } + + public void setArrivalTime(final int routeId, final long arrivalTime) { + addRoute(routeId); + routes.get(routeId).setArrivalTime(arrivalTime); + } + + public void setCheapestReachedRouteId(final int cheapestReachedRouteId) { + this.cheapestReachedRouteId = cheapestReachedRouteId; + } + + public void setCoordinates(final Point coordinates) { + this.coordinates = coordinates; + } + + public void setDepartureTime(final int routeId, final long departureTime) { + addRoute(routeId); + routes.get(routeId).setDepartureTime(departureTime); + } + + public void setDistance(final double distance) { + this.distance = distance; + } + + public void setNrAdjacentLinks(final short nr) { + nrAdjacentLinks = nr; + } + + public void setRadius(final double radius) { + this.radius = radius; + } + + public void visitNrAdjacentLinks(final int links) { + nrAdjacentLinks -= links; + } } 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 77ff53c43b7c8b58df8bbbd615aff19c53311479..ccaad42edbfe2e483f93cf0163fbdb77aa821d45 100644 --- a/src/main/java/it/unibz/inf/isochrone/util/Config.java +++ b/src/main/java/it/unibz/inf/isochrone/util/Config.java @@ -134,8 +134,9 @@ public class Config { internalProperties.loadFromXML(inputStream); internalProperties.putAll(System.getProperties()); - if (densityLimit == Short.MIN_VALUE && getProperty("limit.density") != null) { - densityLimit = Short.parseShort(getProperty("limit.density")); + final String density = getProperty("limit.density"); + if (densityLimit == Short.MIN_VALUE && density != null) { + densityLimit = Short.parseShort(density); } } catch (final InvalidPropertiesFormatException e) { diff --git a/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java b/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java index 5cc075c5354dd5c661bb94dde0cb66b371fe1b6f..6cffa8d2253207db50101d86c67528011d68999c 100644 --- a/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java +++ b/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java @@ -32,19 +32,19 @@ public class MemoryBBoxOutput extends MemoryOutput { + "(SELECT st_transform(ST_SetSRID(st_extent(\"GEOMETRY\"),?),?) GEO FROM " + config.getDestinationEdgeTableEntry().getTableName() + ") mbr"; - PreparedStatement statement = null; - long minX, minY, maxX, maxY; - minX = Long.MAX_VALUE; - minY = minX; - maxX = Long.MIN_VALUE; - maxY = maxX; + long minX = Long.MAX_VALUE; + long minY = minX; + long maxX = Long.MIN_VALUE; + long maxY = maxX; + final Connection connection = config.getConnection(); + PreparedStatement statement = null; + ResultSet rSet = null; try { - final Connection connection = config.getConnection(); statement = connection.prepareStatement(q); statement.setInt(1, config.getServerSRID()); statement.setInt(2, config.getClientSRID()); - final ResultSet rSet = statement.executeQuery(); + rSet = statement.executeQuery(); if (rSet.next()) { minX = Math.round(rSet.getDouble("min_x")); minY = Math.round(rSet.getDouble("min_y")); @@ -55,8 +55,10 @@ public class MemoryBBoxOutput extends MemoryOutput { } catch (final SQLException e) { e.printStackTrace(); } finally { + DbUtils.closeQuietly(rSet); DbUtils.closeQuietly(statement); } + return null; } 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 cbdf940359c6e5d07e343d1cfb1767c2af6dc0c6..5c6def6285fed8cbd001abd81ce167f51e299352 100644 --- a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java +++ b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java @@ -15,10 +15,11 @@ import it.unibz.inf.isoga.datastructure.QueryPoint; import it.unibz.inf.isoga.db.DBUtility; import it.unibz.inf.isoga.db.IsogaDatabase; import it.unibz.inf.isoga.network.MemoryBBoxOutput; -import it.unibz.inf.isoga.util.IsogaConfig; import it.unibz.inf.isoga.util.DSetConfig; +import it.unibz.inf.isoga.util.IsogaConfig; import it.unibz.inf.isoga.util.JSONConstants; +import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.text.DateFormat; @@ -111,14 +112,9 @@ public class ServiceIsochrone extends AbstractService { cfgFile += "config_bz.xml"; } - final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - InputStream resourceAsStream = contextClassLoader.getResourceAsStream(cfgFile); - if (resourceAsStream == null) { - resourceAsStream = session.getClass().getResourceAsStream(cfgFile); - } - final IsogaConfig config = socketConfig.getClientConfig(clientId); - config.appendPropertyFile(resourceAsStream); + appendProperties(config, cfgFile, session); + final DSetConfig dSetConfig = socketConfig.getClientDataset(clientId).get(dataset); if (!dSetConfig.isRegistered()) { final Connection connection = config.getConnection(); @@ -213,6 +209,26 @@ public class ServiceIsochrone extends AbstractService { // t.start(); } + private void appendProperties(final IsogaConfig config, final String cfgFile, final Session session) { + final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + InputStream resourceAsStream = null; + try { + resourceAsStream = contextClassLoader.getResourceAsStream(cfgFile); + if (resourceAsStream == null) { + // TODO: Test me: Does this really work with websockets (did this really work with cometd?) + resourceAsStream = session.getClass().getResourceAsStream(cfgFile); + } + + config.appendPropertyFile(resourceAsStream); + } finally { + try { + resourceAsStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + // Private methods private Set<Location> locationsFromQueryPoints(final String qPoints, final IsogaConfig config) {