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 d98b28b60b42accaaced24825eec84cf8c1f44a6..02e6102dd76c72226dccff1bf98b543b693d18c1 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/MrneX.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/MrneX.java @@ -131,7 +131,7 @@ public class MrneX extends Isochrone { final Point p = node.getCoordinates(); final double r = node.getRadius(); - final Collection<Node> intersectionNodes = new ArrayList<>(); + final Collection<Node> intersectionNodes = new ArrayList<>(loadedNodes.size()); for (final Node loadedNode : loadedNodes) { final double distance = DistanceAlgorithm.euclideanDistance(p, loadedNode.getCoordinates()); if (distance < r + loadedNode.getRadius()) { @@ -183,7 +183,7 @@ public class MrneX extends Isochrone { // CHECKSTYLE:OFF MagicNumber if (maxMemory * 0.95d < getNodeSize()) { - final double perc = 100.0d - ((double) getNodeSize() / maxMemory) * 100.0d; + final double perc = 100.0d - (double) getNodeSize() / maxMemory * 100.0d; throw new RuntimeException("Free memory size is " + NumberFormat.getInstance().format(perc) + "%"); } // CHECKSTYLE:ON MagicNumber 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 1599c41575f9d7ec65c7035b80115261f30b7e3c..ce22faebe73c443eef2f78eaa4cf6b01d270cc0e 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java @@ -352,11 +352,9 @@ public class ConfigDataset { // find resources on webapp resources (in tomcat lib folder, in WEB-INF...) and add to available ones final Enumeration<URL> e = cLoader.getResources("../lib"); - if (e != null) { - final Collection<URL> webappResources = Collections.list(e); - final Collection<String> files = ResourceHelper.findFilesInResources(webappResources, dsConfigPattern); - resources.addAll(files); - } + final Collection<URL> webappResources = Collections.list(e); + final Collection<String> files = ResourceHelper.findFilesInResources(webappResources, dsConfigPattern); + resources.addAll(files); } catch (final IOException e) { LOGGER.warn("Datasets could not be read. There might be no configured datasets available!"); } 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 69816331ca4bc9149d72f881b1f7d439c86288d7..5b0721f86f6917b6647d3ffc0fe16b11ee6a1aa5 100644 --- a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java @@ -71,10 +71,12 @@ public final class ConfigIsochrone { public static ConfigIsochrone getInstance() { if (instance == null) { - final ConfigIsochrone config = new ConfigBuilder<>(ConfigIsochrone.class).build(); - config.initConnectionFactory(); + synchronized (ConfigIsochrone.class) { + final ConfigIsochrone config = new ConfigBuilder<>(ConfigIsochrone.class).build(); + config.initConnectionFactory(); - instance = config; + instance = config; + } } return instance; @@ -145,7 +147,7 @@ public final class ConfigIsochrone { LOGGER.debug(" - dbName: " + database); LOGGER.debug(" - dbPort: " + port); LOGGER.debug(" - dbUser: " + user); - LOGGER.debug(" - dbPassword: " + ((password == null) ? "without password" : "with password")); + LOGGER.debug(" - dbPassword: " + (password == null ? "without password" : "with password")); LOGGER.debug(" - isPooling: " + pooling); try { 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 4a33c06545ad376314a59be3e7c92f8a5b93388b..1973e88af644c947d6718abf479086ffe48e283e 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/Database.java +++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java @@ -1,5 +1,6 @@ package it.unibz.inf.isochrone.db; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import it.unibz.inf.isochrone.config.ConfigDataset; import it.unibz.inf.isochrone.config.ConfigIsochrone; import it.unibz.inf.isochrone.network.Link; @@ -64,7 +65,7 @@ public class Database { public Database(final ConfigDataset config, final Mode mode, final Direction direction) { this.config = config; - this.isIncoming = (direction == Direction.INCOMING); + this.isIncoming = direction == Direction.INCOMING; this.mode = mode; final String configDatecodes = config.getTableDatecodes(); @@ -194,7 +195,7 @@ public class Database { * @return a list of links adjacent to the given nodeId */ public Collection<Link> getAdjLinks(final int nodeId, final Map<Integer, Node> nodes) { - final PreparedStatement stmt = getPstmt((mode == Mode.UNIMODAL) ? queryGetAdjContinuousLinks : queryGetAdjLinks); + final PreparedStatement stmt = getPstmt(mode == Mode.UNIMODAL ? queryGetAdjContinuousLinks : queryGetAdjLinks); final Collection<Link> adjLinks = new ArrayList<>(); ResultSet rs = null; @@ -395,7 +396,7 @@ public class Database { * @return the link with id linkId */ public Link getLink(final int linkId, final Map<Integer, Node> nodes) { - final PreparedStatement stmt = getPstmt((mode == Mode.UNIMODAL) ? queryGetContinuousLink : queryGetLink); + final PreparedStatement stmt = getPstmt(mode == Mode.UNIMODAL ? queryGetContinuousLink : queryGetLink); Link link = null; ResultSet rs = null; @@ -431,7 +432,7 @@ public class Database { * @return the node from the database */ public Node getNode(final int nodeId) { - final PreparedStatement stmt = getPstmt((mode == Mode.UNIMODAL) ? queryGetContinuousNode : queryGetMrneXNode); + final PreparedStatement stmt = getPstmt(mode == Mode.UNIMODAL ? queryGetContinuousNode : queryGetMrneXNode); Node node = null; ResultSet rs = null; @@ -509,7 +510,7 @@ public class Database { stmt.setDouble(3, node.getRadius()); // CHECKSTYLE:ON MagicNumber } else { - final Node[] loadedAreas = intersections.toArray(new Node[0]); + final Node[] loadedAreas = intersections.toArray(new Node[intersections.size()]); final String disjunctAreaString = "st_difference(st_buffer(st_pointfromtext('" + pointString + "'," + config.getServerSRID() + ")," + node.getRadius() + ")," + subQuery(loadedAreas, loadedAreas.length - 1, config.getServerSRID()) + ")"; stmt = getPstmt(String.format(queryGetLinksInRange, disjunctAreaString)); @@ -549,7 +550,7 @@ public class Database { * @param links A map in which all the links should be stored. */ public void readNetwork(final Map<Integer, Node> nodes, final Map<Integer, Link> links) { - final PreparedStatement stmt = getPstmt((mode == Mode.UNIMODAL) ? queryGetContinuousEdges : queryGetAllEdges); + final PreparedStatement stmt = getPstmt(mode == Mode.UNIMODAL ? queryGetContinuousEdges : queryGetAllEdges); ResultSet rs = null; try { @@ -629,6 +630,10 @@ public class Database { */ // FIXME: Find a fix for prepared statements with parameters // (we should NOT set strings in preparedStatemens just because we want to cache something) + @SuppressFBWarnings( + value = "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING", + justification = "Since table names can not be filled with parameters, but we have variable table names we somewhere need to do this" + ) protected PreparedStatement getPstmt(final String query) { if (pstmtsCacheMap == null) { pstmtsCacheMap = new HashMap<>(); @@ -661,7 +666,7 @@ public class Database { if (connection.isClosed()) { connection = ConfigIsochrone.getInstance().getConnection(); } - } catch (SQLException e) { + } catch (final SQLException e) { e.printStackTrace(); connection = null; } @@ -725,7 +730,7 @@ public class Database { final StringBuilder builder = new StringBuilder(); for (int i = 0; i < length; ++i) { builder.append("?"); - if ((i + 1) < length) { + if (i + 1 < length) { builder.append(","); } } diff --git a/src/main/java/it/unibz/inf/isochrone/db/TableEntry.java b/src/main/java/it/unibz/inf/isochrone/db/TableEntry.java index ad197e66a332617d114c2b5dda7984102152b8cd..4db89ae486cf6d34fc091a45e1af69782cafc2db 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/TableEntry.java +++ b/src/main/java/it/unibz/inf/isochrone/db/TableEntry.java @@ -1,10 +1,12 @@ package it.unibz.inf.isochrone.db; -import it.unibz.inf.isochrone.util.EnumContainer.TableType; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import it.unibz.inf.isochrone.util.EnumContainer.TableType; + +import java.util.Locale; + /** * Describes a database table for the web interface. */ @@ -16,7 +18,7 @@ public class TableEntry { // Constructors public TableEntry(final String tableName) { - this.tableName = tableName.toLowerCase(); + this.tableName = tableName.toLowerCase(Locale.ENGLISH); } public TableEntry(final String tableName, final String indexName, final TableType type) { 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 07cde781cd9d1436c55df4e1bc1cc00a66888805..440001bd888d895732e88958dc2befcc1e9059e9 100644 --- a/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java +++ b/src/main/java/it/unibz/inf/isochrone/util/EnumContainer.java @@ -1,5 +1,7 @@ package it.unibz.inf.isochrone.util; +import java.util.Locale; + /** * Stores all the enums used in the project in one place. */ @@ -73,8 +75,8 @@ public final class EnumContainer { 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 = Enum.valueOf(enumType, str.toUpperCase(Locale.ENGLISH)); + } catch (final IllegalArgumentException e) { result = null; } diff --git a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java index 27ba9016d799bfef596b73db04468835a9ecd6a7..e15b3bd5058302556857a0136f12f1c4d6decf42 100644 --- a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java +++ b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java @@ -3,7 +3,6 @@ package it.unibz.inf.isochrone.config; import java.util.Collection; import org.testng.Assert; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class ConfigDatasetTest { @@ -11,35 +10,31 @@ public class ConfigDatasetTest { private static final int EXPECTED_NUM_DATASETS_FILTERED = 3; private static final String[] EXPECTED_DATASETS = new String[] {"bz", "it", "sf", "st"}; private static final String[] EXPECTED_DATASETS_FILTERED = new String[] {"bz"}; - private Collection<String> datasetCollection; - private Collection<String> datasetCollectionFiltered; - - @BeforeClass - public void initDatasets() { - datasetCollection = ConfigDataset.getAvailableDatasets(false); - datasetCollectionFiltered = ConfigDataset.getAvailableDatasets(true); - } @Test public void testDatasetCount() { + final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false); Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS, "Unexpected number of configured datasets"); } @Test public void testDatasetNames() { - for (String dsName : EXPECTED_DATASETS) { + final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false); + for (final String dsName : EXPECTED_DATASETS) { Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured"); } } @Test public void testDatasetCountFiltered() { + final Collection<String> datasetCollectionFiltered = ConfigDataset.getAvailableDatasets(true); Assert.assertEquals(datasetCollectionFiltered.size(), EXPECTED_NUM_DATASETS_FILTERED, "Unexpected number of configured datasets"); } @Test public void testDatasetNamesFiltered() { - for (String dsName : EXPECTED_DATASETS_FILTERED) { + final Collection<String> datasetCollectionFiltered = ConfigDataset.getAvailableDatasets(true); + for (final String dsName : EXPECTED_DATASETS_FILTERED) { Assert.assertTrue(datasetCollectionFiltered.contains(dsName), "Dataset of " + dsName + " unconfigured"); } } 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 873f84d9fb8507ce0ae456f37823de12a8d28478..74df28e692664fae9d99ccf4a8100bcd4ed8b859 100644 --- a/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java +++ b/src/test/java/it/unibz/inf/isochrone/db/DatabaseTest.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Map; import org.testng.Assert; -import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class DatabaseTest { @@ -22,13 +21,27 @@ public class DatabaseTest { 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; - @BeforeTest - public void setUp() { - nodes = new HashMap<>(); - links = new LinkedHashMap<>(); + /** + * Private inner class that reads the network on initialization and encapsulated the database object for easier use. + */ + private static class InitializedDatabase { + private final Map<Integer, Node> nodes; + private final Map<Integer, Link> links; + private final Database db; + + public InitializedDatabase(final Database db) { + this.db = db; + + nodes = new HashMap<>(); + links = new LinkedHashMap<>(); + + db.readNetwork(nodes, links); + } + + public void close() { + db.close(); + } } @Test @@ -45,8 +58,8 @@ public class DatabaseTest { final Map<Integer, Link> compareLinks = new LinkedHashMap<>(); fillHashMaps(compareNodes, compareLinks); - final Database db = initDb(); - Assert.assertEquals(links.get(LINK_ID), compareLinks.get(LINK_ID), "Links comparison"); + final InitializedDatabase db = initDb(); + Assert.assertEquals(db.links.get(LINK_ID), compareLinks.get(LINK_ID), "Links comparison"); db.close(); } @@ -56,37 +69,34 @@ public class DatabaseTest { final Map<Integer, Link> compareLinks = new LinkedHashMap<>(); fillHashMaps(compareNodes, compareLinks); - final Database db = initDb(); - Assert.assertEquals(nodes.get(NODE_ID), compareNodes.get(NODE_ID), "Nodes comparison"); + final InitializedDatabase db = initDb(); + Assert.assertEquals(db.nodes.get(NODE_ID), compareNodes.get(NODE_ID), "Nodes comparison"); db.close(); } @Test public void testCountLinkEdges() { - final Database db = initDb(); - Assert.assertEquals(links.size(), EXPECTED_LINK_COUNT, "Link count was unexpected"); + final InitializedDatabase db = initDb(); + Assert.assertEquals(db.links.size(), EXPECTED_LINK_COUNT, "Link count was unexpected"); db.close(); } @Test public void testCountNodeEdges() { - final Database db = initDb(); + final InitializedDatabase db = initDb(); // 2687 Doesn't correspond to the number of nodes in // the nodes table, but the number of distinct // target/source node in the edges table - Assert.assertEquals(nodes.size(), EXPECTED_NODE_COUNT, "Node count was unexpected"); + Assert.assertEquals(db.nodes.size(), EXPECTED_NODE_COUNT, "Node count was unexpected"); db.close(); } // Private methods - private Database initDb() { + private InitializedDatabase initDb() { final ConfigDataset config = ConfigDataset.getInstance(TEST_DATASET); - final Database db = new Database(config, Mode.MULTIMODAL, Direction.INCOMING); - db.readNetwork(nodes, links); - - return db; + return new InitializedDatabase(new Database(config, Mode.MULTIMODAL, Direction.INCOMING)); } private void fillHashMaps(final Map<Integer, Node> nodeHashMap, final Map<Integer, Link> linkHashMap) {