diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/DynamoDbEnhancedClientExtension.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/DynamoDbEnhancedClientExtension.java index b66f493bdac8..82cd554a51a7 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/DynamoDbEnhancedClientExtension.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/DynamoDbEnhancedClientExtension.java @@ -32,6 +32,21 @@ @SdkPublicApi @ThreadSafe public interface DynamoDbEnhancedClientExtension { + + /** + * Determines whether this extension should process operations for the given table. + *

+ * This method is called before invoking {@link #beforeWrite} or {@link #afterRead} to allow + * extensions to skip processing when they are not configured for a particular table schema. + * + * @param metadata the table metadata to check + * @return {@code true} if this extension should process operations for the table, + * {@code false} to skip this extension for the table + */ + default boolean shouldProcess(TableMetadata metadata) { + return true; + } + /** * This hook is called just before an operation is going to write data to the database. The extension that * implements this method can choose to transform the item itself, or add a condition to the write operation diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/AtomicCounterExtension.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/AtomicCounterExtension.java index 69a7807bb970..f59d44e2e64d 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/AtomicCounterExtension.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/AtomicCounterExtension.java @@ -17,6 +17,7 @@ import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.keyRef; import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.valueRef; +import static software.amazon.awssdk.enhanced.dynamodb.internal.extensions.AtomicCounterTag.CUSTOM_METADATA_KEY_PREFIX; import static software.amazon.awssdk.enhanced.dynamodb.internal.update.UpdateExpressionUtils.ifNotExists; import java.util.ArrayList; @@ -29,6 +30,7 @@ import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension; import software.amazon.awssdk.enhanced.dynamodb.DynamoDbExtensionContext; +import software.amazon.awssdk.enhanced.dynamodb.TableMetadata; import software.amazon.awssdk.enhanced.dynamodb.extensions.annotations.DynamoDbAtomicCounter; import software.amazon.awssdk.enhanced.dynamodb.internal.extensions.AtomicCounterTag; import software.amazon.awssdk.enhanced.dynamodb.internal.mapper.AtomicCounter; @@ -106,6 +108,11 @@ public static AtomicCounterExtension.Builder builder() { return new AtomicCounterExtension.Builder(); } + @Override + public boolean shouldProcess(TableMetadata metadata) { + return metadata.customMetadataObject(CUSTOM_METADATA_KEY_PREFIX, Map.class).isPresent(); + } + /** * @param context The {@link DynamoDbExtensionContext.BeforeWrite} context containing the state of the execution. * @return WriteModification contains an update expression representing the counters. diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java index 907ef521b1ec..459c8fadd758 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/extensions/VersionedRecordExtension.java @@ -32,6 +32,7 @@ import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension; import software.amazon.awssdk.enhanced.dynamodb.DynamoDbExtensionContext; import software.amazon.awssdk.enhanced.dynamodb.Expression; +import software.amazon.awssdk.enhanced.dynamodb.TableMetadata; import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticAttributeTag; import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableMetadata; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -141,6 +142,11 @@ public Consumer modifyMetadata(String attributeName } } + @Override + public boolean shouldProcess(TableMetadata metadata) { + return metadata.customMetadataObject(CUSTOM_METADATA_KEY, String.class).isPresent(); + } + @Override public WriteModification beforeWrite(DynamoDbExtensionContext.BeforeWrite context) { Optional versionAttributeKey = context.tableMetadata() diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/extensions/ChainExtension.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/extensions/ChainExtension.java index ed4166d49a15..a9ccbf6f586c 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/extensions/ChainExtension.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/extensions/ChainExtension.java @@ -99,6 +99,9 @@ public WriteModification beforeWrite(DynamoDbExtensionContext.BeforeWrite contex UpdateExpression updateExpression = null; for (DynamoDbEnhancedClientExtension extension : this.extensionChain) { + if (!extension.shouldProcess(context.tableMetadata())) { + continue; + } Map itemToTransform = transformedItem == null ? context.items() : transformedItem; DynamoDbExtensionContext.BeforeWrite beforeWrite =