diff --git a/src/main/java/it/unibz/inf/isochrones/utils/Config.java b/src/main/java/it/unibz/inf/isochrones/utils/Config.java index 4576bf3a00227ddadc74383b57fe11fecfb6aee6..06c9ca4758715bb859ca0d5b8b51cc029db2aff7 100644 --- a/src/main/java/it/unibz/inf/isochrones/utils/Config.java +++ b/src/main/java/it/unibz/inf/isochrones/utils/Config.java @@ -86,7 +86,7 @@ public class Config { /** * Returns the value of the entry specified by the passed <code>key</code>. - * + * * @param key the key that identifies the entry * @return the value of the entry */ @@ -131,7 +131,7 @@ public class Config { * Method appendPropertyFile * </p> * appends the properties of that stream. An existing property is overwritten - * + * * @param inputStream */ public void appendPropertyFile(final InputStream inputStream) { diff --git a/src/main/java/it/unibz/inf/isoga/db/DBUtility.java b/src/main/java/it/unibz/inf/isoga/db/DBUtility.java index 83fb3aa916d3786c1893e6b371b8944d9bf09d38..9a50b41c25c30f394ed9f7df408b1abe0421862a 100644 --- a/src/main/java/it/unibz/inf/isoga/db/DBUtility.java +++ b/src/main/java/it/unibz/inf/isoga/db/DBUtility.java @@ -60,13 +60,13 @@ public final class DBUtility { + " (\"ID\" integer NOT NULL, \"SOURCE\" integer, \"TARGET\" integer, \"OFFSET\" double precision, \"LENGTH\" double precision)"); } - public static void insertGeometryMetadata(final Connection connection, final TableEntry tableEntry, final int srid) { + public static void insertGeometryMetadata(final Connection connection, final TableEntry tableEntry, final int serverSrid) { CallableStatement prepareCall = null; try { prepareCall = connection.prepareCall("{call addgeometrycolumn(?,?,?,?,?,true)}"); prepareCall.setString(1, tableEntry.getTableName()); prepareCall.setString(2, "GEOMETRY"); - prepareCall.setInt(3, srid); + prepareCall.setInt(3, serverSrid); prepareCall.setString(4, tableEntry.getGeometryType()); prepareCall.setInt(5, 2); prepareCall.executeUpdate(); diff --git a/src/main/java/it/unibz/inf/isoga/geometry/BBox.java b/src/main/java/it/unibz/inf/isoga/geometry/BBox.java index 9df6ff14507fe9de7c61937e63093be589271efc..453bb7d6ee1645f894282e7347be21b15055ad70 100644 --- a/src/main/java/it/unibz/inf/isoga/geometry/BBox.java +++ b/src/main/java/it/unibz/inf/isoga/geometry/BBox.java @@ -19,10 +19,10 @@ public class BBox implements Comparable<BBox> { } public BBox(final Point lowerCorner, final Point upperCorner) { - minX = Math.round(lowerCorner.getX()); - minY = Math.round(lowerCorner.getY()); - maxX = Math.round(upperCorner.getX()); - maxY = Math.round(upperCorner.getY()); + minX = (lowerCorner == null) ? 0 : Math.round(lowerCorner.getX()); + minY = (lowerCorner == null) ? 0 : Math.round(lowerCorner.getY()); + maxX = (upperCorner == null) ? 0 : Math.round(upperCorner.getX()); + maxY = (upperCorner == null) ? 0 : Math.round(upperCorner.getY()); } public JSONArray toJSON() throws JSONException { diff --git a/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java b/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java index 71b5d75c411728b999671be3c2bfc4e74886ae08..d5cd4ab8849b9dfcbdc871c755a182892ce77023 100644 --- a/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java +++ b/src/main/java/it/unibz/inf/isoga/services/IsochroneService.java @@ -223,7 +223,7 @@ public class IsochroneService extends AbstractService { // only register dataset bz, all others are registered later final DSetConfig cfgBZ = sessionServerConfigs.get(client.getId()).get(Dataset.BZ); final Connection connection = globalCFG.getConnection(); - registerLayer(connection, cfgBZ, manager.getPublisher(), client.getId()); + registerLayers(connection, cfgBZ, manager.getPublisher()); // listener that listens when client is closed client.addListener(new ServerSession.RemoveListener() { @@ -253,77 +253,67 @@ public class IsochroneService extends AbstractService { /** * Creates the tables and for every session a new datastore via rest. */ - private void registerLayer(final Connection connection, final DSetConfig dSetConfig, - final GeoServerRESTPublisher publisher, final String sessionId) { - // register edge table - DBUtility.deleteGeometryMetadata(connection, dSetConfig.getEdgeTableEntry()); - DBUtility.createTargetEdgeTable(connection, dSetConfig.getEdgeTableEntry().getTableName()); - DBUtility.insertGeometryMetadata(connection, dSetConfig.getEdgeTableEntry(), dSetConfig.getServerSRID()); - DBUtility.createSpatialIndex(connection, dSetConfig.getEdgeTableEntry()); - - final GSFeatureTypeEncoder edgeFeatureTypeEncoder = new GSFeatureTypeEncoder(); - edgeFeatureTypeEncoder.setName(dSetConfig.getEdgeTableEntry().getTableName()); - edgeFeatureTypeEncoder.setTitle(dSetConfig.getEdgeTableEntry().getDescription()); - final String srs = "EPSG:" + dSetConfig.getServerSRID(); - edgeFeatureTypeEncoder.setSRS(srs); - edgeFeatureTypeEncoder.setNativeBoundingBox(dSetConfig.getServerExtent().getMinX(), - dSetConfig.getServerExtent().getMinY(), - dSetConfig.getServerExtent().getMaxX(), - dSetConfig.getServerExtent().getMaxY(), srs); + private void registerLayers(final Connection connection, final DSetConfig dSetConfig, final GeoServerRESTPublisher publisher) { + final String ds = globalCFG.getProperty("rendering.server.rest.datastore"); + final String ws = globalCFG.getProperty("rendering.server.rest.workspace"); + final BBox serverExtend = dSetConfig.getServerExtent(); + final int serverSrid = dSetConfig.getServerSRID(); + final String srs = "EPSG:" + serverSrid; + // register edge table + final TableEntry edgeTableEntry = dSetConfig.getEdgeTableEntry(); + DBUtility.deleteGeometryMetadata(connection, edgeTableEntry); + DBUtility.createTargetEdgeTable(connection, edgeTableEntry.getTableName()); + DBUtility.insertGeometryMetadata(connection, edgeTableEntry, serverSrid); + DBUtility.createSpatialIndex(connection, edgeTableEntry); + final GSFeatureTypeEncoder edgeFeatureTypeEncoder = getFeatureEncoder(edgeTableEntry, serverExtend, srs); final GSLayerEncoder edgeLayerEncoder = new GSLayerEncoder(); edgeLayerEncoder.setDefaultStyle("STYLE_ISO_EDGES"); - - if (!publisher.publishDBLayer(globalCFG.getProperty("rendering.server.rest.workspace"), - globalCFG.getProperty("rendering.server.rest.datastore"), - edgeFeatureTypeEncoder, edgeLayerEncoder)) { - throw new RuntimeException("Couldn't register layer on the GeoServer"); + if (!publisher.publishDBLayer(ws, ds, edgeFeatureTypeEncoder, edgeLayerEncoder)) { + throw new RuntimeException("Couldn't register edge layer on the GeoServer"); } - DBUtility.createVertexAnnotationTable(connection, - dSetConfig.getVertexAnnotatedTableEntry().getTableName()); - // register vertex table - DBUtility.deleteGeometryMetadata(connection, dSetConfig.getVertexTableEntry()); - DBUtility.createTargetVertexTable(connection, dSetConfig.getVertexTableEntry().getTableName()); - DBUtility.insertGeometryMetadata(connection, dSetConfig.getVertexTableEntry(), dSetConfig.getServerSRID()); - DBUtility.createSpatialIndex(connection, dSetConfig.getVertexTableEntry()); - - final GSFeatureTypeEncoder vertexFeatureTypeEncoder = new GSFeatureTypeEncoder(); - vertexFeatureTypeEncoder.setName(dSetConfig.getVertexTableEntry().getTableName()); - vertexFeatureTypeEncoder.setTitle(dSetConfig.getVertexTableEntry().getDescription()); - vertexFeatureTypeEncoder.setSRS(srs); - vertexFeatureTypeEncoder.setNativeBoundingBox(dSetConfig.getServerExtent().getMinX(), - dSetConfig.getServerExtent().getMinY(), - dSetConfig.getServerExtent().getMaxX(), - dSetConfig.getServerExtent().getMaxY(), srs); + final TableEntry vertexTableEntry = dSetConfig.getVertexTableEntry(); + final TableEntry annotatedTableEntry = dSetConfig.getVertexAnnotatedTableEntry(); + DBUtility.createVertexAnnotationTable(connection, annotatedTableEntry.getTableName()); + DBUtility.deleteGeometryMetadata(connection, vertexTableEntry); + DBUtility.createTargetVertexTable(connection, vertexTableEntry.getTableName()); + DBUtility.insertGeometryMetadata(connection, vertexTableEntry, serverSrid); + DBUtility.createSpatialIndex(connection, vertexTableEntry); + final GSFeatureTypeEncoder vertexFeatureTypeEncoder = getFeatureEncoder(vertexTableEntry, serverExtend, srs); final GSLayerEncoder vertexLayerEncoder = new GSLayerEncoder(); vertexLayerEncoder.setDefaultStyle("STYLE_VERTICES_EXPIRATION"); - publisher.publishDBLayer(globalCFG.getProperty("rendering.server.rest.workspace"), - globalCFG.getProperty("rendering.server.rest.datastore"), - vertexFeatureTypeEncoder, vertexLayerEncoder); + if (!publisher.publishDBLayer(ws, ds, vertexFeatureTypeEncoder, vertexLayerEncoder)) { + throw new RuntimeException("Couldn't register vertex layer on the GeoServer"); + } + + final TableEntry areaBufferTableEntry = dSetConfig.getAreaBufferTableEntry(); + DBUtility.deleteGeometryMetadata(connection, areaBufferTableEntry); + DBUtility.createTargetBufferTable(connection, areaBufferTableEntry.getTableName()); + DBUtility.insertGeometryMetadata(connection, areaBufferTableEntry, serverSrid); + DBUtility.createSpatialIndex(connection, areaBufferTableEntry); + final GSFeatureTypeEncoder bufferFeatureTypeEncoder = getFeatureEncoder(areaBufferTableEntry, serverExtend, srs); + final GSLayerEncoder bufferLayerEncoder = new GSLayerEncoder(); + bufferLayerEncoder.setDefaultStyle("STYLE_ISO_AREA"); + if (!publisher.publishDBLayer(ws, ds, bufferFeatureTypeEncoder, bufferLayerEncoder)) { + throw new RuntimeException("Couldn't register areaBuffer layer on the GeoServer"); + } - DBUtility.deleteGeometryMetadata(connection, dSetConfig.getAreaBufferTableEntry()); - DBUtility.createTargetBufferTable(connection, dSetConfig.getAreaBufferTableEntry().getTableName()); - DBUtility.insertGeometryMetadata(connection, dSetConfig.getAreaBufferTableEntry(), - dSetConfig.getServerSRID()); - DBUtility.createSpatialIndex(connection, dSetConfig.getAreaBufferTableEntry()); + dSetConfig.register(); + } + private GSFeatureTypeEncoder getFeatureEncoder(final TableEntry tEntry, final BBox serverExtend, final String srs) { final GSFeatureTypeEncoder bufferFeatureTypeEncoder = new GSFeatureTypeEncoder(); - bufferFeatureTypeEncoder.setName(dSetConfig.getAreaBufferTableEntry().getTableName()); - bufferFeatureTypeEncoder.setTitle(dSetConfig.getAreaBufferTableEntry().getDescription()); + bufferFeatureTypeEncoder.setName(tEntry.getTableName()); + bufferFeatureTypeEncoder.setTitle(tEntry.getDescription()); bufferFeatureTypeEncoder.setSRS(srs); - bufferFeatureTypeEncoder.setNativeBoundingBox(dSetConfig.getServerExtent().getMinX(), - dSetConfig.getServerExtent().getMinY(), - dSetConfig.getServerExtent().getMaxX(), - dSetConfig.getServerExtent().getMaxY(), srs); + bufferFeatureTypeEncoder.setNativeBoundingBox(serverExtend.getMinX(), + serverExtend.getMinY(), + serverExtend.getMaxX(), + serverExtend.getMaxY(), srs); - final GSLayerEncoder bufferLayerEncoder = new GSLayerEncoder(); - bufferLayerEncoder.setDefaultStyle("STYLE_ISO_AREA"); - publisher.publishDBLayer(globalCFG.getProperty("rendering.server.rest.workspace"), - globalCFG.getProperty("rendering.server.rest.datastore"), - bufferFeatureTypeEncoder, bufferLayerEncoder); - dSetConfig.register(); + return bufferFeatureTypeEncoder; } private Set<Location> locationsFromQueryPoints(final String qPoints, final Config config) { @@ -390,7 +380,7 @@ public class IsochroneService extends AbstractService { final DSetConfig dSetConfig = sessionServerConfigs.get(client.getId()).get(dataset); if (!dSetConfig.isRegistered()) { final Connection connection = config.getConnection(); - registerLayer(connection, dSetConfig, manager.getPublisher(), client.getId()); + registerLayers(connection, dSetConfig, manager.getPublisher()); } config.setDestinationEdgeTableEntry(dSetConfig.getEdgeTableEntry()); config.setDestinationVertexTableEntry(dSetConfig.getVertexTableEntry()); @@ -580,7 +570,7 @@ public class IsochroneService extends AbstractService { * schedule data of the means of transport passing there. It delivers for each * mean of transport that passes at that vertex: the type,name of means of * transportation system and the corresponding arrival or departure time - * + * * @param client * @param message * passes an identifier of the transit station diff --git a/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java b/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java index b1d7cd6f65582b10af393977f694f0577e0661e2..a76df68831ef8ecea329f2b01c4593c573ce066d 100644 --- a/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java +++ b/src/main/java/it/unibz/inf/isoga/utils/DSetConfig.java @@ -9,6 +9,7 @@ import it.unibz.inf.isoga.geometry.BBox; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; +import java.util.Date; import org.json.JSONArray; import org.json.JSONException; @@ -18,21 +19,20 @@ import org.json.JSONObject; * Configuration for individual datasets. */ public class DSetConfig implements Cloneable { + private static final DateFormat CLIENT_DATE_FORMAT = new SimpleDateFormat("dd'/'MM'/'yyyy"); + private static final DateFormat CLIENT_TIME_FORMAT = new SimpleDateFormat("HH':'mm"); + private static final int NAME_MAX_LENGTH = 15; private final Dataset dataset; - private final BBox clientMBR, serverMBR; - + private final BBox clientMBR; + private final BBox serverMBR; private final Calendar time; private final Point queryPoint; - private String edgeLayer, vertexLayer, areaBufferLayer, vertexAnnotatedTableName; - private TableEntry edgeTableEntry, vertexTableEntry, areaBufferTableEntry, vertexAnnotatedTableEntry; - private final int serverSRID; private final String workspace; + private String edgeLayer, vertexLayer, areaBufferLayer, vertexAnnotatedTableName; + private TableEntry edgeTableEntry, vertexTableEntry, areaBufferTableEntry, vertexAnnotatedTableEntry; private boolean registered = false; - private static final DateFormat CLIENT_DATE_FORMAT = new SimpleDateFormat("dd'/'MM'/'yyyy"); - private static final DateFormat CLIENT_TIME_FORMAT = new SimpleDateFormat("HH':'mm"); - public DSetConfig(final Dataset dataset, final BBox serverMBR, final BBox clientMBR, final Calendar time, final Point queryPoint, final int serverSRID, final String workspace) { this.dataset = dataset; this.serverMBR = serverMBR; @@ -68,45 +68,46 @@ public class DSetConfig implements Cloneable { } public JSONObject toJSON() { - final JSONObject json = new JSONObject(); - final JSONObject qPoint = new JSONObject(); - final JSONArray bboxVals = new JSONArray(); - final JSONObject edgeLayer = new JSONObject(); - final JSONObject vertexLayer = new JSONObject(); - final JSONObject bufferLayer = new JSONObject(); - + final JSONObject resultObject = new JSONObject(); + final JSONObject qPointObject = new JSONObject(); + final JSONArray bboxValArray = new JSONArray(); + final JSONObject edgeLayerObject = new JSONObject(); + final JSONObject vertexLayerObject = new JSONObject(); + final JSONObject bufferLayerObject = new JSONObject(); + + final Date date = time.getTime(); try { - json.put("name", dataset.toString()); - json.put("date", CLIENT_DATE_FORMAT.format(time.getTime())); - json.put("time", CLIENT_TIME_FORMAT.format(time.getTime())); - json.put("prefix", workspace); - - qPoint.put("x", queryPoint.getX()); - qPoint.put("y", queryPoint.getY()); - json.put("queryPoint", qPoint); - - bboxVals.put(clientMBR.getMinX()); - bboxVals.put(clientMBR.getMinY()); - bboxVals.put(clientMBR.getMaxX()); - bboxVals.put(clientMBR.getMaxY()); - json.put(JSONConstants.BBOX, bboxVals); - - edgeLayer.put("name", edgeTableEntry.getDescription()); - edgeLayer.put("layer", edgeTableEntry.getTableName()); - json.put("isoEdgeLayer", edgeLayer); - - vertexLayer.put("name", vertexTableEntry.getDescription()); - vertexLayer.put("layer", vertexTableEntry.getTableName()); - json.put("isoVertexLayer", vertexLayer); - - bufferLayer.put("name", areaBufferTableEntry.getDescription()); - bufferLayer.put("layer", areaBufferTableEntry.getTableName()); - json.put("isoCoverageLayer", bufferLayer); + resultObject.put("name", dataset.toString()); + resultObject.put("prefix", workspace); + resultObject.put("date", CLIENT_DATE_FORMAT.format(date)); + resultObject.put("time", CLIENT_TIME_FORMAT.format(date)); + + qPointObject.put("x", queryPoint.getX()); + qPointObject.put("y", queryPoint.getY()); + resultObject.put("queryPoint", qPointObject); + + bboxValArray.put(clientMBR.getMinX()); + bboxValArray.put(clientMBR.getMinY()); + bboxValArray.put(clientMBR.getMaxX()); + bboxValArray.put(clientMBR.getMaxY()); + resultObject.put(JSONConstants.BBOX, bboxValArray); + + edgeLayerObject.put("name", edgeTableEntry.getDescription()); + edgeLayerObject.put("layer", edgeTableEntry.getTableName()); + resultObject.put("isoEdgeLayer", edgeLayerObject); + + vertexLayerObject.put("name", vertexTableEntry.getDescription()); + vertexLayerObject.put("layer", vertexTableEntry.getTableName()); + resultObject.put("isoVertexLayer", vertexLayerObject); + + bufferLayerObject.put("name", areaBufferTableEntry.getDescription()); + bufferLayerObject.put("layer", areaBufferTableEntry.getTableName()); + resultObject.put("isoCoverageLayer", bufferLayerObject); } catch (final JSONException e) { e.printStackTrace(); } - return json; + return resultObject; } @Override @@ -123,37 +124,15 @@ public class DSetConfig implements Cloneable { } public void appendSessionId(final String id) { - edgeLayer += "_" + id; - vertexLayer += "_" + id; - areaBufferLayer += "_" + id; - vertexAnnotatedTableName += "_" + id; - - if (edgeLayer.length() > 15) { - String shortName = edgeLayer.substring(0, 10) + "_" + edgeLayer.substring(edgeLayer.length() - 6, edgeLayer.length()); - shortName = shortName.toLowerCase(); - edgeTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.EDGE); - edgeLayer = shortName; - } - - if (vertexLayer.length() > 15) { - String shortName = vertexLayer.substring(0, 10) + "_" + vertexLayer.substring(vertexLayer.length() - 6, vertexLayer.length()); - shortName = shortName.toLowerCase(); - vertexTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.VERTEX); - vertexLayer = shortName; - } - if (vertexAnnotatedTableName.length() > 15) { - String shortName = vertexAnnotatedTableName.substring(0, 10) + "_" + vertexAnnotatedTableName.substring(vertexAnnotatedTableName.length() - 6, vertexAnnotatedTableName.length()); - shortName = shortName.toLowerCase(); - vertexAnnotatedTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.VERTEX); - vertexAnnotatedTableName = shortName; - } - if (areaBufferLayer.length() > 15) { - String shortName = areaBufferLayer.substring(0, 10) + "_" + areaBufferLayer.substring(areaBufferLayer.length() - 6, areaBufferLayer.length()); - shortName = shortName.toLowerCase(); - areaBufferTableEntry = new TableEntry(shortName, "sidx_" + shortName, TableType.COVERAGE); - areaBufferLayer = shortName; - } + edgeLayer = appendId(edgeLayer, id); + vertexLayer = appendId(vertexLayer, id); + areaBufferLayer = appendId(areaBufferLayer, id); + vertexAnnotatedTableName = appendId(vertexAnnotatedTableName, id); + edgeTableEntry = new TableEntry(edgeLayer, "sidx_" + edgeLayer, TableType.EDGE); + vertexTableEntry = new TableEntry(vertexLayer, "sidx_" + vertexLayer, TableType.VERTEX); + vertexAnnotatedTableEntry = new TableEntry(vertexAnnotatedTableName, "sidx_" + vertexAnnotatedTableName, TableType.VERTEX); + areaBufferTableEntry = new TableEntry(areaBufferLayer, "sidx_" + areaBufferLayer, TableType.COVERAGE); } public TableEntry getEdgeTableEntry() { @@ -192,4 +171,15 @@ public class DSetConfig implements Cloneable { return registered; } + private String appendId(final String layerName, final String id) { + String name = layerName + "_" + id; + if (name.length() > NAME_MAX_LENGTH) { + // CHECKSTYLE:OFF MagicNumber + name = name.substring(0, 10) + "_" + name.substring(name.length() - 6, name.length()); + // CHECKSTYLE:ON MagicNumber + } + + return name.toLowerCase(); + } + }