/*
* Copyright 2017 ThoughtWorks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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.thoughtworks.go.domain;
import com.google.gson.Gson;
import com.google.gson.annotations.Expose;
import com.thoughtworks.go.util.ArrayUtil;
import com.thoughtworks.go.util.GoConstants;
import java.util.*;
import static com.thoughtworks.go.util.MapBuilder.map;
public class BuildCommand {
private static final Gson GSON = new Gson();
public static BuildCommand echoWithPrefix(String format, Object...args) {
return echo("[%s] " + format, ArrayUtil.pushToArray(GoConstants.PRODUCT_NAME, args));
}
public static BuildCommand exec(String command, String...args) {
return new BuildCommand("exec", map("command", command, "args", GSON.toJson(args)));
}
public static BuildCommand test(String flag, String left) {
return new BuildCommand("test", map("flag", flag, "left", left));
}
public static BuildCommand test(String flag, String left, BuildCommand subCommand) {
return new BuildCommand("test", map("flag", flag, "left", left))
.setSubCommands(Collections.singletonList(subCommand));
}
public static BuildCommand reportCurrentStatus(JobState status) {
return new BuildCommand("reportCurrentStatus", map("status", status.name()));
}
public static BuildCommand reportCompleting() {
return new BuildCommand("reportCompleting");
}
public static BuildCommand compose(BuildCommand...subCommands) {
return new BuildCommand("compose").setSubCommands(Arrays.asList(subCommands));
}
public static BuildCommand compose(List<BuildCommand> subCommands) {
return new BuildCommand("compose").setSubCommands(subCommands);
}
public static BuildCommand echo(String format, Object...args) {
return new BuildCommand("echo", map("line", String.format(format, args)));
}
public static BuildCommand mkdirs(String path) {
return new BuildCommand("mkdirs", map("path", path));
}
public static BuildCommand cleandir(String path, String...allowedPaths) {
return new BuildCommand("cleandir", map("path", path, "allowed", GSON.toJson(allowedPaths)));
}
public static BuildCommand noop() {
return new BuildCommand("compose");
}
public static BuildCommand fail(String format, String... args) {
return new BuildCommand("fail", map("message", String.format(format, args)));
}
// set environment variable with displaying it
public static BuildCommand export(String name, String value, boolean isSecure) {
return new BuildCommand("export", map("name", name, "value", value, "secure", String.valueOf(isSecure)));
}
// display environment variable
public static BuildCommand export(String name) {
return new BuildCommand("export", map("name", name));
}
public static BuildCommand secret(String secretValue) {
return new BuildCommand("secret", map("value", secretValue));
}
public static BuildCommand secret(String secretValue, String substitution) {
return new BuildCommand("secret", map("value", secretValue, "substitution", substitution));
}
public static BuildCommand uploadArtifact(String src, String dest, boolean ignoreUnmatchError) {
return new BuildCommand("uploadArtifact", map("src", src, "dest", dest, "ignoreUnmatchError", String.valueOf(ignoreUnmatchError)));
}
public static BuildCommand generateTestReport(List<String> srcs, String uploadPath) {
return new BuildCommand("generateTestReport", map(
"uploadPath", uploadPath,
"srcs", GSON.toJson(srcs)));
}
public static BuildCommand downloadFile(Map<String, String> args) {
return new BuildCommand("downloadFile", args);
}
public static BuildCommand downloadDir(Map<String, String> args) {
return new BuildCommand("downloadDir", args);
}
public static BuildCommand generateProperty(String name, String src, String xpath) {
return new BuildCommand("generateProperty", map("name", name, "src", src, "xpath", xpath));
}
//not part of the protocol, only for tests
public static BuildCommand error(String message) {
return new BuildCommand("error", map("message", message));
}
@Expose
private final String name;
@Expose
private Map<String, String> args;
@Expose
private List<BuildCommand> subCommands;
@Expose
private String workingDirectory;
@Expose
private BuildCommand test;
@Expose
private String runIfConfig = "passed";
@Expose
private BuildCommand onCancel;
public BuildCommand(String name) {
this.name = name;
this.subCommands = Collections.emptyList();
this.args = Collections.emptyMap();
}
public BuildCommand(String name, Map<String, String> args) {
this(name);
this.args = args;
}
public String getName() {
return name;
}
public boolean hasArg(String arg) {
return args.containsKey(arg);
}
public String dump() {
StringBuilder sb = new StringBuilder();
doDump(0, 4, sb);
return sb.toString();
}
private void doDump(int level, int indent, StringBuilder sb) {
for (int i = 0; i < level * indent; i++) {
sb.append(' ');
}
sb.append(name);
for (String argName : args.keySet()) {
sb.append(' ').append('\"').append(argName).append(":").append(args.get(argName)).append('\"');
}
if (!"passed".equals(runIfConfig)) {
sb.append(" ").append("(runIf:").append(runIfConfig).append(")");
}
for (BuildCommand subCommand : subCommands) {
sb.append("\n");
subCommand.doDump(level + 1, indent, sb);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BuildCommand that = (BuildCommand) o;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
if (args != null ? !args.equals(that.args) : that.args != null) return false;
if (subCommands != null ? !subCommands.equals(that.subCommands) : that.subCommands != null) return false;
if (workingDirectory != null ? !workingDirectory.equals(that.workingDirectory) : that.workingDirectory != null)
return false;
if (test != null ? !test.equals(that.test) : that.test != null) return false;
if (runIfConfig != null ? !runIfConfig.equals(that.runIfConfig) : that.runIfConfig != null) return false;
return onCancel != null ? onCancel.equals(that.onCancel) : that.onCancel == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (args != null ? args.hashCode() : 0);
result = 31 * result + (subCommands != null ? subCommands.hashCode() : 0);
result = 31 * result + (workingDirectory != null ? workingDirectory.hashCode() : 0);
result = 31 * result + (test != null ? test.hashCode() : 0);
result = 31 * result + (runIfConfig != null ? runIfConfig.hashCode() : 0);
result = 31 * result + (onCancel != null ? onCancel.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "BuildCommand{" +
"name='" + name + '\'' +
", args=" + args +
", subCommands=" + subCommands +
", workingDirectory='" + workingDirectory + '\'' +
", test=" + test +
", runIfConfig='" + runIfConfig + '\'' +
", onCancel=" + onCancel +
'}';
}
public BuildCommand setWorkingDirectory(String workingDirectory) {
this.workingDirectory = workingDirectory;
return this;
}
public BuildCommand setWorkingDirectoryRecursively(String workingDirectory) {
this.setWorkingDirectory(workingDirectory);
for (BuildCommand subCommand : subCommands) {
subCommand.setWorkingDirectoryRecursively(workingDirectory);
}
return this;
}
public String getWorkingDirectory() {
return workingDirectory == null ? "" : workingDirectory;
}
public BuildCommand getTest() {
return test;
}
public BuildCommand setTest(BuildCommand test) {
this.test = test;
return this;
}
public List<BuildCommand> getSubCommands() {
return subCommands;
}
public BuildCommand setSubCommands(List<BuildCommand> subCommands) {
this.subCommands = subCommands;
return this;
}
public String getRunIfConfig() {
return runIfConfig;
}
public void setRunIfConfig(String runIfConfig) {
this.runIfConfig = runIfConfig;
}
public BuildCommand getOnCancel() {
return onCancel;
}
public BuildCommand setOnCancel(BuildCommand onCancel) {
this.onCancel = onCancel;
return this;
}
public BuildCommand runIf(String runIfConfig) {
setRunIfConfig(runIfConfig);
return this;
}
public BuildCommand setRunIfRecurisvely(String runIfConfig) {
runIf(runIfConfig);
for (BuildCommand subCommand : subCommands) {
subCommand.setRunIfRecurisvely(runIfConfig);
}
return this;
}
public boolean getBooleanArg(String arg) {
return args.containsKey(arg) ? Boolean.valueOf(args.get(arg)) : false;
}
public String getStringArg(String arg) {
return args.get(arg);
}
public String[] getArrayArg(String arg) {
if (!hasArg(arg)) {
return new String[]{};
}
return GSON.fromJson(args.get(arg), String[].class);
}
}