in DynamoDbEncryption/runtimes/java/src/main/java/software/amazon/cryptography/dbencryptionsdk/dynamodb/DynamoDbEncryptionInterceptor.java [45:333]
public SdkRequest modifyRequest(
Context.ModifyRequest context,
ExecutionAttributes executionAttributes
) {
SdkRequest originalRequest = context.request();
// Only transform DDB requests. Otherwise, throw an error.
if (
!executionAttributes
.getAttribute(SdkExecutionAttribute.SERVICE_NAME)
.equals(DDB_NAME)
) {
throw DynamoDbEncryptionTransformsException
.builder()
.message(
"DynamoDbEncryptionInterceptor does not support use with services other than DynamoDb."
)
.build();
}
// Throw an error if this is not a Sync client.
if (
!executionAttributes
.getAttribute(SdkExecutionAttribute.CLIENT_TYPE)
.equals(ClientType.SYNC)
) {
throw DynamoDbEncryptionTransformsException
.builder()
.message(
"DynamoDbEncryptionInterceptor does not support use with the Async client."
)
.build();
}
// Store original request so it can be used when intercepting the response
executionAttributes.putAttribute(ORIGINAL_REQUEST, originalRequest);
String operationName = executionAttributes.getAttribute(
SdkExecutionAttribute.OPERATION_NAME
);
// Ensure we are dealing with a known operation. Otherwise, throw an error.
checkSupportedOperation(operationName);
SdkRequest outgoingRequest;
switch (operationName) {
case "BatchExecuteStatement":
{
BatchExecuteStatementRequest transformedRequest = transformer
.BatchExecuteStatementInputTransform(
BatchExecuteStatementInputTransformInput
.builder()
.sdkInput((BatchExecuteStatementRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(BatchExecuteStatementRequest) originalRequest,
transformedRequest
);
break;
}
case "BatchGetItem":
{
BatchGetItemRequest transformedRequest = transformer
.BatchGetItemInputTransform(
BatchGetItemInputTransformInput
.builder()
.sdkInput((BatchGetItemRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(BatchGetItemRequest) originalRequest,
transformedRequest
);
break;
}
case "BatchWriteItem":
{
BatchWriteItemRequest transformedRequest = transformer
.BatchWriteItemInputTransform(
BatchWriteItemInputTransformInput
.builder()
.sdkInput((BatchWriteItemRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(BatchWriteItemRequest) originalRequest,
transformedRequest
);
break;
}
case "DeleteItem":
{
DeleteItemRequest transformedRequest = transformer
.DeleteItemInputTransform(
DeleteItemInputTransformInput
.builder()
.sdkInput((DeleteItemRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(DeleteItemRequest) originalRequest,
transformedRequest
);
break;
}
case "ExecuteStatement":
{
ExecuteStatementRequest transformedRequest = transformer
.ExecuteStatementInputTransform(
ExecuteStatementInputTransformInput
.builder()
.sdkInput((ExecuteStatementRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(ExecuteStatementRequest) originalRequest,
transformedRequest
);
break;
}
case "ExecuteTransaction":
{
ExecuteTransactionRequest transformedRequest = transformer
.ExecuteTransactionInputTransform(
ExecuteTransactionInputTransformInput
.builder()
.sdkInput((ExecuteTransactionRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(ExecuteTransactionRequest) originalRequest,
transformedRequest
);
break;
}
case "GetItem":
{
GetItemRequest transformedRequest = transformer
.GetItemInputTransform(
GetItemInputTransformInput
.builder()
.sdkInput((GetItemRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(GetItemRequest) originalRequest,
transformedRequest
);
break;
}
case "PutItem":
{
PutItemRequest transformedRequest = transformer
.PutItemInputTransform(
PutItemInputTransformInput
.builder()
.sdkInput((PutItemRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(PutItemRequest) originalRequest,
transformedRequest
);
break;
}
case "Query":
{
QueryRequest queryRequest = (QueryRequest) originalRequest;
QueryRequest transformedRequest = transformer
.QueryInputTransform(
QueryInputTransformInput.builder().sdkInput(queryRequest).build()
)
.transformedInput();
// Our current Java->Dafny conversion squashes empty maps into the "None" type.
// In order to avoid gray failures for invalid `exclusiveStartKey`,
// and because our transforms do not act on or modify this value currently,
// copy over the original `exclusiveStartKey`
// so that the server can correctly reject it as invalid if it is empty.
transformedRequest =
transformedRequest
.toBuilder()
.exclusiveStartKey(queryRequest.exclusiveStartKey())
.build();
outgoingRequest =
copyOverrideConfig(queryRequest, transformedRequest);
break;
}
case "Scan":
{
ScanRequest scanRequest = (ScanRequest) originalRequest;
ScanRequest transformedRequest = transformer
.ScanInputTransform(
ScanInputTransformInput.builder().sdkInput(scanRequest).build()
)
.transformedInput();
// Our current Java->Dafny conversion squashes empty maps into the "None" type.
// In order to avoid gray failures for invalid `exclusiveStartKey`,
// and because our transforms do not act on or modify this value currently,
// copy over the original `exclusiveStartKey`
// so that the server can correctly reject it as invalid if it is empty.
transformedRequest =
transformedRequest
.toBuilder()
.exclusiveStartKey(scanRequest.exclusiveStartKey())
.build();
outgoingRequest = copyOverrideConfig(scanRequest, transformedRequest);
break;
}
case "TransactGetItems":
{
TransactGetItemsRequest transformedRequest = transformer
.TransactGetItemsInputTransform(
TransactGetItemsInputTransformInput
.builder()
.sdkInput((TransactGetItemsRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(TransactGetItemsRequest) originalRequest,
transformedRequest
);
break;
}
case "TransactWriteItems":
{
TransactWriteItemsRequest transformedRequest = transformer
.TransactWriteItemsInputTransform(
TransactWriteItemsInputTransformInput
.builder()
.sdkInput((TransactWriteItemsRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(TransactWriteItemsRequest) originalRequest,
transformedRequest
);
break;
}
case "UpdateItem":
{
UpdateItemRequest transformedRequest = transformer
.UpdateItemInputTransform(
UpdateItemInputTransformInput
.builder()
.sdkInput((UpdateItemRequest) originalRequest)
.build()
)
.transformedInput();
outgoingRequest =
copyOverrideConfig(
(UpdateItemRequest) originalRequest,
transformedRequest
);
break;
}
default:
{
// Currently we only transform the above hardcoded set of APIs.
// Passthrough all others.
outgoingRequest = originalRequest;
break;
}
}
return outgoingRequest;
}