in DynamoDbEncryption/runtimes/java/src/main/java/software/amazon/cryptography/dbencryptionsdk/dynamodb/DynamoDbEncryptionInterceptor.java [336:666]
public SdkResponse modifyResponse(
Context.ModifyResponse context,
ExecutionAttributes executionAttributes
) {
SdkResponse originalResponse = context.response();
// Only transform DDB requests. Otherwise, throw an error.
// It should be impossible to encounter this error. Belt and suspenders.
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.
// It should be impossible to encounter this error. Belt and suspenders.
if (
!executionAttributes
.getAttribute(SdkExecutionAttribute.CLIENT_TYPE)
.equals(ClientType.SYNC)
) {
throw DynamoDbEncryptionTransformsException
.builder()
.message(
"DynamoDbEncryptionInterceptor does not support use with the Async client."
)
.build();
}
SdkRequest originalRequest = executionAttributes.getAttribute(
ORIGINAL_REQUEST
);
String operationName = executionAttributes.getAttribute(
SdkExecutionAttribute.OPERATION_NAME
);
// Ensure we are dealing with a known operation. Otherwise, throw an error.
// It should be impossible to encounter this error. Belt and suspenders.
checkSupportedOperation(operationName);
SdkResponse outgoingResponse;
switch (operationName) {
case "BatchExecuteStatement":
{
BatchExecuteStatementResponse transformedResponse = transformer
.BatchExecuteStatementOutputTransform(
BatchExecuteStatementOutputTransformInput
.builder()
.sdkOutput((BatchExecuteStatementResponse) originalResponse)
.originalInput((BatchExecuteStatementRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((BatchExecuteStatementResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "BatchGetItem":
{
BatchGetItemResponse transformedResponse = transformer
.BatchGetItemOutputTransform(
BatchGetItemOutputTransformInput
.builder()
.sdkOutput((BatchGetItemResponse) originalResponse)
.originalInput((BatchGetItemRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((BatchGetItemResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "BatchWriteItem":
{
BatchWriteItemResponse transformedResponse = transformer
.BatchWriteItemOutputTransform(
BatchWriteItemOutputTransformInput
.builder()
.sdkOutput((BatchWriteItemResponse) originalResponse)
.originalInput((BatchWriteItemRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((BatchWriteItemResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "DeleteItem":
{
DeleteItemResponse transformedResponse = transformer
.DeleteItemOutputTransform(
DeleteItemOutputTransformInput
.builder()
.sdkOutput((DeleteItemResponse) originalResponse)
.originalInput((DeleteItemRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((DeleteItemResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "ExecuteStatement":
{
ExecuteStatementResponse transformedResponse = transformer
.ExecuteStatementOutputTransform(
ExecuteStatementOutputTransformInput
.builder()
.sdkOutput((ExecuteStatementResponse) originalResponse)
.originalInput((ExecuteStatementRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((ExecuteStatementResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "ExecuteTransaction":
{
ExecuteTransactionResponse transformedResponse = transformer
.ExecuteTransactionOutputTransform(
ExecuteTransactionOutputTransformInput
.builder()
.sdkOutput((ExecuteTransactionResponse) originalResponse)
.originalInput((ExecuteTransactionRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((ExecuteTransactionResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "GetItem":
{
GetItemResponse transformedResponse = transformer
.GetItemOutputTransform(
GetItemOutputTransformInput
.builder()
.sdkOutput((GetItemResponse) originalResponse)
.originalInput((GetItemRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((GetItemResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "PutItem":
{
PutItemResponse transformedResponse = transformer
.PutItemOutputTransform(
PutItemOutputTransformInput
.builder()
.sdkOutput((PutItemResponse) originalResponse)
.originalInput((PutItemRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((PutItemResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "Query":
{
QueryResponse transformedResponse = transformer
.QueryOutputTransform(
QueryOutputTransformInput
.builder()
.sdkOutput((QueryResponse) originalResponse)
.originalInput((QueryRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((QueryResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "Scan":
{
ScanResponse transformedResponse = transformer
.ScanOutputTransform(
ScanOutputTransformInput
.builder()
.sdkOutput((ScanResponse) originalResponse)
.originalInput((ScanRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((ScanResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "TransactGetItems":
{
TransactGetItemsResponse transformedResponse = transformer
.TransactGetItemsOutputTransform(
TransactGetItemsOutputTransformInput
.builder()
.sdkOutput((TransactGetItemsResponse) originalResponse)
.originalInput((TransactGetItemsRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((TransactGetItemsResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "TransactWriteItems":
{
TransactWriteItemsResponse transformedResponse = transformer
.TransactWriteItemsOutputTransform(
TransactWriteItemsOutputTransformInput
.builder()
.sdkOutput((TransactWriteItemsResponse) originalResponse)
.originalInput((TransactWriteItemsRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((TransactWriteItemsResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
case "UpdateItem":
{
UpdateItemResponse transformedResponse = transformer
.UpdateItemOutputTransform(
UpdateItemOutputTransformInput
.builder()
.sdkOutput((UpdateItemResponse) originalResponse)
.originalInput((UpdateItemRequest) originalRequest)
.build()
)
.transformedOutput();
outgoingResponse =
transformedResponse
.toBuilder()
.responseMetadata(
((UpdateItemResponse) originalResponse).responseMetadata()
)
.sdkHttpResponse(originalResponse.sdkHttpResponse())
.build();
break;
}
default:
{
// Currently we only transform the above hardcoded set of APIs.
// Passthrough all others.
outgoingResponse = originalResponse;
break;
}
}
return outgoingResponse;
}