package org.jvnet.hudson.plugins.jira.issueversioning.plugin.hudson;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.Job;
import hudson.model.JobProperty;
import hudson.model.JobPropertyDescriptor;
import net.sf.json.JSONObject;
import org.codehaus.plexus.util.StringUtils;
import org.jvnet.hudson.plugins.jira.issueversioning.plugin.hudson.utils.JiraKeyUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
/**
* {@link JobProperty} to implement a property for a Jira Project Key
*
* @author <a href="mailto:from.hudson@nisgits.net">Stig Kleppe-J;odash&rgensen</a>
*/
@ExportedBean
public class JiraProjectKeyJobProperty extends JobProperty<AbstractProject<?, ?>> implements
Comparable<JiraProjectKeyJobProperty> {
private String key = "";
/**
* Constructor
*
* @param key the JIRA Key
*/
@DataBoundConstructor
public JiraProjectKeyJobProperty(String key) {
setKey(key);
}
/**
* Gets the JIRA Key
*
* @return the JIRA Key
*/
@Exported(name = "jira-key")
public String getKey() {
return key;
}
/**
* Sets the JIRA Project Key
*
* @param key the JIRA Project Key
*/
public void setKey(String key) {
if (StringUtils.isEmpty(key)) {
return;
}
if (JiraKeyUtils.isValidProjectKey(key, getProjectKeyPattern())) {
this.key = key;
} else {
throw new IllegalArgumentException(key + " is not a valid JIRA Project Key ("
+ getProjectKeyPattern().pattern() + ")");
}
}
/**
* Get the Global Jira project key {@link Pattern}
*
* @return the Global Jira project key {@link Pattern}
*/
public Pattern getProjectKeyPattern() {
return ((JiraProjectKeyJobPropertyDescriptor) getDescriptor()).getProjectKeyPattern();
}
/**
* Get the Global Jira issue key {@link Pattern}
*
* @return the Global Jira issue key {@link Pattern}
*/
public Pattern getIssueKeyPattern() {
return ((JiraProjectKeyJobPropertyDescriptor) getDescriptor()).getIssueKeyPattern();
}
public String getJiraBaseUrl() {
return ((JiraProjectKeyJobPropertyDescriptor) getDescriptor()).getJiraBaseUrl();
}
/**
* {@inheritDoc}
*/
public int compareTo(JiraProjectKeyJobProperty other) {
return getKey().compareTo(other.getKey());
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof JiraProjectKeyJobProperty) {
return getKey().equals(((JiraProjectKeyJobProperty) obj).getKey());
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return getKey().hashCode();
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return getKey();
}
/**
* {@link JobPropertyDescriptor} for {@link JiraProjectKeyJobProperty}
*
* @author <a href="mailto:from.hudson@nisgits.net">Stig Kleppe-J;odash&rgensen</a>
*/
@Extension
public static final class JiraProjectKeyJobPropertyDescriptor extends JobPropertyDescriptor {
private Pattern projectKeyPattern = JiraKeyUtils.DEFAULT_JIRA_PROJECT_KEY_PATTERN;
private Pattern issueKeyPattern = JiraKeyUtils.DEFAULT_JIRA_ISSUE_KEY_PATTERN;
private String JiraBaseUrl;
/**
* Constructor
*/
public JiraProjectKeyJobPropertyDescriptor() {
super(JiraProjectKeyJobProperty.class);
load();
}
/**
* {@inheritDoc}
*/
public String getDisplayName() {
return Messages.JiraKeyProperty_DisplayName();
}
/**
* {@inheritDoc}
*/
@Override
public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
try {
if (StringUtils.isNotEmpty(json.getString("projectKeyPattern"))) {
projectKeyPattern = Pattern.compile(json.getString("projectKeyPattern"));
}
} catch (PatternSyntaxException e) {
throw new FormException(e, "Invalid Jira Project key pattern");
}
try {
if (StringUtils.isNotEmpty(json.getString("issueKeyPattern"))) {
issueKeyPattern = Pattern.compile(json.getString("issueKeyPattern"));
}
} catch (PatternSyntaxException e) {
throw new FormException(e, "Invalid Jira Issue key pattern");
}
if (StringUtils.isNotEmpty(json.getString("jiraBaseUrl"))) {
JiraBaseUrl = json.getString("jiraBaseUrl");
}
save();
return true;
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
@Override
public boolean isApplicable(Class<? extends Job> jobType) {
return AbstractProject.class.isAssignableFrom(jobType);
}
/**
* Get the configured Jira project key pattern
*
* @return the Jira project key pattern
*/
public Pattern getProjectKeyPattern() {
return projectKeyPattern;
}
/**
* Get the configured Jira issue key pattern
*
* @return the Jira issue key pattern
*/
public Pattern getIssueKeyPattern() {
return issueKeyPattern;
}
public String getJiraBaseUrl() {
return JiraBaseUrl;
}
}
}