package hudson.plugins.jira;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Notifier;
import hudson.tasks.Publisher;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
public class JiraIssueMigrator extends Notifier {
private static final long serialVersionUID = 6909671291180081586L;
private String jiraProjectKey;
private String jiraRelease;
private String jiraReplaceVersion;
private String jiraQuery;
private boolean addRelease;
@DataBoundConstructor
public JiraIssueMigrator(String jiraProjectKey, String jiraRelease, String jiraQuery, String jiraReplaceVersion, boolean addRelease) {
this.jiraRelease = jiraRelease;
this.jiraProjectKey = jiraProjectKey;
this.jiraQuery = jiraQuery;
this.jiraReplaceVersion = jiraReplaceVersion;
this.addRelease = addRelease;
}
public String getJiraRelease() {
return jiraRelease;
}
public void setJiraRelease(String jiraRelease) {
this.jiraRelease = jiraRelease;
}
public String getJiraProjectKey() {
return jiraProjectKey;
}
public void setJiraProjectKey(String jiraProjectKey) {
this.jiraProjectKey = jiraProjectKey;
}
public String getJiraQuery() {
return jiraQuery;
}
public void setJiraQuery(String jiraQuery) {
this.jiraQuery = jiraQuery;
}
public String getJiraReplaceVersion() {
return jiraReplaceVersion;
}
public void setJiraReplaceVersion(String jiraReplaceVersion) {
this.jiraReplaceVersion = jiraReplaceVersion;
}
public boolean isAddRelease() { return addRelease; }
public void setAddRelease(boolean addRelease) { this.addRelease = addRelease; }
@Override
public BuildStepDescriptor<Publisher> getDescriptor() {
return DESCRIPTOR;
}
@Extension
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) {
String realRelease = null;
String realReplace = null;
String realQuery = "";
String realProjectKey = null;
try {
realRelease = build.getEnvironment(listener).expand(jiraRelease);
realReplace = build.getEnvironment(listener).expand(jiraReplaceVersion);
realProjectKey = build.getEnvironment(listener).expand(jiraProjectKey);
if (realRelease == null || realRelease.isEmpty()) {
throw new IllegalArgumentException("Release is Empty");
}
if (realProjectKey == null || realProjectKey.isEmpty()) {
throw new IllegalArgumentException("No project specified");
}
realQuery = build.getEnvironment(listener).expand(jiraQuery);
if (realQuery == null || realQuery.isEmpty()) {
throw new IllegalArgumentException("JQL query is Empty");
}
JiraSite site = getJiraSiteForProject(build.getProject());
if (addRelease == true) {
site.addFixVersionToIssue(realProjectKey, realRelease, realQuery);
} else {
if (realReplace == null || realReplace.isEmpty()) {
site.migrateIssuesToFixVersion(realProjectKey, realRelease, realQuery);
} else {
site.replaceFixVersion(realProjectKey, realReplace, realRelease, realQuery);
}
}
} catch (Exception e) {
e.printStackTrace(listener.fatalError(
"Unable to release jira version %s/%s: %s", realRelease,
realProjectKey, e));
listener.finished(Result.FAILURE);
return false;
}
return true;
}
JiraSite getJiraSiteForProject(AbstractProject<?, ?> project) {
return JiraSite.get(project);
}
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.BUILD;
}
public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {
public DescriptorImpl() {
super(JiraIssueMigrator.class);
}
@Override
public JiraIssueMigrator newInstance(StaplerRequest req,
JSONObject formData) throws FormException {
return req.bindJSON(JiraIssueMigrator.class, formData);
}
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
}
@Override
public String getDisplayName() {
return Messages.JiraReleaseVersionMigrator_DisplayName();
}
@Override
public String getHelpFile() {
return "/plugin/jira/help-release-migrate.html";
}
}
}