/*
* 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 java.io.File;
import java.util.Date;
import java.util.Map;
import com.thoughtworks.go.config.CaseInsensitiveString;
import com.thoughtworks.go.config.CruiseConfig;
import com.thoughtworks.go.config.EnvironmentVariablesConfig;
import com.thoughtworks.go.config.materials.Materials;
import com.thoughtworks.go.domain.buildcause.BuildCause;
import com.thoughtworks.go.domain.label.PipelineLabel;
import static com.thoughtworks.go.domain.label.PipelineLabel.COUNT;
public class Pipeline extends PersistentObject implements PipelineInfo {
private String pipelineName;
private Integer counter;
private PipelineLabel pipelineLabel = PipelineLabel.defaultLabel();
private Stages stages = new Stages();
private BuildCause buildCause;
private double naturalOrder;
public Pipeline() {
this(new Stages());
}
private Pipeline(Stages stages) {
this.stages = stages;
this.counter = 0;//counter can never be null, as pipeline identifier creation with null counter is not allowed
}
public Pipeline(String pipelineName, String labelTemplate, BuildCause buildCause, Stage... stages) {
this(new Stages(stages));
this.pipelineName = pipelineName;
this.pipelineLabel = PipelineLabel.create(labelTemplate);
this.buildCause = buildCause;
}
public Pipeline(String pipelineName, BuildCause buildCause, Stage... stages) {
this(pipelineName, PipelineLabel.COUNT_TEMPLATE, buildCause, stages);
}
public File defaultWorkingFolder() {
return new File(CruiseConfig.WORKING_BASE_DIR + pipelineName);
}
public String getName() {
return pipelineName;
}
public void setName(String pipelineName) {
this.pipelineName = pipelineName;
}
public void setCounter(Integer counter) {
this.counter = counter;
}
public Integer getCounter() {
return counter;
}
public Stages getStages() {
return stages;
}
public void setStages(Stages stages) {
this.stages = stages;
}
public Stage getFirstStage() {
return stages.first() == null ? new NullStage("unknown") : stages.first();
}
public Materials getMaterials() {
return buildCause.materials();
}
public BuildCause getBuildCause() {
return buildCause;
}
public void setBuildCause(BuildCause buildCause) {
this.buildCause = buildCause;
}
public void setModificationsOnBuildCause(MaterialRevisions materialRevisions) {
this.buildCause.setMaterialRevisions(materialRevisions);
}
public String getBuildCauseMessage() {
if (buildCause == null) {
return "Unknown";
}
//TODO: ChrisS: Replace this with encapsulation and null checks for the buildCause
//also, we may choos to persist the real username and buildcause rather than throwing
// away that information as we do now
String message = "Unknown";
if (getBuildCause() != null && getBuildCause().getBuildCauseMessage() != null) {
message = getBuildCause().getBuildCauseMessage();
}
return message;
}
public ModificationSummaries toModificationSummaries() {
if (buildCause == null) {
return new ModificationSummaries();
} else {
return buildCause.toModificationSummaries();
}
}
public boolean hasStageBeenRun(String stageName) {
return stages.hasStage(stageName);
}
public String getLabel() {
return pipelineLabel.toString();
}
/**
* Will not apply template logic; to be used only in testing or by iBatis
*
* @param label
*/
public void setLabel(String label) {
this.pipelineLabel.setLabel(label);
}
public void updateCounter(Integer lastCount) {
counter = lastCount + 1;
updateLabel();
}
private void updateLabel() {
Map<CaseInsensitiveString, String> namedRevisions = this.getMaterialRevisions().getNamedRevisions();
namedRevisions.put(new CaseInsensitiveString(COUNT), counter.toString());
this.pipelineLabel.updateLabel(namedRevisions);
}
public boolean isAnyStageActive() {
return stages.isAnyStageActive();
}
public String nextStageName(String stageName) {
return stages.nextStageName(stageName);
}
public Stage findStage(String stageName) {
return stages.byName(stageName);
}
private void setBuildCauseMessage(String buildCauseMessage) {
buildCause.setMessage(buildCauseMessage);
}
private void setApprovedBy(String approvedBy) {
buildCause.setApprover(approvedBy);
}
public MaterialRevisions getMaterialRevisions() {
return buildCause.getMaterialRevisions();
}
public Date getModifiedDate() {
return buildCause.getModifiedDate();
}
public PipelineIdentifier getIdentifier() {
return new PipelineIdentifier(pipelineName, counter, getLabel());
}
public double getNaturalOrder() {
return naturalOrder;
}
public void setNaturalOrder(double naturalOrder) {
this.naturalOrder = naturalOrder;
}
public EnvironmentVariablesConfig scheduleTimeVariables() {
return buildCause.getVariables();
}
public boolean isBisect() {
return naturalOrderIsNotAnInteger();
}
private boolean naturalOrderIsNotAnInteger() {
return naturalOrder - new Double(naturalOrder).intValue() > 0;
}
}