in codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/ClientClassUtils.java [174:239]
static Optional<CodeBlock> addS3ArnableFieldCode(OperationModel opModel, IntermediateModel model) {
CodeBlock.Builder builder = CodeBlock.builder();
Map<String, S3ArnableFieldConfig> s3ArnableFields = model.getCustomizationConfig().getS3ArnableFields();
if (s3ArnableFields != null &&
s3ArnableFields.containsKey(opModel.getInputShape().getShapeName())) {
S3ArnableFieldConfig s3ArnableField = s3ArnableFields.get(opModel.getInputShape().getShapeName());
String fieldName = s3ArnableField.getField();
MemberModel arnableMember = opModel.getInputShape().tryFindMemberModelByC2jName(fieldName, true);
ClassName arnResourceFqcn = classNameFromFqcn(s3ArnableField.getArnResourceFqcn());
builder.addStatement("String $N = $N.$N()", fieldName,
opModel.getInput().getVariableName(), arnableMember.getFluentGetterMethodName());
builder.addStatement("$T arn = null", Arn.class);
builder.beginControlFlow("if ($N != null && $N.startsWith(\"arn:\"))", fieldName, fieldName)
.addStatement("arn = $T.fromString($N)", Arn.class, fieldName)
.addStatement("$T s3Resource = $T.getInstance().convertArn(arn)",
classNameFromFqcn(s3ArnableField.getBaseArnResourceFqcn()),
classNameFromFqcn(s3ArnableField.getArnConverterFqcn()))
.beginControlFlow("if (!(s3Resource instanceof $T))", arnResourceFqcn)
.addStatement("throw new $T(String.format(\"Unsupported ARN type: %s\", s3Resource.type()))",
IllegalArgumentException.class)
.endControlFlow()
.addStatement("$T resource = ($T) s3Resource", arnResourceFqcn, arnResourceFqcn);
Map<String, String> otherFieldsToPopulate = s3ArnableField.getOtherFieldsToPopulate();
for (Map.Entry<String, String> entry : otherFieldsToPopulate.entrySet()) {
MemberModel memberModel = opModel.getInputShape().tryFindMemberModelByC2jName(entry.getKey(), true);
String variableName = memberModel.getVariable().getVariableName();
String arnVariableName = variableName + "InArn";
builder.addStatement("String $N = $N.$N()", variableName,
opModel.getInput().getVariableName(),
memberModel.getFluentGetterMethodName());
builder.addStatement("String $N = resource.$N",
arnVariableName,
entry.getValue());
builder.beginControlFlow("if ($N != null && !$N.equals($N))",
variableName,
variableName,
arnVariableName)
.addStatement("throw new $T(String.format(\"%s field provided from the request (%s) is different from "
+ "the one in the ARN (%s)\", $S, $N, $N))",
IllegalArgumentException.class,
variableName,
variableName, arnVariableName)
.endControlFlow();
}
builder.add("$N = $N.toBuilder().$N(resource.$N())",
opModel.getInput().getVariableName(),
opModel.getInput().getVariableName(),
arnableMember.getFluentSetterMethodName(),
s3ArnableField.getArnResourceSubstitutionGetter());
for (Map.Entry<String, String> entry : otherFieldsToPopulate.entrySet()) {
MemberModel memberModel = opModel.getInputShape().tryFindMemberModelByC2jName(entry.getKey(), true);
String variableName = memberModel.getVariable().getVariableName();
String arnVariableName = variableName + "InArn";
builder.add(".$N($N)", memberModel.getFluentSetterMethodName(), arnVariableName);
}
return Optional.of(builder.addStatement(".build()").endControlFlow().build());
}
return Optional.empty();
}