Skip to content

Support ability to rename fields and deprecate existing names; does so for S3 #1547

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/next-release/feature-AmazonS3-ebadcff.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"category": "Amazon S3",
"type": "feature",
"description": "CopyObjectRequest now has `destinationBucket` and `destinationKey` properties for clarity.\nThe existing names, `bucket` and `key`, are deprecated."
}
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,20 @@ private MemberModel generateMemberModel(String c2jMemberName, Member c2jMemberDe
fillContainerTypeMemberMetadata(allC2jShapes, c2jMemberDefinition.getShape(), memberModel,
protocol);


String deprecatedName = c2jMemberDefinition.getDeprecatedName();
if (StringUtils.isNotBlank(deprecatedName)) {
checkForValidDeprecatedName(c2jMemberName, shape);

memberModel.setDeprecatedName(deprecatedName);
memberModel.setDeprecatedFluentGetterMethodName(
namingStrategy.getFluentGetterMethodName(deprecatedName, parentShape, shape));
memberModel.setDeprecatedFluentSetterMethodName(
namingStrategy.getFluentSetterMethodName(deprecatedName, parentShape, shape));
memberModel.setDeprecatedBeanStyleSetterMethodName(
namingStrategy.getBeanStyleSetterMethodName(deprecatedName, parentShape, shape));
}

ParameterHttpMapping httpMapping = generateParameterHttpMapping(parentShape,
c2jMemberName,
c2jMemberDefinition,
Expand All @@ -219,6 +233,26 @@ private MemberModel generateMemberModel(String c2jMemberName, Member c2jMemberDe
return memberModel;
}

private void checkForValidDeprecatedName(String c2jMemberName, Shape memberShape) {
if (memberShape.getEnumValues() != null) {
throw new IllegalStateException(String.format(
"Member %s has enum values and a deprecated name. Codegen does not support this.",
c2jMemberName));
}

if (isListShape(memberShape)) {
throw new IllegalStateException(String.format(
"Member %s is a list and has a deprecated name. Codegen does not support this.",
c2jMemberName));
}

if (isMapShape(memberShape)) {
throw new IllegalStateException(String.format(
"Member %s is a map and has a deprecated name. Codegen does not support this.",
c2jMemberName));
}
}

private boolean isSensitiveShapeOrContainer(Member member, Map<String, Shape> allC2jShapes) {
if (member == null) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@ private void doModifyShapeMembers(ServiceModel serviceModel, Shape shape, String
member.setLocationName(memberToModify);
}

if (modifyModel.isExistingNameDeprecated()) {
member.setDeprecatedName(memberToModify);
}

shape.getMembers().put(modifyModel.getEmitPropertyName(), member);
}
if (modifyModel.getEmitAsType() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@

public class ModifyModelShapeModifier {

/**
* Indicates whether a renamed member should create getters and setters under the existing name
*/
private boolean existingNameDeprecated;

/**
* Sets a name for a member used by the SDK, eliminating the existing name
*/
private String emitPropertyName;

/**
Expand All @@ -41,6 +49,14 @@ public class ModifyModelShapeModifier {

private String unmarshallLocationName;

public boolean isExistingNameDeprecated() {
return existingNameDeprecated;
}

public void setExistingNameDeprecated(boolean existingNameDeprecated) {
this.existingNameDeprecated = existingNameDeprecated;
}

public String getEmitPropertyName() {
return emitPropertyName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,14 @@ public class MemberModel extends DocumentationModel {

private boolean xmlAttribute;

private String deprecatedName;

private String fluentDeprecatedGetterMethodName;

private String fluentDeprecatedSetterMethodName;

private String deprecatedBeanStyleSetterMethodName;

public String getName() {
return name;
}
Expand Down Expand Up @@ -443,6 +451,14 @@ public String getGetterDocumentation() {
return docBuilder.toString();
}

public String getDeprecatedGetterDocumentation() {
String getterDocumentation = getGetterDocumentation();
return getterDocumentation
+ LF
+ "@deprecated Use {@link #" + getFluentGetterMethodName() + "()}"
+ LF;
}

private boolean returnTypeIs(Class<?> clazz) {
String returnType = this.getGetterModel().getReturnType();
return returnType != null && returnType.startsWith(clazz.getName()); // Use startsWith in case it's parametrized
Expand All @@ -459,6 +475,13 @@ public String getExistenceCheckDocumentation() {
return defaultExistenceCheck().replace("%s", name) + LF;
}

public String getDeprecatedSetterDocumentation() {
return getFluentSetterDocumentation()
+ LF
+ "@deprecated Use {@link #" + getFluentSetterMethodName() + "(" + setterModel.getSimpleType() + ")}"
+ LF;
}

public String getDefaultConsumerFluentSetterDocumentation() {
return (StringUtils.isNotBlank(documentation) ? documentation : defaultSetter().replace("%s", name) + "\n")
+ LF
Expand Down Expand Up @@ -589,6 +612,19 @@ public MemberModel withXmlAttribtue(boolean xmlAttribtue) {
return this;
}

public String getDeprecatedName() {
return deprecatedName;
}

public void setDeprecatedName(String deprecatedName) {
this.deprecatedName = deprecatedName;
}

public MemberModel withDeprecatedName(String deprecatedName) {
this.deprecatedName = deprecatedName;
return this;
}

@JsonIgnore
public boolean hasBuilder() {
return !(isSimple() || isList() || isMap());
Expand Down Expand Up @@ -653,4 +689,28 @@ public Optional<ClassName> getAutoConstructClassIfExists() {

return Optional.empty();
}

public void setDeprecatedFluentGetterMethodName(String fluentDeprecatedGetterMethodName) {
this.fluentDeprecatedGetterMethodName = fluentDeprecatedGetterMethodName;
}

public String getDeprecatedFluentGetterMethodName() {
return fluentDeprecatedGetterMethodName;
}

public void setDeprecatedFluentSetterMethodName(String fluentDeprecatedSetterMethodName) {
this.fluentDeprecatedSetterMethodName = fluentDeprecatedSetterMethodName;
}

public String getDeprecatedFluentSetterMethodName() {
return fluentDeprecatedSetterMethodName;
}

public String getDeprecatedBeanStyleSetterMethodName() {
return deprecatedBeanStyleSetterMethodName;
}

public void setDeprecatedBeanStyleSetterMethodName(String deprecatedBeanStyleSetterMethodName) {
this.deprecatedBeanStyleSetterMethodName = deprecatedBeanStyleSetterMethodName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public class Member {

private boolean xmlAttribute;

private String deprecatedName;

public String getShape() {
return shape;
}
Expand Down Expand Up @@ -212,4 +214,12 @@ public boolean isXmlAttribute() {
public void setXmlAttribute(boolean xmlAttribute) {
this.xmlAttribute = xmlAttribute;
}

public void setDeprecatedName(String deprecatedName) {
this.deprecatedName = deprecatedName;
}

public String getDeprecatedName() {
return deprecatedName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ protected MethodSpec.Builder fluentSetterBuilder(TypeName returnType) {
return fluentSetterBuilder(memberAsParameter(), returnType);
}

protected MethodSpec.Builder fluentSetterBuilder(String methodName, TypeName returnType) {
return fluentSetterBuilder(methodName, memberAsParameter(), returnType);
}

protected MethodSpec.Builder fluentSetterBuilder(ParameterSpec setterParam, TypeName returnType) {
return fluentSetterBuilder(memberModel().getFluentSetterMethodName(), setterParam, returnType);
}
Expand All @@ -86,11 +90,15 @@ protected MethodSpec.Builder fluentSetterBuilder(String methodName, ParameterSpe
}

protected MethodSpec.Builder beanStyleSetterBuilder() {
return beanStyleSetterBuilder(memberAsBeanStyleParameter());
return beanStyleSetterBuilder(memberAsBeanStyleParameter(), memberModel().getBeanStyleSetterMethodName());
}

protected MethodSpec.Builder beanStyleSetterBuilder(ParameterSpec setterParam) {
return MethodSpec.methodBuilder(memberModel().getBeanStyleSetterMethodName())
protected MethodSpec.Builder deprecatedBeanStyleSetterBuilder() {
return beanStyleSetterBuilder(memberAsBeanStyleParameter(), memberModel().getDeprecatedBeanStyleSetterMethodName());
}

protected MethodSpec.Builder beanStyleSetterBuilder(ParameterSpec setterParam, String methodName) {
return MethodSpec.methodBuilder(methodName)
.addParameter(setterParam)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public List<MethodSpec> fluentSetters(MemberModel memberModel, TypeName returnTy
return new NonCollectionSetters(intermediateModel, shapeModel, memberModel, typeProvider).fluent(returnType);
}

public MethodSpec beanStyleSetter(MemberModel memberModel) {
public List<MethodSpec> beanStyleSetters(MemberModel memberModel) {
if (memberModel.isList()) {
return new ListSetters(intermediateModel, shapeModel, memberModel, typeProvider).beanStyle();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import software.amazon.awssdk.codegen.poet.eventstream.EventStreamUtils;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.utils.StringUtils;
import software.amazon.awssdk.utils.builder.ToCopyableBuilder;

/**
Expand Down Expand Up @@ -355,10 +356,7 @@ private MethodSpec getValueForField() {

methodBuilder.beginControlFlow("switch ($L)", "fieldName");

shapeModel.getNonStreamingMembers().forEach(m -> methodBuilder.addCode("case $S:", m.getC2jName())
.addStatement("return $T.ofNullable(clazz.cast($L()))",
Optional.class,
m.getFluentGetterMethodName()));
shapeModel.getNonStreamingMembers().forEach(m -> addCasesForMember(methodBuilder, m));

methodBuilder.addCode("default:");
methodBuilder.addStatement("return $T.empty()", Optional.class);
Expand All @@ -367,6 +365,20 @@ private MethodSpec getValueForField() {
return methodBuilder.build();
}

private void addCasesForMember(MethodSpec.Builder methodBuilder, MemberModel member) {
methodBuilder.addCode("case $S:", member.getC2jName())
.addStatement("return $T.ofNullable(clazz.cast($L()))",
Optional.class,
member.getFluentGetterMethodName());

if (shouldGenerateDeprecatedNameGetter(member)) {
methodBuilder.addCode("case $S:", member.getDeprecatedName())
.addStatement("return $T.ofNullable(clazz.cast($L()))",
Optional.class,
member.getFluentGetterMethodName());
}
}

private List<MethodSpec> memberGetters() {
return shapeModel.getNonStreamingMembers().stream()
.filter(m -> !m.getHttp().getIsStreaming())
Expand All @@ -384,11 +396,19 @@ private Stream<MethodSpec> memberGetters(MemberModel member) {
member.getAutoConstructClassIfExists()
.ifPresent(autoConstructClass -> result.add(existenceCheckGetter(member, autoConstructClass)));

if (shouldGenerateDeprecatedNameGetter(member)) {
result.add(deprecatedMemberGetter(member));
}

result.add(memberGetter(member));

return result.stream();
}

private boolean shouldGenerateDeprecatedNameGetter(MemberModel member) {
return StringUtils.isNotBlank(member.getDeprecatedName());
}

private boolean shouldGenerateEnumGetter(MemberModel member) {
return member.getEnumType() != null || MemberCopierSpec.isEnumCopyAvailable(member);
}
Expand Down Expand Up @@ -425,6 +445,16 @@ private CodeBlock existenceCheckStatement(MemberModel member, ClassName autoCons
return CodeBlock.of("return $N != null && !($N instanceof $T);", variableName, variableName, autoConstructClass);
}

private MethodSpec deprecatedMemberGetter(MemberModel member) {
return MethodSpec.methodBuilder(member.getDeprecatedFluentGetterMethodName())
.addJavadoc("$L", member.getDeprecatedGetterDocumentation())
.addModifiers(PUBLIC)
.addAnnotation(Deprecated.class)
.returns(typeProvider.returnType(member))
.addCode(getterStatement(member))
.build();
}

private CodeBlock enumGetterStatement(MemberModel member) {
String fieldName = member.getVariable().getVariableName();
if (member.isList() || member.isMap()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.squareup.javapoet.TypeName;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -117,11 +118,11 @@ public List<MethodSpec> fluent(TypeName returnType) {
}

@Override
public MethodSpec beanStyle() {
public List<MethodSpec> beanStyle() {
MethodSpec.Builder builder = beanStyleSetterBuilder()
.addCode(memberModel().isCollectionWithBuilderMember() ? copySetterBuilderBody() : beanCopySetterBody());

return builder.build();
return Collections.singletonList(builder.build());

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.TypeName;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import software.amazon.awssdk.codegen.internal.Utils;
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
Expand Down Expand Up @@ -75,11 +76,11 @@ public List<MethodSpec> fluent(TypeName returnType) {
}

@Override
public MethodSpec beanStyle() {
public List<MethodSpec> beanStyle() {
MethodSpec.Builder builder = beanStyleSetterBuilder()
.addCode(memberModel().isCollectionWithBuilderMember() ? copySetterBuilderBody() : beanCopySetterBody());

return builder.build();
return Collections.singletonList(builder.build());
}

private ParameterSpec mapWithEnumAsParameter() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,6 @@ interface MemberSetters {

List<MethodSpec> fluent(TypeName returnType);

MethodSpec beanStyle();
List<MethodSpec> beanStyle();
}

Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ private List<MethodSpec> accessors() {
.forEach(m -> {
accessors.add(accessorsFactory.beanStyleGetter(m));
accessors.addAll(accessorsFactory.fluentSetters(m, builderInterfaceName()));
accessors.add(accessorsFactory.beanStyleSetter(m));
accessors.addAll(accessorsFactory.beanStyleSetters(m));
accessors.addAll(accessorsFactory.convenienceSetters(m, builderInterfaceName()));
});

Expand Down
Loading