/*
* 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;
import com.amazonaws.codegen.model.intermediate.OperationModel;
import com.amazonaws.codegen.model.intermediate.ShapeModel;
import com.amazonaws.codegen.model.intermediate.ShapeType;
import com.amazonaws.codegen.model.intermediate.ShapeUnmarshaller;
import com.amazonaws.codegen.model.service.Shape;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import static com.amazonaws.codegen.internal.Utils.isStructure;
/**
* Constructs the shapes (other than request, response and exception) from the service model.
*/
final class AddModelShapes extends AddShapes implements IntermediateModelShapeProcessor {
AddModelShapes(IntermediateModelBuilder builder) {
super(builder);
}
@Override
public Map<String, ShapeModel> process(Map<String, OperationModel> currentOperations,
Map<String, ShapeModel> currentShapes) {
// Only need to construct model shapes for shapes that have not been previously processed
return constructModelShapes(currentShapes.keySet());
}
private Map<String, ShapeModel> constructModelShapes(Set<String> shapesToSkip) {
// Java output shape models, to be constructed
final Map<String, ShapeModel> javaShapes = new HashMap<String, ShapeModel>();
for (Map.Entry<String, Shape> entry : getServiceModel().getShapes().entrySet()) {
final String shapeName = entry.getKey();
final Shape shape = entry.getValue();
ShapeType shapeType = getModelShapeType(shape);
if (shapeType != null) {
final String javaClassName = getNamingStrategy().getJavaClassName(shapeName);
if(shapesToSkip.contains(javaClassName)) {
continue;
}
ShapeModel modelShape = generateShapeModel(javaClassName, shapeName);
modelShape.setType(shapeType);
// We need unmarshaller metadata for all shapes
ShapeUnmarshaller unmarshaller = new ShapeUnmarshaller();
unmarshaller.setFlattened(shape.isFlattened());
modelShape.setUnmarshaller(unmarshaller);
javaShapes.put(javaClassName, modelShape);
}
}
return javaShapes;
}
/**
* @return null if the given shape is neither a structure nor enum model.
*/
private ShapeType getModelShapeType(final Shape shape) {
if (isStructure(shape)) {
return ShapeType.Model;
} else if (shape.getEnumValues() != null) {
return ShapeType.Enum;
}
return null;
}
}