package com.thoughtworks.go.plugin.access.configrepo.contract.tasks; import com.thoughtworks.go.plugin.access.configrepo.ErrorCollection; import com.thoughtworks.go.plugin.access.configrepo.contract.CRConfigurationProperty; import com.thoughtworks.go.plugin.access.configrepo.contract.CRPluginConfiguration; import org.apache.commons.collections.CollectionUtils; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; public class CRPluggableTask extends CRTask { public static final java.lang.String TYPE_NAME = "plugin"; private CRPluginConfiguration plugin_configuration; private Collection<CRConfigurationProperty> configuration ; public CRPluggableTask() { super(TYPE_NAME); } public CRPluggableTask(CRPluginConfiguration pluginConfiguration, CRConfigurationProperty... properties) { super(TYPE_NAME); this.plugin_configuration = pluginConfiguration; this.configuration = Arrays.asList(properties); } public CRPluggableTask(String id,String version, CRConfigurationProperty... properties) { super(TYPE_NAME); this.plugin_configuration = new CRPluginConfiguration(id,version); this.configuration = Arrays.asList(properties); } public CRPluggableTask(CRRunIf runIf, CRTask onCancel, CRPluginConfiguration pluginConfiguration,Collection<CRConfigurationProperty> configuration) { super(runIf, onCancel); this.plugin_configuration = pluginConfiguration; this.configuration = configuration; } public CRPluginConfiguration getPluginConfiguration() { return plugin_configuration; } public void setPluginConfiguration(CRPluginConfiguration pluginConfiguration) { this.plugin_configuration = pluginConfiguration; } public Collection<CRConfigurationProperty> getConfiguration() { return configuration; } public void setConfiguration(Collection<CRConfigurationProperty> configuration) { this.configuration = configuration; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } if (!super.equals(o)) { return false; } CRPluggableTask that = (CRPluggableTask) o; if (configuration != null && that.configuration == null) return false; if (configuration == null && that.configuration != null) return false; if (configuration != null ? !CollectionUtils.isEqualCollection(configuration,that.configuration) : that.configuration != null) { return false; } if (plugin_configuration != null ? !plugin_configuration.equals(that.plugin_configuration) : that.plugin_configuration != null) { return false; } return true; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + (plugin_configuration != null ? plugin_configuration.hashCode() : 0); result = 31 * result + (configuration != null ? configuration.hashCode() : 0); return result; } @Override public void getErrors(ErrorCollection errors, String parentLocation) { String location = getLocation(parentLocation); errors.checkMissing(location,"plugin_configuration",plugin_configuration); if(this.plugin_configuration != null) this.plugin_configuration.getErrors(errors,location); if(this.configuration != null) { for(CRConfigurationProperty p : configuration) { p.getErrors(errors,location); } } validateKeyUniqueness(errors,location); } @Override public String getLocation(String parent) { String myLocation = getLocation() == null ? parent : getLocation(); return String.format("%s; pluggable task",myLocation); } private void validateKeyUniqueness(ErrorCollection errors,String location) { if(this.configuration == null) return; HashSet<String> keys = new HashSet<>(); for(CRConfigurationProperty property1 : this.configuration) { String key = property1.getKey(); if(keys.contains(key)) errors.addError(location,String.format( "Configuration property %s is defined more than once",property1)); else keys.add(key); } } }