Skip to content

Commit 7c6af3d

Browse files
authored
feat!: Create PendingResultBase type requests for Roads API. (#790)
* feat!: Create PendingResultBase type requests for Roads API. BREAKING CHANGE: methods in the RoadsApi class now return PendingResultBase type classes to allow modification (e.g. adding headers) to the request. * Add NearestRoadsApiRequest. * s/path/points * Add points. * Formatting.:
1 parent 3cbb039 commit 7c6af3d

File tree

6 files changed

+169
-93
lines changed

6 files changed

+169
-93
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.google.maps;
2+
3+
import com.google.gson.FieldNamingPolicy;
4+
import com.google.maps.RoadsApi.RoadsResponse;
5+
import com.google.maps.internal.ApiConfig;
6+
import com.google.maps.internal.StringJoin;
7+
import com.google.maps.model.LatLng;
8+
import com.google.maps.model.SnappedPoint;
9+
10+
/** A request to the snap to roads API (part of Roads API). */
11+
public class NearestRoadsApiRequest
12+
extends PendingResultBase<SnappedPoint[], NearestRoadsApiRequest, RoadsResponse> {
13+
14+
private static final ApiConfig NEAREST_ROADS_API_CONFIG =
15+
new ApiConfig("/v1/nearestRoads")
16+
.hostName(RoadsApi.API_BASE_URL)
17+
.supportsClientId(false)
18+
.fieldNamingPolicy(FieldNamingPolicy.IDENTITY);
19+
20+
public NearestRoadsApiRequest(GeoApiContext context) {
21+
super(context, NEAREST_ROADS_API_CONFIG, RoadsResponse.class);
22+
}
23+
24+
@Override
25+
protected void validateRequest() {
26+
if (!params().containsKey("points")) {
27+
throw new IllegalArgumentException("Request must contain 'path");
28+
}
29+
}
30+
31+
/**
32+
* The points from which to snap to roads.
33+
*
34+
* @param points the point to be snapped
35+
* @return returns this {@link NearestRoadsApiRequest} for call chaining.
36+
*/
37+
public NearestRoadsApiRequest points(LatLng... points) {
38+
return param("points", StringJoin.join('|', points));
39+
}
40+
}

src/main/java/com/google/maps/RoadsApi.java

Lines changed: 19 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,12 @@
1515

1616
package com.google.maps;
1717

18-
import static com.google.maps.internal.StringJoin.join;
19-
20-
import com.google.gson.FieldNamingPolicy;
2118
import com.google.maps.errors.ApiError;
2219
import com.google.maps.errors.ApiException;
23-
import com.google.maps.internal.ApiConfig;
2420
import com.google.maps.internal.ApiResponse;
2521
import com.google.maps.model.LatLng;
2622
import com.google.maps.model.SnappedPoint;
27-
import com.google.maps.model.SnappedSpeedLimitResponse;
23+
import com.google.maps.model.SnappedSpeedLimitResult;
2824
import com.google.maps.model.SpeedLimit;
2925

3026
/**
@@ -37,24 +33,6 @@
3733
public class RoadsApi {
3834
static final String API_BASE_URL = "https://roads.googleapis.com";
3935

40-
static final ApiConfig SNAP_TO_ROADS_API_CONFIG =
41-
new ApiConfig("/v1/snapToRoads")
42-
.hostName(API_BASE_URL)
43-
.supportsClientId(false)
44-
.fieldNamingPolicy(FieldNamingPolicy.IDENTITY);
45-
46-
static final ApiConfig SPEEDS_API_CONFIG =
47-
new ApiConfig("/v1/speedLimits")
48-
.hostName(API_BASE_URL)
49-
.supportsClientId(false)
50-
.fieldNamingPolicy(FieldNamingPolicy.IDENTITY);
51-
52-
static final ApiConfig NEAREST_ROADS_API_CONFIG =
53-
new ApiConfig("/v1/nearestRoads")
54-
.hostName(API_BASE_URL)
55-
.supportsClientId(false)
56-
.fieldNamingPolicy(FieldNamingPolicy.IDENTITY);
57-
5836
private RoadsApi() {}
5937

6038
/**
@@ -63,10 +41,10 @@ private RoadsApi() {}
6341
*
6442
* @param context The {@link GeoApiContext} to make requests through.
6543
* @param path The collected GPS points as a path.
66-
* @return Returns the snapped points as a {@link PendingResult}.
44+
* @return Returns the {@code SnapToRoadsApiRequest} for call chaining
6745
*/
68-
public static PendingResult<SnappedPoint[]> snapToRoads(GeoApiContext context, LatLng... path) {
69-
return context.get(SNAP_TO_ROADS_API_CONFIG, RoadsResponse.class, "path", join('|', path));
46+
public static SnapToRoadsApiRequest snapToRoads(GeoApiContext context, LatLng... path) {
47+
return snapToRoads(context, false, path);
7048
}
7149

7250
/**
@@ -81,17 +59,11 @@ public static PendingResult<SnappedPoint[]> snapToRoads(GeoApiContext context, L
8159
* in a path that smoothly follows the geometry of the road, even around corners and through
8260
* tunnels.
8361
* @param path The path to be snapped.
84-
* @return Returns the snapped points as a {@link PendingResult}.
62+
* @return Returns the {@code SnapToRoadsApiRequest} for call chaining
8563
*/
86-
public static PendingResult<SnappedPoint[]> snapToRoads(
64+
public static SnapToRoadsApiRequest snapToRoads(
8765
GeoApiContext context, boolean interpolate, LatLng... path) {
88-
return context.get(
89-
SNAP_TO_ROADS_API_CONFIG,
90-
RoadsResponse.class,
91-
"path",
92-
join('|', path),
93-
"interpolate",
94-
String.valueOf(interpolate));
66+
return new SnapToRoadsApiRequest(context).path(path).interpolate(interpolate);
9567
}
9668

9769
/**
@@ -106,10 +78,10 @@ public static PendingResult<SnappedPoint[]> snapToRoads(
10678
*
10779
* @param context The {@link GeoApiContext} to make requests through.
10880
* @param path The collected GPS points as a path.
109-
* @return Returns the speed limits as a {@link PendingResult}.
81+
* @return a {@link SpeedLimitsApiRequest}
11082
*/
111-
public static PendingResult<SpeedLimit[]> speedLimits(GeoApiContext context, LatLng... path) {
112-
return context.get(SPEEDS_API_CONFIG, SpeedsResponse.class, "path", join('|', path));
83+
public static SpeedLimitsApiRequest speedLimits(GeoApiContext context, LatLng... path) {
84+
return new SpeedLimitsApiRequest(context).path(path);
11385
}
11486

11587
/**
@@ -125,29 +97,10 @@ public static PendingResult<SpeedLimit[]> speedLimits(GeoApiContext context, Lat
12597
* @param placeIds The Place ID of the road segment. Place IDs are returned by the {@link
12698
* #snapToRoads(GeoApiContext, com.google.maps.model.LatLng...)} method. You can pass up to
12799
* 100 placeIds with each request.
128-
* @return Returns the speed limits as a {@link PendingResult}.
100+
* @return a {@link SpeedLimitsApiRequest}
129101
*/
130-
public static PendingResult<SpeedLimit[]> speedLimits(GeoApiContext context, String... placeIds) {
131-
String[] placeParams = new String[2 * placeIds.length];
132-
int i = 0;
133-
for (String placeId : placeIds) {
134-
placeParams[i++] = "placeId";
135-
placeParams[i++] = placeId;
136-
}
137-
138-
return context.get(SPEEDS_API_CONFIG, SpeedsResponse.class, placeParams);
139-
}
140-
141-
/**
142-
* Returns the result of snapping the provided points to roads and retrieving the speed limits.
143-
*
144-
* @param context The {@link GeoApiContext} to make requests through.
145-
* @param path The collected GPS points as a path.
146-
* @return Returns the snapped points and speed limits as a {@link PendingResult}.
147-
*/
148-
public static PendingResult<SnappedSpeedLimitResponse> snappedSpeedLimits(
149-
GeoApiContext context, LatLng... path) {
150-
return context.get(SPEEDS_API_CONFIG, CombinedResponse.class, "path", join('|', path));
102+
public static SpeedLimitsApiRequest speedLimits(GeoApiContext context, String... placeIds) {
103+
return new SpeedLimitsApiRequest(context).placeIds(placeIds);
151104
}
152105

153106
/**
@@ -156,11 +109,10 @@ public static PendingResult<SnappedSpeedLimitResponse> snappedSpeedLimits(
156109
*
157110
* @param context The {@link GeoApiContext} to make requests through.
158111
* @param points The sequence of points to be aligned to nearest roads
159-
* @return Returns the snapped points as a {@link PendingResult}.
112+
* @return a {@link NearestRoadsApiRequest}
160113
*/
161-
public static PendingResult<SnappedPoint[]> nearestRoads(
162-
GeoApiContext context, LatLng... points) {
163-
return context.get(NEAREST_ROADS_API_CONFIG, RoadsResponse.class, "points", join('|', points));
114+
public static NearestRoadsApiRequest nearestRoads(GeoApiContext context, LatLng... points) {
115+
return new NearestRoadsApiRequest(context).points(points);
164116
}
165117

166118
public static class RoadsResponse implements ApiResponse<SnappedPoint[]> {
@@ -183,27 +135,7 @@ public ApiException getError() {
183135
}
184136
}
185137

186-
public static class SpeedsResponse implements ApiResponse<SpeedLimit[]> {
187-
private SpeedLimit[] speedLimits;
188-
private ApiError error;
189-
190-
@Override
191-
public boolean successful() {
192-
return error == null;
193-
}
194-
195-
@Override
196-
public SpeedLimit[] getResult() {
197-
return speedLimits;
198-
}
199-
200-
@Override
201-
public ApiException getError() {
202-
return ApiException.from(error.status, error.message);
203-
}
204-
}
205-
206-
public static class CombinedResponse implements ApiResponse<SnappedSpeedLimitResponse> {
138+
public static class SpeedLimitsResponse implements ApiResponse<SnappedSpeedLimitResult> {
207139
private SnappedPoint[] snappedPoints;
208140
private SpeedLimit[] speedLimits;
209141
private ApiError error;
@@ -214,8 +146,8 @@ public boolean successful() {
214146
}
215147

216148
@Override
217-
public SnappedSpeedLimitResponse getResult() {
218-
SnappedSpeedLimitResponse response = new SnappedSpeedLimitResponse();
149+
public SnappedSpeedLimitResult getResult() {
150+
SnappedSpeedLimitResult response = new SnappedSpeedLimitResult();
219151
response.snappedPoints = snappedPoints;
220152
response.speedLimits = speedLimits;
221153
return response;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.google.maps;
2+
3+
import com.google.gson.FieldNamingPolicy;
4+
import com.google.maps.RoadsApi.RoadsResponse;
5+
import com.google.maps.internal.ApiConfig;
6+
import com.google.maps.internal.StringJoin;
7+
import com.google.maps.model.LatLng;
8+
import com.google.maps.model.SnappedPoint;
9+
10+
/** A request to the snap to roads API (part of Roads API). */
11+
public class SnapToRoadsApiRequest
12+
extends PendingResultBase<SnappedPoint[], SnapToRoadsApiRequest, RoadsResponse> {
13+
14+
private static final ApiConfig SNAP_TO_ROADS_API_CONFIG =
15+
new ApiConfig("/v1/snapToRoads")
16+
.hostName(RoadsApi.API_BASE_URL)
17+
.supportsClientId(false)
18+
.fieldNamingPolicy(FieldNamingPolicy.IDENTITY);
19+
20+
public SnapToRoadsApiRequest(GeoApiContext context) {
21+
super(context, SNAP_TO_ROADS_API_CONFIG, RoadsResponse.class);
22+
}
23+
24+
@Override
25+
protected void validateRequest() {
26+
if (!params().containsKey("path")) {
27+
throw new IllegalArgumentException("Request must contain 'path");
28+
}
29+
}
30+
31+
/**
32+
* The path from which to snap to roads.
33+
*
34+
* @param path the path to be snapped
35+
* @return returns this {@code SnapToRoadsApiRequest} for call chaining.
36+
*/
37+
public SnapToRoadsApiRequest path(LatLng... path) {
38+
return param("path", StringJoin.join('|', path));
39+
}
40+
41+
/**
42+
* Whether to interpolate a path to include all points forming the full road-geometry.
43+
*
44+
* @param interpolate if the points should be interpolated or not
45+
* @return returns this {@code SnapToRoadsApiRequest} for call chaining.
46+
*/
47+
public SnapToRoadsApiRequest interpolate(boolean interpolate) {
48+
return param("interpolate", String.valueOf(interpolate));
49+
}
50+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.google.maps;
2+
3+
import com.google.gson.FieldNamingPolicy;
4+
import com.google.maps.RoadsApi.SpeedLimitsResponse;
5+
import com.google.maps.internal.ApiConfig;
6+
import com.google.maps.internal.StringJoin;
7+
import com.google.maps.model.LatLng;
8+
import com.google.maps.model.SnappedSpeedLimitResult;
9+
10+
/** A request to the speed limits API (part of Roads API). */
11+
public class SpeedLimitsApiRequest
12+
extends PendingResultBase<SnappedSpeedLimitResult, SpeedLimitsApiRequest, SpeedLimitsResponse> {
13+
14+
private static final ApiConfig SPEEDS_API_CONFIG =
15+
new ApiConfig("/v1/speedLimits")
16+
.hostName(RoadsApi.API_BASE_URL)
17+
.supportsClientId(false)
18+
.fieldNamingPolicy(FieldNamingPolicy.IDENTITY);
19+
20+
public SpeedLimitsApiRequest(GeoApiContext context) {
21+
super(context, SPEEDS_API_CONFIG, SpeedLimitsResponse.class);
22+
}
23+
24+
@Override
25+
protected void validateRequest() {
26+
if (!params().containsKey("path") && !params().containsKey("placeId")) {
27+
throw new IllegalArgumentException("Request must contain either 'path' or 'placeId'");
28+
}
29+
}
30+
31+
/**
32+
* A list of up to 100 lat/long pairs representing a path.
33+
*
34+
* @param path the path
35+
* @return a {@code SpeedLimitsApiRequest} for call chaining.
36+
*/
37+
public SpeedLimitsApiRequest path(LatLng... path) {
38+
return param("path", StringJoin.join('|', path));
39+
}
40+
41+
/**
42+
* A list of place ID/s representing one or more road segments.
43+
*
44+
* @param placeIds the place ID/s
45+
* @return a {@code SpeedLimitsApiRequest} for call chaining.
46+
*/
47+
public SpeedLimitsApiRequest placeIds(String... placeIds) {
48+
for (String placeId : placeIds) {
49+
paramAddToList("placeId", placeId);
50+
}
51+
return this;
52+
}
53+
}

src/main/java/com/google/maps/model/SnappedSpeedLimitResponse.java renamed to src/main/java/com/google/maps/model/SnappedSpeedLimitResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import java.io.Serializable;
1919

2020
/** A combined snap-to-roads and speed limit response. */
21-
public class SnappedSpeedLimitResponse implements Serializable {
21+
public class SnappedSpeedLimitResult implements Serializable {
2222

2323
private static final long serialVersionUID = 1L;
2424

src/test/java/com/google/maps/RoadsApiIntegrationTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import com.google.maps.model.LatLng;
2525
import com.google.maps.model.SnappedPoint;
26-
import com.google.maps.model.SnappedSpeedLimitResponse;
26+
import com.google.maps.model.SnappedSpeedLimitResult;
2727
import com.google.maps.model.SpeedLimit;
2828
import java.util.Arrays;
2929
import org.junit.Test;
@@ -86,7 +86,8 @@ public void testSpeedLimitsWithLatLngs() throws Exception {
8686
new LatLng(-33.867841, 151.194137),
8787
new LatLng(-33.868224, 151.194116)
8888
};
89-
SpeedLimit[] speeds = RoadsApi.speedLimits(sc.context, path).await();
89+
SpeedLimitsApiRequest request = RoadsApi.speedLimits(sc.context, path);
90+
SpeedLimit[] speeds = request.await().speedLimits;
9091

9192
assertNotNull(Arrays.toString(speeds));
9293
assertEquals("/v1/speedLimits", sc.path());
@@ -113,7 +114,7 @@ public void testSpeedLimitsWithUsaLatLngs() throws Exception {
113114
new LatLng(33.773250, -84.388840),
114115
new LatLng(33.771991, -84.388840)
115116
};
116-
SpeedLimit[] speeds = RoadsApi.speedLimits(sc.context, path).await();
117+
SpeedLimit[] speeds = RoadsApi.speedLimits(sc.context, path).await().speedLimits;
117118

118119
assertNotNull(Arrays.toString(speeds));
119120
assertEquals("/v1/speedLimits", sc.path());
@@ -136,7 +137,7 @@ public void testSpeedLimitsWithPlaceIds() throws Exception {
136137
"ChIJyU-E2mEE9YgRftyNXxcfQYw",
137138
"ChIJc0BrC2EE9YgR71DvaFzNgrA"
138139
};
139-
SpeedLimit[] speeds = RoadsApi.speedLimits(sc.context, placeIds).await();
140+
SpeedLimit[] speeds = RoadsApi.speedLimits(sc.context, placeIds).await().speedLimits;
140141

141142
assertNotNull(Arrays.toString(speeds));
142143
assertEquals("/v1/speedLimits", sc.path());
@@ -162,7 +163,7 @@ public void testSnappedSpeedLimitRequest() throws Exception {
162163
new LatLng(-33.867841, 151.194137),
163164
new LatLng(-33.868224, 151.194116)
164165
};
165-
SnappedSpeedLimitResponse response = RoadsApi.snappedSpeedLimits(sc.context, path).await();
166+
SnappedSpeedLimitResult response = RoadsApi.speedLimits(sc.context, path).await();
166167

167168
assertNotNull(response.toString());
168169
assertEquals("/v1/speedLimits", sc.path());

0 commit comments

Comments
 (0)