/*************************GO-LICENSE-START*********************************
* Copyright 2014 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.config.remote;
import com.thoughtworks.go.config.*;
import com.thoughtworks.go.config.materials.MaterialConfigs;
import com.thoughtworks.go.config.materials.ScmMaterialConfig;
import com.thoughtworks.go.domain.ConfigErrors;
import com.thoughtworks.go.domain.config.Configuration;
import com.thoughtworks.go.domain.materials.MaterialConfig;
import com.thoughtworks.go.util.StringUtil;
import java.util.Map;
/**
* Defines single source of remote configuration and name of plugin to interpet it.
* This goes to standard static xml configuration.
*/
@ConfigTag("config-repo")
public class ConfigRepoConfig implements Validatable {
// defines source of configuration. Any will fit
@ConfigSubtag(optional = false)
private MaterialConfig repo;
@ConfigSubtag
private Configuration configuration = new Configuration();
// TODO something must instantiate this name into proper implementation of ConfigProvider
// which can be a plugin or embedded class
@ConfigAttribute(value = "plugin", allowNull = false)
private String configProviderPluginName = "gocd-xml";
// plugin-name which will process the repository tree to return configuration.
// as in https://github.com/gocd/gocd/issues/1133#issuecomment-109014208
// then pattern-based plugin is just one option
public static final String AUTO_UPDATE = "autoUpdate";
public static final String UNIQUE_REPO = "unique_repo";
public static final String REPO = "repo";
private ConfigErrors errors = new ConfigErrors();
public ConfigRepoConfig(){
}
public ConfigRepoConfig(MaterialConfig repo, String configProviderPluginName){
this.repo = repo;
this.configProviderPluginName = configProviderPluginName;
}
public MaterialConfig getMaterialConfig() {
return repo;
}
public void setMaterialConfig(MaterialConfig config) {
this.repo = config;
}
public String getConfigProviderPluginName() {
return configProviderPluginName;
}
public void setConfigProviderPluginName(String configProviderPluginName) {
if(StringUtil.isBlank(configProviderPluginName))
configProviderPluginName = null;
this.configProviderPluginName = configProviderPluginName;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ConfigRepoConfig that = (ConfigRepoConfig) o;
if (repo != null ? !repo.equals(that.repo) : that.repo != null) {
return false;
}
if (configProviderPluginName != null ? !configProviderPluginName.equals(that.configProviderPluginName) : that.configProviderPluginName != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = repo != null ? repo.hashCode() : 0;
result = 31 * result + (configProviderPluginName != null ? configProviderPluginName.hashCode() : 0);
return result;
}
@Override
public void validate(ValidationContext validationContext) {
this.validateRepoIsSet();
this.validateAutoUpdateEnabled();
this.validateAutoUpdateState(validationContext);
}
@Override
public ConfigErrors errors() {
return errors;
}
@Override
public void addError(String fieldName, String message) {
this.errors.add(fieldName,message);
}
public void validateMaterialUniqueness(Map<String, ConfigRepoConfig> map) {
if (this.getMaterialConfig() == null) {
return;
}
String materialFingerprint = this.getMaterialConfig().getFingerprint();
ConfigRepoConfig repoWithSameFingerprint = map.get(materialFingerprint);
if (repoWithSameFingerprint != null) {
repoWithSameFingerprint.addMaterialConflictError();
addMaterialConflictError();
return;
}
map.put(materialFingerprint, this);
}
private void validateAutoUpdateEnabled() {
if(!this.getMaterialConfig().isAutoUpdate())
this.errors.add(AUTO_UPDATE,String.format(
"Configuration repository material %s must have autoUpdate enabled",
this.getMaterialConfig().getDisplayName()));
}
private void addMaterialConflictError() {
this.errors.add(UNIQUE_REPO,String.format(
"You have defined multiple configuration repositories with the same repository - %s",
this.repo.getDisplayName()));
}
private void validateRepoIsSet() {
if (this.getMaterialConfig() == null) {
this.errors.add(REPO,"Configuration repository material not specified");
}
}
public boolean hasSameMaterial(MaterialConfig config) {
return this.getMaterialConfig().getFingerprint().equals(config.getFingerprint());
}
public boolean hasMaterialWithFingerprint(String fingerprint) {
return this.getMaterialConfig().getFingerprint().equals(fingerprint);
}
private void validateAutoUpdateState(ValidationContext validationContext) {
if(validationContext == null)
return;
MaterialConfig material = this.getMaterialConfig();
MaterialConfigs allMaterialsByFingerPrint = validationContext.getAllMaterialsByFingerPrint(material.getFingerprint());
if (allMaterialsByFingerPrint != null) {
for(MaterialConfig other : allMaterialsByFingerPrint)
{
if(!other.isAutoUpdate())
((ScmMaterialConfig) other).setAutoUpdateMismatchErrorWithConfigRepo();
}
}
}
public Configuration getConfiguration() {
return configuration;
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
}