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

software.amazon.awssdk.codegen.emitters.tasks.EndpointProviderTasks 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.emitters.tasks;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import software.amazon.awssdk.codegen.emitters.GeneratorTask;
import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams;
import software.amazon.awssdk.codegen.emitters.PoetGeneratorTask;
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
import software.amazon.awssdk.codegen.model.rules.endpoints.ParameterModel;
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
import software.amazon.awssdk.codegen.poet.rules.ClientContextParamsClassSpec;
import software.amazon.awssdk.codegen.poet.rules.DefaultPartitionDataProviderSpec;
import software.amazon.awssdk.codegen.poet.rules.EndpointParametersClassSpec;
import software.amazon.awssdk.codegen.poet.rules.EndpointProviderInterfaceSpec;
import software.amazon.awssdk.codegen.poet.rules.EndpointProviderSpec;
import software.amazon.awssdk.codegen.poet.rules.EndpointProviderTestSpec;
import software.amazon.awssdk.codegen.poet.rules.EndpointResolverInterceptorSpec;
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesClientTestSpec;
import software.amazon.awssdk.codegen.poet.rules.RequestEndpointInterceptorSpec;
import software.amazon.awssdk.codegen.poet.rules2.EndpointProviderSpec2;

public final class EndpointProviderTasks extends BaseGeneratorTasks {
    private final GeneratorTaskParams generatorTaskParams;

    public EndpointProviderTasks(GeneratorTaskParams dependencies) {
        super(dependencies);
        this.generatorTaskParams = dependencies;
    }

    @Override
    protected List createTasks() throws Exception {
        List tasks = new ArrayList<>();
        tasks.add(generateInterface());
        tasks.add(generateParams());
        if (shouldGenerateCompiledEndpointRules()) {
            tasks.add(generateDefaultProvider2());
            tasks.add(new RulesEngineRuntimeGeneratorTask(generatorTaskParams));
            tasks.add(new RulesEngineRuntimeGeneratorTask2(generatorTaskParams));
        } else {
            tasks.add(generateDefaultProvider());
            tasks.add(new RulesEngineRuntimeGeneratorTask(generatorTaskParams));
        }
        if (shouldGenerateJmesPathRuntime()) {
            tasks.add(new JmesPathRuntimeGeneratorTask(generatorTaskParams));
        }
        tasks.addAll(generateInterceptors());
        if (shouldGenerateEndpointTests()) {
            tasks.add(generateProviderTests());
        }
        if (shouldGenerateEndpointTests() && shouldGenerateClientEndpointTests()) {
            tasks.add(generateClientTests());
        }
        if (hasClientContextParams()) {
            tasks.add(generateClientContextParams());
        }
        tasks.add(generateDefaultPartitionsProvider());
        return tasks;
    }

    private GeneratorTask generateInterface() {
        return new PoetGeneratorTask(endpointRulesDir(), model.getFileHeader(), new EndpointProviderInterfaceSpec(model));
    }

    private GeneratorTask generateParams() {
        return new PoetGeneratorTask(endpointRulesDir(), model.getFileHeader(), new EndpointParametersClassSpec(model));
    }

    private GeneratorTask generateDefaultProvider() {
        return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new EndpointProviderSpec(model));
    }

    private GeneratorTask generateDefaultProvider2() {
        return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new EndpointProviderSpec2(model));
    }

    private GeneratorTask generateDefaultPartitionsProvider() {
        return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(),
                                     new DefaultPartitionDataProviderSpec(model));
    }

    private boolean shouldGenerateCompiledEndpointRules() {
        CustomizationConfig customizationConfig = generatorTaskParams.getModel().getCustomizationConfig();
        return customizationConfig.isEnableGenerateCompiledEndpointRules();
    }

    private Collection generateInterceptors() {
        return Arrays.asList(
            new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new EndpointResolverInterceptorSpec(model)),
            new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new RequestEndpointInterceptorSpec(model)));
    }

    private GeneratorTask generateClientTests() {
        return new PoetGeneratorTask(endpointTestsDir(), model.getFileHeader(), new EndpointRulesClientTestSpec(model));
    }

    private GeneratorTask generateProviderTests() {
        return new PoetGeneratorTask(endpointTestsDir(), model.getFileHeader(), new EndpointProviderTestSpec(model));
    }

    private GeneratorTask generateClientContextParams() {
        return new PoetGeneratorTask(endpointRulesInternalDir(), model.getFileHeader(), new ClientContextParamsClassSpec(model));
    }

    private String endpointRulesDir() {
        return generatorTaskParams.getPathProvider().getEndpointRulesDirectory();
    }

    private String endpointRulesInternalDir() {
        return generatorTaskParams.getPathProvider().getEndpointRulesInternalDirectory();
    }

    private String endpointTestsDir() {
        return generatorTaskParams.getPathProvider().getEndpointRulesTestDirectory();
    }

    private boolean shouldGenerateEndpointTests() {
        CustomizationConfig customizationConfig = generatorTaskParams.getModel().getCustomizationConfig();
        return !Boolean.TRUE.equals(customizationConfig.isSkipEndpointTestGeneration()) &&
               !generatorTaskParams.getModel().getEndpointTestSuiteModel().getTestCases().isEmpty();
    }

    private boolean shouldGenerateClientEndpointTests() {
        boolean generateEndpointClientTests = generatorTaskParams.getModel()
                                                                 .getCustomizationConfig()
                                                                 .isGenerateEndpointClientTests();
        boolean someTestCasesHaveOperationInputs = model.getEndpointTestSuiteModel().getTestCases().stream()
                                                        .anyMatch(t -> t.getOperationInputs() != null);
        return generateEndpointClientTests || someTestCasesHaveOperationInputs;
    }

    private boolean hasClientContextParams() {
        Map clientContextParams = model.getClientContextParams();
        Map customClientContextParams = model.getCustomizationConfig().getCustomClientContextParams();
        return (clientContextParams != null && !clientContextParams.isEmpty()) ||
               (customClientContextParams != null && !customClientContextParams.isEmpty());
    }

    private boolean shouldGenerateJmesPathRuntime() {
        boolean isAlreadyGenerated = model.hasWaiters();
        if (isAlreadyGenerated) {
            return true;
        }

        Map endpointParameters = model.getCustomizationConfig().getEndpointParameters();
        if (endpointParameters == null) {
            return false;
        }

        return endpointParameters.values().stream().anyMatch(this::paramRequiresPathParserRuntime);
    }

    private boolean paramRequiresPathParserRuntime(ParameterModel parameterModel) {
        return paramIsOperationalContextParam(parameterModel) &&
               "stringarray".equals(parameterModel.getType().toLowerCase(Locale.US));
    }

    //TODO (string-array-params): resolve this logical test before finalizing coding
    private boolean paramIsOperationalContextParam(ParameterModel parameterModel) {
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy