diff --git a/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteClient.java b/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteClient.java index 03a4052b..8d9dc9ae 100644 --- a/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteClient.java +++ b/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteClient.java @@ -35,14 +35,13 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; -import com.google.gson.JsonArray; - import com.google.gson.JsonObject; import no.vegvesen.nvdbapi.client.gson.RouteParser; import no.vegvesen.nvdbapi.client.model.Coordinates; import no.vegvesen.nvdbapi.client.model.Geometry; import no.vegvesen.nvdbapi.client.model.Projection; import no.vegvesen.nvdbapi.client.model.roadnet.TypeOfRoad; +import no.vegvesen.nvdbapi.client.model.roadnet.route.RouteField; import no.vegvesen.nvdbapi.client.model.roadnet.route.RouteOnRoadNet; public class RoadNetRouteClient extends AbstractJerseyClient { @@ -80,38 +79,38 @@ private WebTarget getWebTarget(RoadNetRouteRequest request) { UriBuilder path = endpoint(); - request.getPointInTime().ifPresent(v -> path.queryParam("tidspunkt", v)); - request.getStartPointInTime().ifPresent(v -> path.queryParam("tidspunkt_start", v)); - request.getEndPointInTime().ifPresent(v -> path.queryParam("tidspunkt_slutt", v)); - path.queryParam("kortform", request.isBriefResponse()); - path.queryParam("konnekteringslenker", request.isConnectionLinks()); - path.queryParam("detaljerte_lenker", request.isDetailedLinks()); - request.getRoadRefFilter().ifPresent(v -> path.queryParam("vegsystemreferanse", v)); - request.getRoadUserGroup().ifPresent(v -> path.queryParam("trafikantgruppe", v.getTextValue())); - if (!request.getTypeOfRoad().isEmpty()) path.queryParam("typeveg", request.getTypeOfRoad() + request.getPointInTime().ifPresent(v -> path.queryParam(RouteField.POINT_IN_TIME.getName(), v)); + request.getStartPointInTime().ifPresent(v -> path.queryParam(RouteField.START_POINT_IN_TIME.getName(), v)); + request.getEndPointInTime().ifPresent(v -> path.queryParam(RouteField.END_POINT_IN_TIME.getName(), v)); + path.queryParam(RouteField.BRIEF_RESPONSE.getName(), request.isBriefResponse()); + path.queryParam(RouteField.CONNECTION_LINKS.getName(), request.isConnectionLinks()); + path.queryParam(RouteField.DETAILED_LINKS.getName(), request.isDetailedLinks()); + request.getRoadRefFilter().ifPresent(v -> path.queryParam(RouteField.ROAD_SYS_REFS.getName(), v)); + request.getRoadUserGroup().ifPresent(v -> path.queryParam(RouteField.ROAD_USER_GROUP.getName(), v.getTextValue())); + if (!request.getTypeOfRoad().isEmpty()) path.queryParam(RouteField.TYPE_OF_ROAD.getName(), request.getTypeOfRoad() .stream() .map(TypeOfRoad::getTypeOfRoadSosi) .collect(Collectors.joining(","))); if (request.usesGeometry()) { Geometry geometry = request.getGeometry(); - path.queryParam("geometri", geometry.getWkt()); - path.queryParam("maks_avstand", request.getDistanceThreshold()); + path.queryParam(RouteField.GEOMETRY.getName(), geometry.getWkt()); + path.queryParam(RouteField.DISTANCE.getName(), request.getDistance()); if (geometry.getProjection() != Projection.UTM33) { - path.queryParam("srid", geometry.getProjection().getSrid()); + path.queryParam(RouteField.SRID.getName(), geometry.getProjection().getSrid()); } } else if(request.usesReflinkPosition()) { - path.queryParam("start", request.getStartReflinkPosition()); - path.queryParam("slutt", request.getEndReflinkPosition()); + path.queryParam(RouteField.START.getName(), request.getStartReflinkPosition()); + path.queryParam(RouteField.END.getName(), request.getEndReflinkPosition()); } else { Coordinates startCoordinates = request.getStartCoordinates(); - path.queryParam("start", startCoordinates); - path.queryParam("slutt", request.getEndCoordinates()); - path.queryParam("maks_avstand", request.getDistanceThreshold()); - path.queryParam("omkrets", request.getCircumferenceAroundPoints()); + path.queryParam(RouteField.START.getName(), startCoordinates); + path.queryParam(RouteField.END.getName(), request.getEndCoordinates()); + path.queryParam(RouteField.DISTANCE.getName(), request.getDistance()); + path.queryParam(RouteField.ENVELOPE.getName(), request.getEnvelope()); if(startCoordinates.getProjection() != Projection.UTM33) { - path.queryParam("srid", startCoordinates.getProjection().getSrid()); + path.queryParam(RouteField.SRID.getName(), startCoordinates.getProjection().getSrid()); } } diff --git a/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteRequest.java b/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteRequest.java index a0f30e6a..1c3ad5c5 100644 --- a/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteRequest.java +++ b/src/main/java/no/vegvesen/nvdbapi/client/clients/RoadNetRouteRequest.java @@ -5,12 +5,14 @@ import no.vegvesen.nvdbapi.client.model.RefLinkPosition; import no.vegvesen.nvdbapi.client.model.roadnet.RoadUserGroup; import no.vegvesen.nvdbapi.client.model.roadnet.TypeOfRoad; +import no.vegvesen.nvdbapi.client.model.roadnet.route.RouteField; import java.time.LocalDate; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import static java.util.Collections.emptyList; import static java.util.Objects.nonNull; @@ -21,15 +23,15 @@ public class RoadNetRouteRequest { private final RefLinkPosition endReflinkPosition; private final Coordinates startCoordinates; private final Coordinates endCoordinates; + private final Geometry geometry; + private final int distance; + private final int envelope; + private final boolean briefResponse; private final boolean connectionLinks; private final boolean detailedLinks; - private final Geometry geometry; - private final int distanceThreshold; - private final int circumferenceAroundPoints; private final Optional roadRefFilter; private final Optional roadUserGroup; private final List typeOfRoad; - private final boolean briefResponse; private final Optional pointInTime; private final Optional startPointInTime; private final Optional endPointInTime; @@ -40,12 +42,12 @@ private RoadNetRouteRequest(Builder b) { this.startCoordinates = b.startCoordinates; this.endCoordinates = b.endCoordinates; this.geometry = b.geometry; - this.distanceThreshold = b.distanceThreshold; - this.circumferenceAroundPoints = b.circumferenceAroundPoints; - this.roadRefFilter = b.roadRefFilter; - this.briefResponse = b.briefReponse; + this.distance = b.distance; + this.envelope = b.envelope; + this.briefResponse = b.briefResponse; this.connectionLinks = b.connectionLinks; this.detailedLinks = b.detailedLinks; + this.roadRefFilter = b.roadSysRefs; this.roadUserGroup = b.roadUserGroup; this.typeOfRoad = b.typeOfRoad; this.pointInTime = b.pointInTime; @@ -89,12 +91,12 @@ public Coordinates getEndCoordinates() { return endCoordinates; } - public int getDistanceThreshold() { - return distanceThreshold; + public int getDistance() { + return distance; } - public int getCircumferenceAroundPoints() { - return circumferenceAroundPoints; + public int getEnvelope() { + return envelope; } public boolean usesReflinkPosition() { @@ -128,19 +130,20 @@ public Optional getEndPointInTime() { public Map getJsonObject() { Map jsonMap = new HashMap<>(); - if (startReflinkPosition != null) jsonMap.put("start", String.valueOf(startReflinkPosition)); - if (endReflinkPosition != null) jsonMap.put("slutt", String.valueOf(endReflinkPosition)); - if (geometry != null) jsonMap.put("geometri", geometry.toString(false)); - jsonMap.put("kortform", String.valueOf(briefResponse)); - jsonMap.put("konnekteringslenker", String.valueOf(connectionLinks)); - jsonMap.put("detaljerte_lenker", String.valueOf(detailedLinks)); - jsonMap.put("maks_avstand", String.valueOf(distanceThreshold)); - jsonMap.put("omkrets", String.valueOf(circumferenceAroundPoints)); - roadRefFilter.ifPresent(s -> jsonMap.put("vegsystemreferanse", s)); - roadUserGroup.ifPresent(userGroup -> jsonMap.put("trafikantgruppe", userGroup.getTextValue())); - if (pointInTime.isPresent()) jsonMap.put("tidspunkt", String.valueOf(pointInTime)); - if (startPointInTime.isPresent()) jsonMap.put("tidspunkt_start", String.valueOf(startPointInTime)); - if (endPointInTime.isPresent()) jsonMap.put("tidspunkt_slutt", String.valueOf(endPointInTime)); + if (startReflinkPosition != null) jsonMap.put(RouteField.START.getName(), String.valueOf(startReflinkPosition)); + if (endReflinkPosition != null) jsonMap.put(RouteField.END.getName(), String.valueOf(endReflinkPosition)); + if (geometry != null) jsonMap.put(RouteField.GEOMETRY.getName(), geometry.toString(false)); + jsonMap.put(RouteField.DISTANCE.getName(), String.valueOf(distance)); + jsonMap.put(RouteField.ENVELOPE.getName(), String.valueOf(envelope)); + jsonMap.put(RouteField.BRIEF_RESPONSE.getName(), String.valueOf(briefResponse)); + jsonMap.put(RouteField.CONNECTION_LINKS.getName(), String.valueOf(connectionLinks)); + jsonMap.put(RouteField.DETAILED_LINKS.getName(), String.valueOf(detailedLinks)); + roadRefFilter.ifPresent(s -> jsonMap.put(RouteField.ROAD_SYS_REFS.getName(), s)); + roadUserGroup.ifPresent(userGroup -> jsonMap.put(RouteField.ROAD_USER_GROUP.getName(), userGroup.getTextValue())); + if (!typeOfRoad.isEmpty()) jsonMap.put(RouteField.TYPE_OF_ROAD.getName(), typeOfRoad.stream().map(TypeOfRoad::getTypeOfRoadSosi).collect(Collectors.joining(","))); + if (pointInTime.isPresent()) jsonMap.put(RouteField.POINT_IN_TIME.getName(), String.valueOf(pointInTime)); + if (startPointInTime.isPresent()) jsonMap.put(RouteField.START_POINT_IN_TIME.getName(), String.valueOf(startPointInTime)); + if (endPointInTime.isPresent()) jsonMap.put(RouteField.END_POINT_IN_TIME.getName(), String.valueOf(endPointInTime)); return jsonMap; } @@ -154,90 +157,88 @@ public static class Builder { private RefLinkPosition endReflinkPosition; private Coordinates startCoordinates; private Coordinates endCoordinates; - private int distanceThreshold = 10; - private int circumferenceAroundPoints = 100; private Geometry geometry; - private Optional roadRefFilter = Optional.empty(); - private Optional roadUserGroup = Optional.empty(); - private boolean briefReponse = false; - private boolean connectionLinks = false; + private int distance = 10; + private int envelope = 100; + private boolean briefResponse = false; + private boolean connectionLinks = true; private boolean detailedLinks = false; + private Optional roadSysRefs = Optional.empty(); + private Optional roadUserGroup = Optional.empty(); private List typeOfRoad = emptyList(); private Optional pointInTime = Optional.empty(); private Optional startPointInTime = Optional.empty(); private Optional endPointInTime = Optional.empty(); - public Builder between(RefLinkPosition startReflinkPosition, - RefLinkPosition endReflinkPosition) { + public Builder between(RefLinkPosition startReflinkPosition, RefLinkPosition endReflinkPosition) { this.startReflinkPosition = startReflinkPosition; this.endReflinkPosition = endReflinkPosition; return this; } - public Builder between(Coordinates startCoordinates, - Coordinates endCoordinates) { + public Builder between(Coordinates startCoordinates, Coordinates endCoordinates) { this.startCoordinates = startCoordinates; this.endCoordinates = endCoordinates; return this; } - public Builder withPointInTime(LocalDate pointInTime) { - this.pointInTime = Optional.ofNullable(pointInTime); + public Builder fromGeometry(Geometry geometry) { + this.geometry = geometry; return this; } - public Builder withStartPointInTime(LocalDate startPointInTime) { - this.startPointInTime = Optional.ofNullable(startPointInTime); + public Builder withDistance(int distance) { + this.distance = distance; return this; } - public Builder withEndPointInTime(LocalDate endPointInTime) { - this.endPointInTime = Optional.ofNullable(endPointInTime); + public Builder withEnvelope(int envelope) { + this.envelope = envelope; return this; } - public Builder withDistanceThreshold(int distanceThreshold) { - this.distanceThreshold = distanceThreshold; + public Builder withBriefResponse(boolean briefResponse) { + this.briefResponse = briefResponse; return this; } - public Builder withRoadRefFilter(String filter) { - this.roadRefFilter = Optional.ofNullable(filter); + public Builder withConnectionLinks(boolean connectionLinks) { + this.connectionLinks = connectionLinks; return this; } - public Builder withRoadUserGroup(RoadUserGroup roadUserGroup) { - this.roadUserGroup = Optional.ofNullable(roadUserGroup); + public Builder withDetailedLinks(boolean detailedLinks) { + this.detailedLinks = detailedLinks; return this; } - public Builder withTypeOfRoad(List typeOfRoad) { - this.typeOfRoad = typeOfRoad; + public Builder withRoadRefFilter(String filter) { + this.roadSysRefs = Optional.ofNullable(filter); return this; } - public Builder withCircumferenceAroundPoints(int circumferenceAroundPoints) { - this.circumferenceAroundPoints = circumferenceAroundPoints; + public Builder withRoadUserGroup(RoadUserGroup roadUserGroup) { + this.roadUserGroup = Optional.ofNullable(roadUserGroup); return this; } - public Builder fromGeometry(Geometry geometry) { - this.geometry = geometry; + public Builder withTypeOfRoad(List typeOfRoad) { + this.typeOfRoad = typeOfRoad; return this; } - public Builder withBriefResponse(boolean briefResponse) { - this.briefReponse = briefResponse; + public Builder withPointInTime(LocalDate pointInTime) { + this.pointInTime = Optional.ofNullable(pointInTime); return this; } - public Builder withConnectionLinks(boolean connectionLinks) { - this.connectionLinks = connectionLinks; + public Builder withStartPointInTime(LocalDate startPointInTime) { + this.startPointInTime = Optional.ofNullable(startPointInTime); return this; } - public Builder withDetailedLinks(boolean detailedLinks) { - this.detailedLinks = detailedLinks; + public Builder withEndPointInTime(LocalDate endPointInTime) { + this.endPointInTime = Optional.ofNullable(endPointInTime); return this; } diff --git a/src/main/java/no/vegvesen/nvdbapi/client/gson/RouteParser.java b/src/main/java/no/vegvesen/nvdbapi/client/gson/RouteParser.java index 42776f06..c535bf17 100644 --- a/src/main/java/no/vegvesen/nvdbapi/client/gson/RouteParser.java +++ b/src/main/java/no/vegvesen/nvdbapi/client/gson/RouteParser.java @@ -3,29 +3,37 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import no.vegvesen.nvdbapi.client.model.roadnet.route.RouteField; import no.vegvesen.nvdbapi.client.model.roadnet.route.RouteOnRoadNet; +import no.vegvesen.nvdbapi.client.model.roadnet.route.RouteStatus; import java.util.stream.Collectors; import java.util.stream.StreamSupport; public class RouteParser { public static RouteOnRoadNet parseDetailed(JsonObject result) { - JsonArray segmenter = result.getAsJsonArray("vegnettsrutesegmenter"); + JsonObject metadata = result.getAsJsonObject(RouteField.METADATA.getName()); + JsonArray segmenter = result.getAsJsonArray(RouteField.ROUTE_SEGMENTS.getName()); return new RouteOnRoadNet( StreamSupport.stream( segmenter.spliterator(), false) .map(JsonElement::getAsJsonObject) .map(DetailedRouteSegmentParser::parse) - .collect(Collectors.toList())); + .collect(Collectors.toList()), + metadata.get(RouteField.LENGTH.getName()).getAsDouble(), + RouteStatus.valueOfCode(metadata.get(RouteField.STATUS.getName()).getAsInt())); } public static RouteOnRoadNet parseBrief(JsonObject result) { - JsonArray segmenter = result.getAsJsonArray("vegnettsrutesegmenter"); + JsonObject metadata = result.getAsJsonObject(RouteField.METADATA.getName()); + JsonArray segmenter = result.getAsJsonArray(RouteField.ROUTE_SEGMENTS.getName()); return new RouteOnRoadNet( StreamSupport.stream( segmenter.spliterator(), false) .map(JsonElement::getAsJsonObject) .map(BriefRouteSegmentParser::parse) - .collect(Collectors.toList())); + .collect(Collectors.toList()), + metadata.get(RouteField.LENGTH.getName()).getAsDouble(), + RouteStatus.valueOfCode(metadata.get(RouteField.STATUS.getName()).getAsInt())); } } diff --git a/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteField.java b/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteField.java new file mode 100644 index 00000000..09a07e88 --- /dev/null +++ b/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteField.java @@ -0,0 +1,34 @@ +package no.vegvesen.nvdbapi.client.model.roadnet.route; + +public enum RouteField { + ROUTE_SEGMENTS("vegnettsrutesegmenter"), + START("start"), + END("slutt"), + GEOMETRY("geometri"), + SRID("srid"), + BRIEF_RESPONSE("kortform"), + CONNECTION_LINKS("konnekteringslenker"), + DETAILED_LINKS("detaljerte_lenker"), + DISTANCE("maks_avstand"), + ENVELOPE("omkrets"), + ROAD_SYS_REFS("vegsystemreferanse"), + TYPE_OF_ROAD("typeveg"), + ROAD_USER_GROUP("trafikantgruppe"), + POINT_IN_TIME("tidspunkt"), + START_POINT_IN_TIME("tidspunkt_start"), + END_POINT_IN_TIME("tidspunkt_slutt"), + METADATA("metadata"), + LENGTH("lengde"), + STATUS("status"), + STATUS_TEXT("status_tekst"); + + private final String fieldName; + + RouteField(String fieldName) { + this.fieldName = fieldName; + } + + public String getName() { + return this.fieldName; + } +} diff --git a/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteOnRoadNet.java b/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteOnRoadNet.java index 6447acfe..03f7cbfc 100644 --- a/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteOnRoadNet.java +++ b/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteOnRoadNet.java @@ -3,17 +3,30 @@ import java.util.List; import java.util.Objects; + public class RouteOnRoadNet { private final List segments; + public final double length; + public final RouteStatus status; - public RouteOnRoadNet(List segments) { + public RouteOnRoadNet(List segments, double length, RouteStatus status) { this.segments = segments; + this.length = length; + this.status = status; } public List getSegments() { return segments; } + public double getLength() { + return length; + } + + public RouteStatus getStatus() { + return status; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteStatus.java b/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteStatus.java new file mode 100644 index 00000000..2277dd11 --- /dev/null +++ b/src/main/java/no/vegvesen/nvdbapi/client/model/roadnet/route/RouteStatus.java @@ -0,0 +1,30 @@ +package no.vegvesen.nvdbapi.client.model.roadnet.route; + +public enum RouteStatus { + KOMPLETT(2000), + LENGSTE_SAMMENHENGENDE(2060), + MED_GYLDIGHETSHULL(2061), + IKKE_FUNNET_RUTE(4040), + IKKE_FUNNET_STARTPUNKT(4041), + IKKE_FUNNET_SLUTTPUNKT(4042), + IKKE_FUNNET_SEGMENTER_I_UTSNITT(4043); + + private final int statusCode; + + RouteStatus(int statusCode) { + this.statusCode = statusCode; + } + + public static RouteStatus valueOfCode(int code) { + for (RouteStatus status: values()) { + if (status.statusCode == code) { + return status; + } + } + return null; + } + + public int getStatusCode() { + return this.statusCode; + } +} diff --git a/src/test/resources/jsonresponse/rute/rute_kortformat.json b/src/test/resources/jsonresponse/rute/rute_kortformat.json index 28c6d79c..af59e039 100644 --- a/src/test/resources/jsonresponse/rute/rute_kortformat.json +++ b/src/test/resources/jsonresponse/rute/rute_kortformat.json @@ -17,6 +17,8 @@ ], "metadata": { "antall": 2, - "lengde": 43.134 + "lengde": 43.134, + "status": 2000, + "status_tekst": "KOMPLETT" } } diff --git a/src/test/resources/jsonresponse/rute/rute_langtformat.json b/src/test/resources/jsonresponse/rute/rute_langtformat.json index 2a4d854f..23266725 100644 --- a/src/test/resources/jsonresponse/rute/rute_langtformat.json +++ b/src/test/resources/jsonresponse/rute/rute_langtformat.json @@ -105,6 +105,8 @@ ], "metadata": { "antall": 2, - "lengde": 143.134 + "lengde": 143.134, + "status": 2000, + "status_tekst": "KOMPLETT" } }