package tw.com.parameters;
import com.amazonaws.services.cloudformation.model.Parameter;
import com.amazonaws.services.cloudformation.model.TemplateParameter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tw.com.entity.ProjectAndEnv;
import tw.com.exceptions.CannotFindVpcException;
import tw.com.exceptions.InvalidStackParameterException;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class ParameterFactory {
private static final Logger logger = LoggerFactory.getLogger(ParameterFactory.class);
private List<String> reservedParameters;
private List<PopulatesParameters> populators;
public ParameterFactory(List<PopulatesParameters> populators) {
this.populators = populators;
reservedParameters = new LinkedList<>();
reservedParameters.add(PopulatesParameters.PARAMETER_ENV);
reservedParameters.add(PopulatesParameters.PARAMETER_VPC);
reservedParameters.add(PopulatesParameters.PARAMETER_BUILD_NUMBER);
}
public Collection<Parameter> createRequiredParameters(ProjectAndEnv projAndEnv,
Collection<Parameter> userParameters,
List<TemplateParameter> declaredParameters,
ProvidesZones providesZones)
throws InvalidStackParameterException,
IOException, CannotFindVpcException {
Collection<Parameter> result = new LinkedList<>();
result.addAll(userParameters);
checkNoClashWithBuiltInParameters(result);
for(PopulatesParameters populator : populators) {
populator.addParameters(result, declaredParameters, projAndEnv, providesZones);
}
logAllParameters(result, declaredParameters);
return result;
}
private void logAllParameters(Collection<Parameter> parameters, List<TemplateParameter> declaredParameters) {
logger.info("Invoking with following parameters");
for(Parameter param : parameters) {
if (noEchoIsSet(param, declaredParameters)) {
logger.info(String.format("Parameter key='%s' value=<NoEchoIsSet>", param.getParameterKey()));
}
else {
logger.info(String.format("Parameter key='%s' value='%s'", param.getParameterKey(), param.getParameterValue()));
}
}
}
private boolean noEchoIsSet(Parameter param,
List<TemplateParameter> declaredParameters) {
for(TemplateParameter declared : declaredParameters) {
if (declared.getParameterKey().equals(param.getParameterKey())) {
if (declared.getNoEcho()==null) {
return false;
}
return declared.getNoEcho();
}
}
return false;
}
private void checkNoClashWithBuiltInParameters(Collection<Parameter> parameters) throws InvalidStackParameterException {
for(Parameter param : parameters) {
String parameterKey = param.getParameterKey();
if (reservedParameters.contains(parameterKey)) {
logger.error("Attempt to overide built in and autoset parameter called " + parameterKey);
throw new InvalidStackParameterException(parameterKey);
}
}
}
}