|
@@ -32,7 +32,19 @@ import static java.util.stream.Collectors.toList;
|
|
public class SuggestingErrorOnUnknown implements ErrorOnUnknown {
|
|
public class SuggestingErrorOnUnknown implements ErrorOnUnknown {
|
|
@Override
|
|
@Override
|
|
public String errorMessage(String parserName, String unknownField, Iterable<String> candidates) {
|
|
public String errorMessage(String parserName, String unknownField, Iterable<String> candidates) {
|
|
- String message = String.format(Locale.ROOT, "[%s] unknown field [%s]", parserName, unknownField);
|
|
|
|
|
|
+ return String.format(Locale.ROOT, "[%s] unknown field [%s]%s", parserName, unknownField, suggest(unknownField, candidates));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int priority() {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Builds suggestions for an unknown field, returning an empty string if there
|
|
|
|
+ * aren't any suggestions or " did you mean " and then the list of suggestions.
|
|
|
|
+ */
|
|
|
|
+ public static String suggest(String unknownField, Iterable<String> candidates) {
|
|
// TODO it'd be nice to combine this with BaseRestHandler's implementation.
|
|
// TODO it'd be nice to combine this with BaseRestHandler's implementation.
|
|
LevenshteinDistance ld = new LevenshteinDistance();
|
|
LevenshteinDistance ld = new LevenshteinDistance();
|
|
final List<Tuple<Float, String>> scored = new ArrayList<>();
|
|
final List<Tuple<Float, String>> scored = new ArrayList<>();
|
|
@@ -43,7 +55,7 @@ public class SuggestingErrorOnUnknown implements ErrorOnUnknown {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (scored.isEmpty()) {
|
|
if (scored.isEmpty()) {
|
|
- return message;
|
|
|
|
|
|
+ return "";
|
|
}
|
|
}
|
|
CollectionUtil.timSort(scored, (a, b) -> {
|
|
CollectionUtil.timSort(scored, (a, b) -> {
|
|
// sort by distance in reverse order, then parameter name for equal distances
|
|
// sort by distance in reverse order, then parameter name for equal distances
|
|
@@ -54,7 +66,7 @@ public class SuggestingErrorOnUnknown implements ErrorOnUnknown {
|
|
return a.v2().compareTo(b.v2());
|
|
return a.v2().compareTo(b.v2());
|
|
});
|
|
});
|
|
List<String> keys = scored.stream().map(Tuple::v2).collect(toList());
|
|
List<String> keys = scored.stream().map(Tuple::v2).collect(toList());
|
|
- StringBuilder builder = new StringBuilder(message).append(" did you mean ");
|
|
|
|
|
|
+ StringBuilder builder = new StringBuilder(" did you mean ");
|
|
if (keys.size() == 1) {
|
|
if (keys.size() == 1) {
|
|
builder.append("[").append(keys.get(0)).append("]");
|
|
builder.append("[").append(keys.get(0)).append("]");
|
|
} else {
|
|
} else {
|
|
@@ -63,9 +75,4 @@ public class SuggestingErrorOnUnknown implements ErrorOnUnknown {
|
|
builder.append("?");
|
|
builder.append("?");
|
|
return builder.toString();
|
|
return builder.toString();
|
|
}
|
|
}
|
|
-
|
|
|
|
- @Override
|
|
|
|
- public int priority() {
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|