/*
* Copyright (C) 2010 JFrog Ltd.
*
* 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 org.jfrog.hudson.gradle;
import com.google.common.base.Predicate;
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import hudson.EnvVars;
import hudson.model.AbstractBuild;
import hudson.model.Cause;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.jfrog.build.api.BuildInfoConfigProperties;
import org.jfrog.build.api.BuildInfoProperties;
import org.jfrog.build.client.ClientGradleProperties;
import org.jfrog.build.client.ClientIvyProperties;
import org.jfrog.build.client.ClientProperties;
import org.jfrog.hudson.ArtifactoryServer;
import org.jfrog.hudson.ServerDetails;
import org.jfrog.hudson.util.ActionableHelper;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Map;
/**
* Class to generate a Gradle initialization script
*
* @author Tomer Cohen
*/
public class GradleInitScriptWriter {
private EnvVars envVars;
private AbstractBuild build;
private static final String NEW_LINE = "\n";
private static final String QUOTE = "'";
private static String scriptRepoPath =
"org/jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryinitplugin-1.0.1.gradle";
private ArtifactoryGradleConfigurator gradleConfigurator;
/**
* The gradle initialization script constructor.
*
* @param gradleConfigurator
* @param build
*/
public GradleInitScriptWriter(ArtifactoryGradleConfigurator gradleConfigurator, EnvVars envVars,
AbstractBuild build) {
this.gradleConfigurator = gradleConfigurator;
this.envVars = envVars;
this.build = build;
}
private String addProperties() {
StringBuilder stringBuilder = new StringBuilder();
String key = ClientProperties.PROP_CONTEXT_URL;
String value = getArtifactoryServer().getUrl();
addProperty(stringBuilder, key, value);
addProperty(stringBuilder, ClientProperties.PROP_RESOLVE_REPOKEY, getServerDetails().downloadRepositoryKey);
addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_REPOKEY, getServerDetails().repositoryKey);
addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_USERNAME, gradleConfigurator.getUsername());
addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_PASSWORD, gradleConfigurator.getPassword());
addProperty(stringBuilder, ClientIvyProperties.PROP_PUBLISH_IVY,
Boolean.toString(gradleConfigurator.deployIvy));
addProperty(stringBuilder, ClientGradleProperties.PROP_PUBLISH_MAVEN,
Boolean.toString(gradleConfigurator.deployMaven));
addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_ARTIFACT,
Boolean.toString(gradleConfigurator.isDeployArtifacts()));
addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_BUILD_INFO,
Boolean.toString(gradleConfigurator.deployBuildInfo));
addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_NAME, build.getProject().getName());
addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_NUMBER, build.getNumber() + "");
String principal = ActionableHelper.getHudsonPrincipal(build);
addProperty(stringBuilder, BuildInfoProperties.PROP_PRINCIPAL, principal);
String buildUrl = envVars.get("BUILD_URL");
if (StringUtils.isNotBlank(buildUrl)) {
addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_URL, buildUrl);
}
String svnRevision = envVars.get("SVN_REVISION");
if (StringUtils.isNotBlank(svnRevision)) {
addProperty(stringBuilder, BuildInfoProperties.PROP_VCS_REVISION, svnRevision);
}
addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_AGENT_NAME, "Hudson");
addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_AGENT_VERSION, build.getHudsonVersion());
Cause.UpstreamCause parent = ActionableHelper.getUpstreamCause(build);
if (parent != null) {
addProperty(stringBuilder, BuildInfoProperties.PROP_PARENT_BUILD_NAME, parent.getUpstreamProject());
addProperty(stringBuilder, BuildInfoProperties.PROP_PARENT_BUILD_NUMBER, parent.getUpstreamBuild() + "");
}
// Write all the deploy (matrix params) properties.
Map<String, String> filteredMatrixParams = Maps.filterKeys(envVars, new Predicate<String>() {
public boolean apply(String input) {
return input.startsWith(ClientProperties.PROP_DEPLOY_PARAM_PROP_PREFIX);
}
});
for (Map.Entry<String, String> entry : filteredMatrixParams.entrySet()) {
addProperty(stringBuilder, entry.getKey(), entry.getValue());
}
// add EnvVars
//Add only the hudson specific environment variables
MapDifference<String, String> difference = Maps.difference(envVars, System.getenv());
Map<String, String> filteredEnvVars = difference.entriesOnlyOnLeft();
for (Map.Entry<String, String> entry : filteredEnvVars.entrySet()) {
addProperty(stringBuilder, BuildInfoProperties.BUILD_INFO_ENVIRONMENT_PREFIX + entry.getKey(),
entry.getValue());
}
addProperty(stringBuilder, BuildInfoConfigProperties.PROP_INCLUDE_ENV_VARS,
String.valueOf(gradleConfigurator.includeEnvVars));
// add build variables
Map<String, String> buildVariables = build.getBuildVariables();
for (Map.Entry<String, String> entry : buildVariables.entrySet()) {
addProperty(stringBuilder, BuildInfoProperties.BUILD_INFO_ENVIRONMENT_PREFIX + entry.getKey(),
entry.getValue());
}
return stringBuilder.toString();
}
private void addProperty(StringBuilder stringBuilder, String key, String value) {
key = key.replace("\\", "\\\\");
value = value.replace("\\", "\\\\");
value = value.replace('"', ' ');
stringBuilder.append(QUOTE).append(key).append(QUOTE).append(":").append(QUOTE).append(value).append(QUOTE)
.append(",").append(NEW_LINE);
}
/**
* Generate the init script from the Artifactory URL.
*
* @return The generated script.
*/
public String generateInitScript() throws URISyntaxException, IOException {
StringBuilder initScript = new StringBuilder();
File template = new File(getClass().getResource("/initscriptemplate.gradle").toURI());
String templateAsString = FileUtils.readFileToString(template);
if (StringUtils.isNotBlank(gradleConfigurator.remotePluginLocation)) {
scriptRepoPath = gradleConfigurator.remotePluginLocation;
}
String str = templateAsString.replace("${artifactoryPluginDownloadUrl}",
getArtifactoryServer().getUrl() + "/" + getServerDetails().downloadRepositoryKey + "/" +
scriptRepoPath);
str = str.replace("${allHudsonProperties}", addProperties());
initScript.append(str);
return initScript.toString();
}
private ServerDetails getServerDetails() {
return gradleConfigurator.getDetails();
}
private ArtifactoryServer getArtifactoryServer() {
return gradleConfigurator.getArtifactoryServer();
}
}