From 89f1a4bf882bcae00b9b9f8f070f0803fc8d98a3 Mon Sep 17 00:00:00 2001 From: Ben Maizels Date: Thu, 8 Jun 2023 17:54:47 +0000 Subject: [PATCH] Add EnhancedType parameters to static builder methods of StaticTableSchema and StaticImmitableTableSchema --- ...eature-DynamoDBEnhancedClient-270c65a.json | 6 +++ .../awssdk/enhanced/dynamodb/TableSchema.java | 28 +++++++++++++ .../dynamodb/mapper/ImmutableAttribute.java | 13 ++++++ .../dynamodb/mapper/StaticAttribute.java | 18 ++++++-- .../mapper/StaticImmutableTableSchema.java | 27 ++++++++---- .../dynamodb/mapper/StaticTableSchema.java | 23 +++++++---- .../enhanced/dynamodb/TableSchemaTest.java | 23 ++++++++++- .../StaticImmutableTableSchemaTest.java | 33 +++++++++++++++ .../mapper/StaticTableSchemaTest.java | 32 +++++++++++++++ .../mapper/testbeans/EntityEnvelopeBean.java | 28 +++++++++++++ .../EntityEnvelopeImmutable.java | 41 +++++++++++++++++++ 11 files changed, 252 insertions(+), 20 deletions(-) create mode 100644 .changes/next-release/feature-DynamoDBEnhancedClient-270c65a.json create mode 100644 services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/EntityEnvelopeBean.java create mode 100644 services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testimmutables/EntityEnvelopeImmutable.java diff --git a/.changes/next-release/feature-DynamoDBEnhancedClient-270c65a.json b/.changes/next-release/feature-DynamoDBEnhancedClient-270c65a.json new file mode 100644 index 000000000000..df22b45c116c --- /dev/null +++ b/.changes/next-release/feature-DynamoDBEnhancedClient-270c65a.json @@ -0,0 +1,6 @@ +{ + "category": "DynamoDB Enhanced Client", + "contributor": "bmaizels", + "type": "feature", + "description": "Add EnhancedType parameters to static builder methods of StaticTableSchema and StaticImmitableTableSchema" +} diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/TableSchema.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/TableSchema.java index bdf4ee35cbdb..2aa9d100d2c2 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/TableSchema.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/TableSchema.java @@ -53,6 +53,18 @@ static StaticTableSchema.Builder builder(Class itemClass) { return StaticTableSchema.builder(itemClass); } + /** + * Returns a builder for the {@link StaticTableSchema} implementation of this interface which allows all attributes, + * tags and table structure to be directly declared in the builder. + * + * @param itemType The {@link EnhancedType} of the item this {@link TableSchema} will map records to. + * @param The type of the item this {@link TableSchema} will map records to. + * @return A newly initialized {@link StaticTableSchema.Builder}. + */ + static StaticTableSchema.Builder builder(EnhancedType itemType) { + return StaticTableSchema.builder(itemType); + } + /** * Returns a builder for the {@link StaticImmutableTableSchema} implementation of this interface which allows all * attributes, tags and table structure to be directly declared in the builder. @@ -69,6 +81,22 @@ static StaticImmutableTableSchema.Builder builder(Class immutabl return StaticImmutableTableSchema.builder(immutableItemClass, immutableBuilderClass); } + /** + * Returns a builder for the {@link StaticImmutableTableSchema} implementation of this interface which allows all + * attributes, tags and table structure to be directly declared in the builder. + * + * @param immutableItemType The {@link EnhancedType} of the immutable item this {@link TableSchema} will map records to. + * @param immutableBuilderType The {@link EnhancedType} of the class that can be used to construct immutable items this + * {@link TableSchema} maps records to. + * @param The type of the immutable item this {@link TableSchema} will map records to. + * @param The type of the builder used by this {@link TableSchema} to construct immutable items with. + * @return A newly initialized {@link StaticImmutableTableSchema.Builder} + */ + static StaticImmutableTableSchema.Builder builder(EnhancedType immutableItemType, + EnhancedType immutableBuilderType) { + return StaticImmutableTableSchema.builder(immutableItemType, immutableBuilderType); + } + /** * Scans a bean class that has been annotated with DynamoDb bean annotations and then returns a * {@link BeanTableSchema} implementation of this interface that can map records to and from items of that bean diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/ImmutableAttribute.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/ImmutableAttribute.java index d22f87af61a9..d5622bfc6df6 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/ImmutableAttribute.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/ImmutableAttribute.java @@ -91,6 +91,19 @@ public static Builder builder(Class itemClass, return new Builder<>(attributeType); } + /** + * Constructs a new builder for this class using supplied types. + * @param itemType The {@link EnhancedType} of the immutable item that this attribute composes. + * @param builderType The {@link EnhancedType} of the builder for the immutable item that this attribute composes. + * @param attributeType A {@link EnhancedType} that represents the type of the value this attribute stores. + * @return A new typed builder for an attribute. + */ + public static Builder builder(EnhancedType itemType, + EnhancedType builderType, + EnhancedType attributeType) { + return new Builder<>(attributeType); + } + /** * Constructs a new builder for this class using supplied types. * @param itemClass The class of the item that this attribute composes. diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticAttribute.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticAttribute.java index 2957311d7417..5071869347c8 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticAttribute.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticAttribute.java @@ -69,7 +69,17 @@ private StaticAttribute(Builder builder) { * @return A new typed builder for an attribute. */ public static Builder builder(Class itemClass, EnhancedType attributeType) { - return new Builder<>(itemClass, attributeType); + return new Builder<>(EnhancedType.of(itemClass), attributeType); + } + + /** + * Constructs a new builder for this class using supplied types. + * @param itemType The {@link EnhancedType} of the item that this attribute composes. + * @param attributeType A {@link EnhancedType} that represents the type of the value this attribute stores. + * @return A new typed builder for an attribute. + */ + public static Builder builder(EnhancedType itemType, EnhancedType attributeType) { + return new Builder<>(itemType, attributeType); } /** @@ -79,7 +89,7 @@ public static Builder builder(Class itemClass, EnhancedType a * @return A new typed builder for an attribute. */ public static Builder builder(Class itemClass, Class attributeClass) { - return new Builder<>(itemClass, EnhancedType.of(attributeClass)); + return new Builder<>(EnhancedType.of(itemClass), EnhancedType.of(attributeClass)); } /** @@ -146,8 +156,8 @@ ImmutableAttribute toImmutableAttribute() { public static final class Builder { private final ImmutableAttribute.Builder delegateBuilder; - private Builder(Class itemClass, EnhancedType type) { - this.delegateBuilder = ImmutableAttribute.builder(itemClass, itemClass, type); + private Builder(EnhancedType itemType, EnhancedType type) { + this.delegateBuilder = ImmutableAttribute.builder(itemType, itemType, type); } private Builder(ImmutableAttribute.Builder delegateBuilder) { diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchema.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchema.java index 5d08ee4a3ae3..ea86ac9fcec4 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchema.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchema.java @@ -210,7 +210,7 @@ private StaticImmutableTableSchema(Builder builder) { this.newBuilderSupplier = builder.newBuilderSupplier; this.buildItemFunction = builder.buildItemFunction; this.tableMetadata = tableMetadataBuilder.build(); - this.itemType = EnhancedType.of(builder.itemClass); + this.itemType = builder.itemType; } /** @@ -220,7 +220,18 @@ private StaticImmutableTableSchema(Builder builder) { * @return A newly initialized builder */ public static Builder builder(Class itemClass, Class builderClass) { - return new Builder<>(itemClass, builderClass); + return new Builder<>(EnhancedType.of(itemClass), EnhancedType.of(builderClass)); + } + + /** + * Creates a builder for a {@link StaticImmutableTableSchema} typed to specific immutable data item class. + * @param itemType The {@link EnhancedType} of the immutable data item class object that the + * {@link StaticImmutableTableSchema} is to map to. + * @param builderType The builder {@link EnhancedType} that can be used to construct instances of the immutable data item. + * @return A newly initialized builder + */ + public static Builder builder(EnhancedType itemType, EnhancedType builderType) { + return new Builder<>(itemType, builderType); } /** @@ -230,8 +241,8 @@ public static Builder builder(Class itemClass, Class builderC */ @NotThreadSafe public static final class Builder { - private final Class itemClass; - private final Class builderClass; + private final EnhancedType itemType; + private final EnhancedType builderType; private final List> additionalAttributes = new ArrayList<>(); private final List> flattenedMappers = new ArrayList<>(); @@ -242,9 +253,9 @@ public static final class Builder { private List attributeConverterProviders = Collections.singletonList(ConverterProviderResolver.defaultConverterProvider()); - private Builder(Class itemClass, Class builderClass) { - this.itemClass = itemClass; - this.builderClass = builderClass; + private Builder(EnhancedType itemType, EnhancedType builderType) { + this.itemType = itemType; + this.builderType = builderType; } /** @@ -285,7 +296,7 @@ public Builder addAttribute(EnhancedType attributeType, Consumer> immutableAttribute) { ImmutableAttribute.Builder builder = - ImmutableAttribute.builder(itemClass, builderClass, attributeType); + ImmutableAttribute.builder(itemType, builderType, attributeType); immutableAttribute.accept(builder); return addAttribute(builder.build()); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchema.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchema.java index 5d8dbfd94b76..6dc6b2d4f211 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchema.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchema.java @@ -75,7 +75,16 @@ private StaticTableSchema(Builder builder) { * @return A newly initialized builder */ public static Builder builder(Class itemClass) { - return new Builder<>(itemClass); + return new Builder<>(EnhancedType.of(itemClass)); + } + + /** + * Creates a builder for a {@link StaticTableSchema} typed to specific data item class. + * @param itemType The {@link EnhancedType} of the data item class object that the {@link StaticTableSchema} is to map to. + * @return A newly initialized builder + */ + public static Builder builder(EnhancedType itemType) { + return new Builder<>(itemType); } /** @@ -85,11 +94,11 @@ public static Builder builder(Class itemClass) { @NotThreadSafe public static final class Builder { private final StaticImmutableTableSchema.Builder delegateBuilder; - private final Class itemClass; + private final EnhancedType itemType; - private Builder(Class itemClass) { - this.delegateBuilder = StaticImmutableTableSchema.builder(itemClass, itemClass); - this.itemClass = itemClass; + private Builder(EnhancedType itemType) { + this.delegateBuilder = StaticImmutableTableSchema.builder(itemType, itemType); + this.itemType = itemType; } /** @@ -130,7 +139,7 @@ public Builder attributes(Collection> staticAttributes) */ public Builder addAttribute(EnhancedType attributeType, Consumer> staticAttribute) { - StaticAttribute.Builder builder = StaticAttribute.builder(itemClass, attributeType); + StaticAttribute.Builder builder = StaticAttribute.builder(itemType, attributeType); staticAttribute.accept(builder); this.delegateBuilder.addAttribute(builder.build().toImmutableAttribute()); return this; @@ -142,7 +151,7 @@ public Builder addAttribute(EnhancedType attributeType, */ public Builder addAttribute(Class attributeClass, Consumer> staticAttribute) { - StaticAttribute.Builder builder = StaticAttribute.builder(itemClass, attributeClass); + StaticAttribute.Builder builder = StaticAttribute.builder(itemType, EnhancedType.of(attributeClass)); staticAttribute.accept(builder); this.delegateBuilder.addAttribute(builder.build().toImmutableAttribute()); return this; diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/TableSchemaTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/TableSchemaTest.java index d42296dfe110..daac73362923 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/TableSchemaTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/TableSchemaTest.java @@ -23,6 +23,7 @@ import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem; import software.amazon.awssdk.enhanced.dynamodb.mapper.BeanTableSchema; import software.amazon.awssdk.enhanced.dynamodb.mapper.ImmutableTableSchema; +import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema; import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.InvalidBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.SimpleBean; @@ -33,11 +34,31 @@ public class TableSchemaTest { public ExpectedException exception = ExpectedException.none(); @Test - public void builder_constructsStaticTableSchemaBuilder() { + public void builder_constructsStaticTableSchemaBuilder_fromClass() { StaticTableSchema.Builder builder = TableSchema.builder(FakeItem.class); assertThat(builder).isNotNull(); } + @Test + public void builder_constructsStaticTableSchemaBuilder_fromEnhancedType() { + StaticTableSchema.Builder builder = TableSchema.builder(EnhancedType.of(FakeItem.class)); + assertThat(builder).isNotNull(); + } + + @Test + public void builder_constructsStaticImmutableTableSchemaBuilder_fromClass() { + StaticImmutableTableSchema.Builder builder = + TableSchema.builder(SimpleImmutable.class, SimpleImmutable.Builder.class); + assertThat(builder).isNotNull(); + } + + @Test + public void builder_constructsStaticImmutableTableSchemaBuilder_fromEnhancedType() { + StaticImmutableTableSchema.Builder builder = + TableSchema.builder(EnhancedType.of(SimpleImmutable.class), EnhancedType.of(SimpleImmutable.Builder.class)); + assertThat(builder).isNotNull(); + } + @Test public void fromBean_constructsBeanTableSchema() { BeanTableSchema beanBeanTableSchema = TableSchema.fromBean(SimpleBean.class); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchemaTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchemaTest.java index 2df2c4b052e1..5c1b8b2a4d11 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchemaTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchemaTest.java @@ -59,6 +59,7 @@ import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem; import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemComposedClass; import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemWithSort; +import software.amazon.awssdk.enhanced.dynamodb.mapper.testimmutables.EntityEnvelopeImmutable; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @RunWith(MockitoJUnitRunner.class) @@ -801,6 +802,17 @@ public void itemType_returnsCorrectClass() { assertThat(FakeItem.getTableSchema().itemType(), is(equalTo(EnhancedType.of(FakeItem.class)))); } + @Test + public void itemType_returnsCorrectClassWhenBuiltWithEnhancedType() { + StaticImmutableTableSchema tableSchema = + StaticImmutableTableSchema.builder(EnhancedType.of(FakeMappedItem.class), + EnhancedType.of(FakeMappedItem.Builder.class)) + .newItemBuilder(FakeMappedItem::builder, FakeMappedItem.Builder::build) + .build(); + + assertThat(tableSchema.itemType(), is(equalTo(EnhancedType.of(FakeMappedItem.class)))); + } + @Test public void getTableMetadata_hasCorrectFields() { TableMetadata tableMetadata = FakeItemWithSort.getTableSchema().tableMetadata(); @@ -1538,6 +1550,27 @@ public void noConverterProvider_handlesCorrectly_whenAttributeConvertersAreSuppl assertThat(resultMap.get("aString").s(), is(expectedString)); } + @Test + public void builder_canBuildForGenericClassType() { + StaticImmutableTableSchema, EntityEnvelopeImmutable.Builder> envelopeTableSchema = + StaticImmutableTableSchema.builder(new EnhancedType>() {}, + new EnhancedType>() {}) + .newItemBuilder(EntityEnvelopeImmutable.Builder::new, EntityEnvelopeImmutable.Builder::build) + .addAttribute(String.class, + a -> a.name("entity") + .getter(EntityEnvelopeImmutable::entity) + .setter(EntityEnvelopeImmutable.Builder::setEntity)) + .build(); + + EntityEnvelopeImmutable testEnvelope = new EntityEnvelopeImmutable<>("test-value"); + + Map expectedMap = + Collections.singletonMap("entity", AttributeValue.fromS("test-value")); + + assertThat(envelopeTableSchema.itemToMap(testEnvelope, false), equalTo(expectedMap)); + assertThat(envelopeTableSchema.mapToItem(expectedMap).entity(), equalTo("test-value")); + } + private void verifyAttribute(EnhancedType attributeType, Consumer> staticAttribute, FakeMappedItem fakeMappedItem, diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchemaTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchemaTest.java index fc43da907b08..368ef26b9648 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchemaTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchemaTest.java @@ -57,6 +57,7 @@ import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem; import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemComposedClass; import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemWithSort; +import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.EntityEnvelopeBean; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @RunWith(MockitoJUnitRunner.class) @@ -799,6 +800,16 @@ public void itemType_returnsCorrectClass() { assertThat(FakeItem.getTableSchema().itemType(), is(equalTo(EnhancedType.of(FakeItem.class)))); } + @Test + public void itemType_returnsCorrectClassWhenBuiltWithEnhancedType() { + StaticTableSchema tableSchema = StaticTableSchema.builder(EnhancedType.of(FakeMappedItem.class)) + .newItemSupplier(FakeMappedItem::new) + .attributes(ATTRIBUTES) + .build(); + + assertThat(tableSchema.itemType(), is(equalTo(EnhancedType.of(FakeMappedItem.class)))); + } + @Test public void getTableMetadata_hasCorrectFields() { TableMetadata tableMetadata = FakeItemWithSort.getTableSchema().tableMetadata(); @@ -1485,6 +1496,27 @@ public void noConverterProvider_handlesCorrectly_whenAttributeConvertersAreSuppl assertThat(resultMap.get("aString").s(), is(expectedString)); } + @Test + public void builder_canBuildForGenericClassType() { + StaticTableSchema> envelopeTableSchema = + StaticTableSchema.builder(new EnhancedType>() {}) + .newItemSupplier(EntityEnvelopeBean::new) + .addAttribute(String.class, + a -> a.name("entity") + .getter(EntityEnvelopeBean::getEntity) + .setter(EntityEnvelopeBean::setEntity)) + .build(); + + EntityEnvelopeBean testEnvelope = new EntityEnvelopeBean<>(); + testEnvelope.setEntity("test-value"); + + Map expectedMap = + Collections.singletonMap("entity", AttributeValue.fromS("test-value")); + + assertThat(envelopeTableSchema.itemToMap(testEnvelope, false), equalTo(expectedMap)); + assertThat(envelopeTableSchema.mapToItem(expectedMap).getEntity(), equalTo("test-value")); + } + private void verifyAttribute(EnhancedType attributeType, Consumer> staticAttribute, FakeMappedItem fakeMappedItem, diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/EntityEnvelopeBean.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/EntityEnvelopeBean.java new file mode 100644 index 000000000000..5097ae8d6747 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/EntityEnvelopeBean.java @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans; + +public class EntityEnvelopeBean { + private T entity; + + public T getEntity() { + return this.entity; + } + + public void setEntity(T entity) { + this.entity = entity; + } +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testimmutables/EntityEnvelopeImmutable.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testimmutables/EntityEnvelopeImmutable.java new file mode 100644 index 000000000000..8be0b00f0d70 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testimmutables/EntityEnvelopeImmutable.java @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.enhanced.dynamodb.mapper.testimmutables; + +public class EntityEnvelopeImmutable { + private final T entity; + + public EntityEnvelopeImmutable(T entity) { + this.entity = entity; + } + + public T entity() { + return this.entity; + } + + public static class Builder { + private T entity; + + public void setEntity(T entity) { + this.entity = entity; + } + + public EntityEnvelopeImmutable build() { + return new EntityEnvelopeImmutable<>(this.entity); + } + } +} +