Skip to content

Commit

Permalink
Provides a clearer exception message when building a ReadBatch or Wri…
Browse files Browse the repository at this point in the history
…teBatch without setting the mappedTableResource (table) (#4267)

Co-authored-by: Steven Swartz <sswartz@ripple.com>
Co-authored-by: Dongie Agnir <261310+dagnir@users.noreply.github.com>
  • Loading branch information
3 people committed Sep 26, 2023
1 parent d85ee04 commit db9ea14
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "bugfix",
"category": "Amazon DynamoDB Enhanced Client",
"contributor": "swar8080",
"description": "Provides a clearer exception message when building a ReadBatch or WriteBatch without setting the mappedTableResource (table)"
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

package software.amazon.awssdk.enhanced.dynamodb.model;

import static java.util.Objects.requireNonNull;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -211,6 +213,9 @@ private static boolean compareNullableBooleans(Boolean one, Boolean two) {

@NotThreadSafe
private static final class BuilderImpl<T> implements Builder<T> {
private static final String MAPPED_TABLE_RESOURCE_NOT_NULL_MESSAGE = String.format("A mappedTableResource (table) is "
+ "required when building a %s",
ReadBatch.class.getSimpleName());
private MappedTableResource<T> mappedTableResource;
private List<GetItemEnhancedRequest> requests = new ArrayList<>();

Expand Down Expand Up @@ -243,6 +248,7 @@ public Builder<T> addGetItem(Key key) {

@Override
public Builder<T> addGetItem(T keyItem) {
requireNonNull(mappedTableResource, MAPPED_TABLE_RESOURCE_NOT_NULL_MESSAGE);
return addGetItem(this.mappedTableResource.keyFrom(keyItem));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

package software.amazon.awssdk.enhanced.dynamodb.model;

import static java.util.Objects.requireNonNull;
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.getItemsFromSupplier;

import java.util.ArrayList;
Expand Down Expand Up @@ -187,7 +188,9 @@ public interface Builder<T> {
}

private static final class BuilderImpl<T> implements Builder<T> {

private static final String MAPPED_TABLE_RESOURCE_NOT_NULL_MESSAGE = String.format("A mappedTableResource (table) is "
+ "required when building a %s",
WriteBatch.class.getSimpleName());
private Class<? extends T> itemClass;
private List<Supplier<WriteRequest>> itemSupplierList = new ArrayList<>();
private MappedTableResource<T> mappedTableResource;
Expand All @@ -204,6 +207,7 @@ public Builder<T> mappedTableResource(MappedTableResource<T> mappedTableResource

@Override
public Builder<T> addDeleteItem(DeleteItemEnhancedRequest request) {
requireNonNull(mappedTableResource, MAPPED_TABLE_RESOURCE_NOT_NULL_MESSAGE);
itemSupplierList.add(() -> generateWriteRequest(() -> mappedTableResource, DeleteItemOperation.create(request)));
return this;
}
Expand All @@ -222,11 +226,13 @@ public Builder<T> addDeleteItem(Key key) {

@Override
public Builder<T> addDeleteItem(T keyItem) {
requireNonNull(mappedTableResource, MAPPED_TABLE_RESOURCE_NOT_NULL_MESSAGE);
return addDeleteItem(this.mappedTableResource.keyFrom(keyItem));
}

@Override
public Builder<T> addPutItem(PutItemEnhancedRequest<T> request) {
requireNonNull(mappedTableResource, MAPPED_TABLE_RESOURCE_NOT_NULL_MESSAGE);
itemSupplierList.add(() -> generateWriteRequest(() -> mappedTableResource, PutItemOperation.create(request)));
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThrows;
import static software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem.createUniqueFakeItem;

import java.util.Collections;
Expand Down Expand Up @@ -95,4 +96,13 @@ public void builder_maximal_builder_style() {
assertThat(builtObject.keysAndAttributes().keys(), containsInAnyOrder(Collections.singletonList(fakeItemMap).toArray()));
}

@Test
public void builder_missing_mapped_table_resource_error_message() {
FakeItem fakeItem = createUniqueFakeItem();

ReadBatch.Builder<FakeItem> builder = ReadBatch.builder(FakeItem.class);

NullPointerException exception = assertThrows(NullPointerException.class, () -> builder.addGetItem(fakeItem));
assertThat(exception.getMessage(), is("A mappedTableResource (table) is required when building a ReadBatch"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,21 @@
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThrows;
import static software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem.createUniqueFakeItem;

import java.util.Map;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.function.ThrowingRunnable;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
Expand Down Expand Up @@ -100,6 +105,31 @@ public void builder_maximal_builder_style() {
assertThat(builtObject.writeRequests(), containsInAnyOrder(putRequest(fakeItemMap), deleteRequest(fakeItemMap)));
}

@Test
public void builder_missing_mapped_table_resource_error_message() {
FakeItem fakeItem = createUniqueFakeItem();
PutItemEnhancedRequest<FakeItem> putItemRequest = PutItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build();

Key partitionKey = Key.builder().partitionValue(fakeItem.getId()).build();
DeleteItemEnhancedRequest deleteItemRequest = DeleteItemEnhancedRequest.builder()
.key(partitionKey)
.build();

WriteBatch.Builder<FakeItem> builder = WriteBatch.builder(FakeItem.class);

assertThrowsMappedTableResourceNullException(() -> builder.addPutItem(putItemRequest));
assertThrowsMappedTableResourceNullException(() -> builder.addPutItem(fakeItem));
assertThrowsMappedTableResourceNullException(() -> builder.addPutItem(r -> r.item(fakeItem)));
assertThrowsMappedTableResourceNullException(() -> builder.addDeleteItem(deleteItemRequest));
assertThrowsMappedTableResourceNullException(() -> builder.addDeleteItem(fakeItem));
assertThrowsMappedTableResourceNullException(() -> builder.addDeleteItem(r -> r.key(partitionKey)));
}

private static void assertThrowsMappedTableResourceNullException(ThrowingRunnable runnable) {
NullPointerException exception = assertThrows(NullPointerException.class, runnable);
assertThat(exception.getMessage(), is("A mappedTableResource (table) is required when building a WriteBatch"));
}

private static WriteRequest putRequest(Map<String, AttributeValue> itemMap) {
return WriteRequest.builder().putRequest(PutRequest.builder().item(itemMap).build()).build();
}
Expand Down

0 comments on commit db9ea14

Please sign in to comment.