/* * Copyright 2016 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 com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import com.thoughtworks.go.config.CaseInsensitiveString; import com.thoughtworks.go.config.PipelineConfig; import com.thoughtworks.go.domain.MaterialInstance; import com.thoughtworks.go.domain.MaterialRevision; import com.thoughtworks.go.domain.config.ConfigurationProperty; import com.thoughtworks.go.domain.materials.*; import com.thoughtworks.go.domain.materials.packagematerial.PackageMaterialInstance; import com.thoughtworks.go.domain.materials.packagematerial.PackageMaterialRevision; import com.thoughtworks.go.domain.packagerepository.PackageDefinition; import com.thoughtworks.go.util.StringUtil; import com.thoughtworks.go.util.command.ConsoleOutputStreamConsumer; import com.thoughtworks.go.util.command.EnvironmentVariableContext; import com.thoughtworks.go.util.json.JsonHelper; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import java.util.UUID; import static com.thoughtworks.go.util.command.EnvironmentVariableContext.escapeEnvironmentVariable; import static java.lang.String.format; import static org.apache.commons.lang.StringUtils.isEmpty; import static org.apache.commons.lang.StringUtils.upperCase; public class PackageMaterial extends AbstractMaterial { public static final String TYPE = "PackageMaterial"; private String packageId; @Expose @SerializedName("package") private PackageDefinition packageDefinition; public PackageMaterial() { super(TYPE); } public PackageMaterial(String packageId) { this(); this.packageId = packageId; } public PackageMaterial(PackageMaterialConfig config) { super(TYPE); this.name = config.getName(); this.packageId = config.getPackageId(); this.packageDefinition = config.getPackageDefinition(); } @Override public String toString() { return String.format("'PackageMaterial{%s}'", getLongDescription()); } @Override public MaterialConfig config() { return new PackageMaterialConfig(this.name, this.packageId, this.packageDefinition); } public String getPluginId() { return getPackageDefinition().getRepository().getPluginConfiguration().getId(); } public PackageDefinition getPackageDefinition() { return packageDefinition; } @Override public String getFingerprint() { if (isEmpty(fingerprint)) { return packageDefinition == null ? null : packageDefinition.getFingerprint(FINGERPRINT_DELIMITER); } return fingerprint; } @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 public String getFolder() { return null; } @Override public void updateTo(ConsoleOutputStreamConsumer outputStreamConsumer, File baseDir, RevisionContext revisionContext, SubprocessExecutionContext execCtx) { //do nothing } @Override public void toJson(Map jsonMap, Revision revision) { jsonMap.put("scmType", getTypeForDisplay()); jsonMap.put("action", "Modified"); jsonMap.put("location", getUriForDisplay()); jsonMap.put("materialName", getDisplayName()); } @Override public boolean matches(String name, String regex) { return false; } @Override public void emailContent(StringBuilder content, Modification modification) { content.append(getTypeForDisplay() + " : " + getDisplayName()).append('\n').append( format("revision: %s, completed on %s", modification.getRevision(), modification.getModifiedTime())); } @Override public MaterialInstance createMaterialInstance() { return new PackageMaterialInstance(JsonHelper.toJsonString(this), UUID.randomUUID().toString()); } @Override public CaseInsensitiveString getName() { if (((name == null) || 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 void populateEnvironmentContext(EnvironmentVariableContext context, MaterialRevision materialRevision, File workingDir) { context.setProperty(upperCase(format("GO_PACKAGE_%s_LABEL", escapeEnvironmentVariable(getName().toString()))), materialRevision.getRevision().getRevision(), false); for (ConfigurationProperty configurationProperty : getPackageDefinition().getRepository().getConfiguration()) { context.setProperty(getEnvironmentVariableKey("GO_REPO_%s_%s", configurationProperty.getConfigurationKey().getName()), configurationProperty.getValue(), configurationProperty.isSecure()); } for (ConfigurationProperty configurationProperty : getPackageDefinition().getConfiguration()) { context.setProperty(getEnvironmentVariableKey("GO_PACKAGE_%s_%s", configurationProperty.getConfigurationKey().getName()), configurationProperty.getValue(), configurationProperty.isSecure()); } HashMap<String, String> additionalData = materialRevision.getLatestModification().getAdditionalDataMap(); if (additionalData != null) { for (Map.Entry<String, String> entry : additionalData.entrySet()) { boolean isSecure = false; for (EnvironmentVariableContext.EnvironmentVariable secureEnvironmentVariable : context.getSecureEnvironmentVariables()) { String urlEncodedValue = null; try { urlEncodedValue = URLEncoder.encode(secureEnvironmentVariable.value(), "UTF-8"); } catch (UnsupportedEncodingException e) { } boolean isSecureEnvironmentVariableEncoded = !StringUtil.isBlank(urlEncodedValue) && !secureEnvironmentVariable.value().equals(urlEncodedValue); if (isSecureEnvironmentVariableEncoded && entry.getValue().contains(urlEncodedValue)) { isSecure = true; break; } } String key = entry.getKey(); String value = entry.getValue(); context.setProperty(getEnvironmentVariableKey("GO_PACKAGE_%s_%s", key), value, isSecure); } } } private String getEnvironmentVariableKey(String keyPattern, String givenKey) { return escapeEnvironmentVariable(upperCase(format(keyPattern, getName().toString(), givenKey))); } @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 Map<String, Object> getAttributes(boolean addSecureFields) { Map<String, Object> materialMap = new HashMap<>(); materialMap.put("type", "package"); materialMap.put("plugin-id", getPluginId()); Map<String, String> repositoryConfigurationMap = packageDefinition.getRepository().getConfiguration().getConfigurationAsMap(addSecureFields); materialMap.put("repository-configuration", repositoryConfigurationMap); Map<String, String> packageConfigurationMap = packageDefinition.getConfiguration().getConfigurationAsMap(addSecureFields); materialMap.put("package-configuration", packageConfigurationMap); return materialMap; } @Override public boolean isAutoUpdate() { return packageDefinition.isAutoUpdate(); } @Override public MatchedRevision createMatchedRevision(Modification modification, String searchString) { return new MatchedRevision(searchString, modification.getRevision(), modification.getRevision(), modification.getUserName(), modification.getModifiedTime(), modification.getComment()); } @Override public Boolean isUsedInFetchArtifact(PipelineConfig pipelineConfig) { return Boolean.FALSE; } @Override public Class getInstanceType() { return PackageMaterialInstance.class; } @Override public Revision oldestRevision(Modifications modifications) { if (modifications.isEmpty()) { return new NullRevision(); } Modification modification = modifications.get(0); return new PackageMaterialRevision(modification.getRevision(), modification.getModifiedTime()); } @Override public String getLongDescription() { return getUriForDisplay(); } public void setPackageDefinition(PackageDefinition packageDefinition) { this.packageDefinition = packageDefinition; } @Override public void updateFromConfig(MaterialConfig materialConfig) { super.updateFromConfig(materialConfig); this.getPackageDefinition().setConfiguration(((PackageMaterialConfig)materialConfig).getPackageDefinition().getConfiguration()); this.getPackageDefinition().getRepository().setConfiguration(((PackageMaterialConfig)materialConfig).getPackageDefinition().getRepository().getConfiguration()); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } PackageMaterial that = (PackageMaterial) o; if (this.getFingerprint() != null ? !this.getFingerprint().equals(that.getFingerprint()) : that.getFingerprint() != null) { return false; } return true; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + (packageId != null ? packageId.hashCode() : 0); return result; } public void setFingerprint(String fingerprint) { this.fingerprint = fingerprint; } }