Skip to content

Commit bf93f44

Browse files
authored
Provide top level methods to set custom http handlers (#446)
1 parent 0b21687 commit bf93f44

File tree

11 files changed

+185
-23
lines changed

11 files changed

+185
-23
lines changed

config/checkstyle/checkstyle-suppressions.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@
2222
<suppress checks="ParameterNumberCheck" files="src/main/java/com/mapzen/android/graphics/MapReadyInitializer.java"/>
2323
<suppress checks="ParameterNumberCheck" files="src/main/java/com/mapzen/android/graphics/model/MarkerManager.java"/>
2424
<suppress checks="ParameterNumberCheck" files="src/main/java/com/mapzen/android/graphics/model/BitmapMarkerManager.java"/>
25+
<suppress checks="[a-zA-Z0-9]*" files="src/main/java/com/mapzen/android/routing/MapzenRouterHttpHandler"/>
2526
</suppressions>

core/src/main/java/com/mapzen/android/core/GenericHttpHandler.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,65 @@ public interface GenericHttpHandler {
1212
String HEADER_USER_AGENT = "User-Agent";
1313
String USER_AGENT = "android-sdk;" + MapzenManager.getSdkVersion() + ";" + Build.VERSION.RELEASE;
1414

15+
/**
16+
* Log levels for http requests.
17+
*/
18+
enum LogLevel {
19+
/** No logs. */
20+
NONE,
21+
/**
22+
* Logs request and response lines.
23+
*
24+
* <p>Example:
25+
* <pre>{@code
26+
* --> POST /greeting http/1.1 (3-byte body)
27+
*
28+
* <-- 200 OK (22ms, 6-byte body)
29+
* }</pre>
30+
*/
31+
BASIC,
32+
/**
33+
* Logs request and response lines and their respective headers.
34+
*
35+
* <p>Example:
36+
* <pre>{@code
37+
* --> POST /greeting http/1.1
38+
* Host: example.com
39+
* Content-Type: plain/text
40+
* Content-Length: 3
41+
* --> END POST
42+
*
43+
* <-- 200 OK (22ms)
44+
* Content-Type: plain/text
45+
* Content-Length: 6
46+
* <-- END HTTP
47+
* }</pre>
48+
*/
49+
HEADERS,
50+
/**
51+
* Logs request and response lines and their respective headers and bodies (if present).
52+
*
53+
* <p>Example:
54+
* <pre>{@code
55+
* --> POST /greeting http/1.1
56+
* Host: example.com
57+
* Content-Type: plain/text
58+
* Content-Length: 3
59+
*
60+
* Hi?
61+
* --> END POST
62+
*
63+
* <-- 200 OK (22ms)
64+
* Content-Type: plain/text
65+
* Content-Length: 6
66+
*
67+
* Hello!
68+
* <-- END HTTP
69+
* }</pre>
70+
*/
71+
BODY
72+
}
73+
1574
/**
1675
* Return query parameters to be appended to every request.
1776
* @return

core/src/main/java/com/mapzen/android/graphics/MapzenMap.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,14 @@ public void setOverlaysEnabled(boolean transitOverlayEnabled, boolean bikeOverla
931931
mapController.updateSceneAsync(updates);
932932
}
933933

934+
/**
935+
* Sets the object used to add query parameters and headers to each request.
936+
* @param handler
937+
*/
938+
public void setHttpHandler(MapzenMapHttpHandler handler) {
939+
mapController.setHttpHandler(handler.httpHandler());
940+
}
941+
934942
/**
935943
* Restores all aspects of the map EXCEPT the style, this is restored in the
936944
* {@link MapInitializer}.

core/src/main/java/com/mapzen/android/search/MapzenSearch.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ public void setLocationProvider(PeliasLocationProvider locationProvider) {
129129
internalSearch.setLocationProvider(locationProvider);
130130
}
131131

132+
/**
133+
* Sets the router's http handler for adding custom headers and parameters to
134+
* requests.
135+
* @param handler
136+
*/
137+
public void setHttpHandler(MapzenSearchHttpHandler handler) {
138+
internalSearch.setRequestHandler(handler.searchHandler());
139+
}
140+
132141
/**
133142
* Return the underlying {@link Pelias} object.
134143
* @return

core/src/test/java/com/mapzen/android/graphics/MapzenMapTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.mapzen.android.graphics.model.Polygon;
1111
import com.mapzen.android.graphics.model.Polyline;
1212
import com.mapzen.android.graphics.model.WalkaboutStyle;
13+
import com.mapzen.tangram.HttpHandler;
1314
import com.mapzen.tangram.LabelPickResult;
1415
import com.mapzen.tangram.LngLat;
1516
import com.mapzen.tangram.MapController;
@@ -709,6 +710,14 @@ public void applySceneUpdates_shouldClearQueuedUpdates() throws Exception {
709710
verify(bitmapMarkerManager).restoreMarkers();
710711
}
711712

713+
@Test public void setHttpHandler_shouldCallMapController() throws Exception {
714+
MapzenMapHttpHandler mapzenMapHandler = mock(MapzenMapHttpHandler.class);
715+
HttpHandler handler = mock(HttpHandler.class);
716+
when(mapzenMapHandler.httpHandler()).thenReturn(handler);
717+
map.setHttpHandler(mapzenMapHandler);
718+
verify(mapController).setHttpHandler(handler);
719+
}
720+
712721
public class TestRotateResponder implements TouchInput.RotateResponder {
713722

714723
boolean rotated = false;

core/src/test/java/com/mapzen/android/search/MapzenSearchTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static org.assertj.core.api.Assertions.assertThat;
1717
import static org.mockito.Mockito.mock;
1818
import static org.mockito.Mockito.verify;
19+
import static org.mockito.Mockito.when;
1920
import retrofit2.Call;
2021
import retrofit2.Callback;
2122
import retrofit2.Response;
@@ -85,6 +86,15 @@ public class MapzenSearchTest {
8586
verify(search.getPelias()).setLocationProvider(provider);
8687
}
8788

89+
@Test public void setHttpHandler_shouldCallInternalSearch() throws Exception {
90+
MapzenSearchHttpHandler mapzenSearchHandler = mock(MapzenSearchHttpHandler.class);
91+
MapzenSearchHttpHandler.SearchRequestHandler handler = mock(
92+
MapzenSearchHttpHandler.SearchRequestHandler.class);
93+
when(mapzenSearchHandler.searchHandler()).thenReturn(handler);
94+
search.setHttpHandler(mapzenSearchHandler);
95+
verify(search.getPelias()).setRequestHandler(handler);
96+
}
97+
8898
private class TestCallback implements Callback<Result> {
8999
@Override public void onResponse(Call<Result> call, Response<Result> response) {
90100
}

mapzen-android-sdk/src/main/java/com/mapzen/android/routing/MapzenRouter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ public MapzenRouter clearLocations() {
150150
return this;
151151
}
152152

153+
/**
154+
* Sets the router's http handler for adding custom headers and parameters to
155+
* requests.
156+
* @param handler
157+
*/
158+
public void setHttpHandler(MapzenRouterHttpHandler handler) {
159+
internalRouter.setHttpHandler(handler.turnByTurnHandler());
160+
}
161+
153162
public Router getRouter() {
154163
return internalRouter;
155164
}

mapzen-android-sdk/src/main/java/com/mapzen/android/routing/MapzenRouterHttpHandler.java

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
import java.util.HashMap;
88
import java.util.Map;
99

10+
import static com.mapzen.android.core.GenericHttpHandler.LogLevel.BASIC;
11+
import static com.mapzen.android.core.GenericHttpHandler.LogLevel.BODY;
12+
import static com.mapzen.android.core.GenericHttpHandler.LogLevel.HEADERS;
13+
import static com.mapzen.android.core.GenericHttpHandler.LogLevel.NONE;
1014
import okhttp3.HttpUrl;
1115
import okhttp3.Interceptor;
1216
import okhttp3.Request;
@@ -18,14 +22,23 @@
1822
*/
1923
public abstract class MapzenRouterHttpHandler implements GenericHttpHandler {
2024

25+
public static final String DEFAULT_URL = "https://valhalla.mapzen.com/";
26+
public static final LogLevel DEFAULT_LOG_LEVEL = MapzenRouterHttpHandler.getDefaultLogLevel();
2127
private TurnByTurnHttpHandler handler;
2228
ChainProceder chainProceder = new ChainProceder();
2329

2430
/**
2531
* Construct handler with default url and log levels.
2632
*/
2733
public MapzenRouterHttpHandler() {
28-
handler = new TurnByTurnHttpHandler(HttpLoggingInterceptor.Level.BODY);
34+
handler = new TurnByTurnHttpHandler(DEFAULT_URL, DEFAULT_LOG_LEVEL);
35+
}
36+
37+
/**
38+
* Construct handler with custom url and log levels.
39+
*/
40+
public MapzenRouterHttpHandler(String url, LogLevel logLevel) {
41+
handler = new TurnByTurnHttpHandler(url, logLevel);
2942
}
3043

3144
/**
@@ -36,6 +49,10 @@ TurnByTurnHttpHandler turnByTurnHandler() {
3649
return handler;
3750
}
3851

52+
private static LogLevel getDefaultLogLevel() {
53+
return BASIC;
54+
}
55+
3956
/**
4057
* Handles appending api keys for all turn-by-turn requests.
4158
*/
@@ -45,32 +62,20 @@ class TurnByTurnHttpHandler extends HttpHandler {
4562

4663
private String apiKey;
4764

48-
/**
49-
* Construct handler with default url and log levels.
50-
*/
51-
public TurnByTurnHttpHandler() {
52-
configure(DEFAULT_URL, DEFAULT_LOG_LEVEL);
53-
}
54-
55-
/**
56-
* Construct handler with url and default log levels.
57-
*/
58-
public TurnByTurnHttpHandler(String endpoint) {
59-
configure(endpoint, DEFAULT_LOG_LEVEL);
60-
}
61-
62-
/**
63-
* Construct handler with log levels and default url.
64-
*/
65-
public TurnByTurnHttpHandler(HttpLoggingInterceptor.Level logLevel) {
66-
configure(DEFAULT_URL, logLevel);
67-
}
65+
private final Map<LogLevel, HttpLoggingInterceptor.Level> TO_INTERNAL_LEVEL = new HashMap() {
66+
{
67+
put(NONE, HttpLoggingInterceptor.Level.NONE);
68+
put(BASIC, HttpLoggingInterceptor.Level.BASIC);
69+
put(HEADERS, HttpLoggingInterceptor.Level.HEADERS);
70+
put(BODY, HttpLoggingInterceptor.Level.BODY);
71+
}
72+
};
6873

6974
/**
7075
* Construct handler with url and log levels.
7176
*/
72-
public TurnByTurnHttpHandler(String endpoint, HttpLoggingInterceptor.Level logLevel) {
73-
configure(endpoint, logLevel);
77+
public TurnByTurnHttpHandler(String endpoint, LogLevel logLevel) {
78+
configure(endpoint, TO_INTERNAL_LEVEL.get(logLevel));
7479
}
7580

7681
/**

mapzen-android-sdk/src/test/java/com/mapzen/android/routing/MapzenRouterHttpHandlerTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.mapzen.android.routing;
22

3+
import com.mapzen.android.core.GenericHttpHandler;
4+
import com.mapzen.valhalla.TestHttpHandlerHelper;
5+
36
import org.junit.Test;
47

58
import java.util.HashMap;
@@ -9,6 +12,8 @@
912
import static com.mapzen.android.core.GenericHttpHandler.USER_AGENT;
1013
import static com.mapzen.android.routing.MapzenRouterHttpHandler.TurnByTurnHttpHandler.NAME_API_KEY;
1114
import okhttp3.Interceptor;
15+
import okhttp3.logging.HttpLoggingInterceptor;
16+
import static org.assertj.core.api.Assertions.assertThat;
1217
import static org.mockito.Mockito.mock;
1318
import static org.mockito.Mockito.verify;
1419

@@ -64,4 +69,22 @@ public class MapzenRouterHttpHandlerTest {
6469

6570
verify(proceder).proceed(chain, params, headers);
6671
}
72+
73+
@Test public void initWithCustomUrlAndLogLevelShouldCallConstructor() throws Exception {
74+
MapzenRouterHttpHandler handler = new MapzenRouterHttpHandler("http://test.com",
75+
GenericHttpHandler.LogLevel.BODY) {
76+
@Override public Map<String, String> queryParamsForRequest() {
77+
return null;
78+
}
79+
80+
@Override public Map<String, String> headersForRequest() {
81+
return null;
82+
}
83+
};
84+
String endpoint = TestHttpHandlerHelper.getEndpoint(handler.turnByTurnHandler());
85+
assertThat(endpoint).isEqualTo("http://test.com");
86+
HttpLoggingInterceptor.Level level = TestHttpHandlerHelper.getLogLevel(
87+
handler.turnByTurnHandler());
88+
assertThat(level).isEqualTo(HttpLoggingInterceptor.Level.BODY);
89+
}
6790
}

mapzen-android-sdk/src/test/java/com/mapzen/android/routing/MapzenRouterTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static org.assertj.core.api.Assertions.assertThat;
1717
import static org.mockito.Mockito.mock;
1818
import static org.mockito.Mockito.verify;
19+
import static org.mockito.Mockito.when;
1920

2021
public class MapzenRouterTest {
2122

@@ -96,6 +97,15 @@ public class MapzenRouterTest {
9697
assertThat(MapzenRouter.DistanceUnits.KILOMETERS.toString()).isEqualTo("kilometers");
9798
}
9899

100+
@Test public void setHttpHandler_shouldCallInternalRouter() throws Exception {
101+
MapzenRouterHttpHandler mapzenRouterHandler = mock(MapzenRouterHttpHandler.class);
102+
MapzenRouterHttpHandler.TurnByTurnHttpHandler handler = mock(
103+
MapzenRouterHttpHandler.TurnByTurnHttpHandler.class);
104+
when(mapzenRouterHandler.turnByTurnHandler()).thenReturn(handler);
105+
router.setHttpHandler(mapzenRouterHandler);
106+
verify(router.getRouter()).setHttpHandler(handler);
107+
}
108+
99109
class TestRouteCallback implements RouteCallback {
100110

101111
@Override public void success(Route route) {

0 commit comments

Comments
 (0)