package tw.com.commandline.actions; import com.amazonaws.services.cloudformation.model.Parameter; import org.apache.commons.cli.Option; import tw.com.FacadeFactory; import tw.com.commandline.CommandLineAction; import tw.com.commandline.CommandLineException; import tw.com.entity.ProjectAndEnv; import tw.com.providers.ArtifactUploader; import java.util.Collection; public abstract class SharedAction implements CommandLineAction { protected Option option; @Override public Option getOption() { return option; } @Override public String getArgName() { return option.getArgName(); } protected void createOption(String optName, String description) { option = Option.builder(optName).argName(optName).desc(description).build(); } protected void createOptionWithArg(String name, String description) { option = Option.builder(name).argName(name).desc(description).hasArg().build(); } protected void createOptionWithArgs(String name, String description, int numberOfArgs) { option = Option.builder(name).argName(name).desc(description).hasArgs().numberOfArgs(numberOfArgs).build(); } protected void createOptionalWithOptionalArg(String name, String description) { option = Option.builder(name).argName(name).desc(description).hasArg().optionalArg(true).build(); } protected void guardForProjectAndEnv(ProjectAndEnv projectAndEnv) throws CommandLineException { guardForProject(projectAndEnv); guardForEnv(projectAndEnv); } private void guardForEnv(ProjectAndEnv projectAndEnv) throws CommandLineException { if (!projectAndEnv.hasEnv()) { throw new CommandLineException("Must provide env"); } } protected void guardForProject(ProjectAndEnv projectAndEnv) throws CommandLineException { if (!projectAndEnv.hasProject()) { throw new CommandLineException("Must provide project"); } } protected void guardForNoBuildNumber(ProjectAndEnv projectAndEnv) throws CommandLineException { if (projectAndEnv.hasBuildNumber()) { throw new CommandLineException( "Build number parameter is not valid with action: " + getArgName()); } } protected void guardForNoArtifacts(Collection<Parameter> artifacts) throws CommandLineException { if (!artifacts.isEmpty()) { throw new CommandLineException( "artifacts are not valid with action: " + getArgName()); } } protected void guardForBucketName(ProjectAndEnv projectAndEnv) throws CommandLineException { if (!projectAndEnv.hasBucketName()) { throw new CommandLineException( "You must provide bucket name if you specify artitacts"); } } protected void guardForBuildNumber(ProjectAndEnv projectAndEnv) throws CommandLineException { if (!projectAndEnv.hasBuildNumber()) { throw new CommandLineException( "You must provide build number if you specify artitacts"); } } protected void guardForArtifactAndRequiredParams( ProjectAndEnv projectAndEnv, Collection<Parameter> artifacts) throws CommandLineException { if (!artifacts.isEmpty()) { guardForBuildNumber(projectAndEnv); guardForBucketName(projectAndEnv); } } protected void uploadArtifacts(FacadeFactory factory, ProjectAndEnv projectAndEnv, Collection<Parameter> artifacts, Collection<Parameter> cfnParams) { if (artifacts.isEmpty()) { return; } ArtifactUploader artifactUploader = factory.createArtifactUploader(projectAndEnv); cfnParams.addAll(artifactUploader.uploadArtifacts(artifacts)); } protected void guardForSNSNotSet(ProjectAndEnv projectAndEnv) throws CommandLineException { if (projectAndEnv.useSNS()) { throw new CommandLineException("Setting sns does not work with this action"); } } }