Skip to content
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
6 changes: 6 additions & 0 deletions .changes/next-release/bugfix-AmazonDynamoDB-474adb8.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "bugfix",
"category": "Amazon DynamoDB",
"contributor": "",
"description": "Add a `setNull(Boolean)` setter for the serializable builder class returned by `AttributeValue.serializableBuilderClass()`. This allows successfully converting from a JSON blob such as `{\"NULL\": true}`."
}
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,14 @@ private MemberModel generateMemberModel(String c2jMemberName, Member c2jMemberDe
memberModel.setRequired(isRequiredMember(c2jMemberName, parentShape));
memberModel.setSynthetic(shape.isSynthetic());

if (c2jMemberDefinition.getAlternateBeanPropertyName() != null) {
String alternatePropertyName = c2jMemberDefinition.getAlternateBeanPropertyName();

String setter = String.format("set%s", alternatePropertyName);

memberModel.setAdditionalBeanStyleSetterName(setter);
}


// Pass the xmlNameSpace from the member reference
if (c2jMemberDefinition.getXmlNamespace() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,11 @@ private void doModifyShapeMembers(ServiceModel serviceModel, Shape shape, String
member.setDeprecatedMessage(modifyModel.getDeprecatedMessage());
}
}

if (modifyModel.getAlternateBeanPropertyName() != null) {
shape.getMembers().get(memberToModify).setAlternateBeanPropertyName(modifyModel.getAlternateBeanPropertyName());
}

// Currently only supports emitPropertyName which is to rename the member
if (modifyModel.getEmitPropertyName() != null) {
Member member = shape.getMembers().remove(memberToModify);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ public class ModifyModelShapeModifier {
*/
private String emitEnumValue;

/**
* An additional, alternate name for this member that should additionally be used when generating bean style
* setters/getters for the enclosing shape.
*/
private String alternateBeanPropertyName;

/**
* Emit as a different primitive type. Used by AWS Budget Service to change string
* to BigDecimal (see API-433).
Expand Down Expand Up @@ -143,4 +149,12 @@ public void setIgnoreDataTypeConversionFailures(boolean ignoreDataTypeConversion
public boolean isIgnoreDataTypeConversionFailures() {
return ignoreDataTypeConversionFailures;
}

public String getAlternateBeanPropertyName() {
return alternateBeanPropertyName;
}

public void setAlternateBeanPropertyName(String alternateBeanPropertyName) {
this.alternateBeanPropertyName = alternateBeanPropertyName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ public class MemberModel extends DocumentationModel {

private String beanStyleSetterName;

private String additionalBeanStyleSetterName;

private String unionEnumTypeName;

private boolean isJsonValue;
Expand Down Expand Up @@ -787,6 +789,19 @@ public boolean ignoreDataTypeConversionFailures() {
return ignoreDataTypeConversionFailures;
}

public String getAdditionalBeanStyleSetterName() {
return additionalBeanStyleSetterName;
}

public void setAdditionalBeanStyleSetterName(String additionalBeanStyleSetterName) {
this.additionalBeanStyleSetterName = additionalBeanStyleSetterName;
}

public MemberModel withAdditionalBeanStyleSetterName(String additionalBeanStyleSetterName) {
setAdditionalBeanStyleSetterName(additionalBeanStyleSetterName);
return this;
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
Expand Down Expand Up @@ -834,6 +849,7 @@ public boolean equals(Object o) {
&& Objects.equals(fluentDeprecatedGetterMethodName, that.fluentDeprecatedGetterMethodName)
&& Objects.equals(fluentDeprecatedSetterMethodName, that.fluentDeprecatedSetterMethodName)
&& Objects.equals(deprecatedBeanStyleSetterMethodName, that.deprecatedBeanStyleSetterMethodName)
&& Objects.equals(additionalBeanStyleSetterName, that.additionalBeanStyleSetterName)
&& Objects.equals(contextParam, that.contextParam);
}

Expand Down Expand Up @@ -878,6 +894,8 @@ public int hashCode() {
result = 31 * result + Objects.hashCode(deprecatedBeanStyleSetterMethodName);
result = 31 * result + Objects.hashCode(contextParam);
result = 31 * result + Boolean.hashCode(ignoreDataTypeConversionFailures);
result = 31 * result + Objects.hashCode(additionalBeanStyleSetterName);

return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ public class Member {

private String deprecatedName;

/**
* An additional, alternate name for this member that should additionally be used when generating bean style
* setters/getters for the enclosing shape.
*/
private String alternateBeanPropertyName;

private ContextParam contextParam;

public String getShape() {
Expand Down Expand Up @@ -236,4 +242,12 @@ public ContextParam getContextParam() {
public void setContextParam(ContextParam contextParam) {
this.contextParam = contextParam;
}

public String getAlternateBeanPropertyName() {
return alternateBeanPropertyName;
}

public void setAlternateBeanPropertyName(String alternateBeanPropertyName) {
this.alternateBeanPropertyName = alternateBeanPropertyName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,14 @@ public List<MethodSpec> beanStyle() {
.build());
}

String additionalSetter = memberModel().getAdditionalBeanStyleSetterName();
if (StringUtils.isNotBlank(additionalSetter)) {
MethodSpec.Builder methodBuilder = beanStyleSetterBuilder();
methodBuilder.setName(additionalSetter);
methods.add(methodBuilder.addCode(beanCopySetterBody())
.build());
}

return methods;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
package software.amazon.awssdk.services.jsonprotocoltests.model;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Function;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.Mutable;
import software.amazon.awssdk.annotations.NotThreadSafe;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.core.SdkPojo;
import software.amazon.awssdk.core.protocol.MarshallLocation;
import software.amazon.awssdk.core.protocol.MarshallingType;
import software.amazon.awssdk.core.traits.LocationTrait;
import software.amazon.awssdk.utils.ToString;
import software.amazon.awssdk.utils.builder.CopyableBuilder;
import software.amazon.awssdk.utils.builder.ToCopyableBuilder;

/**
*/
@Generated("software.amazon.awssdk:codegen")
public final class ContainsReservedKeyword implements SdkPojo, Serializable,
ToCopyableBuilder<ContainsReservedKeyword.Builder, ContainsReservedKeyword> {
private static final SdkField<String> NUL_FIELD = SdkField.<String> builder(MarshallingType.STRING).memberName("NUL")
.getter(getter(ContainsReservedKeyword::nul)).setter(setter(Builder::nul))
.traits(LocationTrait.builder().location(MarshallLocation.PAYLOAD).locationName("NULL").build()).build();

private static final List<SdkField<?>> SDK_FIELDS = Collections.unmodifiableList(Arrays.asList(NUL_FIELD));

private static final Map<String, SdkField<?>> SDK_NAME_TO_FIELD = memberNameToFieldInitializer();

private static final long serialVersionUID = 1L;

private final String nul;

private ContainsReservedKeyword(BuilderImpl builder) {
this.nul = builder.nul;
}

/**
* Returns the value of the NUL property for this object.
*
* @return The value of the NUL property for this object.
*/
public final String nul() {
return nul;
}

@Override
public Builder toBuilder() {
return new BuilderImpl(this);
}

public static Builder builder() {
return new BuilderImpl();
}

public static Class<? extends Builder> serializableBuilderClass() {
return BuilderImpl.class;
}

@Override
public final int hashCode() {
int hashCode = 1;
hashCode = 31 * hashCode + Objects.hashCode(nul());
return hashCode;
}

@Override
public final boolean equals(Object obj) {
return equalsBySdkFields(obj);
}

@Override
public final boolean equalsBySdkFields(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof ContainsReservedKeyword)) {
return false;
}
ContainsReservedKeyword other = (ContainsReservedKeyword) obj;
return Objects.equals(nul(), other.nul());
}

/**
* Returns a string representation of this object. This is useful for testing and debugging. Sensitive data will be
* redacted from this string using a placeholder value.
*/
@Override
public final String toString() {
return ToString.builder("ContainsReservedKeyword").add("NUL", nul()).build();
}

public final <T> Optional<T> getValueForField(String fieldName, Class<T> clazz) {
switch (fieldName) {
case "NUL":
return Optional.ofNullable(clazz.cast(nul()));
default:
return Optional.empty();
}
}

@Override
public final List<SdkField<?>> sdkFields() {
return SDK_FIELDS;
}

@Override
public final Map<String, SdkField<?>> sdkFieldNameToField() {
return SDK_NAME_TO_FIELD;
}

private static Map<String, SdkField<?>> memberNameToFieldInitializer() {
Map<String, SdkField<?>> map = new HashMap<>();
map.put("NULL", NUL_FIELD);
return Collections.unmodifiableMap(map);
}

private static <T> Function<Object, T> getter(Function<ContainsReservedKeyword, T> g) {
return obj -> g.apply((ContainsReservedKeyword) obj);
}

private static <T> BiConsumer<Object, T> setter(BiConsumer<Builder, T> s) {
return (obj, val) -> s.accept((Builder) obj, val);
}

@Mutable
@NotThreadSafe
public interface Builder extends SdkPojo, CopyableBuilder<Builder, ContainsReservedKeyword> {
/**
* Sets the value of the NUL property for this object.
*
* @param nul
* The new value for the NUL property for this object.
* @return Returns a reference to this object so that method calls can be chained together.
*/
Builder nul(String nul);
}

static final class BuilderImpl implements Builder {
private String nul;

private BuilderImpl() {
}

private BuilderImpl(ContainsReservedKeyword model) {
nul(model.nul);
}

public final String getNul() {
return nul;
}

public final void setNul(String nul) {
this.nul = nul;
}

public final void setNull(String nul) {
this.nul = nul;
}

@Override
public final Builder nul(String nul) {
this.nul = nul;
return this;
}

@Override
public ContainsReservedKeyword build() {
return new ContainsReservedKeyword(this);
}

@Override
public List<SdkField<?>> sdkFields() {
return SDK_FIELDS;
}

@Override
public Map<String, SdkField<?>> sdkFieldNameToField() {
return SDK_NAME_TO_FIELD;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@
"eventStreamOperation"
],
"shapeModifiers": {
"ContainsReservedKeyword": {
"modify": [
{
"NULL": {
"emitPropertyName": "NUL",
"alternateBeanPropertyName": "Null"
}
}
]
},
"DeprecatedRenameRequest": {
"modify": [
{
Expand Down
Loading
Loading