Skip to content

Change generated Getters to have a 'get' prefix #655

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 4 commits into from
Apr 18, 2025
Merged
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
Original file line number Diff line number Diff line change
@@ -42,15 +42,16 @@ public PreRequest parse(Document input) {

@Override
public IdentityResolver<?> identityResolver(PreRequest input) {
return new SdkCredentialsResolver(ProfileCredentialsProvider.create(input.awsProfileName()));
return new SdkCredentialsResolver(ProfileCredentialsProvider.create(input.getAwsProfileName()));
}

@Override
public EndpointResolver endpointResolver(PreRequest input) {
// TODO: error reporting
return ignore -> {
var endpoint = URI.create(Objects.requireNonNull(serviceMetadata.endpoints().get(input.awsRegion()),
"no endpoint for region " + input.awsRegion()));
var endpoint =
URI.create(Objects.requireNonNull(serviceMetadata.getEndpoints().get(input.getAwsProfileName()),
"no endpoint for region " + input.getAwsRegion()));
return CompletableFuture.completedFuture(Endpoint.builder()
.uri(endpoint)
.build());
@@ -59,13 +60,13 @@ public EndpointResolver endpointResolver(PreRequest input) {

@Override
public AuthScheme<?, ?> authScheme(PreRequest input) {
return new SigV4AuthScheme(serviceMetadata.sigv4SigningName());
return new SigV4AuthScheme(serviceMetadata.getSigv4SigningName());
}

@Override
public RequestOverrideConfig.Builder adaptConfig(PreRequest args) {
return ConfigProvider.super.adaptConfig(args)
.putConfig(RegionSetting.REGION, args.awsRegion());
.putConfig(RegionSetting.REGION, args.getAwsRegion());
}

}
Original file line number Diff line number Diff line change
@@ -17,12 +17,12 @@ public class AwsServiceBundlerTest {
@Test
public void accessAnalyzer() {
var bundler = new AwsServiceBundler("accessanalyzer-2019-11-01.json", AwsServiceBundlerTest::getModel);
var bundle = bundler.bundle().config().asShape(AwsServiceMetadata.builder());
var bundle = bundler.bundle().getConfig().asShape(AwsServiceMetadata.builder());

assertEquals("access-analyzer", bundle.sigv4SigningName());
assertEquals("AccessAnalyzer", bundle.serviceName());
assertEquals("access-analyzer", bundle.getSigv4SigningName());
assertEquals("AccessAnalyzer", bundle.getServiceName());

assertNotEquals(0, bundle.endpoints().size());
assertNotEquals(0, bundle.getEndpoints().size());
}

private static String getModel(String path) {
Original file line number Diff line number Diff line change
@@ -22,8 +22,8 @@ public void testToBuilderList() {
.build();
var copy = original.toBuilder().optionalList(List.of("1")).build();
assertThat(copy)
.returns(original.requiredList(), ListMembersInput::requiredList)
.returns(List.of("1"), ListMembersInput::optionalList);
.returns(original.getRequiredList(), ListMembersInput::getRequiredList)
.returns(List.of("1"), ListMembersInput::getOptionalList);
}

@Test
@@ -33,7 +33,7 @@ public void testToBuilderMap() {
.build();
var copy = original.toBuilder().optionalMap(Map.of("1", "2")).build();
assertThat(copy)
.returns(original.requiredMap(), MapMembersInput::requiredMap)
.returns(Map.of("1", "2"), MapMembersInput::optionalMap);
.returns(original.getRequiredMap(), MapMembersInput::getRequiredMap)
.returns(Map.of("1", "2"), MapMembersInput::getOptionalMap);
}
}
Original file line number Diff line number Diff line change
@@ -21,31 +21,32 @@
import software.amazon.smithy.java.codegen.test.model.NestedIntEnum;

public class ClientErrorCorrectionTest {

@Test
void correctsErrors() {
var corrected = ClientErrorCorrectionInput.builder()
.errorCorrection()
.build();

assertFalse(corrected.booleanMember());
assertEquals(corrected.bigDecimal(), BigDecimal.ZERO);
assertEquals(corrected.bigInteger(), BigInteger.ZERO);
assertEquals(corrected.byteMember(), (byte) 0);
assertEquals(corrected.doubleMember(), 0);
assertEquals(corrected.floatMember(), 0);
assertEquals(corrected.integer(), 0);
assertEquals(corrected.longMember(), 0);
assertEquals(corrected.shortMember(), (short) 0);
assertEquals(corrected.blob(), ByteBuffer.allocate(0));
assertEquals(corrected.streamingBlob().contentLength(), 0);
corrected.streamingBlob().asByteBuffer().thenAccept(bytes -> assertEquals(0, bytes.remaining()));
assertNull(corrected.document());
assertEquals(corrected.list(), List.of());
assertEquals(corrected.map(), Map.of());
assertEquals(corrected.timestamp(), Instant.EPOCH);
assertEquals(corrected.enumMember().type(), NestedEnum.Type.$UNKNOWN);
assertEquals(corrected.enumMember().value(), "");
assertEquals(corrected.intEnum().type(), NestedIntEnum.Type.$UNKNOWN);
assertEquals(corrected.intEnum().value(), 0);
assertFalse(corrected.isBoolean());
assertEquals(corrected.getBigDecimal(), BigDecimal.ZERO);
assertEquals(corrected.getBigInteger(), BigInteger.ZERO);
assertEquals(corrected.getByte(), (byte) 0);
assertEquals(corrected.getDouble(), 0);
assertEquals(corrected.getFloat(), 0);
assertEquals(corrected.getInteger(), 0);
assertEquals(corrected.getLong(), 0);
assertEquals(corrected.getShort(), (short) 0);
assertEquals(corrected.getBlob(), ByteBuffer.allocate(0));
assertEquals(corrected.getStreamingBlob().contentLength(), 0);
corrected.getStreamingBlob().asByteBuffer().thenAccept(bytes -> assertEquals(0, bytes.remaining()));
assertNull(corrected.getDocument());
assertEquals(corrected.getList(), List.of());
assertEquals(corrected.getMap(), Map.of());
assertEquals(corrected.getTimestamp(), Instant.EPOCH);
assertEquals(corrected.getEnum().getType(), NestedEnum.Type.$UNKNOWN);
assertEquals(corrected.getEnum().getValue(), "");
assertEquals(corrected.getIntEnum().getType(), NestedIntEnum.Type.$UNKNOWN);
assertEquals(corrected.getIntEnum().getValue(), 0);
}
}
Original file line number Diff line number Diff line change
@@ -27,29 +27,29 @@ public class DefaultsTest {
void setsCorrectDefault() {
var defaults = DefaultsInput.builder().build();

assertTrue(defaults.booleanMember());
assertEquals(defaults.bigDecimal(), BigDecimal.valueOf(1.0));
assertEquals(defaults.bigInteger(), BigInteger.valueOf(1));
assertEquals(defaults.byteMember(), (byte) 1);
assertEquals(defaults.doubleMember(), 1.0);
assertEquals(defaults.floatMember(), 1f);
assertEquals(defaults.integer(), 1);
assertEquals(defaults.longMember(), 1);
assertEquals(defaults.shortMember(), (short) 1);
assertEquals(defaults.blob(), ByteBuffer.wrap(Base64.getDecoder().decode("YmxvYg==")));
defaults.streamingBlob()
assertTrue(defaults.isBoolean());
assertEquals(defaults.getBigDecimal(), BigDecimal.valueOf(1.0));
assertEquals(defaults.getBigInteger(), BigInteger.valueOf(1));
assertEquals(defaults.getByte(), (byte) 1);
assertEquals(defaults.getDouble(), 1.0);
assertEquals(defaults.getFloat(), 1f);
assertEquals(defaults.getInteger(), 1);
assertEquals(defaults.getLong(), 1);
assertEquals(defaults.getShort(), (short) 1);
assertEquals(defaults.getBlob(), ByteBuffer.wrap(Base64.getDecoder().decode("YmxvYg==")));
defaults.getStreamingBlob()
.asByteBuffer()
.thenAccept(b -> assertEquals(b, ByteBuffer.wrap(Base64.getDecoder().decode("c3RyZWFtaW5n"))));
assertEquals(defaults.boolDoc(), Document.of(true));
assertEquals(defaults.stringDoc(), Document.of("string"));
assertEquals(defaults.numberDoc(), Document.of(1));
assertEquals(defaults.floatingPointnumberDoc(), Document.of(1.2));
assertEquals(defaults.listDoc(), Document.of(Collections.emptyList()));
assertEquals(defaults.mapDoc(), Document.of(Collections.emptyMap()));
assertEquals(defaults.list(), List.of());
assertEquals(defaults.map(), Map.of());
assertEquals(defaults.timestamp(), Instant.parse("1985-04-12T23:20:50.52Z"));
assertEquals(defaults.enumMember(), NestedEnum.A);
assertEquals(defaults.intEnum(), NestedIntEnum.A);
assertEquals(defaults.getBoolDoc(), Document.of(true));
assertEquals(defaults.getStringDoc(), Document.of("string"));
assertEquals(defaults.getNumberDoc(), Document.of(1));
assertEquals(defaults.getFloatingPointnumberDoc(), Document.of(1.2));
assertEquals(defaults.getListDoc(), Document.of(Collections.emptyList()));
assertEquals(defaults.getMapDoc(), Document.of(Collections.emptyMap()));
assertEquals(defaults.getList(), List.of());
assertEquals(defaults.getMap(), Map.of());
assertEquals(defaults.getTimestamp(), Instant.parse("1985-04-12T23:20:50.52Z"));
assertEquals(defaults.getEnum(), NestedEnum.A);
assertEquals(defaults.getIntEnum(), NestedIntEnum.A);
}
}
Original file line number Diff line number Diff line change
@@ -19,6 +19,6 @@ void unknownTypeDeserializedIntoUnknownVariant() {
try (var codec = JsonCodec.builder().useJsonName(true).useTimestampFormat(true).build()) {
output = codec.deserializeShape("\"option-n\"", EnumType.builder());
}
assertEquals(output.type(), EnumType.Type.$UNKNOWN);
assertEquals(output.getType(), EnumType.Type.$UNKNOWN);
}
}
Original file line number Diff line number Diff line change
@@ -223,8 +223,8 @@ void nullDistinctFromEmpty() {
assertTrue(emptyInput.hasListOfBoolean());
assertFalse(nullInput.hasListOfBoolean());
// Collections should return empty collections for access
assertEquals(emptyInput.listOfBoolean(), Collections.emptyList());
assertEquals(emptyInput.listOfBoolean(), nullInput.listOfBoolean());
assertEquals(emptyInput.getListOfBoolean(), Collections.emptyList());
assertEquals(emptyInput.getListOfBoolean(), nullInput.getListOfBoolean());
var emptyDocument = Document.of(emptyInput);
var nullDocument = Document.of(nullInput);
assertNotNull(emptyDocument.getMember("listOfBoolean"));
Original file line number Diff line number Diff line change
@@ -248,8 +248,8 @@ void nullDistinctFromEmpty() {
assertTrue(emptyInput.hasStringBooleanMap());
assertFalse(nullInput.hasStringBooleanMap());
// Collections should return empty collections for access
assertEquals(emptyInput.stringBooleanMap(), Collections.emptyMap());
assertEquals(emptyInput.stringBooleanMap(), nullInput.stringBooleanMap());
assertEquals(emptyInput.getStringBooleanMap(), Collections.emptyMap());
assertEquals(emptyInput.getStringBooleanMap(), nullInput.getStringBooleanMap());

var emptyDocument = Document.of(emptyInput);
var nullDocument = Document.of(nullInput);
Original file line number Diff line number Diff line change
@@ -46,6 +46,10 @@ public final class CodegenUtils {
CodegenUtils.class.getResource("object-reserved-members.txt"));
private static final URL SMITHY_RESERVED_MEMBERS_FILE = Objects.requireNonNull(
CodegenUtils.class.getResource("smithy-reserved-members.txt"));
private static final URL SMITHY_RESERVED_METHODS_FILE = Objects.requireNonNull(
CodegenUtils.class.getResource("smithy-reserved-methods.txt"));

private static final List<String> DELIMITERS = List.of("_", "-", " ");

public static final ReservedWords SHAPE_ESCAPER = new ReservedWordsBuilder()
.loadCaseInsensitiveWords(RESERVED_WORDS_FILE, word -> word + "Shape")
@@ -55,6 +59,9 @@ public final class CodegenUtils {
.loadCaseInsensitiveWords(OBJECT_RESERVED_MEMBERS_FILE, word -> word + "Member")
.loadCaseInsensitiveWords(SMITHY_RESERVED_MEMBERS_FILE, word -> word + "Member")
.build();
public static final ReservedWords METHODS_ESCAPER = new ReservedWordsBuilder()
.loadCaseInsensitiveWords(SMITHY_RESERVED_METHODS_FILE, word -> word + "Member")
.build();

private static final String SCHEMA_STATIC_NAME = "$SCHEMA";

@@ -255,6 +262,33 @@ public static String toDefaultValueName(String memberName) {
return CaseUtils.toSnakeCase(memberName).toUpperCase(Locale.ENGLISH) + "_DEFAULT";
}

/**
*
* Gets the name to use when defining a member as instance variable in a class.
*
* @param memberShape MemberShape
* @param model Model
* @return Instance variable name of a member.
*/
public static String toMemberName(MemberShape memberShape, Model model) {
return getMemberName(memberShape, model, true);
}

/**
* Gets the name to use when defining the getter method of a member.
*
* @param memberShape memberShape.
* @return Getter method name of a member.
*/
public static String toGetterName(MemberShape memberShape, Model model) {
var target = model.expectShape(memberShape.getTarget());
var prefix = target.isBooleanShape() ? "is" : "get";
var memberName = getMemberName(memberShape, model, false);
var suffix =
Character.toUpperCase(memberName.charAt(0)) + (memberName.length() == 1 ? "" : memberName.substring(1));
return METHODS_ESCAPER.escape(prefix + suffix);
}

/**
* Gets the file name to use for the SharedSerde utility class
*
@@ -449,4 +483,46 @@ public static Symbol getServiceApiSymbol(String packageNamespace, String service
.declarationFile(filename)
.build();
}

private static String getMemberName(MemberShape shape, Model model, boolean escape) {
Shape containerShape = model.expectShape(shape.getContainer());
if (containerShape.isEnumShape() || containerShape.isIntEnumShape()) {
return CaseUtils.toSnakeCase(shape.getMemberName()).toUpperCase(Locale.ENGLISH);
}

// If a member name contains an underscore, space, or dash, convert to camel case using Smithy utility
var memberName = shape.getMemberName();
if (DELIMITERS.stream().anyMatch(memberName::contains)) {
memberName = CaseUtils.toCamelCase(memberName);
} else {
memberName = uncapitalizeAcronymAware(memberName);
}

if (escape) {
memberName = CodegenUtils.MEMBER_ESCAPER.escape(memberName);
}
return memberName;
}

private static String uncapitalizeAcronymAware(String str) {
if (Character.isLowerCase(str.charAt(0))) {
return str;
} else if (str.equals(str.toUpperCase())) {
return str.toLowerCase();
}
int strLen = str.length();
StringBuilder sb = new StringBuilder(strLen);
boolean nextIsUpperCase;
for (int idx = 0; idx < strLen; idx++) {
var currentChar = str.charAt(idx);
nextIsUpperCase = (idx + 1 < strLen) && Character.isUpperCase(str.charAt(idx + 1));
if (Character.isUpperCase(currentChar) && (nextIsUpperCase || idx == 0)) {
sb.append(Character.toLowerCase(currentChar));
} else {
sb.append(currentChar);
}
}
return sb.toString();
}

}
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.Flow;
import software.amazon.smithy.codegen.core.CodegenException;
@@ -52,7 +51,6 @@
import software.amazon.smithy.model.shapes.UnionShape;
import software.amazon.smithy.model.traits.StreamingTrait;
import software.amazon.smithy.model.traits.UnitTypeTrait;
import software.amazon.smithy.utils.CaseUtils;

/**
* Maps Smithy types to Java Symbols
@@ -61,7 +59,6 @@ public class JavaSymbolProvider implements ShapeVisitor<Symbol>, SymbolProvider

private static final InternalLogger LOGGER = InternalLogger.getLogger(JavaSymbolProvider.class);
private static final Symbol UNIT_SYMBOL = CodegenUtils.fromClass(Unit.class);
private static final List<String> DELIMITERS = List.of("_", "-", " ");

private final Model model;
private final ServiceShape service;
@@ -82,39 +79,7 @@ public Symbol toSymbol(Shape shape) {

@Override
public String toMemberName(MemberShape shape) {
Shape containerShape = model.expectShape(shape.getContainer());
if (containerShape.isEnumShape() || containerShape.isIntEnumShape()) {
return CaseUtils.toSnakeCase(shape.getMemberName()).toUpperCase(Locale.ENGLISH);
}

// If a member name contains an underscore, space, or dash, convert to camel case using Smithy utility
var memberName = shape.getMemberName();
if (DELIMITERS.stream().anyMatch(memberName::contains)) {
return CodegenUtils.MEMBER_ESCAPER.escape(CaseUtils.toCamelCase(memberName));
}

return CodegenUtils.MEMBER_ESCAPER.escape(uncapitalizeAcronymAware(memberName));
}

private static String uncapitalizeAcronymAware(String str) {
if (Character.isLowerCase(str.charAt(0))) {
return str;
} else if (str.equals(str.toUpperCase())) {
return str.toLowerCase();
}
int strLen = str.length();
StringBuilder sb = new StringBuilder(strLen);
boolean nextIsUpperCase;
for (int idx = 0; idx < strLen; idx++) {
var currentChar = str.charAt(idx);
nextIsUpperCase = (idx + 1 < strLen) && Character.isUpperCase(str.charAt(idx + 1));
if (Character.isUpperCase(currentChar) && (nextIsUpperCase || idx == 0)) {
sb.append(Character.toLowerCase(currentChar));
} else {
sb.append(currentChar);
}
}
return sb.toString();
return CodegenUtils.toMemberName(shape, model);
}

@Override
Original file line number Diff line number Diff line change
@@ -174,14 +174,14 @@ public void run() {
/**
* Value contained by this Enum.
*/
public ${value:N} value() {
public ${value:N} getValue() {
return value;
}

/**
* Type of this Enum variant.
*/
public ${type:N} type() {
public ${type:N} getType() {
return type;
}

Original file line number Diff line number Diff line change
@@ -60,7 +60,7 @@ public void accept(${shape:T} values, ${mapSerializer:T} serializer) {
for (var valueEntry : values.entrySet()) {
serializer.writeEntry(
${keySchema:L}.mapKeyMember(),
valueEntry.getKey()${?enumKey}.value()${/enumKey},
valueEntry.getKey()${?enumKey}.getValue()${/enumKey},
valueEntry.getValue(),
${name:U}$$ValueSerializer.INSTANCE
);
Original file line number Diff line number Diff line change
@@ -125,7 +125,7 @@ public Void integerShape(IntegerShape integerShape) {

@Override
public Void intEnumShape(IntEnumShape shape) {
writer.write("serializer.writeInteger(${schema:L}, ${state:L}.value())");
writer.write("serializer.writeInteger(${schema:L}, ${state:L}.getValue())");
return null;
}

@@ -177,7 +177,7 @@ public Void stringShape(StringShape stringShape) {

@Override
public Void enumShape(EnumShape shape) {
writer.write("serializer.writeString(${schema:L}, ${state:L}.value())");
writer.write("serializer.writeString(${schema:L}, ${state:L}.getValue())");
return null;
}

Original file line number Diff line number Diff line change
@@ -282,9 +282,11 @@ public void run() {
continue;
}
writer.pushState();
writer.putContext("memberName", symbolProvider.toMemberName(member));
var memberName = symbolProvider.toMemberName(member);
writer.putContext("memberName", memberName);
writer.putContext("member", symbolProvider.toSymbol(member));
writer.putContext("isNullable", CodegenUtils.isNullableMember(model, member));
writer.putContext("getterName", CodegenUtils.toGetterName(member, model));
this.member = member;
member.accept(this);
writer.popState();
@@ -298,7 +300,7 @@ protected Void getDefault(Shape shape) {

writer.write(
"""
public ${?isNullable}${member:B}${/isNullable}${^isNullable}${member:N}${/isNullable} ${memberName:L}() {
public ${?isNullable}${member:B}${/isNullable}${^isNullable}${member:N}${/isNullable} ${getterName:L}() {
return ${memberName:L};
}
""");
@@ -325,7 +327,7 @@ private void writeCollectionGetter(Shape shape) {
writer.putContext("collections", Collections.class);
writer.write(
"""
public ${member:T} ${memberName:L}() {${?isNullable}
public ${member:T} ${getterName:L}() {${?isNullable}
if (${memberName:L} == null) {
return ${collections:T}.${empty:L};
}${/isNullable}
Original file line number Diff line number Diff line change
@@ -168,7 +168,7 @@ public void serializeMembers(${shapeSerializer:N} serializer) {
${serializeMember:C};
}${^unit}
public ${member:N} ${memberName:L}() {
public ${member:N} ${getterName:L}() {
return value;
}${/unit}
@@ -180,17 +180,23 @@ public <T> T getValue() {
}
""";
var memberSymbol = symbolProvider.toSymbol(member);
var target = model.expectShape(member.getTarget());
var memberName = symbolProvider.toMemberName(member);
var getterName = CodegenUtils.toGetterName(member, model);
if (getterName.equals("getValue")) {
getterName += "Member";
}
writer.putContext("hasBoxed", memberSymbol.getProperty(SymbolProperties.BOXED_TYPE).isPresent());
writer.putContext("member", memberSymbol);
writer.putContext("memberName", symbolProvider.toMemberName(member));
writer.putContext("memberName", memberName);
writer.putContext("getterName", getterName);
writer.putContext(
"serializeMember",
new SerializerMemberGenerator(directive, writer, member, "value"));
writer.putContext("primitive", memberSymbol.expectProperty(SymbolProperties.IS_PRIMITIVE));
writer.putContext(
"wrap",
memberSymbol.getProperty(SymbolProperties.COLLECTION_IMMUTABLE_WRAPPER).orElse(null));
var target = model.expectShape(member.getTarget());
writer.putContext("unit", target.hasTrait(UnitTypeTrait.class));
writer.putContext("col", target.isMapShape() || target.isListShape());
writer.write(template);
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Member names reserved for Smithy interfaces or fields that are generated into
# customer-defined objects. Member getters with any of these names will attempt
# to override APIs reserved for Smithy's use unless escaped.
#
# Note: Only zero-args methods are a problem here.
getClass
Original file line number Diff line number Diff line change
@@ -31,13 +31,13 @@ void usesFullyQualifiedMap() {
var fileStr = getFileStringForClass("NamingConflictsInput");
// Java map uses fully qualified name
var expectedJavaMapGetter = """
public java.util.Map<String, String> javaMap() {
public java.util.Map<String, String> getJavaMap() {
""";
assertTrue(fileStr.contains(expectedJavaMapGetter));

// Custom map does not use fully qualified name
var expectedCustomMap = """
public Map map() {
public Map getMap() {
return map;
}
""";
@@ -49,13 +49,13 @@ void usesFullyQualifiedList() {
var fileStr = getFileStringForClass("NamingConflictsInput");
// Java map uses fully qualified name
var expectedJavaListGetter = """
public java.util.List<String> javaList() {
public java.util.List<String> getJavaList() {
""";
assertTrue(fileStr.contains(expectedJavaListGetter));

// Custom map does not use fully qualified name
var expectedCustomList = """
public List list() {
public List getList() {
return list;
}
""";
@@ -122,14 +122,14 @@ void acronymInsideStruct() {
void acronymMemberName() {
var fileStr = getFileStringForClass("CasingInput");
assertTrue(fileStr.contains("private final transient String acronymMemberName"));
assertTrue(fileStr.contains("public String acronymMemberName() {"));
assertTrue(fileStr.contains("public String getAcronymMemberName() {"));
}

@Test
void allCapsMemberName() {
var fileStr = getFileStringForClass("CasingInput");
assertTrue(fileStr.contains("private final transient String allcaps"));
assertTrue(fileStr.contains("public String allcaps() {"));
assertTrue(fileStr.contains("public String getAllcaps() {"));
}

static List<Arguments> enumCaseArgs() {
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@ protected ObjectNode settings() {
void nonNullAnnotationsOnFieldsAndGetter() {
var fileStr = getFileStringForClass("NonNullAnnotationStructInput");
var expectedField = "private final transient @TestNonNullAnnotation RequiredStruct requiredStruct;";
var expectedGetter = "public @TestNonNullAnnotation RequiredStruct requiredStruct()";
var expectedGetter = "public @TestNonNullAnnotation RequiredStruct getRequiredStruct()";
var expectedImport = "import software.amazon.smithy.java.codegen.utils.TestNonNullAnnotation;";
var expectedToString = "public @TestNonNullAnnotation String toString() {";

@@ -53,7 +53,7 @@ void nonNullAnnotationNotAddedForPrimitive() {
var fileStr = getFileStringForClass("NonNullAnnotationStructInput");

var expectedField = "private final transient boolean requiredPrimitive;";
var expectedGetter = "public boolean requiredPrimitive() {";
var expectedGetter = "public boolean isRequiredPrimitive() {";
var expectedToString = "public @TestNonNullAnnotation String toString() {";

assertTrue(fileStr.contains(expectedField));
@@ -63,24 +63,25 @@ void nonNullAnnotationNotAddedForPrimitive() {
@Test
void nonNullAnnotationAddedForUnionVariant() {
var fileStr = getFileStringForClass("TestUnion");
var expectedGetterBoxed = "public @TestNonNullAnnotation String boxedVariant() {";
var expectedGetterPrimitive = "public @TestNonNullAnnotation String primitiveVariant() {";
var expectedGetterBoxed = "public @TestNonNullAnnotation String getBoxedVariant() {";
var expectedGetterPrimitive = "public @TestNonNullAnnotation String getPrimitiveVariant() {";
var expectedToString = "public @TestNonNullAnnotation String toString() {";
var expectedTypeGetter = "public @TestNonNullAnnotation Type type() {";

assertTrue(fileStr.contains(expectedGetterBoxed));
assertTrue(fileStr.contains(expectedGetterPrimitive));
assertTrue(fileStr.contains(expectedToString));
System.out.println(fileStr);
assertTrue(fileStr.contains(expectedTypeGetter));
}

@Test
void nonNullAnnotationAddedForEnumVariant() {
var fileStr = getFileStringForClass("TestEnum");
var expectedValueGetter = "public @TestNonNullAnnotation String value() {";
var expectedValueGetter = "public @TestNonNullAnnotation String getValue() {";
var expectedValueField = "private final @TestNonNullAnnotation String value;";
var expectedToString = "public @TestNonNullAnnotation String toString() {";
var expectedTypeGetter = "public @TestNonNullAnnotation Type type() {";
var expectedTypeGetter = "public @TestNonNullAnnotation Type getType() {";

assertTrue(fileStr.contains(expectedValueGetter));
assertTrue(fileStr.contains(expectedValueField));
Original file line number Diff line number Diff line change
@@ -50,7 +50,7 @@ void htmlFormattedTextNotWrapped() {
* <li> Lorem ipsum dolor sit amet, consectetur adipiscing elit Lorem ipsum dolor sit amet, consectetur adipiscing elit </li>
* </ul>
*/
public String shouldNotBeWrapped() {
public String getShouldNotBeWrapped() {
"""));
}

@@ -74,7 +74,7 @@ public final class DeprecatedAnnotationInput implements SerializableStruct {
* @deprecated As of 1.2.
*/
@Deprecated(since = "1.2")
public String deprecatedMember() {
public String getDeprecatedMember() {
return deprecatedMember;
}
"""));
@@ -91,7 +91,7 @@ public String deprecatedMember() {
* @deprecated
*/
@Deprecated
public String deprecatedWithDocs() {
public String getDeprecatedWithDocs() {
return deprecatedWithDocs;
}
"""));
@@ -120,7 +120,7 @@ public final class SinceInput implements SerializableStruct {
/**
* @since 1.2
*/
public String sinceMember() {
public String getSinceMember() {
"""));
}

@@ -139,7 +139,7 @@ public final class ExternalDocumentationInput implements SerializableStruct {
/**
* @see <a href="https://en.wikipedia.org/wiki/Puffin">Puffins are also neat</a>
*/
public String memberWithExternalDocumentation() {
public String getMemberWithExternalDocumentation() {
"""));
}

@@ -153,7 +153,7 @@ public final class UnstableInput implements SerializableStruct {
"""));
assertThat(fileContents, containsString("""
@SmithyUnstableApi
public String unstableMember() {
public String getUnstableMember() {
return unstableMember;
}
"""));
@@ -185,7 +185,7 @@ public final class RollupInput implements SerializableStruct {
*/
@SmithyUnstableApi
@Deprecated(since = "sometime")
public String rollupMember() {
public String getRollupMember() {
"""));
}

Original file line number Diff line number Diff line change
@@ -58,6 +58,6 @@ public void readBeforeTransmit(RequestHook<?, ?, ?> hook) {
var value = "hello world";
var input = EchoInput.builder().string(value).build();
var output = client.echo(input);
assertEquals(value, output.string());
assertEquals(value, output.getString());
}
}
Original file line number Diff line number Diff line change
@@ -55,7 +55,7 @@ public void echoTest() {
var value = "hello world";
var input = EchoInput.builder().string(value).build();
var output = client.echo(input);
assertEquals(value, output.string());
assertEquals(value, output.getString());
}

@Test
@@ -89,7 +89,7 @@ public void readAfterDeserialization(OutputHook<?, ?, ?, ?> hook, RuntimeExcepti
var echoedString = "hello world";
var input = EchoInput.builder().string(echoedString).build();
var output = client.echo(input);
assertEquals(echoedString, output.string());
assertEquals(echoedString, output.getString());
}

@Test
@@ -157,7 +157,7 @@ public void correctlyAppliesDefaultPlugins() {
var value = "hello world";
var input = EchoInput.builder().string(value).build();
var output = client.echo(input);
assertEquals(value, output.string());
assertEquals(value, output.getString());
}

@Test
Original file line number Diff line number Diff line change
@@ -36,7 +36,7 @@ public class ServiceBuilderTest {
private static final class EchoImpl implements EchoOperation {
@Override
public EchoOutput echo(EchoInput input, RequestContext context) {
var output = input.value().toBuilder().echoCount(input.value().echoCount() + 1).build();
var output = input.getValue().toBuilder().echoCount(input.getValue().getEchoCount() + 1).build();
return EchoOutput.builder().value(output).build();
}
}
@@ -46,7 +46,7 @@ private static final class GetBeerImpl implements GetBeerOperationAsync {
public CompletableFuture<GetBeerOutput> getBeer(GetBeerInput input, RequestContext context) {
return CompletableFuture.completedFuture(
GetBeerOutput.builder()
.value(List.of(Beer.builder().id(input.id()).name("TestBeer").build()))
.value(List.of(Beer.builder().id(input.getId()).name("TestBeer").build()))
.build());
}
}
@@ -56,15 +56,15 @@ private static final class GetErrorImpl implements GetErrorOperationAsync {
public CompletableFuture<GetErrorOutput> getError(GetErrorInput input, RequestContext context) {
Throwable exception;
try {
Class<?> clazz = Class.forName(input.exceptionClass());
Class<?> clazz = Class.forName(input.getExceptionClass());
if (ModeledException.class.isAssignableFrom(clazz)) {
Object builderInstance = clazz.getDeclaredMethod("builder").invoke(null);
builderInstance = builderInstance.getClass()
.getMethod("message")
.invoke(builderInstance, input.message());
.invoke(builderInstance, input.getMessage());
exception = (Throwable) builderInstance.getClass().getMethod("build").invoke(builderInstance);
} else {
exception = (Throwable) clazz.getConstructor().newInstance(input.message());
exception = (Throwable) clazz.getConstructor().newInstance(input.getMessage());
}
} catch (ClassNotFoundException
| NoSuchMethodException
@@ -88,16 +88,16 @@ void testRouting() throws ExecutionException, InterruptedException {
Operation<GetBeerInput, GetBeerOutput> getBeer = service.getOperation("GetBeer");
assertThat("GetBeer").isEqualTo(getBeer.name());
var output = getBeer.asyncFunction().apply(GetBeerInput.builder().id(1).build(), null);
assertThat(output.get().value())
assertThat(output.get().getValue())
.hasSize(1)
.containsExactly(Beer.builder().id(1).name("TestBeer").build());

Operation<EchoInput, EchoOutput> echo = service.getOperation("Echo");
assertThat("Echo").isEqualTo(echo.name());
var echoOutput = echo.function()
.apply(EchoInput.builder().value(EchoPayload.builder().string("A").build()).build(), null);
assertThat(echoOutput.value().echoCount()).isEqualTo(1);
assertThat(echoOutput.value().string()).isEqualTo("A");
assertThat(echoOutput.getValue().getEchoCount()).isEqualTo(1);
assertThat(echoOutput.getValue().getString()).isEqualTo("A");
}

@Test
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ private static final class AddBeerImpl implements AddBeerOperation {
@Override
public AddBeerOutput addBeer(AddBeerInput input, RequestContext context) {
long id = ID_GEN.incrementAndGet();
FRIDGE.put(id, input.beer());
FRIDGE.put(id, input.getBeer());
return AddBeerOutput.builder().id(id).build();
}
}
@@ -56,7 +56,7 @@ private static final class GetBeerImpl implements GetBeerOperationAsync {
@Override
public CompletableFuture<GetBeerOutput> getBeer(GetBeerInput input, RequestContext context) {
return CompletableFuture.supplyAsync(
() -> GetBeerOutput.builder().beer(FRIDGE.get(input.id())).build(),
() -> GetBeerOutput.builder().beer(FRIDGE.get(input.getId())).build(),
CompletableFuture.delayedExecutor(100, TimeUnit.MILLISECONDS));
}
}
Original file line number Diff line number Diff line change
@@ -60,31 +60,31 @@ void setupClient() {
@Test
void executesCorrectly() throws InterruptedException {
var menu = client.getMenu(GetMenuInput.builder().build());
var hasEspresso = menu.items().stream().anyMatch(item -> item.typeMember().equals(CoffeeType.ESPRESSO));
var hasEspresso = menu.getItems().stream().anyMatch(item -> item.getType().equals(CoffeeType.ESPRESSO));
assertTrue(hasEspresso);

var createRequest = CreateOrderInput.builder().coffeeType(CoffeeType.COLD_BREW).build();
var createResponse = client.createOrder(createRequest);
assertEquals(CoffeeType.COLD_BREW, createResponse.coffeeType());
System.out.println("Created request with id = " + createResponse.id());
assertEquals(CoffeeType.COLD_BREW, createResponse.getCoffeeType());
System.out.println("Created request with id = " + createResponse.getId());

var getRequest = GetOrderInput.builder().id(createResponse.id()).build();
var getRequest = GetOrderInput.builder().id(createResponse.getId()).build();
var getResponse1 = client.getOrder(getRequest);
assertEquals(getResponse1.status(), OrderStatus.IN_PROGRESS);
assertEquals(getResponse1.getStatus(), OrderStatus.IN_PROGRESS);

// Complete the order
OrderTracker.completeOrder(getResponse1.id());
OrderTracker.completeOrder(getResponse1.getId());

var getResponse2 = client.getOrder(getRequest);
assertEquals(getResponse2.status(), OrderStatus.COMPLETED);
assertEquals(getResponse2.getStatus(), OrderStatus.COMPLETED);
System.out.println("Completed Order :" + getResponse2);
}

@Test
void errorsOutIfOrderDoesNotExist() throws InterruptedException {
var getRequest = GetOrderInput.builder().id(UUID.randomUUID().toString()).build();
var orderNotFound = assertThrows(OrderNotFound.class, () -> client.getOrder(getRequest));
assertEquals(orderNotFound.orderId(), getRequest.id());
assertEquals(orderNotFound.getOrderId(), getRequest.getId());
}

@AfterAll
Original file line number Diff line number Diff line change
@@ -20,11 +20,11 @@ final class CreateOrder implements CreateOrderOperation {
public CreateOrderOutput createOrder(CreateOrderInput input, RequestContext context) {
var id = UUID.randomUUID();

OrderTracker.putOrder(new Order(id, input.coffeeType(), OrderStatus.IN_PROGRESS));
OrderTracker.putOrder(new Order(id, input.getCoffeeType(), OrderStatus.IN_PROGRESS));

return CreateOrderOutput.builder()
.id(id.toString())
.coffeeType(input.coffeeType())
.coffeeType(input.getCoffeeType())
.status(OrderStatus.IN_PROGRESS)
.build();
}
Original file line number Diff line number Diff line change
@@ -15,15 +15,15 @@
final class GetOrder implements GetOrderOperation {
@Override
public GetOrderOutput getOrder(GetOrderInput input, RequestContext context) {
var order = OrderTracker.getOrderById(UUID.fromString(input.id()));
var order = OrderTracker.getOrderById(UUID.fromString(input.getId()));
if (order == null) {
throw OrderNotFound.builder()
.orderId(input.id())
.orderId(input.getId())
.message("Order not found")
.build();
}
return GetOrderOutput.builder()
.id(input.id())
.id(input.getId())
.coffeeType(order.type())
.status(order.status())
.build();
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ public void fizzBuzz() throws InterruptedException {

AtomicLong receivedEvents = new AtomicLong();
Set<Long> unbuzzed = new HashSet<>();
output.stream().subscribe(new Flow.Subscriber<>() {
output.getStream().subscribe(new Flow.Subscriber<>() {

private Flow.Subscription subscription;

Original file line number Diff line number Diff line change
@@ -55,8 +55,8 @@ private static final class AddBeerImpl implements AddBeerOperation {
@Override
public AddBeerOutput addBeer(AddBeerInput input, RequestContext context) {
LOGGER.info("AddBeer - " + input);
String id = ENCODER.encodeToString(input.beer().name().getBytes(StandardCharsets.UTF_8));
FRIDGE.put(id, input.beer());
String id = ENCODER.encodeToString(input.getBeer().getName().getBytes(StandardCharsets.UTF_8));
FRIDGE.put(id, input.getBeer());
return AddBeerOutput.builder().id(id).build();
}
}
@@ -65,7 +65,7 @@ private static final class GetBeerImpl implements GetBeerOperation {
@Override
public GetBeerOutput getBeer(GetBeerInput input, RequestContext context) {
LOGGER.info("GetBeer - " + input);
return GetBeerOutput.builder().beer(FRIDGE.get(input.id())).build();
return GetBeerOutput.builder().beer(FRIDGE.get(input.getId())).build();
}
}
}
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ public class GetCodingStatistics implements GetCodingStatisticsOperation {

@Override
public GetCodingStatisticsOutput getCodingStatistics(GetCodingStatisticsInput input, RequestContext context) {
return switch (input.login()) {
return switch (input.getLogin()) {
case "janedoe" -> GetCodingStatisticsOutput.builder().commits(Map.of()).build();
case "johndoe" -> GetCodingStatisticsOutput.builder().commits(Map.of("Java", 100)).build();
default -> throw NoSuchUserException.builder().message("User doesn't exist in the system").build();
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ public class GetEmployeeDetails implements GetEmployeeDetailsOperation {

@Override
public GetEmployeeDetailsOutput getEmployeeDetails(GetEmployeeDetailsInput input, RequestContext context) {
return switch (input.loginId()) {
return switch (input.getLoginId()) {
case "janedoe" -> GetEmployeeDetailsOutput.builder().name("Jane Doe").build();
case "johndoe" -> GetEmployeeDetailsOutput.builder().name("John Doe").managerAlias("janedoe").build();
default -> throw NoSuchUserException.builder().message("User doesn't exist in the system").build();
Original file line number Diff line number Diff line change
@@ -91,8 +91,8 @@ private void listen() {

private void handleRequest(JsonRpcRequest req) {
try {
switch (req.method()) {
case "initialize" -> writeResponse(req.id(),
switch (req.getMethod()) {
case "initialize" -> writeResponse(req.getId(),
InitializeResult.builder()
.capabilities(Capabilities.builder()
.tools(Tools.builder().listChanged(false).build())
@@ -102,13 +102,13 @@ private void handleRequest(JsonRpcRequest req) {
.version("1.0.0")
.build())
.build());
case "tools/list" -> writeResponse(req.id(),
case "tools/list" -> writeResponse(req.getId(),
ListToolsResult.builder().tools(tools.values().stream().map(Tool::toolInfo).toList()).build());
case "tools/call" -> {
var operationName = req.params().getMember("name").asString();
var operationName = req.getParams().getMember("name").asString();
var tool = tools.get(operationName);
var operation = tool.operation();
var input = req.params()
var input = req.getParams()
.getMember("arguments")
.asShape(operation.getApiOperation().inputBuilder());
var output = operation.function().apply(input, null);
@@ -117,7 +117,7 @@ private void handleRequest(JsonRpcRequest req) {
.text(CODEC.serializeToString((SerializableShape) output))
.build()))
.build();
writeResponse(req.id(), result);
writeResponse(req.getId(), result);
}
default -> {
//For now don't do anything
@@ -161,7 +161,7 @@ private void internalError(JsonRpcRequest req, Exception exception) {
.message(s)
.build();
var response = JsonRpcResponse.builder()
.id(req.id())
.id(req.getId())
.error(error)
.jsonrpc("2.0")
.build();