Skip to content

Commit 33c942f

Browse files
committed
Improved handling of incorrect parameters and URI values
1 parent 5de8efb commit 33c942f

File tree

13 files changed

+172
-62
lines changed

13 files changed

+172
-62
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,11 @@ self-hosting this service.
351351

352352
## Release Notes
353353

354+
### 2.4.12.2
355+
356+
* Improved handling if incorrect coordinates and parameter values, producing a
357+
`HTTP 400 Bad Request` rather than `HTTP 404 Not Found`.
358+
354359
### 2.4.8.1 – 2.4.12.1
355360

356361
* Updated Mapcode library.

deployment/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<groupId>com.mapcode</groupId>
2525
<artifactId>mapcode-rest-service</artifactId>
26-
<version>2.4.12.1</version>
26+
<version>2.4.12.2</version>
2727
</parent>
2828

2929
<artifactId>deployment</artifactId>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<artifactId>mapcode-rest-service</artifactId>
2525

2626
<packaging>pom</packaging>
27-
<version>2.4.12.1</version>
27+
<version>2.4.12.2</version>
2828

2929
<name>Mapcode REST API Web Service</name>
3030
<description>

resources/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<groupId>com.mapcode</groupId>
2525
<artifactId>mapcode-rest-service</artifactId>
26-
<version>2.4.12.1</version>
26+
<version>2.4.12.2</version>
2727
</parent>
2828

2929
<artifactId>resources</artifactId>

service/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<groupId>com.mapcode</groupId>
2525
<artifactId>mapcode-rest-service</artifactId>
26-
<version>2.4.12.1</version>
26+
<version>2.4.12.2</version>
2727
</parent>
2828

2929
<artifactId>service</artifactId>

service/src/main/java/com/mapcode/services/MapcodeResource.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ void convertLatLonToMapcode(
7878
/**
7979
* Convert a lat/lon to one or more mapcodes. All possible mapcodes are returned.
8080
*
81-
* @param paramLatDeg Latitude. Range: [-90, 90].
82-
* @param paramLonDeg Longitude. Range: Any double, wrapped along the earth to [-180, 180].
83-
* @param paramPrecision Precision specifier; specifies additional mapcode digits. Range: [0, 2].
81+
* @param paramLatDegAsString Latitude. Range: [-90, 90].
82+
* @param paramLonDegAsString Longitude. Range: Any double, wrapped along the earth to [-180, 180].
83+
* @param paramPrecisionAsString Precision specifier; specifies additional mapcode digits. Range: [0, 2].
8484
* @param paramTerritory Specifies a territory context to create a local mapcode for. This is only useful for local mapcodes.
8585
* If the mapcode cannot be created for the territory, an exception is thrown.
8686
* Range: any valid territory code, alpha or numeric.
@@ -112,18 +112,18 @@ void convertLatLonToMapcode(
112112
value = "Latitude in degrees. Format: [-90, 90].",
113113
allowableValues = "range[-90,90]"
114114
)
115-
@PathParam(PARAM_LAT_DEG) double paramLatDeg,
115+
@PathParam(PARAM_LAT_DEG) @Nullable String paramLatDegAsString,
116116
@ApiParam(
117117
value = "Longitude in degrees. Format: [-180, 180) (other values are correctly wrapped).",
118118
allowableValues = "range[-180,180)"
119119
)
120-
@PathParam(PARAM_LON_DEG) double paramLonDeg,
120+
@PathParam(PARAM_LON_DEG) @Nullable String paramLonDegAsString,
121121
@ApiParam(
122122
value = "(optional) Additional precision for the mapcodes. This uses precision extension " +
123123
"characters, which are appended to a mapcode after a `-`.",
124124
allowableValues = "range[0,8]",
125125
defaultValue = "0")
126-
@QueryParam(PARAM_PRECISION) @DefaultValue("0") int paramPrecision,
126+
@QueryParam(PARAM_PRECISION) @DefaultValue("0") @Nullable String paramPrecisionAsString,
127127
@ApiParam(
128128
value = "(optional) Limit the returned mapcodes to this territory. This is useful if the territory " +
129129
"is already set by the context of the application (for example, you are only interested " +
@@ -157,11 +157,11 @@ void convertLatLonToMapcode(
157157
/**
158158
* Convert a lat/lon to one or more mapcodes.
159159
*
160-
* @param paramLatDeg Latitude. Range: [-90, 90].
161-
* @param paramLonDeg Longitude. Range: Any double, wrapped along the earth to [-180, 180].
160+
* @param paramLatDegAsString Latitude. Range: [-90, 90].
161+
* @param paramLonDegAsString Longitude. Range: Any double, wrapped along the earth to [-180, 180].
162162
* @param paramType Specifies whether to return only the shortest local, the international, or all mapcodes.
163163
* Range: {@link ParamType}, if null, no type is supplied.
164-
* @param paramPrecision Precision specifier; specifies additional mapcode digits. Range: [0, 2].
164+
* @param paramPrecisionAsString Precision specifier; specifies additional mapcode digits. Range: [0, 2].
165165
* @param paramTerritory Specifies a territory context to create a local mapcode for. This is only useful for local mapcodes.
166166
* If the mapcode cannot be created for the territory, an exception is thrown.
167167
* Range: any valid territory code, alpha or numeric.
@@ -183,10 +183,10 @@ void convertLatLonToMapcode(
183183
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
184184
@Path("codes/{" + PARAM_LAT_DEG + "},{" + PARAM_LON_DEG + "}/{" + PARAM_TYPE + '}')
185185
void convertLatLonToMapcode(
186-
@PathParam(PARAM_LAT_DEG) double paramLatDeg,
187-
@PathParam(PARAM_LON_DEG) double paramLonDeg,
186+
@PathParam(PARAM_LAT_DEG) @Nullable String paramLatDegAsString,
187+
@PathParam(PARAM_LON_DEG) @Nullable String paramLonDegAsString,
188188
@PathParam(PARAM_TYPE) @Nullable String paramType,
189-
@QueryParam(PARAM_PRECISION) @DefaultValue("0") int paramPrecision,
189+
@QueryParam(PARAM_PRECISION) @DefaultValue("0") @Nullable String paramPrecisionAsString,
190190
@QueryParam(PARAM_TERRITORY) @Nullable String paramTerritory,
191191
@QueryParam(PARAM_COUNTRY) @Nullable String paramCountry,
192192
@QueryParam(PARAM_CONTEXT) @Nullable String paramContextMustBeNull,

service/src/main/java/com/mapcode/services/OnlyJsonResource.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ void convertLatLonToMapcodeJson(
5353
@Produces(MediaType.APPLICATION_JSON)
5454
@Path("codes/{" + PARAM_LAT_DEG + "},{" + PARAM_LON_DEG + '}')
5555
void convertLatLonToMapcodeJson(
56-
@PathParam(PARAM_LAT_DEG) double paramLatDeg,
57-
@PathParam(PARAM_LON_DEG) double paramLonDeg,
58-
@QueryParam(PARAM_PRECISION) @DefaultValue("0") int paramPrecision,
56+
@PathParam(PARAM_LAT_DEG) @Nullable String paramLatDegAsString,
57+
@PathParam(PARAM_LON_DEG) @Nullable String paramLonDegAsString,
58+
@QueryParam(PARAM_PRECISION) @DefaultValue("0") @Nullable String paramPrecisionAsString,
5959
@QueryParam(PARAM_TERRITORY) @Nullable String paramTerritory,
6060
@QueryParam(PARAM_COUNTRY) @Nullable String paramCountry,
6161
@QueryParam(PARAM_CONTEXT) @Nullable String paramContextMustBeNull,
@@ -69,10 +69,10 @@ void convertLatLonToMapcodeJson(
6969
@Produces(MediaType.APPLICATION_JSON)
7070
@Path("codes/{" + PARAM_LAT_DEG + "},{" + PARAM_LON_DEG + "}/{" + PARAM_TYPE + '}')
7171
void convertLatLonToMapcodeJson(
72-
@PathParam(PARAM_LAT_DEG) double paramLatDeg,
73-
@PathParam(PARAM_LON_DEG) double paramLonDeg,
72+
@PathParam(PARAM_LAT_DEG) @Nullable String paramLatDegAsString,
73+
@PathParam(PARAM_LON_DEG) @Nullable String paramLonDegAsString,
7474
@PathParam(PARAM_TYPE) @Nullable String paramType,
75-
@QueryParam(PARAM_PRECISION) @DefaultValue("0") int paramPrecision,
75+
@QueryParam(PARAM_PRECISION) @DefaultValue("0") @Nullable String paramPrecisionAsString,
7676
@QueryParam(PARAM_TERRITORY) @Nullable String paramTerritory,
7777
@QueryParam(PARAM_COUNTRY) @Nullable String paramCountry,
7878
@QueryParam(PARAM_CONTEXT) @Nullable String paramContextMustBeNull,

service/src/main/java/com/mapcode/services/OnlyXmlResource.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ void convertLatLonToMapcodeXml(
5353
@Produces(MediaType.APPLICATION_XML)
5454
@Path("codes/{" + PARAM_LAT_DEG + "},{" + PARAM_LON_DEG + '}')
5555
void convertLatLonToMapcodeXml(
56-
@PathParam(PARAM_LAT_DEG) double paramLatDeg,
57-
@PathParam(PARAM_LON_DEG) double paramLonDeg,
58-
@QueryParam(PARAM_PRECISION) @DefaultValue("0") int paramPrecision,
56+
@PathParam(PARAM_LAT_DEG) @Nullable String paramLatDegAsString,
57+
@PathParam(PARAM_LON_DEG) @Nullable String paramLonDegAsString,
58+
@QueryParam(PARAM_PRECISION) @DefaultValue("0") @Nullable String paramPrecisionAsString,
5959
@QueryParam(PARAM_TERRITORY) @Nullable String paramTerritory,
6060
@QueryParam(PARAM_COUNTRY) @Nullable String paramCountry,
6161
@QueryParam(PARAM_CONTEXT) @Nullable String paramContextMustBeNull,
@@ -69,10 +69,10 @@ void convertLatLonToMapcodeXml(
6969
@Produces(MediaType.APPLICATION_XML)
7070
@Path("codes/{" + PARAM_LAT_DEG + "},{" + PARAM_LON_DEG + "}/{" + PARAM_TYPE + '}')
7171
void convertLatLonToMapcodeXml(
72-
@PathParam(PARAM_LAT_DEG) double paramLatDeg,
73-
@PathParam(PARAM_LON_DEG) double paramLonDeg,
72+
@PathParam(PARAM_LAT_DEG) @Nullable String paramLatDegAsString,
73+
@PathParam(PARAM_LON_DEG) @Nullable String paramLonDegAsString,
7474
@PathParam(PARAM_TYPE) @Nullable String paramType,
75-
@QueryParam(PARAM_PRECISION) @DefaultValue("0") int paramPrecision,
75+
@QueryParam(PARAM_PRECISION) @DefaultValue("0") @Nullable String paramPrecisionAsString,
7676
@QueryParam(PARAM_TERRITORY) @Nullable String paramTerritory,
7777
@QueryParam(PARAM_COUNTRY) @Nullable String paramCountry,
7878
@QueryParam(PARAM_CONTEXT) @Nullable String paramContextMustBeNull,

service/src/main/java/com/mapcode/services/implementation/MapcodeResourceImpl.java

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.tomtom.speedtools.tracer.Traceable;
3535
import com.tomtom.speedtools.tracer.TracerFactory;
3636
import com.tomtom.speedtools.utils.MathUtils;
37+
import com.tomtom.speedtools.utils.StringUtils;
3738
import org.apache.commons.text.StringEscapeUtils;
3839
import org.joda.time.DateTime;
3940
import org.slf4j.Logger;
@@ -105,9 +106,9 @@ public void convertLatLonToMapcode(
105106

106107
@Override
107108
public void convertLatLonToMapcode(
108-
final double paramLatDeg,
109-
final double paramLonDeg,
110-
final int paramPrecision,
109+
@Nullable final String paramLatDegAsString,
110+
@Nullable final String paramLonDegAsString,
111+
@Nullable final String paramPrecisionAsString,
111112
@Nullable final String paramTerritory,
112113
@Nullable final String paramCountry,
113114
@Nullable final String paramContextMustBeNull,
@@ -116,17 +117,17 @@ public void convertLatLonToMapcode(
116117
@Nonnull final String paramClient,
117118
@Nonnull final String paramAllowLog,
118119
@Nonnull final AsyncResponse response) throws ApiInvalidFormatException {
119-
convertLatLonToMapcode(paramLatDeg, paramLonDeg, null, paramPrecision, paramTerritory, paramCountry,
120+
convertLatLonToMapcode(paramLatDegAsString, paramLonDegAsString, null, paramPrecisionAsString, paramTerritory, paramCountry,
120121
paramContextMustBeNull, paramAlphabet, paramInclude, paramClient, paramAllowLog, response);
121122
}
122123

123124
@SuppressWarnings("NestedTryStatement")
124125
@Override
125126
public void convertLatLonToMapcode(
126-
final double paramLatDeg,
127-
final double paramLonDeg,
127+
@Nullable final String paramLatDegAsString,
128+
@Nullable final String paramLonDegAsString,
128129
@Nullable final String paramType,
129-
final int paramPrecision,
130+
@Nullable final String paramPrecisionAsString,
130131
@Nullable final String paramTerritory,
131132
@Nullable final String paramCountry,
132133
@Nullable final String paramContextMustBeNull,
@@ -142,7 +143,7 @@ public void convertLatLonToMapcode(
142143
final boolean allowLog = "true".equalsIgnoreCase(paramAllowLog);
143144

144145
LOG.info("convertLatLonToMapcode: lat={}, lon={}, precision={}, type={}, context={}, alphabet={}, include={}, client={}, allowLog={}",
145-
paramLatDeg, paramLonDeg, paramPrecision, paramType, paramTerritory, paramAlphabet, paramInclude, paramClient, paramAllowLog);
146+
paramLatDegAsString, paramLonDegAsString, paramPrecisionAsString, paramType, paramTerritory, paramAlphabet, paramInclude, paramClient, paramAllowLog);
146147
metricsCollector.addOneLatLonToMapcodeRequest(paramClient);
147148

148149
// Prevent 'context' from inadvertently being specified.
@@ -151,19 +152,35 @@ public void convertLatLonToMapcode(
151152
}
152153

153154
// Check lat range.
154-
final double latDeg = paramLatDeg;
155-
if (!MathUtils.isBetween(latDeg, ApiConstants.API_LAT_MIN, ApiConstants.API_LAT_MAX)) {
156-
throw new ApiInvalidFormatException(PARAM_LAT_DEG, String.valueOf(paramLatDeg),
155+
final double latDeg;
156+
try {
157+
latDeg = Double.valueOf(StringUtils.nullToEmpty(paramLatDegAsString));
158+
if (!MathUtils.isBetween(latDeg, ApiConstants.API_LAT_MIN, ApiConstants.API_LAT_MAX)) {
159+
throw new NumberFormatException(paramLatDegAsString);
160+
}
161+
} catch (final NumberFormatException e) {
162+
throw new ApiInvalidFormatException(PARAM_LAT_DEG, paramLatDegAsString,
157163
"[" + ApiConstants.API_LAT_MIN + ", " + ApiConstants.API_LAT_MAX + ']');
158164
}
159165

166+
160167
// Check lon range.
161-
final double lonDeg = Geo.mapToLon(paramLonDeg);
168+
final double lonDeg;
169+
try {
170+
lonDeg = Geo.mapToLon(Double.valueOf(StringUtils.nullToEmpty(paramLonDegAsString)));
171+
} catch (final NumberFormatException e) {
172+
throw new ApiInvalidFormatException(PARAM_LAT_DEG, paramLonDegAsString, "Double");
173+
}
162174

163175
// Check precision.
164-
final int precision = paramPrecision;
165-
if (!MathUtils.isBetween(precision, ApiConstants.API_PRECISION_MIN, ApiConstants.API_PRECISION_MAX)) {
166-
throw new ApiInvalidFormatException(PARAM_PRECISION, String.valueOf(paramPrecision), "[" + ApiConstants.API_PRECISION_MIN +
176+
final int precision;
177+
try {
178+
precision = Integer.valueOf(StringUtils.nullToEmpty(paramPrecisionAsString));
179+
if (!MathUtils.isBetween(precision, ApiConstants.API_PRECISION_MIN, ApiConstants.API_PRECISION_MAX)) {
180+
throw new NumberFormatException(paramPrecisionAsString);
181+
}
182+
} catch (final NumberFormatException e) {
183+
throw new ApiInvalidFormatException(PARAM_PRECISION, paramPrecisionAsString, "[" + ApiConstants.API_PRECISION_MIN +
167184
", " + ApiConstants.API_PRECISION_MAX + ']');
168185
}
169186

service/src/main/java/com/mapcode/services/implementation/OnlyJsonResourceImpl.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package com.mapcode.services.implementation;
1818

19-
import com.mapcode.services.OnlyJsonResource;
2019
import com.mapcode.services.MapcodeResource;
20+
import com.mapcode.services.OnlyJsonResource;
2121
import com.mapcode.services.RootResource;
2222
import com.tomtom.speedtools.apivalidation.exceptions.ApiIntegerOutOfRangeException;
2323
import com.tomtom.speedtools.apivalidation.exceptions.ApiInvalidFormatException;
@@ -60,9 +60,9 @@ public void getStatusJson(@Suspended @Nonnull final AsyncResponse response) {
6060

6161
@Override
6262
public void convertLatLonToMapcodeJson(
63-
final double paramLatDeg,
64-
final double paramLonDeg,
65-
final int paramPrecision,
63+
@Nullable final String paramLatDegAsString,
64+
@Nullable final String paramLonDegAsString,
65+
@Nullable final String paramPrecisionAsString,
6666
@Nullable final String paramTerritory,
6767
@Nullable final String paramCountry,
6868
@Nullable final String paramContextMustBeNull,
@@ -72,16 +72,16 @@ public void convertLatLonToMapcodeJson(
7272
@Nonnull final String paramAllowLog,
7373
@Suspended @Nonnull final AsyncResponse response)
7474
throws ApiInvalidFormatException {
75-
mapcodeResource.convertLatLonToMapcode(paramLatDeg, paramLonDeg, paramPrecision, paramTerritory, paramCountry,
75+
mapcodeResource.convertLatLonToMapcode(paramLatDegAsString, paramLonDegAsString, paramPrecisionAsString, paramTerritory, paramCountry,
7676
paramContextMustBeNull, paramAlphabet, paramInclude, paramClient, paramAllowLog, response);
7777
}
7878

7979
@Override
8080
public void convertLatLonToMapcodeJson(
81-
final double paramLatDeg,
82-
final double paramLonDeg,
81+
@Nullable final String paramLatDegAsString,
82+
@Nullable final String paramLonDegAsString,
8383
@Nullable final String paramType,
84-
final int paramPrecision,
84+
@Nullable final String paramPrecisionAsString,
8585
@Nullable final String paramTerritory,
8686
@Nullable final String paramCountry,
8787
@Nullable final String paramContextMustBeNull,
@@ -91,7 +91,7 @@ public void convertLatLonToMapcodeJson(
9191
@Nonnull final String paramDebug,
9292
@Suspended @Nonnull final AsyncResponse response)
9393
throws ApiInvalidFormatException {
94-
mapcodeResource.convertLatLonToMapcode(paramLatDeg, paramLonDeg, paramType, paramPrecision, paramTerritory, paramCountry,
94+
mapcodeResource.convertLatLonToMapcode(paramLatDegAsString, paramLonDegAsString, paramType, paramPrecisionAsString, paramTerritory, paramCountry,
9595
paramContextMustBeNull, paramAlphabet, paramInclude, paramClient, paramDebug, response);
9696
}
9797

0 commit comments

Comments
 (0)