Skip to content

Commit 3364b42

Browse files
authored
Allow request cancellation (#126)
* update http deps & return Call obj * update tests
1 parent 9fba5c4 commit 3364b42

File tree

8 files changed

+53
-39
lines changed

8 files changed

+53
-39
lines changed

library/build.gradle

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,10 @@ repositories {
7878
dependencies {
7979
compile 'com.android.support:appcompat-v7:25.1.0'
8080
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
81-
compile 'com.squareup.okhttp3:okhttp:3.5.0'
82-
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
83-
compile 'com.squareup.retrofit2:retrofit:2.1.0'
84-
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
85-
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
81+
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
82+
compile 'com.squareup.retrofit2:retrofit:2.3.0'
83+
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
84+
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
8685

8786
compile 'com.f2prateek.ln:ln:1.1.1'
8887
testCompile 'junit:junit:4.12'

library/src/main/java/com/mapzen/valhalla/HttpHandler.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@
22

33
import com.mapzen.http.Tls12OkHttpClientFactory;
44

5+
import com.google.gson.Gson;
6+
import com.google.gson.GsonBuilder;
7+
58
import java.io.IOException;
9+
import java.lang.annotation.Annotation;
10+
import java.lang.reflect.Type;
611

712
import okhttp3.Interceptor;
813
import okhttp3.OkHttpClient;
914
import okhttp3.Response;
1015
import okhttp3.logging.HttpLoggingInterceptor;
16+
import retrofit2.Call;
1117
import retrofit2.Callback;
18+
import retrofit2.Converter;
1219
import retrofit2.Retrofit;
1320
import retrofit2.converter.scalars.ScalarsConverterFactory;
1421

@@ -35,6 +42,10 @@ public class HttpHandler {
3542
}
3643
};
3744

45+
private Gson gson = new GsonBuilder()
46+
.registerTypeAdapter(JSON.Location.class, new LocationSerializer())
47+
.create();
48+
3849
public HttpHandler() {
3950
this(DEFAULT_URL, DEFAULT_LOG_LEVEL);
4051
}
@@ -65,12 +76,24 @@ protected void configure(String endpoint, HttpLoggingInterceptor.Level logLevel)
6576
.baseUrl(endpoint)
6677
.client(client)
6778
.addConverterFactory(ScalarsConverterFactory.create())
79+
.addConverterFactory(new Converter.Factory() {
80+
@Override public Converter<?, String> stringConverter(Type type, Annotation[] annotations,
81+
Retrofit retrofit) {
82+
return new Converter<Object, String>() {
83+
@Override public String convert(Object value) throws IOException {
84+
return gson.toJson(value);
85+
}
86+
};
87+
}
88+
})
6889
.build();
6990
this.service = new RestAdapterFactory(this.adapter).getRoutingService();
7091
}
7192

72-
public void requestRoute(String routeJson, Callback<String> callback) {
73-
service.getRoute(routeJson).enqueue(callback);
93+
public Call<String> requestRoute(JSON routeJson, Callback<String> callback) {
94+
Call call = service.getRoute(routeJson);
95+
call.enqueue(callback);
96+
return call;
7497
}
7598

7699
/**

library/src/main/java/com/mapzen/valhalla/Router.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.mapzen.valhalla
22

3+
import retrofit2.Call
4+
35
interface Router {
46

57
enum class Language(private val languageTag: String) {
@@ -56,6 +58,6 @@ interface Router {
5658
fun setDistanceUnits(units: DistanceUnits): Router
5759
fun clearLocations(): Router
5860
fun setCallback(callback: RouteCallback): Router
59-
fun fetch()
61+
fun fetch(): Call<String>?
6062
fun getJSONRequest(): JSON
6163
}

library/src/main/java/com/mapzen/valhalla/RoutingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
import retrofit2.Call;
66

77
public interface RoutingService {
8-
@GET("/route") Call<String> getRoute(@Query("json") String json);
8+
@GET("/route") Call<String> getRoute(@Query("json") JSON json);
99
}

library/src/main/java/com/mapzen/valhalla/ValhallaRouter.kt

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package com.mapzen.valhalla
22

3-
import com.google.gson.Gson
4-
import com.google.gson.GsonBuilder
53
import retrofit2.Call
64
import retrofit2.Callback
75
import retrofit2.Response
86
import java.net.MalformedURLException
97
import java.util.ArrayList
108
import java.util.Locale
119

12-
open class ValhallaRouter : Router, Runnable {
10+
open class ValhallaRouter : Router {
1311

1412
private var language: String? = null
1513
private var type = Router.Type.DRIVING
@@ -19,10 +17,6 @@ open class ValhallaRouter : Router, Runnable {
1917

2018
private var httpHandler: HttpHandler? = null
2119

22-
private val gson: Gson = GsonBuilder()
23-
.registerTypeAdapter(JSON.Location::class.java, LocationSerializer())
24-
.create()
25-
2620
override fun setHttpHandler(handler: HttpHandler): Router {
2721
httpHandler = handler
2822
return this
@@ -89,20 +83,12 @@ open class ValhallaRouter : Router, Runnable {
8983
return this
9084
}
9185

92-
override fun fetch() {
93-
if (callback == null) {
94-
return
95-
}
96-
Thread(this).start()
97-
}
98-
99-
override fun run() {
100-
var jsonString = gson.toJson(getJSONRequest()).toString()
101-
httpHandler?.requestRoute(jsonString, object: Callback<String> {
86+
override fun fetch(): Call<String>? {
87+
return httpHandler?.requestRoute(getJSONRequest(), object: Callback<String> {
10288
override fun onResponse(call: Call<String>?, response: Response<String>?) {
10389
if (response != null) {
104-
if (response.isSuccessful) {
105-
callback?.success(Route(response.body()))
90+
if (response.isSuccessful && response.body() != null) {
91+
response.body()?.let { callback?.success(Route(it)) }
10692
} else {
10793
callback?.failure(response.raw().code())
10894
}
@@ -119,8 +105,8 @@ open class ValhallaRouter : Router, Runnable {
119105
if (locations.size < 2) {
120106
throw MalformedURLException()
121107
}
122-
var json: JSON = JSON()
123-
for ( i in 0..(locations.size-1)){
108+
var json = JSON()
109+
for (i in 0..(locations.size-1)){
124110
json.locations.add(locations[i])
125111
}
126112

library/src/test/java/com/mapzen/valhalla/HttpHandlerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class HttpHandlerTest {
4646
.setLocation(new double[] { 40.671773, -73.981115 });
4747
RouteCallback callback = Mockito.mock(RouteCallback.class);
4848
router.setCallback(callback);
49-
((ValhallaRouter) router).run();
49+
router.fetch();
5050
assertThat(httpHandler.headersAdded).isTrue();
5151
}
5252
}

library/src/test/java/com/mapzen/valhalla/RouterTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ public void shouldGetRoute() throws Exception {
231231
.setLocation(new double[] { 40.659241, -73.983776 })
232232
.setLocation(new double[] { 40.671773, -73.981115 });
233233
router.setCallback(callback);
234-
((ValhallaRouter) router).run();
234+
router.fetch();
235235
Mockito.verify(callback).success(route.capture());
236236
assertThat(route.getValue().foundRoute()).isTrue();
237237
}
@@ -245,7 +245,7 @@ public void shouldGetError() throws Exception {
245245
.setLocation(new double[]{40.659241, -73.983776})
246246
.setLocation(new double[]{40.671773, -73.981115});
247247
router.setCallback(callback);
248-
((ValhallaRouter) router).run();
248+
router.fetch();
249249
Mockito.verify(callback).failure(statusCode.capture());
250250
assertThat(statusCode.getValue()).isEqualTo(500);
251251
}
@@ -259,7 +259,7 @@ public void shouldGetNotFound() throws Exception {
259259
.setLocation(new double[]{40.659241, -73.983776})
260260
.setLocation(new double[]{40.671773, -73.981115});
261261
router.setCallback(callback);
262-
((ValhallaRouter) router).run();
262+
router.fetch();
263263
Mockito.verify(callback).failure(statusCode.capture());
264264
assertThat(statusCode.getValue()).isEqualTo(404);
265265
}
@@ -273,7 +273,7 @@ public void shouldGetRouteNotFound() throws Exception {
273273
.setLocation(new double[] { 40.659241, -73.983776 })
274274
.setLocation(new double[] { 40.671773, -73.981115 });
275275
router.setCallback(callback);
276-
((ValhallaRouter) router).run();
276+
router.fetch();
277277
Mockito.verify(callback).failure(statusCode.capture());
278278
assertThat(statusCode.getValue()).isEqualTo(400);
279279
}
@@ -288,7 +288,7 @@ public void shouldStoreRawRoute() throws Exception {
288288
.setLocation(new double[] { 40.659241, -73.983776 })
289289
.setLocation(new double[] { 40.671773, -73.981115 });
290290
router.setCallback(callback);
291-
((ValhallaRouter) router).run();
291+
router.fetch();
292292
Mockito.verify(callback).success(route.capture());
293293
assertThat(route.getValue().getRawRoute().toString())
294294
.isEqualTo(new JSONObject(routeJson).toString());
@@ -357,7 +357,7 @@ public void setEndpoint_shouldUpdateBaseRequestUrl() throws Exception {
357357
.setHttpHandler(httpHandler)
358358
.setLocation(new double[] { 40.659241, -73.983776 })
359359
.setLocation(new double[] { 40.671773, -73.981115 });
360-
((ValhallaRouter) router).run();
360+
router.fetch();
361361
assertThat(httpHandler.route.raw().request().url().toString()).contains(endpoint);
362362
}
363363

library/src/test/java/com/mapzen/valhalla/TestHttpHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import okhttp3.Interceptor;
66
import okhttp3.logging.HttpLoggingInterceptor;
7+
import retrofit2.Call;
78
import retrofit2.Callback;
89
import retrofit2.Response;
910

@@ -18,13 +19,16 @@ class TestHttpHandler extends HttpHandler {
1819
super(endpoint, logLevel);
1920
}
2021

21-
@Override public void requestRoute(String routeJson, Callback<String> callback) {
22+
@Override public Call requestRoute(JSON routeJson, Callback<String> callback) {
23+
Call call = null;
2224
try {
23-
route = service.getRoute(routeJson).execute();
25+
call = service.getRoute(routeJson);
26+
route = call.execute();
2427
} catch (IOException e) {
2528
e.printStackTrace();
2629
}
2730
callback.onResponse(null, route);
31+
return call;
2832
}
2933

3034
@Override protected okhttp3.Response onRequest(Interceptor.Chain chain) throws IOException {

0 commit comments

Comments
 (0)