/*************************GO-LICENSE-START*********************************
* Copyright 2016 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.domain.builder;
import com.thoughtworks.go.config.RunIfConfig;
import com.thoughtworks.go.domain.BuildCommand;
import com.thoughtworks.go.domain.BuildLogElement;
import com.thoughtworks.go.domain.RunIfConfigs;
import com.thoughtworks.go.plugin.access.pluggabletask.TaskExtension;
import com.thoughtworks.go.util.command.CruiseControlException;
import com.thoughtworks.go.util.command.EnvironmentVariableContext;
import com.thoughtworks.go.work.DefaultGoPublisher;
import org.apache.log4j.Logger;
import java.io.Serializable;
import static java.lang.String.format;
public abstract class Builder implements Serializable {
private static final Logger LOGGER = Logger.getLogger(Builder.class);
public static final int UNSET_EXIT_CODE = -1;
static final int SUCCESS_EXIT_CODE = 0;
private int exitCode = UNSET_EXIT_CODE;
protected final RunIfConfigs conditions;
private String description;
private Builder cancelBuilder;
public Builder(RunIfConfigs conditions, Builder cancelBuilder, String description) {
this.conditions = conditions;
this.cancelBuilder = cancelBuilder;
this.description = description;
}
public boolean allowRun(RunIfConfig previousStatus) {
return conditions.match(previousStatus);
}
public abstract void build(BuildLogElement buildLogElement, DefaultGoPublisher publisher,
EnvironmentVariableContext environmentVariableContext, TaskExtension taskExtension)
throws CruiseControlException;
public String getDescription() {
return description;
}
public void setCancelBuilder(Builder cancelBuilder) {
this.cancelBuilder = cancelBuilder;
}
public Builder getCancelBuilder() {
return cancelBuilder;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Builder builder = (Builder) o;
if (cancelBuilder != null ? !cancelBuilder.equals(builder.cancelBuilder) : builder.cancelBuilder != null) {
return false;
}
if (conditions != null ? !conditions.equals(builder.conditions) : builder.conditions != null) {
return false;
}
if (description != null ? !description.equals(builder.description) : builder.description != null) {
return false;
}
return true;
}
public int hashCode() {
int result;
result = (conditions != null ? conditions.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (cancelBuilder != null ? cancelBuilder.hashCode() : 0);
return result;
}
public void cancel(DefaultGoPublisher publisher, EnvironmentVariableContext environmentVariableContext, TaskExtension taskExtension) {
publisher.taggedConsumeLineWithPrefix(DefaultGoPublisher.CANCEL_TASK_START, "On Cancel Task: " + cancelBuilder.getDescription()); // odd capitalization, but consistent with UI
try {
cancelBuilder.build(new BuildLogElement(), publisher, environmentVariableContext, taskExtension);
// As this message will output before the running task outputs its task status, do not use the same
// wording (i.e. "Task status: %s") as the order of outputted lines may be confusing
publisher.taggedConsumeLineWithPrefix(DefaultGoPublisher.CANCEL_TASK_PASS, "On Cancel Task completed");
} catch (Exception e) {
publisher.taggedConsumeLineWithPrefix(DefaultGoPublisher.CANCEL_TASK_FAIL, "On Cancel Task failed");
LOGGER.error("", e);
}
}
protected void logException(DefaultGoPublisher publisher, Exception e) throws CruiseControlException {
publisher.taggedConsumeLine(DefaultGoPublisher.ERR, String.format("Error: %s", e.getMessage()));
LOGGER.error(e.getMessage(), e);
throw new CruiseControlException(e);
}
protected void logError(DefaultGoPublisher publisher, String message) throws CruiseControlException {
publisher.taggedConsumeLine(DefaultGoPublisher.ERR, message);
LOGGER.error(message);
throw new CruiseControlException(message);
}
public BuildCommand buildCommand() {
return BuildCommand.fail(format("\"%s\" does not support new build command agent", this.getClass().getName()));
}
public RunIfConfig resolvedRunIfConfig() {
return this.conditions.resolveToSingle();
}
public int getExitCode() {
return exitCode;
}
protected void setExitCode(int exitCode) {
this.exitCode = exitCode;
}
}