package com.gitee.jenkins.trigger;
import com.gitee.jenkins.connection.GiteeConnection;
import com.gitee.jenkins.connection.GiteeConnectionConfig;
import com.gitee.jenkins.connection.GiteeConnectionProperty;
import com.gitee.jenkins.gitee.hook.model.PullRequestHook;
import com.gitee.jenkins.gitee.hook.model.NoteHook;
import com.gitee.jenkins.gitee.hook.model.PipelineHook;
import com.gitee.jenkins.gitee.hook.model.PushHook;
import com.gitee.jenkins.publisher.GiteeAcceptPullRequestPublisher;
import com.gitee.jenkins.publisher.GiteeMessagePublisher;
import com.gitee.jenkins.trigger.filter.*;
import com.gitee.jenkins.trigger.filter.PullRequestLabelFilterConfig;
import com.gitee.jenkins.trigger.handler.pull.PullRequestHookTriggerHandler;
import com.gitee.jenkins.trigger.handler.note.NoteHookTriggerHandler;
import com.gitee.jenkins.trigger.handler.pipeline.PipelineHookTriggerHandler;
import com.gitee.jenkins.trigger.handler.push.PushHookTriggerHandler;
import com.gitee.jenkins.webhook.GiteeWebHook;
import hudson.Extension;
import hudson.Util;
import hudson.init.InitMilestone;
import hudson.init.Initializer;
import hudson.model.AbstractProject;
import hudson.model.Item;
import hudson.model.Job;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import hudson.util.Secret;
import hudson.util.SequentialExecutionQueue;
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn;
import jenkins.triggers.SCMTriggerItem.SCMTriggerItems;
import net.karneim.pojobuilder.GeneratePojoBuilder;
import net.sf.json.JSONObject;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.security.SecureRandom;
import static com.gitee.jenkins.trigger.filter.BranchFilterConfig.BranchFilterConfigBuilder.branchFilterConfig;
import static com.gitee.jenkins.trigger.handler.pull.PullRequestHookTriggerHandlerFactory.newPullRequestHookTriggerHandler;
import static com.gitee.jenkins.trigger.handler.note.NoteHookTriggerHandlerFactory.newNoteHookTriggerHandler;
import static com.gitee.jenkins.trigger.handler.pipeline.PipelineHookTriggerHandlerFactory.newPipelineHookTriggerHandler;
import static com.gitee.jenkins.trigger.handler.push.PushHookTriggerHandlerFactory.newPushHookTriggerHandler;
/**
* Triggers a build when we receive a Gitee WebHook.
*
* @author Daniel Brooks
* @author Yashin Luo
*
*/
public class GiteePushTrigger extends Trigger<Job<?, ?>> {
private static final SecureRandom RANDOM = new SecureRandom();
private boolean triggerOnPush = true;
private boolean triggerOnCommitComment = false;
private boolean triggerOnOpenPullRequest = true;
private boolean triggerOnPipelineEvent = false;
private boolean triggerOnAcceptedPullRequest = false;
private String triggerOnUpdatePullRequest = "3";
private boolean triggerOnClosedPullRequest = false;
private boolean triggerOnApprovedPullRequest = false;
private boolean triggerOnTestedPullRequest = false;
private boolean triggerOnNoteRequest = true;
private String noteRegex = "";
private transient boolean ciSkip = true;
private BuildInstructionFilterType buildInstructionFilterType = BuildInstructionFilterType.NONE;
private boolean skipWorkInProgressPullRequest;
private boolean ciSkipFroTestNotRequired;
private boolean skipLastCommitHasBeenBuild;
private boolean setBuildDescription = true;
private transient boolean addNoteOnPullRequest;
private transient boolean addCiMessage;
private transient boolean addVoteOnPullRequest;
private transient boolean allowAllBranches = false;
private transient String branchFilterName;
private BranchFilterType branchFilterType;
private String includeBranchesSpec;
private String excludeBranchesSpec;
private String targetBranchRegex;
private PullRequestLabelFilterConfig pullRequestLabelFilterConfig;
private volatile Secret secretToken;
private String pendingBuildName;
private boolean cancelPendingBuildsOnUpdate;
private boolean cancelIncompleteBuildOnSamePullRequest;
private boolean ignorePullRequestConflicts;
private transient BranchFilter branchFilter;
private transient PushHookTriggerHandler pushHookTriggerHandler;
private transient PullRequestHookTriggerHandler pullRequestHookTriggerHandler;
private transient NoteHookTriggerHandler noteHookTriggerHandler;
private transient PipelineHookTriggerHandler pipelineTriggerHandler;
private transient boolean acceptPullRequestOnSuccess;
private transient PullRequestLabelFilter pullRequestLabelFilter;
/**
* @deprecated use {@link #GiteePushTrigger()} with setters to configure an instance of this class.
*/
@Deprecated
@GeneratePojoBuilder(intoPackage = "*.builder.generated", withFactoryMethod = "*")
public GiteePushTrigger(boolean triggerOnPush,
boolean triggerOnCommitComment,
boolean triggerOnOpenPullRequest,
String triggerOnUpdatePullRequest,
boolean triggerOnAcceptedPullRequest,
boolean triggerOnClosedPullRequest,
boolean triggerOnNoteRequest, String noteRegex,
boolean skipWorkInProgressPullRequest, boolean ciSkip,
BuildInstructionFilterType buildInstructionFilterType,
boolean setBuildDescription, boolean addNoteOnPullRequest, boolean addCiMessage, boolean addVoteOnPullRequest,
boolean acceptPullRequestOnSuccess, BranchFilterType branchFilterType,
String includeBranchesSpec, String excludeBranchesSpec, String targetBranchRegex,
PullRequestLabelFilterConfig pullRequestLabelFilterConfig, String secretToken, boolean triggerOnPipelineEvent,
boolean triggerOnApprovedPullRequest, String pendingBuildName, boolean cancelPendingBuildsOnUpdate,
boolean cancelIncompleteBuildOnSamePullRequest,
boolean ignorePullRequestConflicts) {
this.triggerOnPush = triggerOnPush;
this.triggerOnCommitComment = triggerOnCommitComment;
this.triggerOnOpenPullRequest = triggerOnOpenPullRequest;
this.triggerOnUpdatePullRequest = triggerOnUpdatePullRequest;
this.triggerOnAcceptedPullRequest = triggerOnAcceptedPullRequest;
this.triggerOnClosedPullRequest = triggerOnClosedPullRequest;
this.triggerOnNoteRequest = triggerOnNoteRequest;
this.noteRegex = noteRegex;
this.triggerOnPipelineEvent = triggerOnPipelineEvent;
this.ciSkip = ciSkip;
this.buildInstructionFilterType = buildInstructionFilterType;
this.skipWorkInProgressPullRequest = skipWorkInProgressPullRequest;
this.setBuildDescription = setBuildDescription;
this.addNoteOnPullRequest = addNoteOnPullRequest;
this.addCiMessage = addCiMessage;
this.addVoteOnPullRequest = addVoteOnPullRequest;
this.branchFilterType = branchFilterType;
this.includeBranchesSpec = includeBranchesSpec;
this.excludeBranchesSpec = excludeBranchesSpec;
this.targetBranchRegex = targetBranchRegex;
this.acceptPullRequestOnSuccess = acceptPullRequestOnSuccess;
this.pullRequestLabelFilterConfig = pullRequestLabelFilterConfig;
this.secretToken = Secret.fromString(secretToken);
this.triggerOnApprovedPullRequest = triggerOnApprovedPullRequest;
this.pendingBuildName = pendingBuildName;
this.cancelPend