Skip to content

Commit 30f299c

Browse files
authored
Pass error responses for Mapbox Directions and MapMatching (#963)
* Pass error responses in Callback#onResponse for Mapbox Directions and MapMatching * Delete unneeded file
1 parent 9d971f7 commit 30f299c

4 files changed

Lines changed: 186 additions & 235 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.mapbox.api.directions.v5;
2+
3+
import com.mapbox.api.directions.v5.models.DirectionsResponse;
4+
import com.mapbox.api.directions.v5.models.DirectionsRoute;
5+
import com.mapbox.api.directions.v5.models.RouteOptions;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
import retrofit2.Response;
11+
12+
class DirectionsResponseFactory {
13+
14+
private final MapboxDirections mapboxDirections;
15+
16+
DirectionsResponseFactory(MapboxDirections mapboxDirections) {
17+
this.mapboxDirections = mapboxDirections;
18+
}
19+
20+
Response<DirectionsResponse> generate(Response<DirectionsResponse> response) {
21+
if (isNotSuccessful(response)) {
22+
return response;
23+
} else {
24+
return Response.success(
25+
response
26+
.body()
27+
.toBuilder()
28+
.routes(generateRouteOptions(response))
29+
.build(),
30+
new okhttp3.Response.Builder()
31+
.code(200)
32+
.message("OK")
33+
.protocol(response.raw().protocol())
34+
.headers(response.headers())
35+
.request(response.raw().request())
36+
.build());
37+
}
38+
}
39+
40+
private boolean isNotSuccessful(Response<DirectionsResponse> response) {
41+
return !response.isSuccessful()
42+
|| response.body() == null
43+
|| response.body().routes().isEmpty();
44+
}
45+
46+
private List<DirectionsRoute> generateRouteOptions(Response<DirectionsResponse> response) {
47+
List<DirectionsRoute> routes = response.body().routes();
48+
List<DirectionsRoute> modifiedRoutes = new ArrayList<>();
49+
for (DirectionsRoute route : routes) {
50+
modifiedRoutes.add(route.toBuilder().routeOptions(
51+
RouteOptions.builder()
52+
.profile(mapboxDirections.profile())
53+
.coordinates(mapboxDirections.coordinates())
54+
.waypointIndices(mapboxDirections.waypointIndices())
55+
.waypointNames(mapboxDirections.waypointNames())
56+
.waypointTargets(mapboxDirections.waypointTargets())
57+
.continueStraight(mapboxDirections.continueStraight())
58+
.annotations(mapboxDirections.annotation())
59+
.approaches(mapboxDirections.approaches())
60+
.bearings(mapboxDirections.bearing())
61+
.alternatives(mapboxDirections.alternatives())
62+
.language(mapboxDirections.language())
63+
.radiuses(mapboxDirections.radius())
64+
.user(mapboxDirections.user())
65+
.voiceInstructions(mapboxDirections.voiceInstructions())
66+
.bannerInstructions(mapboxDirections.bannerInstructions())
67+
.roundaboutExits(mapboxDirections.roundaboutExits())
68+
.geometries(mapboxDirections.geometries())
69+
.overview(mapboxDirections.overview())
70+
.steps(mapboxDirections.steps())
71+
.exclude(mapboxDirections.exclude())
72+
.voiceUnits(mapboxDirections.voiceUnits())
73+
.accessToken(mapboxDirections.accessToken())
74+
.requestUuid(response.body().uuid())
75+
.baseUrl(mapboxDirections.baseUrl())
76+
.build()
77+
).build());
78+
}
79+
return modifiedRoutes;
80+
}
81+
}

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

Lines changed: 5 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313
import com.mapbox.api.directions.v5.DirectionsCriteria.OverviewCriteria;
1414
import com.mapbox.api.directions.v5.DirectionsCriteria.ProfileCriteria;
1515
import com.mapbox.api.directions.v5.DirectionsCriteria.VoiceUnitCriteria;
16-
import com.mapbox.api.directions.v5.models.DirectionsError;
1716
import com.mapbox.api.directions.v5.models.DirectionsResponse;
18-
import com.mapbox.api.directions.v5.models.DirectionsRoute;
1917
import com.mapbox.api.directions.v5.models.RouteLeg;
20-
import com.mapbox.api.directions.v5.models.RouteOptions;
2118
import com.mapbox.core.MapboxService;
2219
import com.mapbox.core.constants.Constants;
2320
import com.mapbox.core.exceptions.ServicesException;
@@ -27,21 +24,16 @@
2724
import com.mapbox.geojson.Point;
2825

2926
import java.io.IOException;
30-
import java.lang.annotation.Annotation;
3127
import java.util.ArrayList;
3228
import java.util.List;
3329
import java.util.Locale;
34-
import java.util.logging.Level;
35-
import java.util.logging.Logger;
3630

3731
import okhttp3.EventListener;
3832
import okhttp3.Interceptor;
3933
import okhttp3.OkHttpClient;
40-
import okhttp3.ResponseBody;
4134
import okhttp3.logging.HttpLoggingInterceptor;
4235
import retrofit2.Call;
4336
import retrofit2.Callback;
44-
import retrofit2.Converter;
4537
import retrofit2.Response;
4638

4739
/**
@@ -114,26 +106,8 @@ protected GsonBuilder getGsonBuilder() {
114106
@Override
115107
public Response<DirectionsResponse> executeCall() throws IOException {
116108
Response<DirectionsResponse> response = super.executeCall();
117-
if (response.isSuccessful()) {
118-
if (response.body() != null && !response.body().routes().isEmpty()) {
119-
return Response.success(
120-
response.body()
121-
.toBuilder()
122-
.routes(generateRouteOptions(response))
123-
.build(),
124-
new okhttp3.Response.Builder()
125-
.code(200)
126-
.message("OK")
127-
.protocol(response.raw().protocol())
128-
.headers(response.headers())
129-
.request(response.raw().request())
130-
.build());
131-
}
132-
} else {
133-
errorDidOccur(null, response);
134-
}
135-
136-
return response;
109+
DirectionsResponseFactory factory = new DirectionsResponseFactory(this);
110+
return factory.generate(response);
137111
}
138112

139113
/**
@@ -149,33 +123,9 @@ public void enqueueCall(final Callback<DirectionsResponse> callback) {
149123
getCall().enqueue(new Callback<DirectionsResponse>() {
150124
@Override
151125
public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
152-
if (!response.isSuccessful()) {
153-
errorDidOccur(callback, response);
154-
155-
} else if (callback != null) {
156-
if (response.body() == null || response.body().routes().isEmpty()) {
157-
// If null just pass the original object back since there's nothing to modify.
158-
callback.onResponse(call, response);
159-
160-
} else {
161-
Response<DirectionsResponse> newResponse =
162-
Response.success(
163-
response
164-
.body()
165-
.toBuilder()
166-
.routes(generateRouteOptions(response))
167-
.build(),
168-
new okhttp3.Response.Builder()
169-
.code(200)
170-
.message("OK")
171-
.protocol(response.raw().protocol())
172-
.headers(response.headers())
173-
.request(response.raw().request())
174-
.build());
175-
176-
callback.onResponse(call, newResponse);
177-
}
178-
}
126+
DirectionsResponseFactory factory = new DirectionsResponseFactory(MapboxDirections.this);
127+
Response<DirectionsResponse> generatedResponse = factory.generate(response);
128+
callback.onResponse(call, generatedResponse);
179129
}
180130

181131
@Override
@@ -208,61 +158,6 @@ protected synchronized OkHttpClient getOkHttpClient() {
208158
return okHttpClient;
209159
}
210160

211-
private void errorDidOccur(@Nullable Callback<DirectionsResponse> callback,
212-
@NonNull Response<DirectionsResponse> response) {
213-
// Response gave an error, we try to LOGGER any messages into the LOGGER here.
214-
Converter<ResponseBody, DirectionsError> errorConverter =
215-
getRetrofit().responseBodyConverter(DirectionsError.class, new Annotation[0]);
216-
if (callback == null) {
217-
Logger.getLogger(MapboxDirections.class.getName()).log(
218-
Level.WARNING, "Failed to complete your request and callback is null");
219-
} else {
220-
try {
221-
callback.onFailure(getCall(),
222-
new Throwable(errorConverter.convert(response.errorBody()).message()));
223-
} catch (IOException ioException) {
224-
Logger.getLogger(MapboxDirections.class.getName()).log(
225-
Level.WARNING, "Failed to complete your request. ", ioException);
226-
}
227-
}
228-
}
229-
230-
private List<DirectionsRoute> generateRouteOptions(Response<DirectionsResponse> response) {
231-
List<DirectionsRoute> routes = response.body().routes();
232-
List<DirectionsRoute> modifiedRoutes = new ArrayList<>();
233-
for (DirectionsRoute route : routes) {
234-
modifiedRoutes.add(route.toBuilder().routeOptions(
235-
RouteOptions.builder()
236-
.profile(profile())
237-
.coordinates(coordinates())
238-
.waypointIndices(waypointIndices())
239-
.waypointNames(waypointNames())
240-
.waypointTargets(waypointTargets())
241-
.continueStraight(continueStraight())
242-
.annotations(annotation())
243-
.approaches(approaches())
244-
.bearings(bearing())
245-
.alternatives(alternatives())
246-
.language(language())
247-
.radiuses(radius())
248-
.user(user())
249-
.voiceInstructions(voiceInstructions())
250-
.bannerInstructions(bannerInstructions())
251-
.roundaboutExits(roundaboutExits())
252-
.geometries(geometries())
253-
.overview(overview())
254-
.steps(steps())
255-
.exclude(exclude())
256-
.voiceUnits(voiceUnits())
257-
.accessToken(accessToken())
258-
.requestUuid(response.body().uuid())
259-
.baseUrl(baseUrl())
260-
.build()
261-
).build());
262-
}
263-
return modifiedRoutes;
264-
}
265-
266161
private static String formatCoordinates(List<Point> coordinates) {
267162
String[] coordinatesFormatted = new String[coordinates.size()];
268163
int index = 0;

0 commit comments

Comments
 (0)