diff --git a/core/src/main/java/org/elasticsearch/common/ParseField.java b/core/src/main/java/org/elasticsearch/common/ParseField.java
index c04bcb14dcb..ed00394640e 100644
--- a/core/src/main/java/org/elasticsearch/common/ParseField.java
+++ b/core/src/main/java/org/elasticsearch/common/ParseField.java
@@ -26,7 +26,8 @@ import java.util.HashSet;
import java.util.Set;
/**
- * Holds a field that can be found in a request while parsing and its different variants, which may be deprecated.
+ * Holds a field that can be found in a request while parsing and its different
+ * variants, which may be deprecated.
*/
public class ParseField {
@@ -37,6 +38,14 @@ public class ParseField {
private String allReplacedWith = null;
private final String[] allNames;
+ /**
+ * @param name
+ * the primary name for this field. This will be returned by
+ * {@link #getPreferredName()}
+ * @param deprecatedNames
+ * names for this field which are deprecated and will not be
+ * accepted when strict matching is used.
+ */
public ParseField(String name, String... deprecatedNames) {
this.name = name;
if (deprecatedNames == null || deprecatedNames.length == 0) {
@@ -52,20 +61,35 @@ public class ParseField {
this.allNames = allNames.toArray(new String[allNames.size()]);
}
- public String getPreferredName(){
+ /**
+ * @return the preferred name used for this field
+ */
+ public String getPreferredName() {
return name;
}
+ /**
+ * @return All names for this field regardless of whether they are
+ * deprecated
+ */
public String[] getAllNamesIncludedDeprecated() {
return allNames;
}
+ /**
+ * @param deprecatedNames
+ * deprecated names to include with the returned
+ * {@link ParseField}
+ * @return a new {@link ParseField} using the preferred name from this one
+ * but with the specified deprecated names
+ */
public ParseField withDeprecation(String... deprecatedNames) {
return new ParseField(this.name, deprecatedNames);
}
/**
- * Return a new ParseField where all field names are deprecated and replaced with {@code allReplacedWith}.
+ * Return a new ParseField where all field names are deprecated and replaced
+ * with {@code allReplacedWith}.
*/
public ParseField withAllDeprecated(String allReplacedWith) {
ParseField parseField = this.withDeprecation(getAllNamesIncludedDeprecated());
@@ -73,16 +97,34 @@ public class ParseField {
return parseField;
}
- boolean match(String currentFieldName, boolean strict) {
- if (allReplacedWith == null && currentFieldName.equals(name)) {
+ /**
+ * @param fieldName
+ * the field name to match against this {@link ParseField}
+ * @param strict
+ * if true an exception will be thrown if a deprecated field name
+ * is given. If false the deprecated name will be matched but a
+ * message will also be logged to the {@link DeprecationLogger}
+ * @return true if fieldName
matches any of the acceptable
+ * names for this {@link ParseField}.
+ */
+ boolean match(String fieldName, boolean strict) {
+ // if this parse field has not been completely deprecated then try to
+ // match the preferred name
+ if (allReplacedWith == null && fieldName.equals(name)) {
return true;
}
+ // Now try to match against one of the deprecated names. Note that if
+ // the parse field is entirely deprecated (allReplacedWith != null) all
+ // fields will be in the deprecatedNames array
String msg;
for (String depName : deprecatedNames) {
- if (currentFieldName.equals(depName)) {
- msg = "Deprecated field [" + currentFieldName + "] used, expected [" + name + "] instead";
+ if (fieldName.equals(depName)) {
+ msg = "Deprecated field [" + fieldName + "] used, expected [" + name + "] instead";
if (allReplacedWith != null) {
- msg = "Deprecated field [" + currentFieldName + "] used, replaced by [" + allReplacedWith + "]";
+ // If the field is entirely deprecated then there is no
+ // preferred name so instead use the `allReplaceWith`
+ // message to indicate what should be used instead
+ msg = "Deprecated field [" + fieldName + "] used, replaced by [" + allReplacedWith + "]";
}
if (strict) {
throw new IllegalArgumentException(msg);
@@ -100,10 +142,20 @@ public class ParseField {
return getPreferredName();
}
+ /**
+ * @return the message to use if this {@link ParseField} has been entirely
+ * deprecated in favor of something else. This method will return
+ * null
if the ParseField has not been completely
+ * deprecated.
+ */
public String getAllReplacedWith() {
return allReplacedWith;
}
+ /**
+ * @return an array of the names for the {@link ParseField} which are
+ * deprecated.
+ */
public String[] getDeprecatedNames() {
return deprecatedNames;
}