/*
* Copyright 2011-2017 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 com.amazonaws.codegen.emitters.tasks;
import com.amazonaws.codegen.emitters.FreemarkerGeneratorTask;
import com.amazonaws.codegen.emitters.GeneratorTask;
import com.amazonaws.codegen.emitters.GeneratorTaskParams;
import com.amazonaws.codegen.model.intermediate.Metadata;
import com.amazonaws.codegen.model.intermediate.WaiterDefinitionModel;
import com.amazonaws.util.ImmutableMapParameter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WaitersGeneratorTasks extends BaseGeneratorTasks {
private final String waiterClassDir;
public WaitersGeneratorTasks(GeneratorTaskParams dependencies) {
super(dependencies);
this.waiterClassDir = dependencies.getPathProvider().getWaitersDirectory();
}
@Override
protected boolean hasTasks() {
return model.getHasWaiters();
}
@Override
protected List<GeneratorTask> createTasks() throws Exception {
info("Emitting waiter classes");
return Stream.of(createWaiterOpFunctionClassTasks(), createWaiterAcceptorClassTasks(), createWaiterClassTasks())
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
/**
* Constructs the data model and submits tasks for every generating SDKFunction for every unique operation in the waiter
* intermediate model
*/
private List<GeneratorTask> createWaiterOpFunctionClassTasks() throws IOException {
List<GeneratorTask> generatorTasks = new ArrayList<>();
List<String> generatedOperations = new ArrayList<>();
for (Map.Entry<String, WaiterDefinitionModel> entry : model.getWaiters().entrySet()) {
final WaiterDefinitionModel waiterModel = entry.getValue();
if (!generatedOperations.contains(waiterModel.getOperationName())) {
generatedOperations.add(waiterModel.getOperationName());
Map<String, Object> dataModel = ImmutableMapParameter.of(
"fileHeader", model.getFileHeader(),
"waiter", waiterModel,
"operation", model.getOperation(waiterModel.getOperationName()),
"metadata", model.getMetadata());
final String className = waiterModel.getOperationModel().getOperationName() + "Function";
generatorTasks.add(new FreemarkerGeneratorTask(waiterClassDir,
className,
freemarker.getWaiterSDKFunctionTemplate(),
dataModel));
}
}
return generatorTasks;
}
/**
* Constructs the data model and submits tasks for every generating Acceptor for each waiter definition in the intermediate
* model
*/
private List<GeneratorTask> createWaiterAcceptorClassTasks() throws IOException {
List<GeneratorTask> generatorTasks = new ArrayList<>();
for (Map.Entry<String, WaiterDefinitionModel> entry : model.getWaiters().entrySet()) {
if (containsAllStatusMatchers(entry)) {
continue;
}
final String waiterName = entry.getKey();
final WaiterDefinitionModel waiterModel = entry.getValue();
Map<String, Object> dataModel = ImmutableMapParameter.of(
"fileHeader", model.getFileHeader(),
"waiter", waiterModel,
"operation", model.getOperation(waiterModel.getOperationName()),
"metadata", model.getMetadata());
generatorTasks.add(new FreemarkerGeneratorTask(waiterClassDir,
waiterName,
freemarker.getWaiterAcceptorTemplate(),
dataModel));
}
return generatorTasks;
}
private static boolean containsAllStatusMatchers(Map.Entry<String, WaiterDefinitionModel> entry) {
return entry.getValue().getAcceptors().stream()
.allMatch(a -> a.getMatcher().equals("status"));
}
/**
* Constructs the data model and submits tasks for every generating synchronous waiter and asynchronous waiter for each waiter
* in the intermediate model.
*/
private List<GeneratorTask> createWaiterClassTasks() throws IOException {
Metadata metadata = model.getMetadata();
final String className = metadata.getSyncInterface() + "Waiters";
Map<String, Object> dataModel = ImmutableMapParameter.of(
"fileHeader", model.getFileHeader(),
"className", className,
"waiters", model.getWaiters(),
"operation", model.getOperations(),
"metadata", metadata);
return Collections.singletonList(new FreemarkerGeneratorTask(waiterClassDir,
className,
freemarker.getWaiterTemplate(),
dataModel));
}
}