From 2dc9aead700349c0f52058464d65d9273c360926 Mon Sep 17 00:00:00 2001 From: Nikolaus Krismer <niko@krismer.de> Date: Mon, 24 Mar 2014 17:03:45 +0100 Subject: [PATCH] aspect oriented changes in output interface (added after/beforeCalculation methods) --- .../inf/isochrone/algorithm/Isochrone.java | 3 ++ .../inf/isochrone/network/MemoryOutput.java | 11 +++++++ .../unibz/inf/isochrone/network/Output.java | 12 +++++++ .../unibz/inf/isoga/network/BBoxOutput.java | 31 ++++++++++++------- .../inf/isoga/service/ServiceIsochrone.java | 6 ++-- 5 files changed, 47 insertions(+), 16 deletions(-) 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 eb311491..26a41172 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java @@ -128,6 +128,8 @@ public abstract class Isochrone { * @return the computed output (stored in the output given by the parameter) */ public <T extends Output> T compute(final T output) { + output.beforeCalculation(); + if (!query.getNodes().isEmpty()) { exploreInitialNodes(query.getNodes()); } else { @@ -159,6 +161,7 @@ public abstract class Isochrone { output.addNode(n); } + output.afterCalculation(); 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 523e8210..40000e9d 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java +++ b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java @@ -41,4 +41,15 @@ public class MemoryOutput implements Output { public void addNode(final Node node) { nodes.add(node); } + + @Override + public void afterCalculation() { + // No post-processing of calculated isochrone + } + + @Override + public void beforeCalculation() { + // No pre-processing of calculated isochrone + } + } 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 84104741..a69f87b1 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/Output.java +++ b/src/main/java/it/unibz/inf/isochrone/network/Output.java @@ -19,4 +19,16 @@ public interface Output { */ void addNode(Node node); + /** + * This is called after all links and nodes are stored in this output. + * Can be useful to save results in the database (or similar) + */ + void afterCalculation(); + + /** + * This is called before links and/or nodes are stored in this output. + * Can be useful to set up some datatypes (clear maps, ...). + */ + void beforeCalculation(); + } diff --git a/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java b/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java index adb025f2..f7375287 100644 --- a/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java +++ b/src/main/java/it/unibz/inf/isoga/network/BBoxOutput.java @@ -20,20 +20,24 @@ 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 isSavedInDatabase; + private final DatabaseWeb db; + private final Direction direction; private final String query; private final int serverSRID; + private BBox boundingBox; + private boolean isSavedInDatabase; // Constructors - public BBoxOutput(final ConfigDataset config) { + public BBoxOutput(final ConfigDataset config, final DatabaseWeb db, final Direction direction) { super(); - final String cfgEdgeTable = config.getEdgeTableEntry().getTableName(); + this.db = db; + this.direction = direction; serverSRID = config.getServerSRID(); isSavedInDatabase = false; + final String cfgEdgeTable = config.getEdgeTableEntry().getTableName(); 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 " + cfgEdgeTable + ") MBR"; } @@ -56,6 +60,15 @@ public class BBoxOutput extends MemoryOutput { super.addNode(node); } + @Override + public void afterCalculation() { + db.storeLinks(getLinks().values(), direction); + db.storeVertices(getNodes()); + db.updateVertexTable(); + + isSavedInDatabase = true; + } + public BBox getBoundingBox() { if (!isSavedInDatabase) { throw new IllegalStateException("Can not calculate bounding box, since results have not been saved to database"); @@ -67,6 +80,8 @@ public class BBoxOutput extends MemoryOutput { return boundingBox; } + // Private methods + private void calculateBoundingBox() { final ConfigIsochrone configIso = ConfigIsochrone.getInstance(); final Connection connection = configIso.getConnection(); @@ -93,12 +108,4 @@ public class BBoxOutput extends MemoryOutput { DbUtils.closeQuietly(statement); } } - - public void saveInDatabase(final DatabaseWeb db, final Direction direction) { - db.storeLinks(getLinks().values(), direction); - db.storeVertices(getNodes()); - db.updateVertexTable(); - - isSavedInDatabase = true; - } } 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 fabbefdc..aac24fe8 100644 --- a/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java +++ b/src/main/java/it/unibz/inf/isoga/service/ServiceIsochrone.java @@ -56,7 +56,7 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response final ConfigClient config = ConfigClient.getInstance(clientId, dataset); - // register layers which have not been preregistered in ServiceConfiguration class + // register layers which have not been pre-registered in ServiceConfiguration class if (!config.isRegistered()) { registerTableAndLayers(ConfigIsochrone.getInstance().getConnection(), config); } @@ -68,10 +68,8 @@ public class ServiceIsochrone extends AbstractService<RequestIsochrone, Response truncateTables(config); 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(request.getAlgorithm(), config, query); - final BBoxOutput output = isochrone.compute(new BBoxOutput(config)); - output.saveInDatabase(db, direction); + final BBoxOutput output = isochrone.compute(new BBoxOutput(config, db, direction)); final long timeIsochrone = System.currentTimeMillis() - startComputationTiming; long startCoverageTiming = 0; -- GitLab