/*
* Copyright 2017 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.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.thoughtworks.go.domain.BaseCollection;
import com.thoughtworks.go.domain.ConfigErrors;
/**
* @understands a collection of configuration abstractions
*/
@ConfigTag("templates")
@ConfigCollection(PipelineTemplateConfig.class)
public class TemplatesConfig extends BaseCollection<PipelineTemplateConfig> implements Validatable {
public static final String PIPELINE_TEMPLATES_FAKE_GROUP_NAME = "Pipeline Templates";
private final ConfigErrors configErrors = new ConfigErrors();
public TemplatesConfig() {
}
public TemplatesConfig(PipelineTemplateConfig... templates) {
Collections.addAll(this, templates);
}
public void validate(ValidationContext validationContext) {
validateNameUniqueness();
}
private void validateNameUniqueness() {
Map<String, PipelineTemplateConfig> templateList = new HashMap<>();
for (PipelineTemplateConfig pipelineTemplateConfig : this) {
pipelineTemplateConfig.validateNameUniquness(templateList);
}
}
public ConfigErrors errors() {
return configErrors;
}
public void addError(String fieldName, String message) {
configErrors.add(fieldName, message);
}
public boolean equals(Object that) {
if (this == that) { return true; }
if (that == null) { return false; }
if (this.getClass() != that.getClass()) { return false; }
return super.equals(that);
}
public int hashCode() {
return super.hashCode();
}
public void removeTemplateNamed(CaseInsensitiveString name) {
PipelineTemplateConfig toBeRemoved = null;
for (PipelineTemplateConfig templateConfig : this) {
if (templateConfig.matches(name)) {
toBeRemoved = templateConfig;
}
}
this.remove(toBeRemoved);
}
public boolean hasTemplateNamed(CaseInsensitiveString name) {
for (PipelineTemplateConfig templateConfig : this) {
if (templateConfig.matches(name)) {
return true;
}
}
return false;
}
public PipelineTemplateConfig templateByName(CaseInsensitiveString foo) {
for (PipelineTemplateConfig templateConfig : this) {
if (templateConfig.name().equals(foo)) {
return templateConfig;
}
}
return null;
}
public boolean canViewAndEditTemplate(CaseInsensitiveString username, List<Role> roles) {
for (PipelineTemplateConfig templateConfig : this) {
if (canUserEditTemplate(templateConfig, username, roles)) {
return true;
}
}
return false;
}
public boolean canUserViewTemplates(CaseInsensitiveString username, List<Role> roles, boolean isGroupAdministrator) {
for (PipelineTemplateConfig templateConfig : this) {
if (hasViewAccessToTemplate(templateConfig, username, roles, isGroupAdministrator)) {
return true;
}
}
return false;
}
public boolean canUserEditTemplate(PipelineTemplateConfig template, CaseInsensitiveString username, List<Role> roles) {
return template.getAuthorization().isUserAnAdmin(username, roles);
}
public boolean hasViewAccessToTemplate(PipelineTemplateConfig template, CaseInsensitiveString username, List<Role> roles, boolean isGroupAdministrator) {
boolean hasViewAccessToTemplate = template.getAuthorization().isViewUser(username, roles);
hasViewAccessToTemplate = hasViewAccessToTemplate || (template.isAllowGroupAdmins() && isGroupAdministrator);
return hasViewAccessToTemplate;
}
}