/*
* 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.materials;
import java.util.Map;
import com.thoughtworks.go.config.CaseInsensitiveString;
import com.thoughtworks.go.config.ConfigAttribute;
import com.thoughtworks.go.config.ConfigReferenceElement;
import com.thoughtworks.go.config.ConfigTag;
import com.thoughtworks.go.config.IgnoreTraversal;
import com.thoughtworks.go.config.PipelineConfig;
import com.thoughtworks.go.config.ValidationContext;
import com.thoughtworks.go.domain.packagerepository.PackageDefinition;
import com.thoughtworks.go.domain.packagerepository.PackageRepository;
import org.apache.commons.lang.StringUtils;
@ConfigTag(value = "package")
public class PackageMaterialConfig extends AbstractMaterialConfig {
public static final String TYPE = "PackageMaterial";
public static final String PACKAGE_ID = "packageId";
@ConfigAttribute(value = "ref")
private String packageId;
@IgnoreTraversal
@ConfigReferenceElement(referenceAttribute = "ref", referenceCollection = "packages")
private com.thoughtworks.go.domain.packagerepository.PackageDefinition packageDefinition;
public PackageMaterialConfig() {
super(TYPE);
}
public PackageMaterialConfig(String packageId) {
this();
this.packageId = packageId;
}
public PackageMaterialConfig(CaseInsensitiveString name, String packageId, PackageDefinition packageDefinition) {
super(TYPE);
this.name = name;
this.packageId = packageId;
this.packageDefinition = packageDefinition;
}
public String getPackageId() {
return packageId;
}
public void setPackageId(String packageId) {
this.packageId = packageId;
}
public String getPluginId() {
return getPackageDefinition().getRepository().getPluginConfiguration().getId();
}
public PackageDefinition getPackageDefinition() {
return packageDefinition;
}
@Override
public String toString() {
return String.format("'PackageMaterial{%s}'", getLongDescription());
}
@Override
public String getFingerprint() {
if (packageDefinition == null) {
return null;
}
return packageDefinition.getFingerprint(FINGERPRINT_DELIMITER);
}
@Override
protected void appendCriteria(Map<String, Object> parameters) {
parameters.put("fingerprint", getFingerprint());
}
@Override
protected void appendAttributes(Map<String, Object> parameters) {
parameters.put("repositoryName", this.getPackageDefinition().getRepository().getName());
parameters.put("packageName", this.getPackageDefinition().getName());
}
@Override
protected void appendPipelineUniqueCriteria(Map<String, Object> basicCriteria) {
//do nothing
}
@Override
protected void validateConcreteMaterial(ValidationContext validationContext) {
if (StringUtils.isBlank(packageId)) {
addError(PACKAGE_ID, "Please select a repository and package");
}
}
@Override
protected void validateExtras(ValidationContext validationContext) {
if (!StringUtils.isBlank(packageId)) {
PackageRepository packageRepository = validationContext.findPackageById(packageId);
if (packageRepository == null) {
addError(PACKAGE_ID, String.format("Could not find repository for given package id:[%s]", packageId));
} else if (!packageRepository.doesPluginExist()) {
addError(PACKAGE_ID, String.format("Could not find plugin for given package id:[%s].", packageId));
}
}
}
@Override
public String getFolder() {
return null;
}
@Override
public Filter filter() {
return new Filter() {
@Override
public boolean shouldNeverIgnore() {
return true;
}
};
}
@Override
public boolean isInvertFilter() {
return false;
}
@Override
public boolean matches(String name, String regex) {
return false;
}
@Override
public CaseInsensitiveString getName() {
if (((name == null) || StringUtils.isEmpty(name.toString())) && packageDefinition != null) {
return new CaseInsensitiveString(getPackageDefinition().getRepository().getName() + ":" + packageDefinition.getName());
} else {
return name;
}
}
@Override
public String getDescription() {
return getDisplayName();
}
@Override
public String getTypeForDisplay() {
return "Package";
}
@Override
public String getDisplayName() {
return ((name == null || name.isBlank()) && getPackageDefinition().getRepository().getName() == null) ? getUriForDisplay() : getName().toString();
}
@Override
public String getUriForDisplay() {
return packageDefinition.getConfigForDisplay();
}
@Override
public boolean isAutoUpdate() {
return packageDefinition.isAutoUpdate();
}
@Override
public void setAutoUpdate(boolean autoUpdate) {
packageDefinition.setAutoUpdate(autoUpdate);
}
@Override
public Boolean isUsedInFetchArtifact(PipelineConfig pipelineConfig) {
return Boolean.FALSE;
}
@Override
public String getLongDescription() {
return getUriForDisplay();
}
public void setPackageDefinition(PackageDefinition packageDefinition) {
this.packageDefinition = packageDefinition;
if (packageDefinition != null) {
this.packageId = packageDefinition.getId();
} else{
this.packageId = null;
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
PackageMaterialConfig that = (PackageMaterialConfig) o;
if (packageDefinition != null ? !packageDefinition.equals(that.packageDefinition) : that.packageDefinition != null) {
return false;
}
return super.equals(that);
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (packageId != null ? packageId.hashCode() : 0);
return result;
}
public void setConfigAttributes(Object attributes) {
if (attributes == null) {
return;
}
super.setConfigAttributes(attributes);
Map map = (Map) attributes;
this.packageId = (String) map.get(PACKAGE_ID);
}
@Override
public void validateNameUniqueness(Map<CaseInsensitiveString, AbstractMaterialConfig> map) {
if (StringUtils.isBlank(packageId)) {
return;
}
if (map.containsKey(new CaseInsensitiveString(packageId))) {
AbstractMaterialConfig material = map.get(new CaseInsensitiveString(packageId));
material.addError(PACKAGE_ID, "Duplicate package material detected!");
addError(PACKAGE_ID, "Duplicate package material detected!");
} else {
map.put(new CaseInsensitiveString(packageId), this);
}
}
}