Add support for property deprecation
Previously, an item could only have a 'deprecated' boolean flag to indicate that the property is deprecated. It is desirable to provide an additional description for the deprecation as well as the name of the property to use instead. The `deprecated` boolean flag is now supported. Instead, a `deprecated` object can be specified with two optional attributes: `reason` to provide an explanation for the deprecation and `replacement` to refer to the property that should be used instead. If none of them is present, an empty deprecation object should be set. For backward compatibility, the `deprecated` field is still set. Deprecation information can only set via manual meta-data. Closes gh-3449
This commit is contained in:
@@ -48,6 +48,7 @@ import org.springframework.boot.configurationprocessor.fieldvalues.FieldValuesPa
|
||||
import org.springframework.boot.configurationprocessor.fieldvalues.javac.JavaCompilerFieldValuesParser;
|
||||
import org.springframework.boot.configurationprocessor.metadata.ConfigurationMetadata;
|
||||
import org.springframework.boot.configurationprocessor.metadata.InvalidConfigurationMetadataException;
|
||||
import org.springframework.boot.configurationprocessor.metadata.ItemDeprecation;
|
||||
import org.springframework.boot.configurationprocessor.metadata.ItemMetadata;
|
||||
|
||||
/**
|
||||
@@ -211,7 +212,8 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
|| hasDeprecateAnnotation(element);
|
||||
this.metadataCollector.add(ItemMetadata
|
||||
.newProperty(prefix, name, dataType, sourceType, null,
|
||||
description, defaultValue, deprecated));
|
||||
description, defaultValue,
|
||||
deprecated ? new ItemDeprecation() : null));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -240,7 +242,8 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||
|| hasDeprecateAnnotation(element);
|
||||
this.metadataCollector.add(ItemMetadata
|
||||
.newProperty(prefix, name, dataType, sourceType, null,
|
||||
description, defaultValue, deprecated));
|
||||
description, defaultValue,
|
||||
deprecated ? new ItemDeprecation() : null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.configurationprocessor.metadata;
|
||||
|
||||
/**
|
||||
* Describe an item deprecation.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @since 1.3.0
|
||||
*/
|
||||
public class ItemDeprecation {
|
||||
|
||||
private String reason;
|
||||
|
||||
private String replacement;
|
||||
|
||||
public ItemDeprecation() {
|
||||
}
|
||||
|
||||
public ItemDeprecation(String reason, String replacement) {
|
||||
this.reason = reason;
|
||||
this.replacement = replacement;
|
||||
}
|
||||
|
||||
public String getReason() {
|
||||
return reason;
|
||||
}
|
||||
|
||||
public void setReason(String reason) {
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
public String getReplacement() {
|
||||
return replacement;
|
||||
}
|
||||
|
||||
public void setReplacement(String replacement) {
|
||||
this.replacement = replacement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ItemDeprecation{" + "reason='" + this.reason + '\'' + ", " +
|
||||
"replacement='" + this.replacement + '\'' + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
ItemDeprecation that = (ItemDeprecation) o;
|
||||
|
||||
if (reason != null ? !reason.equals(that.reason) : that.reason != null) return false;
|
||||
return !(replacement != null ? !replacement.equals(that.replacement) : that.replacement != null);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = reason != null ? reason.hashCode() : 0;
|
||||
result = 31 * result + (replacement != null ? replacement.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -40,11 +40,11 @@ public class ItemMetadata implements Comparable<ItemMetadata> {
|
||||
|
||||
private final Object defaultValue;
|
||||
|
||||
private final boolean deprecated;
|
||||
private final ItemDeprecation deprecation;
|
||||
|
||||
ItemMetadata(ItemType itemType, String prefix, String name, String type,
|
||||
String sourceType, String sourceMethod, String description,
|
||||
Object defaultValue, boolean deprecated) {
|
||||
Object defaultValue, ItemDeprecation deprecation) {
|
||||
super();
|
||||
this.itemType = itemType;
|
||||
this.name = buildName(prefix, name);
|
||||
@@ -53,7 +53,7 @@ public class ItemMetadata implements Comparable<ItemMetadata> {
|
||||
this.sourceMethod = sourceMethod;
|
||||
this.description = description;
|
||||
this.defaultValue = defaultValue;
|
||||
this.deprecated = deprecated;
|
||||
this.deprecation = deprecation;
|
||||
}
|
||||
|
||||
private String buildName(String prefix, String name) {
|
||||
@@ -96,8 +96,8 @@ public class ItemMetadata implements Comparable<ItemMetadata> {
|
||||
return this.defaultValue;
|
||||
}
|
||||
|
||||
public boolean isDeprecated() {
|
||||
return this.deprecated;
|
||||
public ItemDeprecation getDeprecation() {
|
||||
return deprecation;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,7 +107,7 @@ public class ItemMetadata implements Comparable<ItemMetadata> {
|
||||
buildToStringProperty(string, "sourceType", this.sourceType);
|
||||
buildToStringProperty(string, "description", this.description);
|
||||
buildToStringProperty(string, "defaultValue", this.defaultValue);
|
||||
buildToStringProperty(string, "deprecated", this.deprecated);
|
||||
buildToStringProperty(string, "deprecation", this.deprecation);
|
||||
return string.toString();
|
||||
}
|
||||
|
||||
@@ -126,14 +126,14 @@ public class ItemMetadata implements Comparable<ItemMetadata> {
|
||||
public static ItemMetadata newGroup(String name, String type, String sourceType,
|
||||
String sourceMethod) {
|
||||
return new ItemMetadata(ItemType.GROUP, name, null, type, sourceType,
|
||||
sourceMethod, null, null, false);
|
||||
sourceMethod, null, null, null);
|
||||
}
|
||||
|
||||
public static ItemMetadata newProperty(String prefix, String name, String type,
|
||||
String sourceType, String sourceMethod, String description,
|
||||
Object defaultValue, boolean deprecated) {
|
||||
Object defaultValue, ItemDeprecation deprecation) {
|
||||
return new ItemMetadata(ItemType.PROPERTY, prefix, name, type, sourceType,
|
||||
sourceMethod, description, defaultValue, deprecated);
|
||||
sourceMethod, description, defaultValue, deprecation);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -86,8 +86,17 @@ public class JsonMarshaller {
|
||||
if (defaultValue != null) {
|
||||
putDefaultValue(jsonObject, defaultValue);
|
||||
}
|
||||
if (item.isDeprecated()) {
|
||||
jsonObject.put("deprecated", true);
|
||||
ItemDeprecation deprecation = item.getDeprecation();
|
||||
if (deprecation != null) {
|
||||
jsonObject.put("deprecated", true); // backward compat
|
||||
JSONObject deprecationJsonObject = new JSONObject();
|
||||
if (deprecation.getReason() != null) {
|
||||
deprecationJsonObject.put("reason", deprecation.getReason());
|
||||
}
|
||||
if (deprecation.getReplacement() != null) {
|
||||
deprecationJsonObject.put("replacement", deprecation.getReplacement());
|
||||
}
|
||||
jsonObject.put("deprecation", deprecationJsonObject);
|
||||
}
|
||||
return jsonObject;
|
||||
}
|
||||
@@ -202,9 +211,20 @@ public class JsonMarshaller {
|
||||
String sourceType = object.optString("sourceType", null);
|
||||
String sourceMethod = object.optString("sourceMethod", null);
|
||||
Object defaultValue = readItemValue(object.opt("defaultValue"));
|
||||
boolean deprecated = object.optBoolean("deprecated");
|
||||
ItemDeprecation deprecation = toItemDeprecation(object);
|
||||
return new ItemMetadata(itemType, name, null, type, sourceType, sourceMethod,
|
||||
description, defaultValue, deprecated);
|
||||
description, defaultValue, deprecation);
|
||||
}
|
||||
|
||||
private ItemDeprecation toItemDeprecation(JSONObject object) {
|
||||
if (object.has("deprecation")) {
|
||||
JSONObject deprecationJsonObject = object.getJSONObject("deprecation");
|
||||
ItemDeprecation deprecation = new ItemDeprecation();
|
||||
deprecation.setReason(deprecationJsonObject.optString("reason", null));
|
||||
deprecation.setReplacement(deprecationJsonObject.optString("replacement", null));
|
||||
return deprecation;
|
||||
}
|
||||
return (object.optBoolean("deprecated") ? new ItemDeprecation() : null);
|
||||
}
|
||||
|
||||
private ItemHint toItemHint(JSONObject object) {
|
||||
|
||||
Reference in New Issue
Block a user