package org.jfrog.hudson.util;
import com.google.common.collect.Sets;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.jira.JiraIssue;
import hudson.plugins.jira.JiraSite;
import hudson.plugins.jira.selector.AbstractIssueSelector;
import hudson.plugins.jira.selector.DefaultIssueSelector;
import org.jfrog.build.api.Issue;
import org.jfrog.build.api.IssueTracker;
import org.jfrog.build.api.Issues;
import org.jfrog.build.api.IssuesTrackerFields;
import org.jfrog.build.api.builder.BuildInfoBuilder;
import org.jfrog.build.extractor.clientConfiguration.ArtifactoryClientConfiguration;
import org.jfrog.build.extractor.clientConfiguration.util.IssuesTrackerUtils;
import org.jfrog.hudson.util.plugins.PluginsUtils;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.Set;
/**
* @author Noam Y. Tenne
*/
public class IssuesTrackerHelper {
private String issueTrackerVersion;
private boolean aggregateBuildIssues;
private String aggregationBuildStatus;
private String affectedIssues;
private String matrixParams;
public IssuesTrackerHelper(Run build, TaskListener listener, boolean aggregateBuildIssues,
String aggregationBuildStatus) {
this.aggregateBuildIssues = aggregateBuildIssues;
this.aggregationBuildStatus = aggregationBuildStatus;
JiraSite site = JiraSite.get(build.getParent());
if (site == null) {
return;
}
try {
issueTrackerVersion = getJiraVersion(site);
StringBuilder affectedIssuesBuilder = new StringBuilder();
StringBuilder matrixParamsBuilder = new StringBuilder();
Set<String> issueIds = Sets.newHashSet(manuallyCollectIssues(build, site, listener));
for (String issueId : issueIds) {
if (!site.existsIssue(issueId)) {
continue;
}
if (affectedIssuesBuilder.length() > 0) {
affectedIssuesBuilder.append(",");
matrixParamsBuilder.append(",");
}
URL url = site.getUrl(issueId);
JiraIssue issue = site.getIssue(issueId);
affectedIssuesBuilder.append(issueId).append(">>").append(url.toString()).append(">>").append(
issue.title);
matrixParamsBuilder.append(issueId);
}
affectedIssues = affectedIssuesBuilder.toString();
matrixParams = matrixParamsBuilder.toString();
} catch (Exception e) {
listener.getLogger()
.print("[Warning] Error while trying to collect issue tracker and change information: " +
e.getMessage());
}
}
private String getJiraVersion(JiraSite site) {
return PluginsUtils.getJiraVersion(site.url);
}
private Set<String> manuallyCollectIssues(Run build, JiraSite site, TaskListener listener)
throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
AbstractIssueSelector issueSelector = new DefaultIssueSelector();
return issueSelector.findIssueIds(build, site, listener);
}
/**
* Applying issues tracker info to a client configuration (used by the extractors)
*/
public void setIssueTrackerInfo(ArtifactoryClientConfiguration configuration) {
configuration.info.issues.setIssueTrackerName("JIRA");
configuration.info.issues.setIssueTrackerVersion(issueTrackerVersion);
configuration.info.issues.setAggregateBuildIssues(aggregateBuildIssues);
if (aggregateBuildIssues) {
configuration.info.issues.setAggregationBuildStatus(aggregationBuildStatus);
} else {
configuration.info.issues.setAggregationBuildStatus("");
}
configuration.info.issues.setAffectedIssues(affectedIssues);
configuration.publisher.addMatrixParam(IssuesTrackerFields.AFFECTED_ISSUES, matrixParams);
}
/**
* Apply issues tracker info to a build info builder (used by generic tasks and maven2 which doesn't use the extractor
*/
public void setIssueTrackerInfo(BuildInfoBuilder builder) {
Issues issues = new Issues();
issues.setAggregateBuildIssues(aggregateBuildIssues);
issues.setAggregationBuildStatus(aggregationBuildStatus);
issues.setTracker(new IssueTracker("JIRA", issueTrackerVersion));
Set<Issue> affectedIssuesSet = IssuesTrackerUtils.getAffectedIssuesSet(affectedIssues);
if (!affectedIssuesSet.isEmpty()) {
issues.setAffectedIssues(affectedIssuesSet);
}
builder.issues(issues);
}
}