Skip to content

Commit 9ffe942

Browse files
authored
Bearing formatting fix (#1121)
* bearing formatting fix * fix bearings parsing * use string to store RouteOptions.waypointTargets
1 parent 123e7cd commit 9ffe942

8 files changed

Lines changed: 137 additions & 51 deletions

File tree

services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/RouteOptions.java

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -481,13 +481,10 @@ public String waypointNames() {
481481
* Must be used with {@link RouteOptions#steps()} = true.
482482
* @return a list of Points representing coordinate pairs for drop-off locations
483483
* @since 4.3.0
484-
* @deprecated use {@link #waypointTargetsList()}
485484
*/
485+
@SerializedName("waypoint_targets")
486486
@Nullable
487-
@Deprecated
488-
public String waypointTargets() {
489-
return FormatUtils.formatPointsList(waypointTargetsList());
490-
}
487+
public abstract String waypointTargets();
491488

492489
/**
493490
* A list of points used to specify drop-off
@@ -499,9 +496,10 @@ public String waypointTargets() {
499496
* Must be used with {@link RouteOptions#steps()} = true.
500497
* @return a list of Points representing coordinate pairs for drop-off locations
501498
*/
502-
@SerializedName("waypoint_targets")
503499
@Nullable
504-
public abstract List<Point> waypointTargetsList();
500+
public List<Point> waypointTargetsList() {
501+
return ParseUtils.parseToPoints(waypointTargets());
502+
}
505503

506504
/**
507505
* To be used to specify settings for use with the walking profile.
@@ -1029,16 +1027,8 @@ public Builder waypointNames(@NonNull String waypointNames) {
10291027
* @param waypointTargets list of coordinate pairs for drop-off locations (;)
10301028
* @return this builder for chaining options together
10311029
* @since 4.3.0
1032-
* @deprecated use {@link #waypointTargetsList(List)}
10331030
*/
1034-
@Deprecated
1035-
public Builder waypointTargets(@NonNull String waypointTargets) {
1036-
List<Point> targets = ParseUtils.parseToPoints(waypointTargets);
1037-
if (targets != null) {
1038-
waypointTargetsList(targets);
1039-
}
1040-
return this;
1041-
}
1031+
public abstract Builder waypointTargets(@NonNull String waypointTargets);
10421032

10431033
/**
10441034
* A list of coordinate pairs used to specify drop-off
@@ -1054,7 +1044,10 @@ public Builder waypointTargets(@NonNull String waypointTargets) {
10541044
* @param waypointTargets list of Points for drop-off locations
10551045
* @return this builder for chaining options together
10561046
*/
1057-
public abstract Builder waypointTargetsList(@NonNull List<Point> waypointTargets);
1047+
public Builder waypointTargetsList(@NonNull List<Point> waypointTargets) {
1048+
waypointTargets(FormatUtils.formatPointsList(waypointTargets));
1049+
return this;
1050+
}
10581051

10591052
/**
10601053
* To be used to specify settings for use with the walking profile.

services-directions-models/src/main/java/com/mapbox/api/directions/v5/utils/FormatUtils.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,26 @@ public static String formatBearings(@Nullable List<List<Double>> bearings) {
125125

126126
List<String> bearingsToJoin = new ArrayList<>();
127127
for (List<Double> bearing : bearings) {
128-
if (bearing == null || bearing.size() == 0) {
128+
if (bearing == null) {
129129
bearingsToJoin.add(null);
130130
} else {
131-
bearingsToJoin.add(String.format(Locale.US, "%s,%s",
132-
formatCoordinate(bearing.get(0)),
133-
formatCoordinate(bearing.get(1))));
131+
if (bearing.size() != 2) {
132+
throw new RuntimeException("Bearing size should be 2.");
133+
}
134+
135+
Double angle = bearing.get(0);
136+
Double tolerance = bearing.get(1);
137+
if (angle == null || tolerance == null) {
138+
bearingsToJoin.add(null);
139+
} else {
140+
if (angle < 0 || angle > 360 || tolerance < 0 || tolerance > 360) {
141+
throw new RuntimeException("Angle and tolerance have to be from 0 to 360.");
142+
}
143+
144+
bearingsToJoin.add(String.format(Locale.US, "%s,%s",
145+
formatCoordinate(angle),
146+
formatCoordinate(tolerance)));
147+
}
134148
}
135149
}
136150
return join(";", bearingsToJoin);

services-directions-models/src/main/java/com/mapbox/api/directions/v5/utils/ParseUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public static List<List<Double>> parseToListOfListOfDoubles(@Nullable String ori
138138
}
139139

140140
List<List<Double>> result = new ArrayList<>();
141-
String[] pairs = original.split(SEMICOLON);
141+
String[] pairs = original.split(SEMICOLON, -1);
142142
for (String pair : pairs) {
143143
if (pair.isEmpty()) {
144144
result.add(null);

services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/RouteOptionsTest.java

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
public class RouteOptionsTest {
1818

19+
private static final String ROUTE_OPTIONS_JSON = "{\"baseUrl\":\"base_url\",\"user\":\"user\",\"profile\":\"profile\",\"coordinates\":[[1.0,2.0],[3.0,4.0]],\"access_token\":\"token\",\"uuid\":\"requestUuid\",\"waypoint_targets\":\";33,44;55,66\"}";
20+
1921
@Test
2022
public void toBuilder() {
2123
RouteOptions routeOptions = routeOptions();
@@ -91,12 +93,14 @@ public void bearingsString() {
9193
bearing.add(5.1);
9294
bearing.add(7.4);
9395

94-
assertEquals(";5.1,7.4", routeOptions.bearings());
96+
assertEquals(";5.1,7.4;;", routeOptions.bearings());
9597

9698
List<List<Double>> bearings = routeOptions.bearingsList();
97-
assertEquals(2, bearings.size());
99+
assertEquals(4, bearings.size());
98100
assertEquals(null, bearings.get(0));
99101
assertEquals(bearing, bearings.get(1));
102+
assertEquals(null, bearings.get(2));
103+
assertEquals(null, bearings.get(3));
100104
}
101105

102106
@Test
@@ -255,7 +259,7 @@ public void waypointTargetsString() {
255259
.waypointTargets(targetsStr)
256260
.build();
257261

258-
assertEquals("1.2,3.4;;;5.65,7.123", routeOptions.waypointTargets());
262+
assertEquals("1.2,3.4;;;5.65,7.123;;;", routeOptions.waypointTargets());
259263

260264
List<Point> targets = routeOptions.waypointTargetsList();
261265
assertEquals(4, targets.size());
@@ -320,6 +324,50 @@ public void annotationsList() {
320324
assertEquals("congestion;distance;maxspeed;speed", routeOptions.annotations());
321325
}
322326

327+
@Test
328+
public void waypointTargetsStringToJson() {
329+
RouteOptions options = routeOptions().toBuilder()
330+
.waypointTargets(";33,44;55,66")
331+
.build();
332+
333+
String json = options.toJson();
334+
335+
assertEquals(ROUTE_OPTIONS_JSON, json);
336+
}
337+
338+
@Test
339+
public void waypointTargetsListToJson() {
340+
List<Point> waypointTargets = new ArrayList<>();
341+
waypointTargets.add(null);
342+
waypointTargets.add(Point.fromLngLat(33, 44));
343+
waypointTargets.add(Point.fromLngLat(55, 66));
344+
345+
RouteOptions options = routeOptions().toBuilder()
346+
.waypointTargetsList(waypointTargets)
347+
.build();
348+
349+
String json = options.toJson();
350+
351+
assertEquals(ROUTE_OPTIONS_JSON, json);
352+
}
353+
354+
@Test
355+
public void waypointTargetsStringFromJson() {
356+
RouteOptions options = RouteOptions.fromJson(ROUTE_OPTIONS_JSON);
357+
358+
assertEquals(";33,44;55,66", options.waypointTargets());
359+
}
360+
361+
@Test
362+
public void waypointTargetsListFromJson() {
363+
RouteOptions options = RouteOptions.fromJson(ROUTE_OPTIONS_JSON);
364+
365+
assertEquals(3, options.waypointTargetsList().size());
366+
assertEquals(null, options.waypointTargetsList().get(0));
367+
assertEquals(Point.fromLngLat(33, 44), options.waypointTargetsList().get(1));
368+
assertEquals(Point.fromLngLat(55, 66), options.waypointTargetsList().get(2));
369+
}
370+
323371
private RouteOptions routeOptions() {
324372
List<Point> coordinates = new ArrayList<>();
325373
coordinates.add(Point.fromLngLat(1.0, 2.0));

services-directions/src/main/java/com/mapbox/api/directions/v5/DirectionsResponseFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ private List<DirectionsRoute> generateRouteOptions(Response<DirectionsResponse>
5959
.waypointNamesList(ParseUtils.parseToStrings(mapboxDirections.waypointNames()))
6060
.waypointTargetsList(ParseUtils.parseToPoints(mapboxDirections.waypointTargets()))
6161
.continueStraight(mapboxDirections.continueStraight())
62-
.annotations(mapboxDirections.annotation())
62+
.annotationsList(ParseUtils.parseToStrings(mapboxDirections.annotation()))
6363
.approachesList(ParseUtils.parseToStrings(mapboxDirections.approaches()))
6464
.bearingsList(ParseUtils.parseToListOfListOfDoubles(mapboxDirections.bearing()))
6565
.alternatives(mapboxDirections.alternatives())

services-directions/src/main/java/com/mapbox/api/directions/v5/MapboxDirections.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -658,11 +658,7 @@ public Builder addAnnotation(@AnnotationCriteria @NonNull String annotation) {
658658
*/
659659
public Builder addBearing(@Nullable @FloatRange(from = 0, to = 360) Double angle,
660660
@Nullable @FloatRange(from = 0, to = 360) Double tolerance) {
661-
if (angle == null || tolerance == null) {
662-
bearings.add(new ArrayList<Double>());
663-
} else {
664-
bearings.add(Arrays.asList(angle, tolerance));
665-
}
661+
bearings.add(Arrays.asList(angle, tolerance));
666662
return this;
667663
}
668664

@@ -679,24 +675,7 @@ public Builder addBearing(@Nullable @FloatRange(from = 0, to = 360) Double angle
679675
* @return this builder for chaining options together
680676
*/
681677
public Builder bearings(@NonNull List<List<Double>> bearings) {
682-
List<List<Double>> newBearings = new ArrayList<>();
683-
for (List<Double> bearing : bearings) {
684-
if (bearing.size() != 2) {
685-
throw new ServicesException("Bearing size should be 2.");
686-
}
687-
Double angle = bearing.get(0);
688-
Double tolerance = bearing.get(1);
689-
if (angle == null || tolerance == null) {
690-
newBearings.add(new ArrayList<Double>());
691-
} else {
692-
if (angle < 0 || angle > 360 || tolerance < 0 || tolerance > 360) {
693-
throw new ServicesException("Angle and tolerance have to be from 0 to 360.");
694-
}
695-
newBearings.add(Arrays.asList(angle, tolerance));
696-
}
697-
}
698-
699-
this.bearings = newBearings;
678+
this.bearings = bearings;
700679
return this;
701680
}
702681

services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.mapbox.api.directions.v5.models.DirectionsRoute;
99
import com.mapbox.api.directions.v5.models.LegAnnotation;
1010
import com.mapbox.api.directions.v5.models.RouteOptions;
11+
import com.mapbox.api.directions.v5.utils.ParseUtils;
1112
import com.mapbox.core.TestUtils;
1213
import com.mapbox.core.exceptions.ServicesException;
1314
import com.mapbox.geojson.Point;
@@ -470,6 +471,54 @@ public void addBearing_doesGetFormattedInUrlCorrectly() throws Exception {
470471
directions.cloneCall().request().url().queryParameter("bearings"));
471472
}
472473

474+
@Test
475+
public void addNullBearings_doesGetFormattedInUrlCorrectly() throws Exception {
476+
List<Double> bearing1 = new ArrayList<>();
477+
bearing1.add(45d);
478+
bearing1.add(90d);
479+
480+
List<Double> bearing2 = new ArrayList<>();
481+
bearing2.add(2d);
482+
bearing2.add(90d);
483+
484+
List<List<Double>> bearings = new ArrayList<>();
485+
bearings.add(null);
486+
bearings.add(null);
487+
bearings.add(bearing1);
488+
bearings.add(bearing2);
489+
bearings.add(null);
490+
491+
MapboxDirections directions = MapboxDirections.builder()
492+
.destination(Point.fromLngLat(13.4930, 9.958))
493+
.origin(Point.fromLngLat(1.234, 2.345))
494+
.bearings(bearings)
495+
.accessToken(ACCESS_TOKEN)
496+
.build();
497+
assertEquals(";;45,90;2,90;",
498+
directions.cloneCall().request().url().queryParameter("bearings"));
499+
}
500+
501+
@Test
502+
public void checksParseToListOfListOfDoublesEmptyTrailing() {
503+
List<List<Double>> bearings = ParseUtils.parseToListOfListOfDoubles(";;45,90;2,90;");
504+
505+
assertEquals(5, bearings.size());
506+
507+
List<Double> bearing1 = new ArrayList<>();
508+
bearing1.add(45d);
509+
bearing1.add(90d);
510+
511+
List<Double> bearing2 = new ArrayList<>();
512+
bearing2.add(2d);
513+
bearing2.add(90d);
514+
515+
assertEquals(null, bearings.get(0));
516+
assertEquals(null, bearings.get(1));
517+
assertEquals(bearing1, bearings.get(2));
518+
assertEquals(bearing2, bearings.get(3));
519+
assertEquals(null, bearings.get(4));
520+
}
521+
473522
@Test
474523
public void bearing_doesGetFormattedInUrlCorrectly() throws Exception {
475524
List<List<Double>> bearings = new ArrayList<>();

services-geojson/src/main/java/com/mapbox/geojson/BaseCoordinatesTypeAdapter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
abstract class BaseCoordinatesTypeAdapter<T> extends TypeAdapter<T> {
2626

2727

28-
protected void writePoint(JsonWriter out, Point value) throws IOException {
29-
writePointList(out, value.coordinates());
28+
protected void writePoint(JsonWriter out, Point point) throws IOException {
29+
if (point == null) {
30+
return;
31+
}
32+
writePointList(out, point.coordinates());
3033
}
3134

3235
protected Point readPoint(JsonReader in) throws IOException {

0 commit comments

Comments
 (0)