/*
* Copyright 2015 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.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.thoughtworks.go.domain.BaseCollection;
import com.thoughtworks.go.domain.ConfigErrors;
import com.thoughtworks.go.service.TaskFactory;
import static com.thoughtworks.go.util.ExceptionUtils.bombIf;
import static java.util.Arrays.asList;
@ConfigTag("jobs")
@ConfigCollection(value = JobConfig.class, minimum = 1)
public class JobConfigs extends BaseCollection<JobConfig> implements Validatable, ParamsAttributeAware {
private final ConfigErrors configErrors = new ConfigErrors();
public JobConfigs(JobConfig... plans) {
super(asList(plans));
}
public JobConfigs() {
super();
}
public boolean containsName(final CaseInsensitiveString jobName) {
for (JobConfig jobConfig : this) {
if (jobName.equals(jobConfig.name())) {
return true;
}
}
return false;
}
public boolean add(JobConfig jobConfig) {
verifyUniqueName(jobConfig);
return addJob(jobConfig);
}
private boolean addJob(JobConfig jobConfig) {
return super.add(jobConfig);
}
public JobConfig set(int index, JobConfig jobConfig) {
verifyUniqueName(jobConfig, index);
return super.set(index, jobConfig);
}
public void add(int index, JobConfig jobConfig) {
verifyUniqueName(jobConfig);
super.add(index, jobConfig);
}
private void verifyUniqueName(JobConfig jobConfig) {
bombIf(containsName(jobConfig.name()), String.format("You have defined multiple Jobs called '%s'. Job names are case-insensitive and must be unique.", jobConfig.name()));
}
private void verifyUniqueName(JobConfig jobConfig, int index) {
if (jobConfig.name().equals(super.get(index).name())) {
return;
}
verifyUniqueName(jobConfig);
}
public boolean validateTree(ValidationContext validationContext) {
validate(validationContext);
boolean isValid = errors().isEmpty();
for (JobConfig jobConfig : this) {
isValid = jobConfig.validateTree(validationContext) && isValid;
}
return isValid;
}
public void validate(ValidationContext validationContext) {
validateNameUniqueness();
}
public ConfigErrors errors() {
return configErrors;
}
public void addError(String fieldName, String message) {
configErrors.add(fieldName, message);
}
public void setConfigAttributes(Object attributes) {
setConfigAttributes(attributes, null);
}
public void setConfigAttributes(Object attributes, TaskFactory taskFactory) {
this.clear();
if (attributes != null) {
for (Object attribute : (List) attributes) {
JobConfig job = new JobConfig();
job.setConfigAttributes(attribute, taskFactory);
this.addJobWithoutValidityAssertion(job);
}
}
}
public void addJobWithoutValidityAssertion(JobConfig jobConfig) {
addJob(jobConfig);
}
private void validateNameUniqueness() {
Map<String, JobConfig> nameToConfig = new HashMap<>();
for (JobConfig jobConfig : this) {
jobConfig.validateNameUniqueness(nameToConfig);
}
}
public JobConfig getJob(final CaseInsensitiveString job) {
for (JobConfig jobConfig : this) {
if (jobConfig.name().equals(job))
return jobConfig;
}
return null;
}
public List<CaseInsensitiveString> names() {
List<CaseInsensitiveString> names = new ArrayList<>();
for (JobConfig jobConfig : this) {
names.add(jobConfig.name());
}
return names;
}
}