Skip to content

Commit 0b0164f

Browse files
committed
NAVAND-713: publicly expose unrecognized properties
1 parent ff7fda7 commit 0b0164f

12 files changed

Lines changed: 3404 additions & 17 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
Mapbox welcomes participation and contributions from everyone.
44

55
### main
6+
- Added `getUnrecognizedJsonProperties()` method to `DirectionsRefreshJsonObject` so that unrecognized properties can be received from refresh response.
7+
- Added `DirectionsRefreshJsonObject.Builder#unrecognizedJsonProperties`. [#1500](https://github.com/mapbox/mapbox-java/pull/1500)
8+
- Added `getUnrecognizedJsonProperties()` method to `DirectionsJsonObject` so that a map of unrecognized properties can be received from route response.
9+
- Added `DirectionsJsonObject.Builder#unrecognizedJsonProperties`. [#1500](https://github.com/mapbox/mapbox-java/pull/1500)
610

711
### v6.8.0 - September 29, 2022
812
- Replaced `TurfSimplify#simplify` with `TurfTransformation#simplify`. [#1496](https://github.com/mapbox/mapbox-java/pull/1496)

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

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
import com.google.gson.GsonBuilder;
66
import com.google.gson.JsonElement;
77
import com.mapbox.api.directions.v5.DirectionsAdapterFactory;
8-
import com.mapbox.geojson.Point;
9-
import com.mapbox.geojson.PointAsCoordinatesTypeAdapter;
8+
import com.mapbox.api.directions.v5.utils.UnrecognizedPropertiesUtils;
109
import com.mapbox.auto.value.gson.SerializableJsonElement;
1110
import com.mapbox.auto.value.gson.UnrecognizedJsonProperties;
11+
import com.mapbox.geojson.Point;
12+
import com.mapbox.geojson.PointAsCoordinatesTypeAdapter;
1213

1314
import java.io.Serializable;
1415
import java.util.Collections;
@@ -89,12 +90,44 @@ public final Set<String> getUnrecognizedPropertiesNames() {
8990
return result;
9091
}
9192

93+
/**
94+
* Use this method to get JSON properties that weren't recognized during JSON
95+
* serialization by the model. This may be useful to access experimental API properties.
96+
* When an experimental API property becomes stable,
97+
* it will eventually have static field in a model introduced
98+
* and it won't be available via this dynamic method anymore.
99+
*
100+
* See
101+
* <a href="https://docs.mapbox.com/api/navigation/directions/">Directions API documentation</a>
102+
* for available experimental fields.
103+
*
104+
* @return unrecognized JSON properties
105+
*/
106+
@Nullable
107+
public final Map<String, JsonElement> getUnrecognizedJsonProperties() {
108+
return UnrecognizedPropertiesUtils.fromSerializableProperties(unrecognized());
109+
}
110+
92111
@Nullable
93112
@UnrecognizedJsonProperties
94113
abstract Map<String, SerializableJsonElement> unrecognized();
95114

96115
abstract static class Builder<T extends Builder> {
97116
@NonNull
98117
abstract T unrecognized(@Nullable Map<String, SerializableJsonElement> value);
118+
119+
/**
120+
* Use this method to add parameters which are not present in the model yet but are supported
121+
* on the Directions API side in the response.
122+
* Use it for experimental parameters.
123+
*
124+
* @param unrecognizedProperties parameters to add to request
125+
*/
126+
@NonNull
127+
public T unrecognizedJsonProperties(@Nullable Map<String, JsonElement> unrecognizedProperties) {
128+
return unrecognized(
129+
UnrecognizedPropertiesUtils.toSerializableProperties(unrecognizedProperties)
130+
);
131+
}
99132
}
100133
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.mapbox.api.directions.v5.utils;
2+
3+
import androidx.annotation.Nullable;
4+
import com.google.gson.JsonElement;
5+
import com.mapbox.auto.value.gson.SerializableJsonElement;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
/**
11+
* Provides utility methods to work with unrecognized properties.
12+
*/
13+
public final class UnrecognizedPropertiesUtils {
14+
15+
/**
16+
* Converts unrecognized properties in form of Map&#60;String, SerializableJsonElement&#60;
17+
* to unrecognized properties in form of Map&#60;String, JsonElement&#60;.
18+
* @param unrecognizedProperties original map
19+
* @return converted map
20+
*/
21+
@Nullable
22+
public static Map<String, JsonElement> fromSerializableProperties(
23+
@Nullable Map<String, SerializableJsonElement> unrecognizedProperties
24+
) {
25+
if (unrecognizedProperties != null) {
26+
Map<String, JsonElement> result = new HashMap<>();
27+
for (String key : unrecognizedProperties.keySet()) {
28+
result.put(key, unrecognizedProperties.get(key).getElement());
29+
}
30+
return result;
31+
}
32+
return null;
33+
}
34+
35+
/**
36+
* Converts unrecognized properties in form of Map&#60;String, JsonElement&#60;.
37+
* to unrecognized properties in form of Map&#60;String, SerializableJsonElement&#60;.
38+
* @param unrecognizedProperties original map
39+
* @return converted map
40+
*/
41+
@Nullable
42+
public static Map<String, SerializableJsonElement> toSerializableProperties(
43+
@Nullable Map<String, JsonElement> unrecognizedProperties
44+
) {
45+
if (unrecognizedProperties != null) {
46+
Map<String, SerializableJsonElement> result = new HashMap<>();
47+
for (Map.Entry<String, JsonElement> entry : unrecognizedProperties.entrySet()) {
48+
result.put(entry.getKey(), new SerializableJsonElement(entry.getValue()));
49+
}
50+
return result;
51+
}
52+
return null;
53+
}
54+
}

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@
1010
import com.mapbox.geojson.Point;
1111

1212
import java.io.IOException;
13+
import java.util.Arrays;
14+
import java.util.Collections;
15+
import java.util.HashMap;
1316
import java.util.List;
1417

1518
import org.junit.Test;
1619

1720
import java.util.ArrayList;
21+
import java.util.Map;
1822
import java.util.Set;
1923

2024
import static com.mapbox.api.directions.v5.utils.MutateJsonUtil.mutateJson;
@@ -34,11 +38,41 @@ public class DirectionsResponseTest extends TestUtils {
3438

3539
@Test
3640
public void sanity() throws Exception {
41+
Metadata metadata = Metadata.builder().infoMap(Collections.singletonMap("aaa", "bbb")).build();
42+
List<DirectionsWaypoint> waypoints = Arrays.asList(
43+
DirectionsWaypoint
44+
.builder()
45+
.rawLocation(new double[0])
46+
.distance(9.8)
47+
.name("aaa")
48+
.build()
49+
);
50+
List<DirectionsRoute> routes = Arrays.asList(
51+
DirectionsRoute
52+
.builder()
53+
.distance(1.2)
54+
.duration(7.8)
55+
.build()
56+
);
57+
Map<String, JsonElement> unrecognizedProperties = Collections.singletonMap("ccc", new JsonPrimitive("ddd"));
3758
DirectionsResponse response = DirectionsResponse.builder()
3859
.code("100")
39-
.routes(new ArrayList<DirectionsRoute>())
60+
.routes(routes)
61+
.message("Message")
62+
.metadata(metadata)
63+
.uuid("uuid")
64+
.waypoints(waypoints)
65+
.unrecognizedJsonProperties(unrecognizedProperties)
4066
.build();
67+
4168
assertNotNull(response);
69+
assertEquals("100", response.code());
70+
assertEquals("Message", response.message());
71+
assertEquals(1, response.routes().size());
72+
assertEquals(metadata, response.metadata());
73+
assertEquals("uuid", response.uuid());
74+
assertEquals(waypoints, response.waypoints());
75+
assertEquals(unrecognizedProperties, response.getUnrecognizedJsonProperties());
4276
}
4377

4478
@Test
@@ -88,16 +122,33 @@ public void accessUnrecognizedProperties() throws Exception {
88122
assertNull(notExistingProperty);
89123
}
90124

125+
@Test
126+
public void accessUnrecognizedJsonProperties() throws Exception {
127+
JsonObject directionsResponseJson = readJsonObject(DIRECTIONS_V5_PRECISION6_FIXTURE_ARTIFICIAL_FIELDS);
128+
String unrecognizedPropertyName = "testUnrecognizedProperty";
129+
String unrecognizedPropertyValue = "test";
130+
directionsResponseJson.add(unrecognizedPropertyName, new JsonPrimitive(unrecognizedPropertyValue));
131+
Map<String, JsonElement> expected = new HashMap<>();
132+
expected.put(unrecognizedPropertyName, new JsonPrimitive(unrecognizedPropertyValue));
133+
DirectionsResponse response = DirectionsResponse.fromJson(directionsResponseJson.toString());
134+
135+
Map<String, JsonElement> actual = response.getUnrecognizedJsonProperties();
136+
137+
assertEquals(expected, actual);
138+
}
139+
91140
@Test
92141
public void noUnrecognizedProperties() throws Exception {
93142
JsonObject directionsResponseJson = readJsonObject(DIRECTIONS_V5_PRECISION6_FIXTURE_ARTIFICIAL_FIELDS);
94143
DirectionsResponse response = DirectionsResponse.fromJson(directionsResponseJson.toString());
95144

96145
JsonElement value = response.getUnrecognizedProperty("");
97146
Set<String> propertiesNames = response.getUnrecognizedPropertiesNames();
147+
Map<String, JsonElement> jsonProperties = response.getUnrecognizedJsonProperties();
98148

99149
assertNull(value);
100150
assertEquals(0, propertiesNames.size());
151+
assertNull(jsonProperties);
101152
}
102153

103154
@Test

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertNotNull;
55

6+
import com.google.gson.JsonElement;
7+
import com.google.gson.JsonPrimitive;
68
import com.mapbox.core.TestUtils;
79
import org.junit.Test;
810

911
import java.util.ArrayList;
1012
import java.util.Arrays;
13+
import java.util.HashMap;
1114
import java.util.List;
15+
import java.util.Map;
1216

1317
public class LegAnnotationTest extends TestUtils {
1418

@@ -20,12 +24,15 @@ public void sanity() throws Exception {
2024
.distance(new ArrayList<Double>())
2125
.duration(new ArrayList<Double>())
2226
.speed(new ArrayList<Double>())
27+
.unrecognizedJsonProperties(new HashMap<>())
2328
.build();
2429
assertNotNull(annotation);
2530
}
2631

2732
@Test
2833
public void testSerializable() throws Exception {
34+
Map<String, JsonElement> unrecognizedProperties = new HashMap<>();
35+
unrecognizedProperties.put("aaa", new JsonPrimitive("bbb"));
2936
List<Double> distance = new ArrayList<>();
3037
distance.add(20d);
3138
distance.add(40d);
@@ -36,13 +43,16 @@ public void testSerializable() throws Exception {
3643
.distance(distance)
3744
.duration(new ArrayList<Double>())
3845
.speed(new ArrayList<Double>())
46+
.unrecognizedJsonProperties(unrecognizedProperties)
3947
.build();
4048
byte[] serialized = TestUtils.serialize(annotation);
4149
assertEquals(annotation, deserialize(serialized, LegAnnotation.class));
4250
}
4351

4452
@Test
4553
public void testToFromJson1() {
54+
Map<String, JsonElement> unrecognizedProperties = new HashMap<>();
55+
unrecognizedProperties.put("aaa", new JsonPrimitive("bbb"));
4656

4757
List<Double> distanceList = Arrays.asList(
4858
4.294596842089401,
@@ -101,6 +111,7 @@ public void testToFromJson1() {
101111
.duration(durationList)
102112
.speed(speedList)
103113
.congestion(congestionList)
114+
.unrecognizedJsonProperties(unrecognizedProperties)
104115
.build();
105116

106117

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.mapbox.api.directions.v5.utils;
2+
3+
import com.google.gson.JsonElement;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.JsonPrimitive;
6+
import com.mapbox.auto.value.gson.SerializableJsonElement;
7+
import org.junit.Assert;
8+
import org.junit.Test;
9+
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
13+
public class UnrecognizedPropertiesUtilsTest {
14+
15+
@Test
16+
public void fromSerializableProperties_nullProperties() {
17+
Map<String, JsonElement> actual = UnrecognizedPropertiesUtils.fromSerializableProperties(null);
18+
Assert.assertNull(actual);
19+
}
20+
21+
@Test
22+
public void fromSerializableProperties_emptyProperties() {
23+
Map<String, JsonElement> actual = UnrecognizedPropertiesUtils.fromSerializableProperties(
24+
new HashMap<>()
25+
);
26+
Assert.assertEquals(0, actual.size());
27+
}
28+
29+
@Test
30+
public void fromSerializableProperties_hasProperties() {
31+
final JsonObject propertyValue = new JsonObject();
32+
propertyValue.add("key", new JsonPrimitive("value"));
33+
final Map<String, SerializableJsonElement> properties = new HashMap<>();
34+
properties.put("aaa", new SerializableJsonElement(propertyValue));
35+
properties.put("bbb", new SerializableJsonElement(new JsonObject()));
36+
Map<String, JsonElement> expected = new HashMap<>();
37+
expected.put("aaa", propertyValue);
38+
expected.put("bbb", new JsonObject());
39+
final Map<String, JsonElement> actual = UnrecognizedPropertiesUtils.fromSerializableProperties(
40+
properties
41+
);
42+
Assert.assertEquals(expected, actual);
43+
}
44+
45+
@Test
46+
public void toSerializableProperties_nullProperties() {
47+
Map<String, SerializableJsonElement> actual = UnrecognizedPropertiesUtils.toSerializableProperties(null);
48+
Assert.assertNull(actual);
49+
}
50+
51+
@Test
52+
public void toSerializableProperties_emptyProperties() {
53+
Map<String, SerializableJsonElement> actual = UnrecognizedPropertiesUtils.toSerializableProperties(
54+
new HashMap<>()
55+
);
56+
Assert.assertEquals(0, actual.size());
57+
}
58+
59+
@Test
60+
public void toSerializableProperties_hasProperties() {
61+
final JsonObject propertyValue = new JsonObject();
62+
propertyValue.add("key", new JsonPrimitive("value"));
63+
final Map<String, JsonElement> properties = new HashMap<>();
64+
properties.put("aaa", propertyValue);
65+
properties.put("bbb", new JsonObject());
66+
Map<String, SerializableJsonElement> expected = new HashMap<>();
67+
expected.put("aaa", new SerializableJsonElement(propertyValue));
68+
expected.put("bbb", new SerializableJsonElement(new JsonObject()));
69+
final Map<String, SerializableJsonElement> actual = UnrecognizedPropertiesUtils.toSerializableProperties(
70+
properties
71+
);
72+
Assert.assertEquals(expected, actual);
73+
}
74+
75+
}

0 commit comments

Comments
 (0)