Java tutorial
/******************************************************************************* * Copyright (c) 2009 Atlassian and others. * 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: * Atlassian - initial API and implementation ******************************************************************************/ package com.atlassian.connector.eclipse.internal.crucible.ui.wizards; import com.atlassian.connector.eclipse.internal.crucible.core.TaskRepositoryUtil; import com.atlassian.connector.eclipse.internal.crucible.ui.CrucibleUiPlugin; import com.atlassian.connector.eclipse.internal.crucible.ui.CrucibleUiUtil; import com.atlassian.connector.eclipse.team.ui.AtlassianTeamUiPlugin; import com.atlassian.connector.eclipse.team.ui.ICustomChangesetLogEntry; import com.atlassian.connector.eclipse.team.ui.ITeamUiResourceConnector; import com.atlassian.connector.eclipse.team.ui.LocalStatus; import com.atlassian.connector.eclipse.team.ui.TeamUiUtils; import com.atlassian.connector.eclipse.ui.commons.DecoratedResource; import com.atlassian.connector.eclipse.ui.commons.ResourceEditorBean; import com.atlassian.theplugin.commons.crucible.api.UploadItem; import com.atlassian.theplugin.commons.crucible.api.model.BasicProject; import com.atlassian.theplugin.commons.crucible.api.model.PermId; import com.atlassian.theplugin.commons.crucible.api.model.Review; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.mylyn.internal.tasks.core.LocalTask; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard; import org.eclipse.ui.INewWizard; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; /** * Wizard for creating a new review * * @author Thomas Ehrnhoefer * @author Pawel Niewiadomski * @author Jacek Jaroczynski */ @SuppressWarnings("restriction") public class ReviewWizard extends NewTaskWizard implements INewWizard { public enum Type { ADD_CHANGESET, ADD_PATCH, ADD_WORKSPACE_PATCH, ADD_SCM_RESOURCES, ADD_UPLOAD_ITEMS, ADD_RESOURCES, ADD_COMMENT_TO_FILE; } private CrucibleReviewDetailsPage detailsPage; private Review crucibleReview; private SelectScmChangesetsPage addChangeSetsPage; private CrucibleAddPatchPage addPatchPage; // private WorkspacePatchSelectionPage addWorkspacePatchPage; private DefineRepositoryMappingsPage defineMappingPage; private ResourceSelectionPage resourceSelectionPage; private final Set<Type> types; private SortedSet<ICustomChangesetLogEntry> preselectedLogEntries; private String previousPatch; private String previousPatchRepository; private final List<IResource> selectedWorkspaceResources = new ArrayList<IResource>(); private IResource[] previousWorkspaceSelection; private List<UploadItem> uploadItems; private List<ResourceEditorBean> versionedCommentsToAdd = new ArrayList<ResourceEditorBean>(); private SelectChangesetsFromCruciblePage addChangeSetsFromCruciblePage; private ITeamUiResourceConnector selectedWorkspaceTeamConnector; public ReviewWizard(TaskRepository taskRepository, Set<Type> types) { super(taskRepository, null); setWindowTitle("New Crucible Review"); setNeedsProgressMonitor(true); this.types = types; this.selectedWorkspaceResources .addAll(Arrays.asList((IResource[]) ResourcesPlugin.getWorkspace().getRoot().getProjects())); } public ReviewWizard(Review review, Set<Type> types) { this(CrucibleUiUtil.getCrucibleTaskRepository(review), types); this.crucibleReview = review; } public ReviewWizard(Review review, Type type) { this(review, new HashSet<Type>(Arrays.asList(type))); } @Override public void addPages() { if (types.contains(Type.ADD_CHANGESET)) { addChangeSetsFromCruciblePage = new SelectChangesetsFromCruciblePage(getTaskRepository(), preselectedLogEntries); addPage(addChangeSetsFromCruciblePage); } if (types.contains(Type.ADD_PATCH)) { addPatchPage = new CrucibleAddPatchPage(getTaskRepository()); addPage(addPatchPage); } // pre-commit if (types.contains(Type.ADD_WORKSPACE_PATCH)) { // addWorkspacePatchPage = new WorkspacePatchSelectionPage(getTaskRepository(), selectedWorkspaceResources); // addPage(addWorkspacePatchPage); } // post-commit for editor selection if (types.contains(Type.ADD_SCM_RESOURCES)) { if (selectedWorkspaceResources.size() > 0 && selectedWorkspaceResources.get(0) != null) { // single SCM integration selection supported final ITeamUiResourceConnector teamConnector = AtlassianTeamUiPlugin.getDefault() .getTeamResourceManager().getTeamConnector(selectedWorkspaceResources.get(0)); if (teamConnector == null) { MessageDialog.openInformation(getShell(), CrucibleUiPlugin.PRODUCT_NAME, "Cannot find Atlassian SCM Integration for '" + selectedWorkspaceResources.get(0).getName() + "'."); } else { boolean missingMapping = false; Collection<String> scmPaths = new ArrayList<String>(); // TODO use job below if there are plenty of resource (currently it is used for single resource) for (IResource resource : selectedWorkspaceResources) { try { LocalStatus status = teamConnector.getLocalRevision(resource); if (status.getScmPath() != null && status.getScmPath().length() > 0) { String scmPath = TeamUiUtils.getScmPath(resource, teamConnector); if (TaskRepositoryUtil.getMatchingSourceRepository( TaskRepositoryUtil.getScmRepositoryMappings(getTaskRepository()), scmPath) == null) { // we need to see mapping page missingMapping = true; scmPaths.add(scmPath); } } } catch (CoreException e) { // resource is probably not under version control // skip } } if (missingMapping) { defineMappingPage = new DefineRepositoryMappingsPage(scmPaths, getTaskRepository()); addPage(defineMappingPage); } } } } // mixed review if (types.contains(Type.ADD_RESOURCES)) { resourceSelectionPage = new ResourceSelectionPage(getTaskRepository(), selectedWorkspaceTeamConnector, selectedWorkspaceResources); addPage(resourceSelectionPage); } // only add details page if review is not already existing if (crucibleReview == null) { detailsPage = new CrucibleReviewDetailsPage(getTaskRepository(), types.contains(Type.ADD_COMMENT_TO_FILE)); addPage(detailsPage); } } @Override public boolean canFinish() { if (detailsPage != null) { return detailsPage.isPageComplete(); } return super.canFinish(); } @Override public boolean performFinish() { setErrorMessage(null); crucibleReview = detailsPage.getReview(); LocalTask task = TasksUiInternal.createNewLocalTask("Review: " + crucibleReview.getSummary()); crucibleReview.setPermId(new PermId(task.getTaskId())); if (detailsPage != null) { // save project selection final BasicProject selectedProject = detailsPage.getSelectedProject(); CrucibleUiPlugin.getDefault().updateLastSelectedProject(getTaskRepository(), selectedProject != null ? selectedProject.getKey() : null); // save checkbox selections CrucibleUiPlugin.getDefault().updateAllowAnyoneOption(getTaskRepository(), detailsPage.isAllowAnyoneToJoin()); CrucibleUiPlugin.getDefault().updateStartReviewOption(getTaskRepository(), detailsPage.isStartReviewImmediately()); } if (addPatchPage != null) { String patchToAdd = addPatchPage.hasPatch() ? addPatchPage.getPatch() : null; String patchRepositoryToAdd = addPatchPage.hasPatch() ? addPatchPage.getPatchRepository() : null; if (patchToAdd != null && patchRepositoryToAdd != null && !patchToAdd.equals(previousPatch) && !patchRepositoryToAdd.equals(previousPatchRepository)) { // create patch review } } // if (addWorkspacePatchPage != null) { // final IResource[] selection = addWorkspacePatchPage.getSelection(); // // if (selection != null && selection.length > 0 && !Arrays.equals(selection, previousWorkspaceSelection) // && addWorkspacePatchPage.getSelectedTeamResourceConnector() != null) { // // create pre-commit review // } // } if (addChangeSetsPage != null || addChangeSetsFromCruciblePage != null) { final Map<String, Set<String>> changesetsToAdd = addChangeSetsPage != null ? addChangeSetsPage.getSelectedChangesets() : addChangeSetsFromCruciblePage.getSelectedChangesets(); if (changesetsToAdd != null && changesetsToAdd.size() > 0) { // create review from changeset } } if (types.contains(Type.ADD_SCM_RESOURCES)) { if (selectedWorkspaceResources != null) { // create review from editor selection (post-commit) } } if (types.contains(Type.ADD_UPLOAD_ITEMS)) { if (uploadItems.size() > 0) { // create review from editor selection (pre-commit) } } if (resourceSelectionPage != null && types.contains(Type.ADD_RESOURCES)) { final List<DecoratedResource> resources = resourceSelectionPage.getSelection(); if (resources != null && resources.size() > 0) { // create review from workbench selection (post- and pre-commit) } } TasksUiUtil.openTask(task); TasksUi.getTaskActivityManager().activateTask(task); CrucibleUiPlugin.getDefault().getActiveReviewManager().reviewAdded(task.getRepositoryUrl(), task.getTaskId(), crucibleReview); return true; } private void setErrorMessage(String message) { IWizardPage page = getContainer().getCurrentPage(); if (page instanceof WizardPage) { ((WizardPage) page).setErrorMessage(message != null ? message.replace("\n", " ") : null); } } public void setLogEntries(SortedSet<ICustomChangesetLogEntry> logEntries) { this.preselectedLogEntries = logEntries; } public void setRoots(ITeamUiResourceConnector teamConnector, List<IResource> list) { this.selectedWorkspaceResources.clear(); this.selectedWorkspaceResources.addAll(list); this.selectedWorkspaceTeamConnector = teamConnector; } public void setUploadItems(List<UploadItem> uploadItems) { this.uploadItems = uploadItems; } public void setFilesCommentData(List<ResourceEditorBean> list) { this.versionedCommentsToAdd = list; } }