All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.amazon.awssdk.codegen.poet.model.NonCollectionSetters Maven / Gradle / Ivy

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package software.amazon.awssdk.codegen.poet.model;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import javax.lang.model.element.Modifier;
import software.amazon.awssdk.codegen.model.config.customization.ConvenienceTypeOverload;
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
import software.amazon.awssdk.codegen.model.intermediate.MemberModel;
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
import software.amazon.awssdk.codegen.poet.PoetUtils;
import software.amazon.awssdk.utils.StringUtils;

class NonCollectionSetters extends AbstractMemberSetters {
    NonCollectionSetters(IntermediateModel intermediateModel,
                         ShapeModel shapeModel,
                         MemberModel memberModel,
                         TypeProvider typeProvider) {
        super(intermediateModel, shapeModel, memberModel, typeProvider);
    }

    @Override
    public List fluentDeclarations(TypeName returnType) {
        List fluentDeclarations = new ArrayList<>();
        fluentDeclarations.add(fluentAbstractSetterDeclaration(memberAsParameter(), returnType)
                                   .addJavadoc("$L", memberModel().getFluentSetterDocumentation())
                                   .build());

        if (memberModel().getEnumType() != null) {
            fluentDeclarations.add(fluentAbstractSetterDeclaration(modeledParam(), returnType)
                                       .addJavadoc("$L", memberModel().getFluentSetterDocumentation())
                                       .build());
        }

        if (memberModel().getDeprecatedName() != null) {
            MethodSpec.Builder builder = fluentAbstractSetterDeclaration(
                memberModel().getDeprecatedFluentSetterMethodName(),
                memberAsParameter(),
                returnType);

            fluentDeclarations.add(builder
                                       .addJavadoc("$L", memberModel().getDeprecatedSetterDocumentation())
                                       .addAnnotation(Deprecated.class)
                                       .build());
        }

        if (memberModel().hasBuilder()) {
            fluentDeclarations.add(fluentConsumerFluentSetter(returnType));
        }

        return fluentDeclarations;
    }

    @Override
    public List fluent(TypeName returnType) {
        List fluentSetters = new ArrayList<>();

        fluentSetters.add(fluentAssignmentSetter(returnType));

        if (memberModel().getEnumType() != null) {
            fluentSetters.add(fluentEnumToStringSetter(returnType));
        }

        if (memberModel().getDeprecatedName() != null) {
            fluentSetters.add(fluentAssignmentSetter(memberModel().getDeprecatedFluentSetterMethodName(), returnType));
        }

        return fluentSetters;
    }


    public MethodSpec convenienceDeclaration(TypeName returnType, ConvenienceTypeOverload overload) {
        return MethodSpec.methodBuilder(memberModel().getFluentSetterMethodName())
                         .addParameter(PoetUtils.classNameFromFqcn(overload.getConvenienceType()), memberAsParameter().name)
                         .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
                         .returns(returnType)
                         .build();

    }


    public MethodSpec fluentConvenience(TypeName returnType, ConvenienceTypeOverload overload) {
        return MethodSpec.methodBuilder(memberModel().getFluentSetterMethodName())
                         .addModifiers(Modifier.PUBLIC)
                         .addParameter(PoetUtils.classNameFromFqcn(overload.getConvenienceType()), memberAsParameter().name)
                         .addStatement("$L($T.instance().adapt($L))",
                                       memberModel().getFluentSetterMethodName(),
                                       PoetUtils.classNameFromFqcn(overload.getTypeAdapterFqcn()),
                                       memberAsParameter().name)
                         .addStatement("return this")
                         .returns(returnType)
                         .build();
    }

    @Override
    public List beanStyle() {
        List methods = new ArrayList<>();
        methods.add(beanStyleSetterBuilder()
                        .addCode(beanCopySetterBody())
                        .build());

        if (StringUtils.isNotBlank(memberModel().getDeprecatedBeanStyleSetterMethodName())) {
            methods.add(deprecatedBeanStyleSetterBuilder()
                            .addCode(beanCopySetterBody())
                            .addAnnotation(Deprecated.class)
                            .addJavadoc("@deprecated Use {@link #" + memberModel().getBeanStyleSetterMethodName() + "} instead")
                            .build());
        }

        return methods;
    }

    private MethodSpec fluentAssignmentSetter(TypeName returnType) {
        return fluentSetterBuilder(returnType)
            .addCode(copySetterBody().toBuilder().addStatement("return this").build())
            .build();
    }

    private MethodSpec fluentAssignmentSetter(String methodName, TypeName returnType) {
        return fluentSetterBuilder(methodName, returnType)
            .addCode(copySetterBody().toBuilder().addStatement("return this").build())
            .build();
    }

    private MethodSpec fluentEnumToStringSetter(TypeName returnType) {
        return fluentSetterBuilder(modeledParam(), returnType)
            .addCode(enumToStringAssignmentBody().toBuilder().addStatement("return this").build())
            .build();
    }

    private MethodSpec fluentConsumerFluentSetter(TypeName returnType) {
        MemberModel memberModel = memberModel();
        ClassName memberClass = poetExtensions.getModelClass(memberModel.getShape().getC2jName());
        ClassName builderClass = memberClass.nestedClass("Builder");
        return fluentDefaultSetterDeclaration(builderConsumerParam(builderClass), returnType)
            .addModifiers(Modifier.DEFAULT)
            .addStatement("return $N($T.builder().applyMutation($N).build())",
                          memberModel.getFluentSetterMethodName(),
                          memberClass,
                          fieldName())
            .addJavadoc("$L", memberModel.getDefaultConsumerFluentSetterDocumentation(memberModel.getVariable().getSimpleType()))
            .build();
    }

    private CodeBlock enumToStringAssignmentBody() {
        return CodeBlock.builder()
                        .addStatement("this.$N($N == null ? null : $N.toString())", memberModel().getFluentSetterMethodName(),
                                      fieldName(), fieldName())
                        .build();
    }

    private ParameterSpec modeledParam() {
        return ParameterSpec.builder(poetExtensions.getModelClass(memberModel().getShape().getShapeName()), fieldName()).build();
    }

    private ParameterSpec builderConsumerParam(ClassName builderClass) {
        return ParameterSpec.builder(ParameterizedTypeName.get(ClassName.get(Consumer.class), builderClass), fieldName()).build();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy