package com.hubspot.blazar.base;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
public class BuildCommand {
public static final String DEFAULT_EXECUTABLE = "/bin/bash";
public static final String DEFAULT_ARG = "-c";
public static final Set<Integer> DEFAULT_SUCCESSFUL_RETURN_CODES = ImmutableSet.of(0);
private final String executable;
private final List<String> args;
private final Set<Integer> successfulReturnCodes;
private final Map<String, String> env;
@JsonCreator
public BuildCommand(@JsonProperty("executable") Optional<String> executable,
@JsonProperty("args") Optional<List<String>> args,
@JsonProperty("command") Optional<String> command,
@JsonProperty("successfulReturnCodes") Set<Integer> successfulReturnCodes,
@JsonProperty("env") Map<String, String> env) {
if (executable.isPresent()) {
Preconditions.checkState(!command.isPresent());
this.executable = executable.get();
this.args = args.or(Collections.<String>emptyList());
} else {
Preconditions.checkState(command.isPresent());
Preconditions.checkState(!args.isPresent());
this.executable = DEFAULT_EXECUTABLE;
this.args = Arrays.asList(DEFAULT_ARG, command.get());
}
this.successfulReturnCodes = MoreObjects.firstNonNull(successfulReturnCodes, DEFAULT_SUCCESSFUL_RETURN_CODES);
this.env = MoreObjects.firstNonNull(env, Collections.<String, String>emptyMap());
}
public BuildCommand(String executable, List<String> args) {
this(executable, args, DEFAULT_SUCCESSFUL_RETURN_CODES, Collections.<String, String>emptyMap());
}
public BuildCommand(String executable, List<String> args, Map<String, String> env) {
this(executable, args, DEFAULT_SUCCESSFUL_RETURN_CODES, env);
}
public BuildCommand(String executable, List<String> args, Set<Integer> successfulReturnCodes, Map<String, String> env) {
this.executable = Preconditions.checkNotNull(executable);
this.args = Preconditions.checkNotNull(args);
this.successfulReturnCodes = Preconditions.checkNotNull(successfulReturnCodes);
this.env = Preconditions.checkNotNull(env);
}
@JsonCreator
public static BuildCommand fromString(String command) {
return new BuildCommand(
Optional.<String>absent(),
Optional.<List<String>>absent(),
Optional.of(command),
null,
null
);
}
public String getExecutable() {
return executable;
}
public List<String> getArgs() {
return args;
}
public Set<Integer> getSuccessfulReturnCodes() {
return successfulReturnCodes;
}
public Map<String, String> getEnv() {
return env;
}
public BuildCommand withDifferentExecutable(String newExecutable) {
return new BuildCommand(newExecutable, args, successfulReturnCodes, env);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BuildCommand command = (BuildCommand) o;
return Objects.equals(executable, command.executable) &&
Objects.equals(args, command.args) &&
Objects.equals(successfulReturnCodes, command.successfulReturnCodes) &&
Objects.equals(env, command.env);
}
@Override
public int hashCode() {
return Objects.hash(executable, args, successfulReturnCodes, env);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("executable", executable)
.add("args", args)
.add("successfulReturnCodes", successfulReturnCodes)
.add("env", env)
.toString();
}
}