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

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

Go to download

The AWS SDK for Java - Code Generator module holds the classes and templates required to generate the AWS Java SDK clients for AWS services.

The newest version!
/*
 * 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 java.util.Collection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
import software.amazon.awssdk.codegen.model.intermediate.MemberModel;
import software.amazon.awssdk.codegen.poet.ClassSpec;
import software.amazon.awssdk.codegen.poet.PoetExtension;

public class ServiceModelCopiers {
    private final IntermediateModel intermediateModel;
    private final PoetExtension poetExtensions;
    private final TypeProvider typeProvider;

    public ServiceModelCopiers(IntermediateModel intermediateModel) {
        this.intermediateModel = intermediateModel;
        this.poetExtensions = new PoetExtension(intermediateModel);
        this.typeProvider = new TypeProvider(intermediateModel);
    }

    public Collection copierSpecs() {
        Map memberSpecs = new HashMap<>();
        allShapeMembers().values().stream()
                .filter(m -> !canCopyReference(m))
                .map(m -> new MemberCopierSpec(m, this, typeProvider, poetExtensions))
                .forEach(spec -> memberSpecs.put(spec.className(), spec));

        return memberSpecs.values();
    }

    public Optional copierClassFor(MemberModel memberModel) {
        if (canCopyReference(memberModel)) {
            return Optional.empty();
        }

        // FIXME: Some services (Health) have shapes with names
        // that differ only in the casing of the first letter, and generating
        // classes for them breaks on case insensitive filesystems...
        String shapeName = memberModel.getC2jShape();
        if (shapeName.substring(0, 1).toLowerCase(Locale.ENGLISH).equals(shapeName.substring(0, 1))) {
            shapeName = "_" + shapeName;
        }

        return Optional.of(poetExtensions.getModelClass(shapeName + "Copier"));
    }

    public String copyMethodName() {
        return "copy";
    }

    public String enumToStringCopyMethodName() {
        return "copyEnumToString";
    }

    public String stringToEnumCopyMethodName() {
        return "copyStringToEnum";
    }

    public String copyFromBuilderMethodName() {
        return "copyFromBuilder";
    }

    public String copyToBuilderMethodName() {
        return "copyToBuilder";
    }

    private Map allShapeMembers() {
        Map shapeMembers = new HashMap<>();
        intermediateModel.getShapes().values().stream()
                .flatMap(s -> s.getMembersAsMap().values().stream())
                .forEach(m -> shapeMembers.put(m.getC2jShape(), m));
        return shapeMembers;
    }

    private boolean canCopyReference(MemberModel m) {
        return !m.isList() && !m.isMap();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy