diff --git a/build.gradle b/build.gradle index 53804aed205625bfb8f27c5f528b6a290120336e..e22651cef93ba91dd15e93412e642018365982ba 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,7 @@ dependencies { compile(group: 'it.geosolutions', name: 'geoserver-manager', version:'1.5.2') { exclude(module: 'jcl-over-slf4j') } + compile group: 'com.google.code.findbugs', name: 'annotations', version: '2.0.3' compile group: 'org.json', name: 'json', version:'20131018' compile(group: 'org.postgis', name: 'postgis-jdbc', version:'1.3+') { exclude(module: 'postgis-stubs') @@ -127,7 +128,9 @@ eclipse { } findbugs { + effort = "max" ignoreFailures = true + toolVersion = '2.0.3' } publishing { 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 7ead46b30c9ae1818b999d18a8ef5c0f74545df6..40031b8c375ba165afbc4a586fc7ee0d9445307a 100644 --- a/src/main/java/it/unibz/inf/isoga/coverage/CoverageBuilder.java +++ b/src/main/java/it/unibz/inf/isoga/coverage/CoverageBuilder.java @@ -1,7 +1,7 @@ package it.unibz.inf.isoga.coverage; import it.unibz.inf.isochrone.util.Enums.Mode; -import it.unibz.inf.isoga.db.Database; +import it.unibz.inf.isoga.db.IsogaDatabase; import it.unibz.inf.isoga.util.IsogaConfig; import it.unibz.inf.isoga.util.SBAUtil; @@ -21,14 +21,14 @@ public class CoverageBuilder { private static final int FULL_CIRCLE_DEGREE = 360; private final IsogaConfig config; private final Mode mode; - private final Database db; + private final IsogaDatabase db; private final Set<Integer> exploredEdges = new HashSet<Integer>(); private long timeBufferQuery; public CoverageBuilder(final IsogaConfig config, final Mode mode) { this.config = config; this.mode = mode; - db = new Database(config); + db = new IsogaDatabase(config); } /** diff --git a/src/main/java/it/unibz/inf/isoga/db/Database.java b/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java similarity index 95% rename from src/main/java/it/unibz/inf/isoga/db/Database.java rename to src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java index 3245aad14bbf6f46971dbf6c446faf7b8e6c26e5..79cba03e3c5b30207c41f4e75d615a8d7da26bbe 100644 --- a/src/main/java/it/unibz/inf/isoga/db/Database.java +++ b/src/main/java/it/unibz/inf/isoga/db/IsogaDatabase.java @@ -1,5 +1,6 @@ package it.unibz.inf.isoga.db; +import it.unibz.inf.isochrone.db.Database; import it.unibz.inf.isochrone.network.Link; import it.unibz.inf.isochrone.network.Location; import it.unibz.inf.isochrone.network.Node; @@ -33,12 +34,14 @@ import org.postgis.LinearRing; import org.postgis.PGgeometry; import org.postgis.Polygon; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * This class contains Database queries specific to the Isoga web * interface. (Mostly inserting vertices and links into the tables * used for the GeoServer) */ -public class Database extends it.unibz.inf.isochrone.db.Database { +public class IsogaDatabase extends Database { private final String queryGetIsoEdges; private final String queryStoreLinks; private final String queryStorePartialLinks; @@ -46,7 +49,7 @@ public class Database extends it.unibz.inf.isochrone.db.Database { private final String queryInsertVertexAnnotation; private final String queryUpdateVertices; - public Database(final IsogaConfig cfg) { + public IsogaDatabase(final IsogaConfig cfg) { super(cfg); queryGetIsoEdges = "SELECT E.\"ID\", E.\"SOURCE\", V.\"DISTANCE\" DISTANCE, E.\"TARGET\", E.\"OFFSET\", E.\"LENGTH\",E.\"GEOMETRY\" FROM " @@ -74,7 +77,7 @@ public class Database extends it.unibz.inf.isochrone.db.Database { + cfg.getDestinationVertexTableEntry().getTableName() + ".\"ROUTE_ID\">=0"; } - public Database(final IsogaConfig config, final Mode mode) { + public IsogaDatabase(final IsogaConfig config, final Mode mode) { this(config); this.mode = mode; } @@ -128,15 +131,19 @@ public class Database extends it.unibz.inf.isochrone.db.Database { } } + @SuppressFBWarnings( + value = "DLS_DEAD_LOCAL_STORE", + justification = "False positiv in DLS_DEAD_LOCAL_STORE check" + ) public Collection<IsoEdge> getIsochroneEdges(final int dMax, final double speed) { final boolean avoidNonPartialDuplicates = false; final Collection<IsoEdge> isoEdges = new ArrayList<IsoEdge>(); final Map<String, IsoEdge> addedLinks = new HashMap<String, IsoEdge>(); + PreparedStatement statement = null; ResultSet resultSet = null; try { statement = getPstmt(queryGetIsoEdges); - resultSet = statement.executeQuery(); while (resultSet.next()) { final int edgeId = resultSet.getInt("ID"); @@ -161,15 +168,18 @@ public class Database extends it.unibz.inf.isochrone.db.Database { edge.setEndOffset(adjNodeOffset); edge.setRemainingDistance(adjNodeOffset < length ? 0 : dMax - edge.getAdjNodeDistance() * speed); } + if (avoidNonPartialDuplicates) { - if (addedLinks.containsKey(edge.getInvertedIdentifier())) { - final IsoEdge invertedEdge = addedLinks.get(edge.getInvertedIdentifier()); - if (invertedEdge.isPartial()) { // inverted is partial - addedLinks.put(edge.getIdentifier(), edge); + final String invertedId = edge.getInvertedIdentifier(); + final String id = edge.getIdentifier(); + if (addedLinks.containsKey(invertedId)) { + final IsoEdge invertedEdge = addedLinks.get(invertedId); + if (invertedEdge.isPartial()) { + addedLinks.put(id, edge); isoEdges.add(edge); } } else { - addedLinks.put(edge.getIdentifier(), edge); + addedLinks.put(id, edge); isoEdges.add(edge); } } else { @@ -181,6 +191,7 @@ public class Database extends it.unibz.inf.isochrone.db.Database { } finally { DbUtils.closeQuietly(resultSet); } + return isoEdges; } 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 6da0c444f09e627efd42ab36f10d25ce75f3df64..5cc075c5354dd5c661bb94dde0cb66b371fe1b6f 100644 --- a/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java +++ b/src/main/java/it/unibz/inf/isoga/network/MemoryBBoxOutput.java @@ -2,7 +2,7 @@ package it.unibz.inf.isoga.network; import it.unibz.inf.isochrone.network.MemoryOutput; import it.unibz.inf.isochrone.network.Node; -import it.unibz.inf.isoga.db.Database; +import it.unibz.inf.isoga.db.IsogaDatabase; import it.unibz.inf.isoga.geometry.BBox; import it.unibz.inf.isoga.util.IsogaConfig; @@ -22,7 +22,7 @@ import org.apache.commons.dbutils.DbUtils; public class MemoryBBoxOutput extends MemoryOutput { private final Set<Node> nodes = new HashSet<Node>(); - public void storeAll(final IsogaConfig config, final Database db) { + public void storeAll(final IsogaConfig config, final IsogaDatabase db) { db.storeLinks(links.values(), config); db.storeVertices(nodes, config); } 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 3f6ed5cc3fdad504307e9eeca02677de2591fb1d..cbdf940359c6e5d07e343d1cfb1767c2af6dc0c6 100644 --- a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java +++ b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java @@ -13,7 +13,7 @@ import it.unibz.inf.isochrone.util.Query; import it.unibz.inf.isoga.coverage.CoverageBuilder; import it.unibz.inf.isoga.datastructure.QueryPoint; import it.unibz.inf.isoga.db.DBUtility; -import it.unibz.inf.isoga.db.Database; +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; @@ -147,7 +147,7 @@ public class ServiceIsochrone extends AbstractService { // public void run() { final long start = System.currentTimeMillis(); config.setDirection(direction); - final Database db = new Database(config, mode); + final IsogaDatabase db = new IsogaDatabase(config, mode); truncateTables(config); final Query query = new Query(direction, speed, dMaxInMinutes * 60, date, true, dataset, mode); query.setLocations(locationsFromQueryPoints(qPoints, new IsogaConfig(dataset))); @@ -232,7 +232,7 @@ public class ServiceIsochrone extends AbstractService { } final Set<Location> locations = new HashSet<Location>(queryPoints.size()); - final Database db = new Database(config); + final IsogaDatabase db = new IsogaDatabase(config); for (final QueryPoint qPoint : queryPoints) { locations.addAll(db.projectOnLinks(qPoint)); } diff --git a/src/main/java/it/unibz/inf/isoga/util/SBAUtil.java b/src/main/java/it/unibz/inf/isoga/util/SBAUtil.java index 8df4c08b10abd7bead81fbb0e2ef439c3e07c61c..1d3ca25bd1d03aadd0fc0146e926f919d1d3a1e8 100644 --- a/src/main/java/it/unibz/inf/isoga/util/SBAUtil.java +++ b/src/main/java/it/unibz/inf/isoga/util/SBAUtil.java @@ -83,10 +83,12 @@ public final class SBAUtil { if (relativeAngle < 0) { relativeAngle = Math.toDegrees(2 * Math.PI) + relativeAngle; } - if (relativeAngle == Double.NaN) { + + if (Double.isNaN(relativeAngle) || Double.isInfinite(relativeAngle)) { System.err.println("Problems with angle computation."); return Double.MAX_VALUE; } + return relativeAngle; } diff --git a/src/main/java/it/unibz/inf/isoga/websocket/SocketConfiguration.java b/src/main/java/it/unibz/inf/isoga/websocket/SocketConfiguration.java index eff04ac054cf22b2d141c401b625a94feab02d0a..a5fb60cac18e7003af880e4b35f82b71ccb0c4d3 100644 --- a/src/main/java/it/unibz/inf/isoga/websocket/SocketConfiguration.java +++ b/src/main/java/it/unibz/inf/isoga/websocket/SocketConfiguration.java @@ -9,7 +9,7 @@ import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; import it.unibz.inf.isochrone.util.Enums.Dataset; import it.unibz.inf.isochrone.util.Point; import it.unibz.inf.isoga.db.DBUtility; -import it.unibz.inf.isoga.db.Database; +import it.unibz.inf.isoga.db.IsogaDatabase; import it.unibz.inf.isoga.db.TableEntry; import it.unibz.inf.isoga.geometry.BBox; import it.unibz.inf.isoga.util.IsogaConfig; @@ -266,7 +266,7 @@ public final class SocketConfiguration { e.printStackTrace(); } - final Database db = new Database(config); + final IsogaDatabase db = new IsogaDatabase(config); final BBox clientBBox = new BBox(db.transform(lowerCorner), db.transform(upperCorner)); final Point queryPoint = db.transform(new Point(Double.valueOf(poiProperty[0]), Double.valueOf(poiProperty[1])));