/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.pullrequest.client.workflow;
import org.eclipse.che.plugin.pullrequest.client.events.ContextPropertyChangeEvent;
import org.eclipse.che.plugin.pullrequest.client.vcs.VcsService;
import org.eclipse.che.plugin.pullrequest.client.vcs.hosting.VcsHostingService;
import org.eclipse.che.plugin.pullrequest.shared.dto.Configuration;
import org.eclipse.che.plugin.pullrequest.shared.dto.PullRequest;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.core.model.project.ProjectConfig;
import org.eclipse.che.commons.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import static org.eclipse.che.plugin.pullrequest.client.events.ContextPropertyChangeEvent.ContextProperty.CONTRIBUTE_TO_BRANCH_NAME;
import static org.eclipse.che.plugin.pullrequest.client.events.ContextPropertyChangeEvent.ContextProperty.PROJECT;
import static org.eclipse.che.plugin.pullrequest.client.events.ContextPropertyChangeEvent.ContextProperty.WORK_BRANCH_NAME;
/**
* Context used to share information between the steps in the contribution workflow.
*
* @author Kevin Pollet
*/
public class Context {
/** The event bus. */
private final EventBus eventBus;
/** The project. */
private ProjectConfig project;
/** The name of the branch to contribute to. */
private String contributeToBranchName;
/** The name of the working branch. */
private String workBranchName;
/** The name of the user on host VCS. */
private String hostUserLogin;
/** The name of the owner of the repository forked on VCS. */
private String upstreamRepositoryOwner;
/** The name of the repository forked on VCS. */
private String upstreamRepositoryName;
/** The name of the owner of the repository cloned on VCS. */
private String originRepositoryOwner;
/** The name of the repository cloned on VCS. */
private String originRepositoryName;
/** The identifier of the pull request on the hosting service. */
private PullRequest pullRequest;
/** The issue number of the pull request issued for the contribution. */
private String pullRequestIssueNumber;
/** The generated review factory URL. */
private String reviewFactoryUrl;
/** The name of the forked remote. */
private String forkedRemoteName;
/** The name of the forked repository. */
private String forkedRepositoryName;
/** Defines availability of fork creation. */
private boolean forkAvailable;
/** Defines ability to use ssh URLs. */
private boolean sshAvailable;
private VcsHostingService vcsHostingService;
/** The name of the origin remote. */
private String originRemoteName;
private WorkflowStatus status;
private WorkflowStatus previousStatus;
private Configuration configuration;
public ViewState viewState;
private VcsService vcsService;
public Context(final EventBus eventBus) {
this.eventBus = eventBus;
viewState = new ViewState();
}
public ProjectConfig getProject() {
return project;
}
public void setProject(final ProjectConfig project) {
final ProjectConfig oldValue = this.project;
this.project = project;
fireContextPropertyChange(PROJECT, oldValue, project);
}
public String getContributeToBranchName() {
return contributeToBranchName;
}
public void setContributeToBranchName(final String contributeToBranchName) {
final String oldValue = this.contributeToBranchName;
this.contributeToBranchName = contributeToBranchName;
fireContextPropertyChange(CONTRIBUTE_TO_BRANCH_NAME, oldValue, contributeToBranchName);
}
public String getWorkBranchName() {
return workBranchName;
}
public void setWorkBranchName(final String workBranchName) {
final String oldValue = this.workBranchName;
this.workBranchName = workBranchName;
fireContextPropertyChange(WORK_BRANCH_NAME, oldValue, workBranchName);
}
public String getHostUserLogin() {
return hostUserLogin;
}
public void setHostUserLogin(final String hostUserLogin) {
this.hostUserLogin = hostUserLogin;
}
public String getUpstreamRepositoryOwner() {
return upstreamRepositoryOwner;
}
public void setUpstreamRepositoryOwner(String upstreamRepositoryOwner) {
this.upstreamRepositoryOwner = upstreamRepositoryOwner;
}
public String getUpstreamRepositoryName() {
return upstreamRepositoryName;
}
public void setUpstreamRepositoryName(String upstreamRepositoryName) {
this.upstreamRepositoryName = upstreamRepositoryName;
}
public String getOriginRepositoryOwner() {
return originRepositoryOwner;
}
public void setOriginRepositoryOwner(final String originRepositoryOwner) {
final String oldValue = this.originRepositoryOwner;
this.originRepositoryOwner = originRepositoryOwner;
fireContextPropertyChange(ContextPropertyChangeEvent.ContextProperty.ORIGIN_REPOSITORY_OWNER, oldValue, originRepositoryOwner);
}
public String getOriginRepositoryName() {
return originRepositoryName;
}
public void setOriginRepositoryName(final String originRepositoryName) {
final String oldValue = this.originRepositoryName;
this.originRepositoryName = originRepositoryName;
fireContextPropertyChange(ContextPropertyChangeEvent.ContextProperty.ORIGIN_REPOSITORY_NAME, oldValue, originRepositoryName);
}
public PullRequest getPullRequest() {
return pullRequest;
}
public void setPullRequest(PullRequest pullRequest) {
this.pullRequest = pullRequest;
}
/**
* Return the issue number of the pull request issued for this contribution.
*
* @return the pull request issue id
*/
public String getPullRequestIssueNumber() {
return pullRequestIssueNumber;
}
/**
* Sets the issue number of the pull request issued for this contribution.
*
* @param pullRequestIssueNumber
* the new value
*/
public void setPullRequestIssueNumber(final String pullRequestIssueNumber) {
this.pullRequestIssueNumber = pullRequestIssueNumber;
}
/**
* Returns the generated review factory URL (if available).
*
* @return factory URL
*/
public String getReviewFactoryUrl() {
return this.reviewFactoryUrl;
}
/**
* Sets the generated review factory URL (if available).
*
* @param reviewFactoryUrl
* new value
*/
public void setReviewFactoryUrl(final String reviewFactoryUrl) {
this.reviewFactoryUrl = reviewFactoryUrl;
}
public String getOriginRemoteName() {
return originRemoteName;
}
public void setOriginRemoteName(String originRemoteName) {
this.originRemoteName = originRemoteName;
}
public String getForkedRemoteName() {
return forkedRemoteName;
}
public void setForkedRemoteName(String forkedRemoteName) {
this.forkedRemoteName = forkedRemoteName;
}
public String getForkedRepositoryName() {
return forkedRepositoryName;
}
public void setForkedRepositoryName(String forkedRepositoryName) {
this.forkedRepositoryName = forkedRepositoryName;
}
private void fireContextPropertyChange(final ContextPropertyChangeEvent.ContextProperty contextProperty,
final Object oldValue,
final Object newValue) {
if (!Objects.equals(oldValue, newValue)) {
eventBus.fireEvent(new ContextPropertyChangeEvent(this, contextProperty));
}
}
public boolean isUpdateMode() {
return status == WorkflowStatus.UPDATING_PR || status == WorkflowStatus.READY_TO_UPDATE_PR;
}
public VcsHostingService getVcsHostingService() {
return vcsHostingService;
}
public void setVcsHostingService(VcsHostingService service) {
this.vcsHostingService = service;
}
@Nullable
public WorkflowStatus getStatus() {
return status;
}
@Nullable
public WorkflowStatus getPreviousStatus() {
return previousStatus;
}
public void setStatus(@Nullable WorkflowStatus status) {
this.previousStatus = this.status;
this.status = status;
}
public Configuration getConfiguration() {
return configuration;
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
public ViewState getViewState() {
return viewState;
}
public void setVcsService(VcsService vcsService) {
this.vcsService = vcsService;
}
public VcsService getVcsService() {
return vcsService;
}
public boolean isForkAvailable() {
return forkAvailable;
}
public void setForkAvailable(boolean forkAvailable) {
this.forkAvailable = forkAvailable;
}
public boolean isSshAvailable() {
return sshAvailable;
}
public void setSshAvailable(boolean sshAvailable) {
this.sshAvailable = sshAvailable;
}
public static final class ViewState {
private String contributionTitle;
private String contributionComment;
private StatusMessage statusMessage;
private List<Stage> stages;
private int currentStage;
private ViewState() {
currentStage = 0;
}
public void setStatusMessage(String message, boolean error) {
this.statusMessage = new StatusMessage(message, error);
}
public void setStatusMessage(StatusMessage message) {
this.statusMessage = message;
}
public void setContributionTitle(String title) {
this.contributionTitle = title;
}
public String getContributionTitle() {
return contributionTitle;
}
public void setContributionComment(String contributionComment) {
this.contributionComment = contributionComment;
}
public String getContributionComment() {
return contributionComment;
}
public List<Stage> getStages() {
if (stages == null) {
stages = new ArrayList<>(3);
}
return stages;
}
public List<String> getStageNames() {
final List<String> statusNames = new ArrayList<>(getStages().size());
for (Stage stepStatus : getStages()) {
statusNames.add(stepStatus.getName());
}
return statusNames;
}
public List<Boolean> getStageValues() {
final List<Boolean> statusNames = new ArrayList<>(getStages().size());
for (Stage stepStatus : getStages()) {
statusNames.add(stepStatus.getStatus());
}
return statusNames;
}
public void resetStages() {
getStages().clear();
currentStage = 0;
}
public void setStep(String name, Boolean value) {
getStages().add(new Stage(name, value));
}
public void setStages(List<String> stages) {
resetStages();
for (String newStage : stages) {
setStep(newStage, null);
}
}
public StatusMessage getStatusMessage() {
return statusMessage;
}
public void setStageDone(boolean stepDone) {
getStages().get(currentStage++).setStatus(stepDone);
}
public static class StatusMessage {
private final boolean error;
private final String message;
private StatusMessage(String message, boolean error) {
this.message = message;
this.error = error;
}
public boolean isError() {
return error;
}
public String getMessage() {
return message;
}
}
public static class Stage {
private final String name;
private Boolean status;
public Stage(String name, Boolean status) {
this.status = status;
this.name = name;
}
public String getName() {
return name;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
}
}
}