Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,21 @@
@SdkPublicApi
@ThreadSafe
public interface DynamoDbEnhancedClientExtension {

/**
* Determines whether this extension should process operations for the given table.
* <p>
* 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -141,6 +142,11 @@ public Consumer<StaticTableMetadata.Builder> 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<String> versionAttributeKey = context.tableMetadata()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, AttributeValue> itemToTransform = transformedItem == null ? context.items() : transformedItem;

DynamoDbExtensionContext.BeforeWrite beforeWrite =
Expand Down
Loading