package org.jfrog.bamboo.context;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;
import org.jfrog.bamboo.bintray.PushToBintrayContext;
import org.jfrog.bamboo.release.action.ModuleVersionHolder;
import org.jfrog.bamboo.util.BeanUtilsHelper;
import org.jfrog.build.api.BlackDuckProperties;
import org.jfrog.build.api.BlackDuckPropertiesFields;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import static org.jfrog.build.api.BlackDuckPropertiesFields.*;
/**
* Container object for common build environment properties that is based on the configuration's namespace. Each context
* has its own unique prefix that the property is appended to.
*
* @author Tomer Cohen
*/
public abstract class AbstractBuildContext {
public static final String SERVER_ID_PARAM = "artifactoryServerId";
public static final String RESOLUTION_REPO_PARAM = "resolutionRepo";
public static final String PUBLISHING_REPO_PARAM = "publishingRepo";
public static final String DEPLOYER_USERNAME_PARAM = "deployerUsername";
public static final String DEPLOYER_PASSWORD_PARAM = "deployerPassword";
public static final String USE_ARTIFACTORY_GRADLE_PLUGIN = "useArtifactoryGradlePlugin";
public static final String PUBLISH_BUILD_INFO_PARAM = "publishBuildInfo";
public static final String INCLUDE_ENV_VARS_PARAM = "includeEnvVars";
public static final String ENV_VARS_INCLUDE_PATTERNS = "envVarsIncludePatterns";
public static final String ENV_VARS_EXCLUDE_PATTERNS = "envVarsExcludePatterns";
public static final String RUN_LICENSE_CHECKS = "runLicenseChecks";
public static final String LICENSE_VIOLATION_RECIPIENTS = "licenseViolationRecipients";
public static final String LIMIT_CHECKS_TO_THE_FOLLOWING_SCOPES = "limitChecksToScopes";
public static final String INCLUDE_PUBLISHED_ARTIFACTS = "includePublishedArtifacts";
public static final String DISABLE_AUTOMATIC_LICENSE_DISCOVERY = "disableAutoLicenseDiscovery";
public static final String TEST_CHECKED = "testChecked";
public static final String TEST_RESULT_DIRECTORY = "testResultsDirectory";
public static final String TEST_DIRECTORY_OPTION = "testDirectoryOption";
public static final String ENVIRONMENT_VARIABLES = "environmentVariables";
public static final String PUBLISH_ARTIFACTS_PARAM = "publishArtifacts";
public static final String PUBLISH_MAVEN_DESCRIPTORS_PARAM = "publishMavenDescriptors";
public static final String PUBLISH_IVY_DESCRIPTORS_PARAM = "publishIvyDescriptors";
public static final String USE_M2_COMPATIBLE_PATTERNS_PARAM = "useM2CompatiblePatterns";
public static final String IVY_PATTERN_PARAM = "ivyPattern";
public static final String ARTIFACT_PATTERN_PARAM = "artifactPattern";
public static final String PUBLISH_INCLUDE_PATTERNS_PARAM = "publishIncludePatterns";
public static final String PUBLISH_EXCLUDE_PATTERNS_PARAM = "publishExcludePatterns";
public static final String FILTER_EXCLUDED_ARTIFACTS_FROM_BUILD_PARAM = "filterExcludedArtifactsFromBuild";
public static final String ARTIFACT_SPECS_PARAM = "artifactSpecs";
public static final String NO_RESOLUTION_REPO_KEY_CONFIGURED = "noResolutionRepoKeyConfigured";
public static final String NO_PUBLISHING_REPO_KEY_CONFIGURED = "noPublishingRepoKeyConfigured";
public static final String JDK = "buildJdk";
public static final String EXECUTABLE = "executable";
public static final String BASE_URL = "baseUrl";
public static final String ENABLE_BINTRAY_CONFIGURATION = "bintrayConfiguration";
// release management props.
public static final String ENABLE_RELEASE_MANAGEMENT = "enableReleaseManagement";
public static final String ACTIVATE_RELEASE_MANAGEMENT = "activateReleaseManagement";
public static final String VCS_TAG_BASE = "vcsTagBase";
public static final String GIT_RELEASE_BRANCH = "gitReleaseBranch";
public static final String ALTERNATIVE_TASKS = "alternativeTasks";
public static final String RELEASE_PROPS = "releaseProps";
public static final String NEXT_INTEG_PROPS = "nextIntegProps";
public static final String VCS_TYPE = "type";
public static final String GIT_URL = "git.url";
public static final String GIT_AUTHENTICATION_TYPE = "git.authenticationType";
public static final String GIT_USERNAME = "git.username";
public static final String GIT_PASSWORD = "git.password";
public static final String GIT_SSH_KEY = "git.ssh.key";
public static final String GIT_PASSPHRASE = "git.ssh.passphrase";
public static final String PERFORCE_PORT = "p4.port";
public static final String PERFORCE_CLIENT = "p4.client";
public static final String PERFORCE_DEPOT = "p4.depot";
public static final String PERFORCE_USERNAME = "p4.username";
public static final String PERFORCE_PASSWORD = "p4.password";
public static final String BLACKDUCK_PREFIX = "artifactory.common.blackduck.";
public static final String VCS_PREFIX = "artifactory.vcs.";
public final ReleaseManagementContext releaseManagementContext = new ReleaseManagementContext();
public final PushToBintrayContext pushToBintrayContext = new PushToBintrayContext();
public final BlackDuckProperties blackDuckProperties;
private final String prefix;
protected final Map<String, String> env;
public AbstractBuildContext(String prefix, Map<String, String> env) {
this.prefix = prefix;
this.env = env;
BeanUtilsHelper.populateWithPrefix(blackDuckProperties = new BlackDuckProperties(), env,
AbstractBuildContext.BLACKDUCK_PREFIX);
}
public static AbstractBuildContext createContextFromMap(Map<String, String> map) {
if (map == null || map.isEmpty()) {
throw new IllegalArgumentException("No empty map allowed");
}
String value = getBuilderValue(map);
if (StringUtils.isBlank(value)) {
return null;
}
if (StringUtils.startsWith(value, GradleBuildContext.PREFIX)) {
return new GradleBuildContext(sanitizeEntries(map));
} else if (StringUtils.startsWith(value, Maven3BuildContext.PREFIX)) {
return new Maven3BuildContext(sanitizeEntries(map));
}
return null;
}
private static String getBuilderValue(Map<String, String> confMap) {
for (Map.Entry<String, String> entry : confMap.entrySet()) {
if (StringUtils.startsWith(entry.getKey(), "builder.")) {
return entry.getKey();
}
}
return null;
}
private static Map<String, String> sanitizeEntries(Map<String, String> confMap) {
Map<String, String> result = Maps.newHashMap();
for (Map.Entry<String, String> entry : confMap.entrySet()) {
if (StringUtils.isBlank(entry.getValue())) {
result.put(entry.getKey(), "");
} else {
result.put(entry.getKey(), entry.getValue());
}
}
return result;
}
public static List<String> getBlackDuckFieldsToCopy() {
return Arrays.asList(
BLACKDUCK_PREFIX + RUN_CHECKS,
BLACKDUCK_PREFIX + APP_NAME,
BLACKDUCK_PREFIX + APP_VERSION,
BLACKDUCK_PREFIX + REPORT_RECIPIENTS,
BLACKDUCK_PREFIX + SCOPES,
BLACKDUCK_PREFIX + BlackDuckPropertiesFields.INCLUDE_PUBLISHED_ARTIFACTS,
BLACKDUCK_PREFIX + AutoCreateMissingComponentRequests,
BLACKDUCK_PREFIX + AutoDiscardStaleComponentRequests);
}
public static List<String> getVcsFieldsToCopy() {
return Arrays.asList(
VCS_PREFIX + VCS_TYPE,
VCS_PREFIX + GIT_AUTHENTICATION_TYPE,
VCS_PREFIX + GIT_USERNAME,
VCS_PREFIX + GIT_PASSWORD,
VCS_PREFIX + GIT_URL,
VCS_PREFIX + GIT_PASSPHRASE,
VCS_PREFIX + GIT_SSH_KEY,
VCS_PREFIX + PERFORCE_CLIENT,
VCS_PREFIX + PERFORCE_PORT,
VCS_PREFIX + PERFORCE_DEPOT,
VCS_PREFIX + PERFORCE_USERNAME,
VCS_PREFIX + PERFORCE_PASSWORD
);
}
public long getArtifactoryServerId() {
String serverId = env.get(prefix + SERVER_ID_PARAM);
if (StringUtils.isBlank(serverId)) {
return -1;
}
return Long.parseLong(serverId);
}
public String getBaseUrl() {
return env.get(BASE_URL);
}
public String getEnvironmentVariables() {
return env.get(prefix + ENVIRONMENT_VARIABLES);
}
public String getExecutable() {
return env.get(prefix + EXECUTABLE);
}
public boolean isTestChecked() {
return Boolean.parseBoolean(env.get(TEST_CHECKED));
}
public String getTestDirectory() {
return env.get(prefix + TEST_RESULT_DIRECTORY);
}
public String getTestDirectoryOption() {
return env.get(TEST_DIRECTORY_OPTION);
}
public String getPublishingRepo() {
return env.get(prefix + PUBLISHING_REPO_PARAM);
}
public String getDeployerUsername() {
return env.get(prefix + DEPLOYER_USERNAME_PARAM);
}
public String getDeployerPassword() {
return env.get(prefix + DEPLOYER_PASSWORD_PARAM);
}
public String getJdkLabel() {
return env.get(prefix + JDK);
}
public boolean useArtifactoryGradlePlugin() {
return Boolean.parseBoolean(env.get(prefix + USE_ARTIFACTORY_GRADLE_PLUGIN));
}
public boolean isPublishBuildInfo() {
return Boolean.parseBoolean(env.get(PUBLISH_BUILD_INFO_PARAM));
}
public boolean isIncludeEnvVars() {
return Boolean.parseBoolean(env.get(INCLUDE_ENV_VARS_PARAM));
}
public String getEnvVarsIncludePatterns() {
return env.get(ENV_VARS_INCLUDE_PATTERNS);
}
public String getEnvVarsExcludePatterns() {
return env.get(ENV_VARS_EXCLUDE_PATTERNS);
}
public boolean isRunLicenseChecks() {
return Boolean.parseBoolean(env.get(RUN_LICENSE_CHECKS));
}
public String getLicenseViolationRecipients() {
return env.get(prefix + LICENSE_VIOLATION_RECIPIENTS);
}
public String getScopes() {
return env.get(prefix + LIMIT_CHECKS_TO_THE_FOLLOWING_SCOPES);
}
public boolean isIncludePublishedArtifacts() {
return Boolean.parseBoolean(env.get(prefix + INCLUDE_PUBLISHED_ARTIFACTS));
}
public boolean isDisableAutomaticLicenseDiscovery() {
return Boolean.parseBoolean(env.get(prefix + DISABLE_AUTOMATIC_LICENSE_DISCOVERY));
}
public boolean isPublishArtifacts() {
return Boolean.parseBoolean(env.get(PUBLISH_ARTIFACTS_PARAM));
}
public boolean isPublishMavenDescriptors() {
return Boolean.parseBoolean(env.get(prefix + PUBLISH_MAVEN_DESCRIPTORS_PARAM));
}
public boolean isPublishIvyDescriptors() {
return Boolean.parseBoolean(env.get(prefix + PUBLISH_IVY_DESCRIPTORS_PARAM));
}
public boolean isMaven2Compatible() {
return Boolean.parseBoolean(env.get(USE_M2_COMPATIBLE_PATTERNS_PARAM));
}
public String getIvyPattern() {
return env.get(prefix + IVY_PATTERN_PARAM);
}
public String getArtifactPattern() {
return env.get(prefix + ARTIFACT_PATTERN_PARAM);
}
public String getIncludePattern() {
return env.get(prefix + PUBLISH_INCLUDE_PATTERNS_PARAM);
}
public String getExcludePattern() {
return env.get(prefix + PUBLISH_EXCLUDE_PATTERNS_PARAM);
}
public boolean isFilterExcludedArtifactsFromBuild() {
return Boolean.parseBoolean(env.get(prefix + FILTER_EXCLUDED_ARTIFACTS_FROM_BUILD_PARAM));
}
public String getResolutionRepo() {
return env.get(prefix + RESOLUTION_REPO_PARAM);
}
public String getArtifactSpecs() {
return env.get(prefix + ARTIFACT_SPECS_PARAM);
}
public void resetContextToDefault() {
env.put(prefix + SERVER_ID_PARAM, "-1");
env.put(prefix + RESOLUTION_REPO_PARAM, "");
env.put(prefix + DEPLOYER_USERNAME_PARAM, "");
env.put(prefix + DEPLOYER_PASSWORD_PARAM, "");
env.put(USE_M2_COMPATIBLE_PATTERNS_PARAM, "true");
env.put(prefix + IVY_PATTERN_PARAM, "");
env.put(prefix + ARTIFACT_PATTERN_PARAM, "");
env.put(RUN_LICENSE_CHECKS, "false");
env.put(prefix + LIMIT_CHECKS_TO_THE_FOLLOWING_SCOPES, "");
env.put(prefix + INCLUDE_PUBLISHED_ARTIFACTS, "false");
env.put(prefix + DISABLE_AUTOMATIC_LICENSE_DISCOVERY, "false");
env.put(prefix + FILTER_EXCLUDED_ARTIFACTS_FROM_BUILD_PARAM, "false");
env.put(PUBLISH_ARTIFACTS_PARAM, "false");
env.put(ENABLE_RELEASE_MANAGEMENT, "false");
env.put(ENV_VARS_EXCLUDE_PATTERNS, "*password*,*secret*");
}
public class ReleaseManagementContext {
public static final String CREATE_VCS_TAG = "createVcsTag";
public static final String USE_RELEASE_BRANCH = "useReleaseBranch";
public static final String RELEASE_BRANCH = "releaseBranch";
public static final String STAGING_COMMENT = "stagingComment";
public static final String TAG_URL = "tagUrl";
public static final String TAG_COMMENT = "tagComment";
public static final String NEXT_DEVELOPMENT_COMMENT = "nextDevelopmentComment";
public static final String REPO_KEY = "release.management.repoKey";
public boolean isActivateReleaseManagement() {
return Boolean.parseBoolean(env.get(ACTIVATE_RELEASE_MANAGEMENT));
}
public void setActivateReleaseManagement(boolean value) {
env.put(ACTIVATE_RELEASE_MANAGEMENT, String.valueOf(value));
}
public String getTagUrl() {
return env.get(TAG_URL);
}
public String getRepoKey() {
return env.get(REPO_KEY);
}
public String getStagingComment() {
return env.get(STAGING_COMMENT);
}
public boolean isUseReleaseBranch() {
return Boolean.parseBoolean(env.get(USE_RELEASE_BRANCH));
}
public String getReleaseBranch() {
return env.get(RELEASE_BRANCH);
}
public String getTagComment() {
return env.get(TAG_COMMENT);
}
public boolean isCreateVcsTag() {
return Boolean.parseBoolean(env.get(CREATE_VCS_TAG));
}
public String getNextDevelopmentComment() {
return env.get(NEXT_DEVELOPMENT_COMMENT);
}
public List<ModuleVersionHolder> filterPropsForRelease(Map<String, String> props) {
List<ModuleVersionHolder> result = Lists.newArrayList();
String releaseProps = env.get(prefix + RELEASE_PROPS);
if (StringUtils.isNotBlank(releaseProps)) {
List<String> split = Lists.newArrayList(splitAndTrim(releaseProps));
for (Map.Entry<String, String> entry : props.entrySet()) {
if (Iterables.contains(split, entry.getKey())) {
result.add(new ModuleVersionHolder(entry.getKey(), entry.getValue(), true));
}
}
}
String nextIntegProps = env.get(prefix + NEXT_INTEG_PROPS);
if (StringUtils.isNotBlank(nextIntegProps)) {
List<String> split = Lists.newArrayList(splitAndTrim(nextIntegProps));
for (Map.Entry<String, String> entry : props.entrySet()) {
final String propertyKey = entry.getKey();
if (Iterables.contains(split, propertyKey)) {
ModuleVersionHolder existingReleaseProp;
try {
existingReleaseProp = Iterables.find(result, new Predicate<ModuleVersionHolder>() {
public boolean apply(ModuleVersionHolder holder) {
return (holder != null) && holder.getKey().equals(propertyKey);
}
});
existingReleaseProp.setReleaseProp(false);
} catch (NoSuchElementException e) {
result.add(new ModuleVersionHolder(propertyKey, entry.getValue(), false));
}
}
}
}
return result;
}
public boolean isReleaseMgmtEnabled() {
return Boolean.parseBoolean(env.get(ENABLE_RELEASE_MANAGEMENT));
}
public String getVcsTagBase() {
return env.get(prefix + VCS_TAG_BASE);
}
public String getGitReleaseBranch() {
return env.get(prefix + GIT_RELEASE_BRANCH);
}
public String getAlternativeTasks() {
return env.get(prefix + ALTERNATIVE_TASKS);
}
public String getReleaseProps() {
return env.get(prefix + RELEASE_PROPS);
}
public String getNextIntegProps() {
return env.get(prefix + NEXT_INTEG_PROPS);
}
}
private List<String> splitAndTrim(String releaseProps) {
List<String> tokens = Lists.newArrayList();
for (String token : StringUtils.split(releaseProps, ",")) {
if (StringUtils.isNotBlank(token)) {
tokens.add(token.trim());
}
}
return tokens;
}
}