/*
* 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.
*/
package com.thoughtworks.go.domain;
import com.google.gson.annotations.Expose;
import com.thoughtworks.go.util.UrlUtil;
import com.thoughtworks.go.util.command.EnvironmentVariableContext;
import java.io.Serializable;
public class JobIdentifier implements Serializable, LocatableEntity {
@Expose
private String pipelineName;
@Expose
private Integer pipelineCounter;
@Expose
private String pipelineLabel;
@Expose
private String stageName;
@Expose
private String buildName;
@Expose
private Long buildId;
@Expose
private String stageCounter;
public static final String LATEST = "latest";
@Expose
private Integer rerunOfCounter;
public JobIdentifier(Pipeline pipeline, Stage stage, JobInstance jobInstance) {
this(pipeline.getName(), pipeline.getCounter(), pipeline.getLabel(), stage.getName(), String.valueOf(stage.getCounter()), jobInstance.getName(), jobInstance.getId());
}
public JobIdentifier(StageIdentifier stageIdentifier, JobInstance job) {
this(stageIdentifier.getPipelineName(), stageIdentifier.getPipelineCounter(),
stageIdentifier.getPipelineLabel(), stageIdentifier.getStageName(),
stageIdentifier.getStageCounter(), job.getName(), job.getId());
}
public JobIdentifier(StageIdentifier stage, String jobName) {
this(stage.getPipelineName(), stage.getPipelineCounter(), stage.getPipelineLabel(), stage.getStageName(),
stage.getStageCounter(), jobName, 0L);
}
public JobIdentifier(StageIdentifier stage, String jobName, Long jobId) {
this(stage.getPipelineName(), stage.getPipelineCounter(), stage.getPipelineLabel(), stage.getStageName(),
stage.getStageCounter(), jobName, jobId);
}
public JobIdentifier(String pipelineName, int pipelineCounter, String pipelineLabel, String staqeName, String stageCounter, String jobName) {
this(pipelineName, pipelineCounter, pipelineLabel, staqeName, stageCounter, jobName, -1L);
}
public static JobIdentifier invalidIdentifier(String pipelineName, String pipelineLabel, String stageName,
String stageCounter, String buildName) {
return new JobIdentifier(pipelineName, pipelineLabel, stageName, stageCounter, buildName, null);
}
@Deprecated // should use pipeline counter
public JobIdentifier(String pipelineName, String pipelineLabel, String stageName,
String counter, String buildName) {
this(pipelineName, pipelineLabel, stageName, counter, buildName, 0L);
}
@Deprecated // should use pipeline counter
public JobIdentifier(String pipelineName, String pipelineLabel, String stageName, int stageCounter, String buildName, Long buildId) {
this(pipelineName, pipelineLabel, stageName, String.valueOf(stageCounter), buildName, buildId);
}
public JobIdentifier(String pipelineName, Integer pipelineCounter, String pipelineLabel, String stageName, String stageCounter, String buildName, Long buildId) {
this.pipelineName = pipelineName;
this.pipelineCounter = pipelineCounter;
this.pipelineLabel = pipelineLabel;
this.stageName = stageName;
this.stageCounter = stageCounter;
this.buildName = buildName;
this.buildId = buildId;
}
/*this constructor is for ibatis*/
public JobIdentifier() {
}
@Deprecated // should use pipeline counter
public JobIdentifier(String pipelineName, String pipelineLabel, String stageName, String stageCounter, String buildName, Long buildId) {
this(pipelineName, null, pipelineLabel, stageName, stageCounter, buildName, buildId);
this.buildId = buildId;
}
public void setPipelineName(String pipelineName) {
this.pipelineName = pipelineName;
}
public void setPipelineLabel(String pipelineLabel) {
this.pipelineLabel = pipelineLabel;
}
public void setBuildName(String buildName) {
this.buildName = buildName;
}
public void setStageCounter(String stageCounter) {
this.stageCounter = stageCounter;
}
public String getPipelineName() {
return pipelineName;
}
public String getPipelineLabel() {
return pipelineLabel;
}
public String getStageName() {
return stageName;
}
public String getStageCounter() {
return stageCounter;
}
public void setStageName(String stageName) {
this.stageName = stageName;
}
public String getBuildName() {
return buildName;
}
public Long getBuildId() {
return buildId;
}
public void setBuildId(Long buildId) {
this.buildId = buildId;
}
public String toString() {
return String.format("JobIdentifier[%s, %s, %s, %s, %s, %s, %s]", pipelineName, pipelineCounter, pipelineLabel,
stageName, stageCounter, buildName, buildId);
}
public String toFullString() {
return "Build [" + buildLocator() + "/" + getBuildId() + "]";
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
JobIdentifier that = (JobIdentifier) o;
if (buildId != null ? !buildId.equals(that.buildId) : that.buildId != null) {
return false;
}
if (buildName != null ? !buildName.equals(that.buildName) : that.buildName != null) {
return false;
}
if (pipelineCounter != null ? !pipelineCounter.equals(that.pipelineCounter) : that.pipelineCounter != null) {
return false;
}
if (pipelineLabel != null ? !pipelineLabel.equals(that.pipelineLabel) : that.pipelineLabel != null) {
return false;
}
if (pipelineName != null ? !pipelineName.equals(that.pipelineName) : that.pipelineName != null) {
return false;
}
if (stageCounter != null ? !stageCounter.equals(that.stageCounter) : that.stageCounter != null) {
return false;
}
if (stageName != null ? !stageName.equals(that.stageName) : that.stageName != null) {
return false;
}
return true;
}
public int hashCode() {
int result;
result = (pipelineName != null ? pipelineName.hashCode() : 0);
result = 31 * result + (pipelineLabel != null ? pipelineLabel.hashCode() : 0);
result = 31 * result + (stageName != null ? stageName.hashCode() : 0);
result = 31 * result + (buildName != null ? buildName.hashCode() : 0);
result = 31 * result + (buildId != null ? buildId.hashCode() : 0);
result = 31 * result + (stageCounter != null ? stageCounter.hashCode() : 0);
result = 31 * result + (pipelineCounter != null ? pipelineCounter.hashCode() : 0);
return result;
}
public String buildLocator() {
//TODO: the encoding logic should be moved to presentation layer
return UrlUtil.encodeInUtf8(String.format("%s/%s", stageLocator(), buildName));
}
private String stageLocator() {
return getStageIdentifier().stageLocatorByLabelOrCounter();
}
public String buildLocatorForDisplay() {
return String.format("%s/%s", getStageIdentifier().stageLocatorForDisplay(), buildName);
}
public String propertyLocator(String propertyName) {
return UrlUtil.encodeInUtf8(String.format("%s/%s/%s", stageLocator(), buildName, propertyName));
}
public String artifactLocator(String filePath) {
//TODO: we should make sure data is valid at the beginning instead of fixing it here
if (filePath.startsWith("/")) {
filePath = filePath.substring(1);
}
return UrlUtil.encodeInUtf8(String.format("%s/%s/%s", stageLocator(), buildName, filePath));
}
public boolean needTranslateJob() {
return buildId == null || buildId <= 0L;
}
public StageIdentifier getStageIdentifier() {
return new StageIdentifier(pipelineName, pipelineCounter, pipelineLabel, stageName,
stageCounter);
}
public String ccProjectName() {
return String.format("%s :: %s :: %s", getPipelineName(), getStageName(), getBuildName());
}
public String webUrl() {
return "tab/build/detail/" + buildLocator();
}
public JobConfigIdentifier jobConfigIdentifier() {
return new JobConfigIdentifier(pipelineName, stageName, buildName);
}
public Integer getPipelineCounter() {
return pipelineCounter;
}
public void setPipelineCounter(Integer pipelineCounter) {
this.pipelineCounter = pipelineCounter;
}
public boolean isSameStageConfig(JobIdentifier other) {
return getPipelineName().equalsIgnoreCase(other.getPipelineName())
&& getStageName().equalsIgnoreCase(other.getStageName());
}
public void populateEnvironmentVariables(EnvironmentVariableContext environmentVariableContext) {
environmentVariableContext.setProperty("GO_PIPELINE_NAME", getPipelineName(), false);
environmentVariableContext.setProperty("GO_PIPELINE_COUNTER", String.valueOf(getPipelineCounter()), false);
environmentVariableContext.setProperty("GO_PIPELINE_LABEL", getPipelineLabel(), false);
environmentVariableContext.setProperty("GO_STAGE_NAME", getStageName(), false);
environmentVariableContext.setProperty("GO_STAGE_COUNTER", getStageCounter(), false);
if (getRerunOfCounter() != null) {
environmentVariableContext.setProperty("GO_RERUN_OF_STAGE_COUNTER", String.valueOf(getRerunOfCounter()), false);
}
environmentVariableContext.setProperty("GO_JOB_NAME", getBuildName(), false);
}
public String asURN() {
return String.format("urn:x-go.studios.thoughtworks.com:job-id:%s:%s:%s:%s:%s", pipelineName, pipelineCounter, stageName, stageCounter, buildName);
}
public Integer getRerunOfCounter() {
return rerunOfCounter;
}
public void setRerunOfCounter(Integer rerunOfCounter) {
this.rerunOfCounter = rerunOfCounter;
}
public String entityLocator() {
return buildLocator();
}
public Long getId() {
return getBuildId();
}
}