/*
* Copyright (c) 2016. 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.customization.processors;
import com.amazonaws.codegen.customization.CodegenCustomizationProcessor;
import com.amazonaws.codegen.model.config.ConstructorFormsWrapper;
import com.amazonaws.codegen.model.config.customization.CustomizationConfig;
import com.amazonaws.codegen.model.intermediate.ArgumentModel;
import com.amazonaws.codegen.model.intermediate.ConstructorModel;
import com.amazonaws.codegen.model.intermediate.IntermediateModel;
import com.amazonaws.codegen.model.intermediate.MemberModel;
import com.amazonaws.codegen.model.intermediate.ShapeModel;
import com.amazonaws.codegen.model.intermediate.VariableModel;
import com.amazonaws.codegen.model.service.ServiceModel;
import java.util.List;
import java.util.Map;
/**
* Looks at the customization configuration and adds new additional constructors
* to the intermediate shape models.
*/
final class CustomConstructorsProcessor implements CodegenCustomizationProcessor {
private final CustomizationConfig customConfig;
CustomConstructorsProcessor(CustomizationConfig customConfig) {
this.customConfig = customConfig;
}
@Override
public void preprocess(ServiceModel serviceModel) {
// Do nothing
}
@Override
public void postprocess(IntermediateModel intermediateModel) {
Map<String, ShapeModel> javaShapes = intermediateModel.getShapes();
addConstructors(javaShapes);
}
private void addConstructors(Map<String, ShapeModel> javaShapes) {
Map<String, ConstructorFormsWrapper> additionalConstructors =
customConfig.getAdditionalShapeConstructors();
if (additionalConstructors == null)
return;
for (Map.Entry<String, ConstructorFormsWrapper> entry : additionalConstructors
.entrySet()) {
String shapeName = entry.getKey();
List<List<String>> forms = entry.getValue().getConstructorForms();
final ShapeModel shapeModel = javaShapes.get(shapeName);
if (shapeModel == null) {
throw new RuntimeException(
"Not able to add constructor. No shape defined with name "
+ shapeName);
}
Map<String, MemberModel> members = shapeModel.getMembersAsMap();
for (List<String> form : forms) {
final ConstructorModel consModel = new ConstructorModel(shapeName);
boolean hasEnumMember = false;
for (String argument : form) {
MemberModel memberModel = members.get(argument);
if (memberModel == null) {
throw new RuntimeException(
"Not able to add constructor. Member "
+ argument + " not present in shape "
+ shapeName);
}
if (memberModel.getVariable() == null) {
throw new RuntimeException(
"Not able to add constructor. Member "
+ argument
+ " doesnt have variable defined "
+ shapeName);
}
if (memberModel.isSimple()
&& memberModel.getEnumType() != null) {
hasEnumMember = true;
}
final String name = memberModel.getVariable()
.getVariableName();
final String type = memberModel.getVariable()
.getVariableType();
final ArgumentModel arg = new ArgumentModel()
.withName(name).withType(type);
arg.setDocumentation(memberModel.getDocumentation());
consModel.addArgument(arg);
}
shapeModel.addConstructor(consModel);
if (hasEnumMember) {
final ConstructorModel enumCons = new ConstructorModel(shapeName);
for (String argument : form) {
MemberModel memberModel = members.get(argument);
VariableModel variable = memberModel.getVariable();
String enumType = memberModel.getEnumType();
final String type = enumType != null ? enumType
: variable.getVariableType();
final ArgumentModel arg = new ArgumentModel()
.withName(variable.getVariableName())
.withType(type).withIsEnumArg(enumType != null);
arg.setDocumentation(memberModel.getDocumentation());
enumCons.addArgument(arg);
}
shapeModel.addConstructor(enumCons);
}
}
}
}
}