From 9eb7296a8eba9d45e0308463a3d100a124465d9d Mon Sep 17 00:00:00 2001
From: Adwait Kumar Singh
Date: Thu, 17 Apr 2025 16:12:40 -0700
Subject: [PATCH 1/4] Change generated Getters to have a 'get' prefix
---
.../provider/AwsAuthProvider.java | 11 ++---
.../bundler/AwsServiceBundlerTest.java | 8 ++--
.../smithy/java/codegen/test/BuilderTest.java | 8 ++--
.../test/ClientErrorCorrectionTest.java | 41 ++++++++---------
.../java/codegen/test/DefaultsTest.java | 44 +++++++++----------
.../smithy/java/codegen/test/EnumTest.java | 2 +-
.../smithy/java/codegen/test/ListsTest.java | 4 +-
.../smithy/java/codegen/test/MapsTest.java | 4 +-
.../smithy/java/codegen/CodegenUtils.java | 27 ++++++++++++
.../codegen/generators/EnumGenerator.java | 4 +-
.../java/codegen/generators/MapGenerator.java | 2 +-
.../generators/SerializerMemberGenerator.java | 4 +-
.../generators/StructureGenerator.java | 8 ++--
.../codegen/generators/UnionGenerator.java | 10 ++++-
.../smithy/java/codegen/NamingTest.java | 12 ++---
.../java/codegen/NonNullAnnotationTest.java | 13 +++---
.../javadoc/JavadocIntegrationTest.java | 14 +++---
.../java/codegen/client/AuthSchemeTest.java | 2 +-
.../codegen/client/GenericClientTest.java | 6 +--
.../codegen/server/ServiceBuilderTest.java | 16 +++----
.../server/example/BasicServerExample.java | 4 +-
.../java/server/example/CreateOrder.java | 4 +-
.../smithy/java/server/example/GetOrder.java | 6 +--
.../java/example/BeerServiceProvider.java | 6 +--
.../mcp/operations/GetCodingStatistics.java | 2 +-
.../mcp/operations/GetEmployeeDetails.java | 2 +-
.../smithy/java/server/mcp/MCPServer.java | 14 +++---
27 files changed, 158 insertions(+), 120 deletions(-)
diff --git a/aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProvider.java b/aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProvider.java
index 492dde453..e1f810afd 100644
--- a/aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProvider.java
+++ b/aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProvider.java
@@ -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());
}
}
diff --git a/aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundlerTest.java b/aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundlerTest.java
index 7af717a1a..5ed64aee1 100644
--- a/aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundlerTest.java
+++ b/aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundlerTest.java
@@ -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) {
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/BuilderTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/BuilderTest.java
index 4e6e647f2..d8c10292d 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/BuilderTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/BuilderTest.java
@@ -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);
}
}
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java
index 887df57ae..49e41b224 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java
@@ -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.getBooleanMember());
+ assertEquals(corrected.getBigDecimal(), BigDecimal.ZERO);
+ assertEquals(corrected.getBigInteger(), BigInteger.ZERO);
+ assertEquals(corrected.getByteMember(), (byte) 0);
+ assertEquals(corrected.getDoubleMember(), 0);
+ assertEquals(corrected.getFloatMember(), 0);
+ assertEquals(corrected.getInteger(), 0);
+ assertEquals(corrected.getLongMember(), 0);
+ assertEquals(corrected.getShortMember(), (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.getEnumMember().getType(), NestedEnum.Type.$UNKNOWN);
+ assertEquals(corrected.getEnumMember().getValue(), "");
+ assertEquals(corrected.getIntEnum().getType(), NestedIntEnum.Type.$UNKNOWN);
+ assertEquals(corrected.getIntEnum().getValue(), 0);
}
}
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java
index b2995a0ee..4b0fbdd4e 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java
@@ -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.getBooleanMember());
+ assertEquals(defaults.getBigDecimal(), BigDecimal.valueOf(1.0));
+ assertEquals(defaults.getBigInteger(), BigInteger.valueOf(1));
+ assertEquals(defaults.getByteMember(), (byte) 1);
+ assertEquals(defaults.getDoubleMember(), 1.0);
+ assertEquals(defaults.getFloatMember(), 1f);
+ assertEquals(defaults.getInteger(), 1);
+ assertEquals(defaults.getLongMember(), 1);
+ assertEquals(defaults.getShortMember(), (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.getEnumMember(), NestedEnum.A);
+ assertEquals(defaults.getIntEnum(), NestedIntEnum.A);
}
}
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/EnumTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/EnumTest.java
index 6e0633b15..6262d17d7 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/EnumTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/EnumTest.java
@@ -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);
}
}
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ListsTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ListsTest.java
index dcc8f9792..d10d56d89 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ListsTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ListsTest.java
@@ -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"));
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/MapsTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/MapsTest.java
index 6ae9badd6..1dc1960ba 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/MapsTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/MapsTest.java
@@ -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);
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
index be9914085..46e614181 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
@@ -255,6 +255,33 @@ public static String toDefaultValueName(String memberName) {
return CaseUtils.toSnakeCase(memberName).toUpperCase(Locale.ENGLISH) + "_DEFAULT";
}
+ /**
+ * Gets the name to use when defining the default value of a member.
+ *
+ * @param memberShape memberShape.
+ * @return Upper snake case name of default
+ */
+ public static String toGetterName(MemberShape memberShape, String memberName) {
+ var prefix = memberShape.isBooleanShape() ? "is" : "get";
+ var suffix =
+ Character.toUpperCase(memberName.charAt(0)) + (memberName.length() == 1 ? "" : memberName.substring(1));
+ return prefix + suffix;
+ }
+
+ /**
+ * Gets the name to use when defining the default value of a member.
+ *
+ * @param memberShape memberShape.
+ * @return Upper snake case name of default
+ */
+ public static String toUnionGetterName(MemberShape memberShape, String memberName) {
+ var getterName = toGetterName(memberShape, memberName);
+ if (getterName.equals("getValue")) {
+ getterName += "Member";
+ }
+ return getterName;
+ }
+
/**
* Gets the file name to use for the SharedSerde utility class
*
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/EnumGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/EnumGenerator.java
index 1e2fe8376..c90fd20c2 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/EnumGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/EnumGenerator.java
@@ -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;
}
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/MapGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/MapGenerator.java
index 3b9c0bc57..02244c6fc 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/MapGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/MapGenerator.java
@@ -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
);
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/SerializerMemberGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/SerializerMemberGenerator.java
index 74558afe3..f2015811a 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/SerializerMemberGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/SerializerMemberGenerator.java
@@ -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;
}
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java
index 129010dda..fb1aabab8 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java
@@ -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, memberName));
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}
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java
index a766eb54b..839e1d94c 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java
@@ -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,9 +180,15 @@ public T getValue() {
}
""";
var memberSymbol = symbolProvider.toSymbol(member);
+ var memberName = symbolProvider.toMemberName(member);
+ var getterName = CodegenUtils.toGetterName(member, memberName);
+ 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"));
diff --git a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NamingTest.java b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NamingTest.java
index f76b0ae81..afa4c4266 100644
--- a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NamingTest.java
+++ b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NamingTest.java
@@ -31,13 +31,13 @@ void usesFullyQualifiedMap() {
var fileStr = getFileStringForClass("NamingConflictsInput");
// Java map uses fully qualified name
var expectedJavaMapGetter = """
- public java.util.Map javaMap() {
+ public java.util.Map 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 javaList() {
+ public java.util.List 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 enumCaseArgs() {
diff --git a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java
index 02d31018b..1adafa129 100644
--- a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java
+++ b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java
@@ -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 getRequiredPrimitive() {";
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));
diff --git a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/integrations/javadoc/JavadocIntegrationTest.java b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/integrations/javadoc/JavadocIntegrationTest.java
index c8b4ec670..25757db43 100644
--- a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/integrations/javadoc/JavadocIntegrationTest.java
+++ b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/integrations/javadoc/JavadocIntegrationTest.java
@@ -50,7 +50,7 @@ void htmlFormattedTextNotWrapped() {
* Lorem ipsum dolor sit amet, consectetur adipiscing elit Lorem ipsum dolor sit amet, consectetur adipiscing elit
*
*/
- 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 Puffins are also neat
*/
- 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() {
"""));
}
diff --git a/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/AuthSchemeTest.java b/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/AuthSchemeTest.java
index 8dcb8f198..619994c39 100644
--- a/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/AuthSchemeTest.java
+++ b/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/AuthSchemeTest.java
@@ -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());
}
}
diff --git a/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/GenericClientTest.java b/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/GenericClientTest.java
index bfcf1641f..e69858219 100644
--- a/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/GenericClientTest.java
+++ b/codegen/plugins/client-codegen/src/it/java/software/amazon/smithy/java/codegen/client/GenericClientTest.java
@@ -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
diff --git a/codegen/plugins/server-codegen/src/it/java/software/amazon/smithy/java/codegen/server/ServiceBuilderTest.java b/codegen/plugins/server-codegen/src/it/java/software/amazon/smithy/java/codegen/server/ServiceBuilderTest.java
index e08ec7c1a..68d0ad428 100644
--- a/codegen/plugins/server-codegen/src/it/java/software/amazon/smithy/java/codegen/server/ServiceBuilderTest.java
+++ b/codegen/plugins/server-codegen/src/it/java/software/amazon/smithy/java/codegen/server/ServiceBuilderTest.java
@@ -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 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 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,7 +88,7 @@ void testRouting() throws ExecutionException, InterruptedException {
Operation 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());
@@ -96,8 +96,8 @@ void testRouting() throws ExecutionException, InterruptedException {
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
diff --git a/examples/basic-server/src/main/java/software/amazon/smithy/java/server/example/BasicServerExample.java b/examples/basic-server/src/main/java/software/amazon/smithy/java/server/example/BasicServerExample.java
index 3b1f5e04e..2b8fbe1b1 100644
--- a/examples/basic-server/src/main/java/software/amazon/smithy/java/server/example/BasicServerExample.java
+++ b/examples/basic-server/src/main/java/software/amazon/smithy/java/server/example/BasicServerExample.java
@@ -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 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));
}
}
diff --git a/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/CreateOrder.java b/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/CreateOrder.java
index 6a241f2b8..b23fb66d5 100644
--- a/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/CreateOrder.java
+++ b/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/CreateOrder.java
@@ -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();
}
diff --git a/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/GetOrder.java b/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/GetOrder.java
index f1c89bec6..892cc4d42 100644
--- a/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/GetOrder.java
+++ b/examples/end-to-end/src/main/java/software/amazon/smithy/java/server/example/GetOrder.java
@@ -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();
diff --git a/examples/lambda/src/main/java/software/amazon/smithy/java/example/BeerServiceProvider.java b/examples/lambda/src/main/java/software/amazon/smithy/java/example/BeerServiceProvider.java
index fb1147d1c..773729fe8 100644
--- a/examples/lambda/src/main/java/software/amazon/smithy/java/example/BeerServiceProvider.java
+++ b/examples/lambda/src/main/java/software/amazon/smithy/java/example/BeerServiceProvider.java
@@ -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();
}
}
}
diff --git a/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetCodingStatistics.java b/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetCodingStatistics.java
index 5d8e27535..68291da99 100644
--- a/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetCodingStatistics.java
+++ b/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetCodingStatistics.java
@@ -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();
diff --git a/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetEmployeeDetails.java b/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetEmployeeDetails.java
index 4983bf392..2c335beb0 100644
--- a/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetEmployeeDetails.java
+++ b/examples/mcp-server/src/main/java/software/amazon/smithy/java/example/server/mcp/operations/GetEmployeeDetails.java
@@ -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();
diff --git a/mcp/mcp-server/src/main/java/software/amazon/smithy/java/server/mcp/MCPServer.java b/mcp/mcp-server/src/main/java/software/amazon/smithy/java/server/mcp/MCPServer.java
index 34404a85b..995e61384 100644
--- a/mcp/mcp-server/src/main/java/software/amazon/smithy/java/server/mcp/MCPServer.java
+++ b/mcp/mcp-server/src/main/java/software/amazon/smithy/java/server/mcp/MCPServer.java
@@ -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();
From 0eebfb6b4edfe2f9c2ec71bea7530a9ca77758d1 Mon Sep 17 00:00:00 2001
From: Adwait Kumar Singh
Date: Thu, 17 Apr 2025 16:20:25 -0700
Subject: [PATCH 2/4] Remove unused method
---
.../amazon/smithy/java/codegen/CodegenUtils.java | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
index 46e614181..b2e5a192a 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
@@ -268,20 +268,6 @@ public static String toGetterName(MemberShape memberShape, String memberName) {
return prefix + suffix;
}
- /**
- * Gets the name to use when defining the default value of a member.
- *
- * @param memberShape memberShape.
- * @return Upper snake case name of default
- */
- public static String toUnionGetterName(MemberShape memberShape, String memberName) {
- var getterName = toGetterName(memberShape, memberName);
- if (getterName.equals("getValue")) {
- getterName += "Member";
- }
- return getterName;
- }
-
/**
* Gets the file name to use for the SharedSerde utility class
*
From ab9b212655e9d5a351d35e2951bdd09f93622c73 Mon Sep 17 00:00:00 2001
From: Adwait Kumar Singh
Date: Thu, 17 Apr 2025 16:27:27 -0700
Subject: [PATCH 3/4] Fix integ tests
---
.../java/server/example/RoundTripTests.java | 16 ++++++++--------
.../example/eventstreaming/EventStreamTest.java | 2 +-
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java b/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java
index 1df514374..b229cb24b 100644
--- a/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java
+++ b/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java
@@ -60,23 +60,23 @@ 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.getTypeMember().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);
}
@@ -84,7 +84,7 @@ void executesCorrectly() throws InterruptedException {
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
diff --git a/examples/event-streaming-client/src/it/java/software/amazon/smithy/java/example/eventstreaming/EventStreamTest.java b/examples/event-streaming-client/src/it/java/software/amazon/smithy/java/example/eventstreaming/EventStreamTest.java
index eee123c08..5badb0706 100644
--- a/examples/event-streaming-client/src/it/java/software/amazon/smithy/java/example/eventstreaming/EventStreamTest.java
+++ b/examples/event-streaming-client/src/it/java/software/amazon/smithy/java/example/eventstreaming/EventStreamTest.java
@@ -46,7 +46,7 @@ public void fizzBuzz() throws InterruptedException {
AtomicLong receivedEvents = new AtomicLong();
Set unbuzzed = new HashSet<>();
- output.stream().subscribe(new Flow.Subscriber<>() {
+ output.getStream().subscribe(new Flow.Subscriber<>() {
private Flow.Subscription subscription;
From 39381f13cb196fe7a8a68477ec380b3ced91f0f7 Mon Sep 17 00:00:00 2001
From: Adwait Kumar Singh
Date: Fri, 18 Apr 2025 13:43:09 -0700
Subject: [PATCH 4/4] Use Method escaper. Fix getter names for booleans
---
.../test/ClientErrorCorrectionTest.java | 16 ++--
.../java/codegen/test/DefaultsTest.java | 14 ++--
.../smithy/java/codegen/CodegenUtils.java | 75 +++++++++++++++++--
.../java/codegen/JavaSymbolProvider.java | 37 +--------
.../generators/StructureGenerator.java | 2 +-
.../codegen/generators/UnionGenerator.java | 4 +-
.../java/codegen/smithy-reserved-methods.txt | 10 +++
.../java/codegen/NonNullAnnotationTest.java | 2 +-
.../java/server/example/RoundTripTests.java | 2 +-
9 files changed, 100 insertions(+), 62 deletions(-)
create mode 100644 codegen/codegen-core/src/main/resources/software/amazon/smithy/java/codegen/smithy-reserved-methods.txt
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java
index 49e41b224..ac7e49275 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java
@@ -28,15 +28,15 @@ void correctsErrors() {
.errorCorrection()
.build();
- assertFalse(corrected.getBooleanMember());
+ assertFalse(corrected.isBoolean());
assertEquals(corrected.getBigDecimal(), BigDecimal.ZERO);
assertEquals(corrected.getBigInteger(), BigInteger.ZERO);
- assertEquals(corrected.getByteMember(), (byte) 0);
- assertEquals(corrected.getDoubleMember(), 0);
- assertEquals(corrected.getFloatMember(), 0);
+ assertEquals(corrected.getByte(), (byte) 0);
+ assertEquals(corrected.getDouble(), 0);
+ assertEquals(corrected.getFloat(), 0);
assertEquals(corrected.getInteger(), 0);
- assertEquals(corrected.getLongMember(), 0);
- assertEquals(corrected.getShortMember(), (short) 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()));
@@ -44,8 +44,8 @@ void correctsErrors() {
assertEquals(corrected.getList(), List.of());
assertEquals(corrected.getMap(), Map.of());
assertEquals(corrected.getTimestamp(), Instant.EPOCH);
- assertEquals(corrected.getEnumMember().getType(), NestedEnum.Type.$UNKNOWN);
- assertEquals(corrected.getEnumMember().getValue(), "");
+ assertEquals(corrected.getEnum().getType(), NestedEnum.Type.$UNKNOWN);
+ assertEquals(corrected.getEnum().getValue(), "");
assertEquals(corrected.getIntEnum().getType(), NestedIntEnum.Type.$UNKNOWN);
assertEquals(corrected.getIntEnum().getValue(), 0);
}
diff --git a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java
index 4b0fbdd4e..2a5de2a44 100644
--- a/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java
+++ b/codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java
@@ -27,15 +27,15 @@ public class DefaultsTest {
void setsCorrectDefault() {
var defaults = DefaultsInput.builder().build();
- assertTrue(defaults.getBooleanMember());
+ assertTrue(defaults.isBoolean());
assertEquals(defaults.getBigDecimal(), BigDecimal.valueOf(1.0));
assertEquals(defaults.getBigInteger(), BigInteger.valueOf(1));
- assertEquals(defaults.getByteMember(), (byte) 1);
- assertEquals(defaults.getDoubleMember(), 1.0);
- assertEquals(defaults.getFloatMember(), 1f);
+ assertEquals(defaults.getByte(), (byte) 1);
+ assertEquals(defaults.getDouble(), 1.0);
+ assertEquals(defaults.getFloat(), 1f);
assertEquals(defaults.getInteger(), 1);
- assertEquals(defaults.getLongMember(), 1);
- assertEquals(defaults.getShortMember(), (short) 1);
+ assertEquals(defaults.getLong(), 1);
+ assertEquals(defaults.getShort(), (short) 1);
assertEquals(defaults.getBlob(), ByteBuffer.wrap(Base64.getDecoder().decode("YmxvYg==")));
defaults.getStreamingBlob()
.asByteBuffer()
@@ -49,7 +49,7 @@ void setsCorrectDefault() {
assertEquals(defaults.getList(), List.of());
assertEquals(defaults.getMap(), Map.of());
assertEquals(defaults.getTimestamp(), Instant.parse("1985-04-12T23:20:50.52Z"));
- assertEquals(defaults.getEnumMember(), NestedEnum.A);
+ assertEquals(defaults.getEnum(), NestedEnum.A);
assertEquals(defaults.getIntEnum(), NestedIntEnum.A);
}
}
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
index b2e5a192a..fe36c4df5 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java
@@ -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 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";
@@ -256,16 +263,30 @@ public static String toDefaultValueName(String memberName) {
}
/**
- * Gets the name to use when defining the default value of a member.
*
- * @param memberShape memberShape.
- * @return Upper snake case name of 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 toGetterName(MemberShape memberShape, String memberName) {
- var prefix = memberShape.isBooleanShape() ? "is" : "get";
+ 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 prefix + suffix;
+ return METHODS_ESCAPER.escape(prefix + suffix);
}
/**
@@ -462,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();
+ }
+
}
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/JavaSymbolProvider.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/JavaSymbolProvider.java
index 476e0b8c9..58cdf1aca 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/JavaSymbolProvider.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/JavaSymbolProvider.java
@@ -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, SymbolProvider
private static final InternalLogger LOGGER = InternalLogger.getLogger(JavaSymbolProvider.class);
private static final Symbol UNIT_SYMBOL = CodegenUtils.fromClass(Unit.class);
- private static final List 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
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java
index fb1aabab8..22b07136e 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/StructureGenerator.java
@@ -286,7 +286,7 @@ public void run() {
writer.putContext("memberName", memberName);
writer.putContext("member", symbolProvider.toSymbol(member));
writer.putContext("isNullable", CodegenUtils.isNullableMember(model, member));
- writer.putContext("getterName", CodegenUtils.toGetterName(member, memberName));
+ writer.putContext("getterName", CodegenUtils.toGetterName(member, model));
this.member = member;
member.accept(this);
writer.popState();
diff --git a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java
index 839e1d94c..d71d6c559 100644
--- a/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java
+++ b/codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/UnionGenerator.java
@@ -180,8 +180,9 @@ public T getValue() {
}
""";
var memberSymbol = symbolProvider.toSymbol(member);
+ var target = model.expectShape(member.getTarget());
var memberName = symbolProvider.toMemberName(member);
- var getterName = CodegenUtils.toGetterName(member, memberName);
+ var getterName = CodegenUtils.toGetterName(member, model);
if (getterName.equals("getValue")) {
getterName += "Member";
}
@@ -196,7 +197,6 @@ public T getValue() {
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);
diff --git a/codegen/codegen-core/src/main/resources/software/amazon/smithy/java/codegen/smithy-reserved-methods.txt b/codegen/codegen-core/src/main/resources/software/amazon/smithy/java/codegen/smithy-reserved-methods.txt
new file mode 100644
index 000000000..26f4d0ab4
--- /dev/null
+++ b/codegen/codegen-core/src/main/resources/software/amazon/smithy/java/codegen/smithy-reserved-methods.txt
@@ -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
\ No newline at end of file
diff --git a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java
index 1adafa129..5adae5e99 100644
--- a/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java
+++ b/codegen/codegen-core/src/test/java/software/amazon/smithy/java/codegen/NonNullAnnotationTest.java
@@ -53,7 +53,7 @@ void nonNullAnnotationNotAddedForPrimitive() {
var fileStr = getFileStringForClass("NonNullAnnotationStructInput");
var expectedField = "private final transient boolean requiredPrimitive;";
- var expectedGetter = "public boolean getRequiredPrimitive() {";
+ var expectedGetter = "public boolean isRequiredPrimitive() {";
var expectedToString = "public @TestNonNullAnnotation String toString() {";
assertTrue(fileStr.contains(expectedField));
diff --git a/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java b/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java
index b229cb24b..c51f699ff 100644
--- a/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java
+++ b/examples/end-to-end/src/it/java/software/amazon/smithy/java/server/example/RoundTripTests.java
@@ -60,7 +60,7 @@ void setupClient() {
@Test
void executesCorrectly() throws InterruptedException {
var menu = client.getMenu(GetMenuInput.builder().build());
- var hasEspresso = menu.getItems().stream().anyMatch(item -> item.getTypeMember().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();