/*
* 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.naming;
import com.amazonaws.codegen.internal.Utils;
import com.amazonaws.codegen.model.config.BasicCodeGenConfig;
import com.amazonaws.codegen.model.config.customization.CustomizationConfig;
import com.amazonaws.codegen.model.intermediate.Protocol;
import com.amazonaws.codegen.model.service.Output;
import com.amazonaws.codegen.model.service.ServiceModel;
import com.amazonaws.util.StringUtils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import static com.amazonaws.codegen.internal.Constants.AUTHORIZER_NAME_PREFIX;
import static com.amazonaws.codegen.internal.Constants.EXCEPTION_CLASS_SUFFIX;
import static com.amazonaws.codegen.internal.Constants.FAULT_CLASS_SUFFIX;
import static com.amazonaws.codegen.internal.Constants.REQUEST_CLASS_SUFFIX;
import static com.amazonaws.codegen.internal.Constants.RESPONSE_CLASS_SUFFIX;
import static com.amazonaws.codegen.internal.Constants.VARIABLE_NAME_SUFFIX;
import static com.amazonaws.codegen.internal.Utils.capitialize;
import static com.amazonaws.codegen.internal.Utils.unCapitialize;
/**
* Default implementation of naming strategy respecting customizations supplied by {@link
* CustomizationConfig}.
*/
public class DefaultNamingStrategy implements NamingStrategy {
private final static Set<String> reservedKeywords = new HashSet<String>() {{
add("return");
add("public");
add("private");
add("class");
add("static");
add("protected");
add("string");
add("boolean");
add("integer");
add("int");
add("char");
add("null");
add("double");
add("object");
add("short");
add("long");
add("float");
add("byte");
add("bigDecimal");
add("bigInteger");
add("protected");
add("inputStream");
add("bytebuffer");
add("date");
add("list");
add("map");
}};
private final ServiceModel serviceModel;
private final BasicCodeGenConfig codeGenConfig;
private final CustomizationConfig customizationConfig;
public DefaultNamingStrategy(ServiceModel serviceModel, BasicCodeGenConfig codeGenConfig,
CustomizationConfig customizationConfig) {
this.serviceModel = serviceModel;
this.customizationConfig = customizationConfig;
this.codeGenConfig = codeGenConfig;
}
@Override
public String getExceptionName(String errorShapeName) {
if (errorShapeName.endsWith(FAULT_CLASS_SUFFIX)) {
return capitialize(errorShapeName.substring(0, errorShapeName.length() -
FAULT_CLASS_SUFFIX.length()) +
EXCEPTION_CLASS_SUFFIX);
} else if (errorShapeName.endsWith(EXCEPTION_CLASS_SUFFIX)) {
return capitialize(errorShapeName);
}
return capitialize(errorShapeName + EXCEPTION_CLASS_SUFFIX);
}
@Override
public String getRequestClassName(String operationName) {
return capitialize(operationName + REQUEST_CLASS_SUFFIX);
}
@Override
public String getResponseClassName(String operationName) {
if (customizationConfig.useModeledOutputShapeNames()) {
final Output operationOutput = serviceModel.getOperation(operationName).getOutput();
if (operationOutput != null) {
return operationOutput.getShape();
}
}
return capitialize(operationName + RESPONSE_CLASS_SUFFIX);
}
@Override
public String getVariableName(String name) {
if (isJavaKeyword(name)) {
return unCapitialize(name + VARIABLE_NAME_SUFFIX);
} else {
return unCapitialize(name);
}
}
@Override
public String getEnumValueName(String enumValue) {
StringBuilder builder = new StringBuilder();
String sanitizedEnumValue = enumValue.replace("::", ":").replace("/", "").replace("(", "")
.replace(")", "");
for (String part : sanitizedEnumValue.split("[ -.:]")) {
if (part.length() > 1) {
builder.append(StringUtils.upperCase(part.substring(0, 1)))
.append(part.substring(1));
} else {
builder.append(StringUtils.upperCase(part));
}
}
return builder.toString();
}
@Override
public String getJavaClassName(String shapeName) {
return Arrays.stream(shapeName.split("[._-]|\\W")).map(Utils::capitialize).collect(Collectors.joining());
}
@Override
public String getAuthorizerClassName(String shapeName) {
String converted = getJavaClassName(shapeName);
if (converted.length() > 0 && !Character.isLetter(converted.charAt(0))) {
return AUTHORIZER_NAME_PREFIX + converted;
}
return converted;
}
@Override
public String getGetterMethodName(String memberName) {
return String.format("get%s", Utils.capitialize(memberName));
}
@Override
public String getSetterMethodName(String memberName) {
return String.format("set%s", Utils.capitialize(memberName));
}
@Override
public String getFluentSetterMethodName(String memberName) {
if (Protocol.fromValue(serviceModel.getMetadata().getProtocol()) == Protocol.API_GATEWAY) {
return Utils.unCapitialize(memberName);
} else {
return String.format("with%s", Utils.capitialize(memberName));
}
}
private static boolean isJavaKeyword(String word) {
return reservedKeywords.contains(word) ||
reservedKeywords.contains(StringUtils.lowerCase(word));
}
}