public SdkRequest modifyRequest()

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;
  }