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();