package com.coravy.hudson.plugins.github;
import com.cloudbees.jenkins.GitHubPushTrigger;
import hudson.Extension;
import hudson.model.Job;
import hudson.model.JobProperty;
import hudson.model.JobPropertyDescriptor;
import jenkins.model.ParameterizedJobMixIn;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.StaplerRequest;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import java.util.logging.Logger;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
/**
* Stores the github related project properties.
* <p>
* - URL to the GitHub project
* - Build status context name
*
* @author Stefan Saasen <stefan@coravy.com>
*/
public final class GithubProjectProperty extends JobProperty<Job<?, ?>> {
/**
* This will the URL to the project main branch.
*/
private String projectUrl;
/**
* GitHub build status context name to use in commit status api
* {@linkplain "https://developer.github.com/v3/repos/statuses/"}
*
* @see com.cloudbees.jenkins.GitHubCommitNotifier
* @see com.cloudbees.jenkins.GitHubSetCommitStatusBuilder
*/
private String displayName;
@DataBoundConstructor
public GithubProjectProperty(String projectUrlStr) {
this.projectUrl = new GithubUrl(projectUrlStr).baseUrl();
}
/**
* Same as {@link #getProjectUrl}, but with a property name and type
* which match those used in the {@link #GithubProjectProperty} constructor.
* Should have been called {@code getProjectUrl} and that method called something else
* (such as {@code getNormalizedProjectUrl}), but that cannot be done compatibly now.
*/
public String getProjectUrlStr() {
return projectUrl;
}
/**
* @return the projectUrl
*/
public GithubUrl getProjectUrl() {
return new GithubUrl(projectUrl);
}
/**
* @see #displayName
* @since 1.14.1
*/
@CheckForNull
public String getDisplayName() {
return displayName;
}
/**
* @since 1.14.1
*/
@DataBoundSetter
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
/**
* Extracts value of display name from given job, or just returns full name if field or prop is not defined
*
* @param job project which wants to get current context name to use in GH status API
*
* @return display name or full job name if field is not defined
* @since 1.14.1
*/
public static String displayNameFor(@Nonnull Job<?, ?> job) {
GithubProjectProperty ghProp = job.getProperty(GithubProjectProperty.class);
if (ghProp != null && isNotBlank(ghProp.getDisplayName())) {
return ghProp.getDisplayName();
}
return job.getFullName();
}
@Extension
public static final class DescriptorImpl extends JobPropertyDescriptor {
/**
* Used to hide property configuration under checkbox,
* as of not each job is GitHub project
*/
public static final String GITHUB_PROJECT_BLOCK_NAME = "githubProject";
public boolean isApplicable(Class<? extends Job> jobType) {
return ParameterizedJobMixIn.ParameterizedJob.class.isAssignableFrom(jobType);
}
public String getDisplayName() {
return "GitHub project page";
}
@Override
public JobProperty<?> newInstance(StaplerRequest req, JSONObject formData) throws FormException {
GithubProjectProperty tpp = req.bindJSON(
GithubProjectProperty.class,
formData.getJSONObject(GITHUB_PROJECT_BLOCK_NAME)
);
if (tpp == null) {
LOGGER.fine("Couldn't bind JSON");
return null;
}
if (tpp.projectUrl == null) {
LOGGER.fine("projectUrl not found, nullifying GithubProjectProperty");
return null;
}
return tpp;
}
}
private static final Logger LOGGER = Logger.getLogger(GitHubPushTrigger.class.getName());
}