Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #3365 - adding response metadata into enhanced response objects #3413

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
6 changes: 6 additions & 0 deletions .changes/next-release/feature-AmazonDynamoDB-24a4d1f.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "feature",
"category": "Amazon DynamoDB",
"contributor": "petercipov",
"description": "Pass DynamoDbResponseMetadata via ItemEnhancedResponse objects to retrieve requestId using enhanced client"
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ public DeleteItemEnhancedResponse<T> transformResponse(DeleteItemResponse respon
.attributes(attributes)
.consumedCapacity(response.consumedCapacity())
.itemCollectionMetrics(response.itemCollectionMetrics())
.responseMetadata(response.responseMetadata())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ public PutItemEnhancedResponse<T> transformResponse(PutItemResponse response,
.attributes(attributes)
.consumedCapacity(response.consumedCapacity())
.itemCollectionMetrics(response.itemCollectionMetrics())
.responseMetadata(response.responseMetadata())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ public UpdateItemEnhancedResponse<T> transformResponse(UpdateItemResponse respon
.attributes(attributes)
.consumedCapacity(response.consumedCapacity())
.itemCollectionMetrics(response.itemCollectionMetrics())
.responseMetadata(response.responseMetadata())
.build();
} catch (RuntimeException e) {
// With a partial update it's possible to update the record into a state that the mapper can no longer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.services.dynamodb.model.ConsumedCapacity;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbResponseMetadata;
import software.amazon.awssdk.services.dynamodb.model.ItemCollectionMetrics;

/**
Expand All @@ -38,11 +39,13 @@ public final class DeleteItemEnhancedResponse<T> {
private final T attributes;
private final ConsumedCapacity consumedCapacity;
private final ItemCollectionMetrics itemCollectionMetrics;
private final DynamoDbResponseMetadata responseMetadata;

private DeleteItemEnhancedResponse(Builder<T> builder) {
this.attributes = builder.attributes;
this.consumedCapacity = builder.consumedCapacity;
this.itemCollectionMetrics = builder.itemCollectionMetrics;
this.responseMetadata = builder.responseMetadata;
}

/**
Expand Down Expand Up @@ -70,6 +73,14 @@ public ItemCollectionMetrics itemCollectionMetrics() {
return itemCollectionMetrics;
}

/**
* The response metadata, f.e. requestId
* @see DeleteItemResponse#responseMetadata() ()
*/
public DynamoDbResponseMetadata responseMetadata() {
return responseMetadata;
}

public static <T> Builder<T> builder(Class<? extends T> clzz) {
return new Builder<>();
}
Expand All @@ -86,14 +97,16 @@ public boolean equals(Object o) {
DeleteItemEnhancedResponse<?> that = (DeleteItemEnhancedResponse<?>) o;
return Objects.equals(attributes, that.attributes)
&& Objects.equals(consumedCapacity, that.consumedCapacity)
&& Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics);
&& Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics)
&& Objects.equals(responseMetadata, that.responseMetadata);
}

@Override
public int hashCode() {
int result = Objects.hashCode(attributes);
result = 31 * result + Objects.hashCode(consumedCapacity);
result = 31 * result + Objects.hashCode(itemCollectionMetrics);
result = 31 * result + Objects.hashCode(responseMetadata);
return result;
}

Expand All @@ -102,6 +115,8 @@ public static final class Builder<T> {
private T attributes;
private ConsumedCapacity consumedCapacity;
private ItemCollectionMetrics itemCollectionMetrics;
private DynamoDbResponseMetadata responseMetadata;


public Builder<T> attributes(T attributes) {
this.attributes = attributes;
Expand All @@ -118,6 +133,11 @@ public Builder<T> itemCollectionMetrics(ItemCollectionMetrics itemCollectionMetr
return this;
}

public Builder<T> responseMetadata(DynamoDbResponseMetadata responseMetadata) {
this.responseMetadata = responseMetadata;
return this;
}

public DeleteItemEnhancedResponse<T> build() {
return new DeleteItemEnhancedResponse<>(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncTable;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.services.dynamodb.model.ConsumedCapacity;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbResponseMetadata;
import software.amazon.awssdk.services.dynamodb.model.ItemCollectionMetrics;
import software.amazon.awssdk.services.dynamodb.model.PutItemResponse;

Expand All @@ -37,11 +38,13 @@ public final class PutItemEnhancedResponse<T> {
private final T attributes;
private final ConsumedCapacity consumedCapacity;
private final ItemCollectionMetrics itemCollectionMetrics;
private final DynamoDbResponseMetadata responseMetadata;

private PutItemEnhancedResponse(Builder<T> builder) {
this.attributes = builder.attributes;
this.consumedCapacity = builder.consumedCapacity;
this.itemCollectionMetrics = builder.itemCollectionMetrics;
this.responseMetadata = builder.responseMetadata;
}

/**
Expand Down Expand Up @@ -69,6 +72,14 @@ public ItemCollectionMetrics itemCollectionMetrics() {
return itemCollectionMetrics;
}

/**
* The response metadata, f.e. requestId
* @see PutItemResponse#responseMetadata() ()
*/
public DynamoDbResponseMetadata responseMetadata() {
return responseMetadata;
}

public static <T> Builder<T> builder(Class<? extends T> clzz) {
return new Builder<>();
}
Expand All @@ -85,19 +96,22 @@ public boolean equals(Object o) {
PutItemEnhancedResponse<?> that = (PutItemEnhancedResponse<?>) o;
return Objects.equals(attributes, that.attributes)
&& Objects.equals(consumedCapacity, that.consumedCapacity)
&& Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics);
&& Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics)
&& Objects.equals(responseMetadata, that.responseMetadata);
}

@Override
public int hashCode() {
int result = Objects.hashCode(attributes);
result = 31 * result + Objects.hashCode(consumedCapacity);
result = 31 * result + Objects.hashCode(itemCollectionMetrics);
result = 31 * result + Objects.hashCode(responseMetadata);
return result;
}

@NotThreadSafe
public static final class Builder<T> {
public DynamoDbResponseMetadata responseMetadata;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be private as in DeleteItemEnhancedResponse

Nit: put it as the last instance variable for consistency

private T attributes;
private ConsumedCapacity consumedCapacity;
private ItemCollectionMetrics itemCollectionMetrics;
Expand All @@ -117,6 +131,11 @@ public Builder<T> itemCollectionMetrics(ItemCollectionMetrics itemCollectionMetr
return this;
}

public Builder<T> responseMetadata(DynamoDbResponseMetadata responseMetadata) {
this.responseMetadata = responseMetadata;
return this;
}

public PutItemEnhancedResponse<T> build() {
return new PutItemEnhancedResponse<>(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncTable;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.services.dynamodb.model.ConsumedCapacity;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbResponseMetadata;
import software.amazon.awssdk.services.dynamodb.model.ItemCollectionMetrics;
import software.amazon.awssdk.services.dynamodb.model.UpdateItemResponse;

Expand All @@ -38,11 +39,13 @@ public final class UpdateItemEnhancedResponse<T> {
private final T attributes;
private final ConsumedCapacity consumedCapacity;
private final ItemCollectionMetrics itemCollectionMetrics;
private final DynamoDbResponseMetadata responseMetadata;

private UpdateItemEnhancedResponse(Builder<T> builder) {
this.attributes = builder.attributes;
this.consumedCapacity = builder.consumedCapacity;
this.itemCollectionMetrics = builder.itemCollectionMetrics;
this.responseMetadata = builder.responseMetadata;
}

/**
Expand Down Expand Up @@ -70,6 +73,14 @@ public ItemCollectionMetrics itemCollectionMetrics() {
return itemCollectionMetrics;
}

/**
* The response metadata, f.e. requestId
* @see UpdateItemResponse#responseMetadata() ()
*/
public DynamoDbResponseMetadata responseMetadata() {
return responseMetadata;
}

public static <T> Builder<T> builder(Class<? extends T> clzz) {
return new Builder<>();
}
Expand All @@ -86,19 +97,22 @@ public boolean equals(Object o) {
UpdateItemEnhancedResponse<?> that = (UpdateItemEnhancedResponse<?>) o;
return Objects.equals(attributes, that.attributes)
&& Objects.equals(consumedCapacity, that.consumedCapacity)
&& Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics);
&& Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics)
&& Objects.equals(responseMetadata, that.responseMetadata);
}

@Override
public int hashCode() {
int result = Objects.hashCode(attributes);
result = 31 * result + Objects.hashCode(consumedCapacity);
result = 31 * result + Objects.hashCode(itemCollectionMetrics);
result = 31 * result + Objects.hashCode(responseMetadata);
return result;
}

@NotThreadSafe
public static final class Builder<T> {
public DynamoDbResponseMetadata responseMetadata;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be private as in DeleteItemEnhancedResponse

Nit: put it as the last instance variable for consistency

private T attributes;
private ConsumedCapacity consumedCapacity;
private ItemCollectionMetrics itemCollectionMetrics;
Expand All @@ -118,6 +132,11 @@ public Builder<T> itemCollectionMetrics(ItemCollectionMetrics itemCollectionMetr
return this;
}

public Builder<T> responseMetadata(DynamoDbResponseMetadata responseMetadata) {
this.responseMetadata = responseMetadata;
return this;
}

public UpdateItemEnhancedResponse<T> build() {
return new UpdateItemEnhancedResponse<>(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import software.amazon.awssdk.awscore.DefaultAwsResponseMetadata;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbExtensionContext;
import software.amazon.awssdk.enhanced.dynamodb.Expression;
Expand All @@ -51,6 +52,7 @@
import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemWithSort;
import software.amazon.awssdk.enhanced.dynamodb.internal.extensions.DefaultDynamoDbExtensionContext;
import software.amazon.awssdk.enhanced.dynamodb.model.DeleteItemEnhancedRequest;
import software.amazon.awssdk.enhanced.dynamodb.model.DeleteItemEnhancedResponse;
import software.amazon.awssdk.enhanced.dynamodb.model.TransactDeleteItemEnhancedRequest;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
Expand Down Expand Up @@ -398,6 +400,31 @@ public void transformResponse_withExtension_appliesItemModification() {
.items(baseFakeItemMap).build());
}

@Test
public void transformResponse_passingRequestMetadata() {
FakeItem baseFakeItem = createUniqueFakeItem();

DeleteItemOperation<FakeItem> deleteItemOperation =
DeleteItemOperation.create(DeleteItemEnhancedRequest.builder()
.key(k -> k.partitionValue(baseFakeItem.getId()))
.build());

Map<String, String> metadata = new HashMap<>();
metadata.put("foo", "bar");

DefaultAwsResponseMetadata awsMetadata = DefaultAwsResponseMetadata.create(metadata);

DeleteItemResponse response = (DeleteItemResponse) DeleteItemResponse.builder()
.responseMetadata(awsMetadata)
.build();
DeleteItemEnhancedResponse<FakeItem> enhanced = deleteItemOperation.transformResponse(response,
FakeItem.getTableSchema(),
PRIMARY_CONTEXT,
mockDynamoDbEnhancedClientExtension);

assertThat(enhanced.responseMetadata(), is(response.responseMetadata()));
}

@Test
public void generateTransactWriteItem_basicRequest() {
FakeItem fakeItem = createUniqueFakeItem();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import software.amazon.awssdk.awscore.DefaultAwsResponseMetadata;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbExtensionContext;
import software.amazon.awssdk.enhanced.dynamodb.Expression;
Expand All @@ -47,6 +48,7 @@
import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemComposedClass;
import software.amazon.awssdk.enhanced.dynamodb.internal.extensions.DefaultDynamoDbExtensionContext;
import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedRequest;
import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedResponse;
import software.amazon.awssdk.enhanced.dynamodb.model.TransactPutItemEnhancedRequest;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
Expand Down Expand Up @@ -410,6 +412,28 @@ public void transformResponse_doesNotBlowUp() {
putItemOperation.transformResponse(response, FakeItem.getTableSchema(), PRIMARY_CONTEXT, null);
}

@Test
public void transformResponse_passingRequestMetadata() {
FakeItem item = createUniqueFakeItem();

PutItemOperation<FakeItem> putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class)
.item(item)
.build());

Map<String, String> metadata = new HashMap<>();
metadata.put("foo", "bar");

DefaultAwsResponseMetadata awsMetadata = DefaultAwsResponseMetadata.create(metadata);

PutItemResponse response = (PutItemResponse) PutItemResponse.builder()
.responseMetadata(awsMetadata)
.build();

PutItemEnhancedResponse<FakeItem> enhanced = putItemOperation.transformResponse(response, FakeItem.getTableSchema(),
PRIMARY_CONTEXT, null);
assertThat(enhanced.responseMetadata(), is(response.responseMetadata()));
}

@Test
public void generateRequest_withExtension_modifiesItemToPut() {
FakeItem baseFakeItem = createUniqueFakeItem();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import software.amazon.awssdk.awscore.DefaultAwsResponseMetadata;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbExtensionContext;
import software.amazon.awssdk.enhanced.dynamodb.Expression;
Expand All @@ -54,6 +55,7 @@
import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItemWithSort;
import software.amazon.awssdk.enhanced.dynamodb.internal.extensions.DefaultDynamoDbExtensionContext;
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest;
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedResponse;
import software.amazon.awssdk.enhanced.dynamodb.update.DeleteAction;
import software.amazon.awssdk.enhanced.dynamodb.update.UpdateExpression;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
Expand Down Expand Up @@ -625,6 +627,31 @@ public void transformResponse_afterReadThrowsException_throwsIllegalStateExcepti
transformResponse(createUniqueFakeItem());
}


@Test
public void transformResponse_passingRequestMetadata() {
FakeItem item = createUniqueFakeItem();

UpdateItemOperation<FakeItem> updateItemOperation =
UpdateItemOperation.create(requestFakeItem(item, b -> b.ignoreNulls(true)));

Map<String, AttributeValue> itemMap = FakeItem.getTableSchema().itemToMap(item, true);
Map<String, String> metadata = new HashMap<>();
metadata.put("foo", "bar");

DefaultAwsResponseMetadata awsMetadata = DefaultAwsResponseMetadata.create(metadata);
UpdateItemResponse response = (UpdateItemResponse) UpdateItemResponse.builder()
.attributes(itemMap)
.responseMetadata(awsMetadata)
.build();

UpdateItemEnhancedResponse enhanced = updateItemOperation.transformResponse(response,
FakeItem.getTableSchema(),
PRIMARY_CONTEXT,
mockDynamoDbEnhancedClientExtension);
assertThat(enhanced.responseMetadata(), is(response.responseMetadata()));
}

private Map<String, AttributeValue> ddbKey(String partitionKey) {
return singletonMap("id", AttributeValue.builder().s(partitionKey).build());
}
Expand Down
Loading