diff options
21 files changed, 698 insertions, 323 deletions
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java index 4d8fde93d..0fbd189a9 100644 --- a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java +++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java @@ -21,6 +21,7 @@ import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.RepositoryResponse; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -100,38 +101,25 @@ public class BugzillaTaskDataHandler extends AbstractTaskDataHandler { } @Override - public boolean initializeTaskData(TaskRepository repository, TaskData data, IProgressMonitor monitor) - throws CoreException { - - if (data == null) { + public boolean initializeTaskData(TaskRepository repository, TaskData data, ITaskMapping initializationData, + IProgressMonitor monitor) throws CoreException { + if (initializationData == null) { return false; } - - TaskAttribute root = data.getRoot(); - - TaskAttribute oldProductAttribute = root.getAttribute(TaskAttribute.PRODUCT); - if (oldProductAttribute == null) { + String product = initializationData.getProduct(); + if (product == null) { return false; } + return initializeTaskData(repository, data, product, monitor); + } - if (oldProductAttribute.getValue().equals("")) { - // Bugzilla needs a product to create task data - // If I see it right the product is never an empty String. - // but to be save I return false as before bug# 213077 - return false; - } - - root.clearAttributes(); - // TODO: Are the following necessary? - root.getMetaData().clear(); - root.clearOptions(); - root.clearValues(); - + public boolean initializeTaskData(TaskRepository repository, TaskData data, String product, IProgressMonitor monitor) + throws CoreException { RepositoryConfiguration repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, monitor); TaskAttribute productAttribute = createAttribute(data, BugzillaReportElement.PRODUCT); - productAttribute.setValue(oldProductAttribute.getValue()); + productAttribute.setValue(product); List<String> optionValues = repositoryConfiguration.getProducts(); Collections.sort(optionValues); @@ -263,11 +251,7 @@ public class BugzillaTaskDataHandler extends AbstractTaskDataHandler { IProgressMonitor monitor) throws CoreException { TaskAttribute attributeProject = parentTaskData.getRoot().getMappedAttribute(TaskAttribute.PRODUCT); String product = attributeProject.getValue(); - - TaskAttribute subAttributeProject = createAttribute(subTaskData, BugzillaReportElement.PRODUCT); - subAttributeProject.setValue(product); - - initializeTaskData(repository, subTaskData, monitor); + initializeTaskData(repository, subTaskData, product, monitor); // TODO: //cloneTaskData(parentTaskData, subTaskData); TaskAttribute attributeBlocked = createAttribute(subTaskData, BugzillaReportElement.BLOCKED); diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java index d6d19e8f9..415f022df 100644 --- a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java +++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java @@ -11,8 +11,8 @@ package org.eclipse.mylyn.internal.bugzilla.ui.editor; import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; import org.eclipse.mylyn.tasks.ui.ITasksUiConstants; -import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.TasksUiImages; +import org.eclipse.mylyn.tasks.ui.TasksUiUtil; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; @@ -26,10 +26,11 @@ public class BugzillaTaskEditorPageFactory extends AbstractTaskEditorPageFactory @Override public boolean canCreatePageFor(TaskEditorInput input) { - if (input.getTask().getConnectorKind().equals(BugzillaCorePlugin.CONNECTOR_KIND)) { + if (input.getTask().getConnectorKind().equals(BugzillaCorePlugin.CONNECTOR_KIND) + || TasksUiUtil.isOutgoingNewTask(input.getTask(), BugzillaCorePlugin.CONNECTOR_KIND)) { return true; } - return TasksUi.getTaskDataManager().hasTaskData(input.getTask()); + return false; } @Override diff --git a/org.eclipse.mylyn.tasks.bugs/plugin.xml b/org.eclipse.mylyn.tasks.bugs/plugin.xml index 195b901bf..e753e51c1 100644 --- a/org.eclipse.mylyn.tasks.bugs/plugin.xml +++ b/org.eclipse.mylyn.tasks.bugs/plugin.xml @@ -23,7 +23,7 @@ <extension point="org.eclipse.mylyn.commons.core.errorReporters"> <errorReporter - class="org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter" + class="org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin$Reporter" id="org.eclipse.mylyn.tasks.bugs.errorReporter" label="Report Error as Bug"> </errorReporter> diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java index 8a9ab5cad..e9355c90c 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java @@ -8,14 +8,21 @@ package org.eclipse.mylyn.internal.tasks.bugs; +import java.util.Date; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.mylyn.internal.tasks.core.deprecated.DefaultTaskSchema; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskSelection; +import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; +import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel; +import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.ui.TasksUi; /** @@ -64,4 +71,96 @@ public class AttributeTaskMapper { } } + @SuppressWarnings("restriction") + public TaskData createTaskData(IProgressMonitor monitor) throws CoreException { + ITaskMapping taskMapping = getTaskMapping(); + return TasksUiInternal.createTaskData(getTaskRepository(), taskMapping, taskMapping, monitor); + } + + public ITaskMapping getTaskMapping() { + return new KeyValueMapping(attributes); + } + + private static class KeyValueMapping implements ITaskMapping { + + private final Map<String, String> attributes; + + public KeyValueMapping(Map<String, String> attributes) { + Assert.isNotNull(attributes); + this.attributes = attributes; + } + + public void copyFrom(ITaskMapping source) { + } + + public Date getCompletionDate() { + // ignore + return null; + } + + public String getComponent() { + return attributes.get(IRepositoryConstants.COMPONENT); + } + + public Date getCreationDate() { + // ignore + return null; + } + + public String getDescription() { + // ignore + return null; + } + + public Date getDueDate() { + // ignore + return null; + } + + public Date getModificationDate() { + // ignore + return null; + } + + public String getOwner() { + // ignore + return null; + } + + public PriorityLevel getPriority() { + // ignore + return null; + } + + public String getProduct() { + return attributes.get(IRepositoryConstants.PRODUCT); + } + + public String getSummary() { + // ignore + return null; + } + + public TaskData getTaskData() { + // ignore + return null; + } + + public String getTaskKey() { + // ignore + return null; + } + + public String getTaskKind() { + // ignore + return null; + } + + public String getTaskUrl() { + // ignore + return null; + } + + } + } diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultTaskContributor.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultTaskContributor.java index 1b5e51c80..514618ec0 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultTaskContributor.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultTaskContributor.java @@ -10,6 +10,7 @@ package org.eclipse.mylyn.internal.tasks.bugs; import java.io.PrintWriter; import java.io.StringWriter; +import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IBundleGroup; @@ -26,29 +27,25 @@ public class DefaultTaskContributor extends AbstractTaskContributor { @Override public Map<String, String> getAttributes(IStatus status) { - return null; - } - - @Override - public String getDescription(IStatus status) { + Map<String, String> attributes = new HashMap<String, String>(); if (status instanceof FeatureStatus) { StringBuilder sb = new StringBuilder(); sb.append("\n\n\n"); sb.append("-- Installed Plug-ins --\n"); - IBundleGroup bundleGroup = ((FeatureStatus)status).getBundleGroup(); - + IBundleGroup bundleGroup = ((FeatureStatus) status).getBundleGroup(); + sb.append(bundleGroup.getIdentifier()); sb.append(" "); sb.append(bundleGroup.getVersion()); - + Bundle[] bundles = bundleGroup.getBundles(); if (bundles != null) { for (Bundle bundle : bundles) { sb.append(bundle.getBundleId()); } } - return sb.toString(); - + attributes.put(IRepositoryConstants.DESCRIPTION, sb.toString()); + } else { StringBuilder sb = new StringBuilder(); sb.append("\n\n-- Error Details --\n"); @@ -58,8 +55,9 @@ public class DefaultTaskContributor extends AbstractTaskContributor { status.getException().printStackTrace(new PrintWriter(writer)); sb.append(writer.getBuffer()); } - return sb.toString(); + attributes.put(IRepositoryConstants.DESCRIPTION, sb.toString()); } + return attributes; } @Override diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java index 0f85efffb..691b92ce8 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java @@ -24,4 +24,6 @@ public class IRepositoryConstants { @Deprecated public static final String BRANDING = "branding"; + public static final String DESCRIPTION = "description"; + } diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskContributorManager.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskContributorManager.java index 1f7a46edf..4e7eaa597 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskContributorManager.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskContributorManager.java @@ -9,6 +9,7 @@ package org.eclipse.mylyn.internal.tasks.bugs; import java.util.List; +import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.core.runtime.CoreException; @@ -16,12 +17,14 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.Status; import org.eclipse.mylyn.commons.core.StatusHandler; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.tasks.bugs.AbstractTaskContributor; +import org.eclipse.mylyn.tasks.core.data.TaskData; /** * @author Steffen Pingel @@ -96,18 +99,39 @@ public class TaskContributorManager { taskContributors.remove(taskContributor); } - public void updateAttributes(RepositoryTaskData taskData, IStatus status) { + public void postProcess(final IStatus status, final TaskData taskData) { readExtensions(); - for (AbstractTaskContributor contributor : taskContributors) { - String description = contributor.getDescription(status); - if (description != null) { - taskData.setDescription(description); - return; - } + for (final AbstractTaskContributor contributor : taskContributors) { + SafeRunner.run(new ISafeRunnable() { + public void handleException(Throwable e) { + StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); + } + + public void run() throws Exception { + contributor.postProcess(status, taskData); + } + }); } + } - taskData.setDescription(defaultTaskContributor.getDescription(status)); + public void preProcess(final IStatus status, final Map<String, String> attributes) { + readExtensions(); + + for (final AbstractTaskContributor contributor : taskContributors) { + SafeRunner.run(new ISafeRunnable() { + public void handleException(Throwable e) { + StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); + } + + public void run() throws Exception { + Map<String, String> contributorAttributes = contributor.getAttributes(status); + if (contributorAttributes != null) { + attributes.putAll(contributorAttributes); + } + } + }); + } } } diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java index f3a5baa1f..e217b4c44 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java @@ -8,160 +8,164 @@ package org.eclipse.mylyn.internal.tasks.bugs; -import java.lang.reflect.InvocationTargetException; import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.mylyn.commons.core.AbstractErrorReporter; -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; -import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskSelection; -import org.eclipse.mylyn.internal.tasks.ui.RepositoryAwareStatusHandler; -import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.internal.tasks.ui.deprecated.NewTaskEditorInput; -import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; -import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.TasksUi; -import org.eclipse.mylyn.tasks.ui.TasksUiUtil; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.PlatformUI; +import org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorWizard; +import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; +import org.eclipse.mylyn.tasks.core.data.TaskData; /** * @author Steffen Pingel */ -@SuppressWarnings( { "restriction", "deprecation" }) -public class TaskErrorReporter extends AbstractErrorReporter { +public class TaskErrorReporter { - private final PluginRepositoryMappingManager manager; + private final PluginRepositoryMappingManager mappingManager; + + private final TaskContributorManager contributorManager; public TaskErrorReporter() { - manager = new PluginRepositoryMappingManager(); + this.contributorManager = new TaskContributorManager(); + this.mappingManager = new PluginRepositoryMappingManager(); + } + + public TaskContributorManager getContributorManager() { + return contributorManager; } - // API 3.0 remove: always enable - public boolean isEnabled() { - return false; //manager.hasMappings(); + public PluginRepositoryMappingManager getMappingManager() { + return mappingManager; } - @Override public int getPriority(IStatus status) { Assert.isNotNull(status); - String pluginId = status.getPlugin(); for (int i = 0; i <= pluginId.length(); i++) { - if (manager.getMapping(pluginId.substring(0, i)) != null) { - return PRIORITY_DEFAULT; + if (mappingManager.getMapping(pluginId.substring(0, i)) != null) { + return AbstractErrorReporter.PRIORITY_DEFAULT; } } - - return PRIORITY_NONE; + return AbstractErrorReporter.PRIORITY_NONE; } - @Override - public void handle(IStatus status) { + public void process(IStatus status) { Assert.isNotNull(status); - if (true) { - RepositoryAwareStatusHandler.getInstance().fail(status, true); - return; - } - - String pluginId = status.getPlugin(); - Map<String, String> attributes = manager.getAllAttributes(pluginId); - AttributeTaskMapper mapper = new AttributeTaskMapper(attributes); - TaskRepository taskRepository = mapper.getTaskRepository(); - try { - if (taskRepository != null) { - AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( - taskRepository.getConnectorKind()); - if (connector instanceof AbstractLegacyRepositoryConnector) { - if (openLegacyTaskEditor(status, taskRepository, mapper)) { - return; - } - } - } - - TaskSelection taskSelection = mapper.createTaskSelection(); - - // fall back to opening wizard - TasksUiUtil.openNewTaskEditor(null, taskSelection, taskRepository); - } catch (OperationCanceledException e) { - // ignore - } + AttributeTaskMapper mapper = preProcess(status); + postProcess(mapper); } - @Deprecated - private boolean openLegacyTaskEditor(IStatus status, TaskRepository taskRepository, AttributeTaskMapper mapper) { - RepositoryTaskData taskData = createLegacyTaskData(taskRepository, mapper); - if (taskData != null) { - taskData.setSummary(status.getMessage()); - - TaskContributorManager manager = new TaskContributorManager(); - manager.updateAttributes(taskData, status); - - String editorId = manager.getEditorId(status); - - NewTaskEditorInput editorInput = new NewTaskEditorInput(taskRepository, taskData); - IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - TasksUiUtil.openEditor(editorInput, editorId, page); - return true; - } - return false; + public AttributeTaskMapper preProcess(IStatus status) { + Assert.isNotNull(status); + String pluginId = status.getPlugin(); + Map<String, String> attributes = mappingManager.getAllAttributes(pluginId); + contributorManager.preProcess(status, attributes); + return new AttributeTaskMapper(attributes); } - @Deprecated - private RepositoryTaskData createLegacyTaskData(final TaskRepository taskRepository, AttributeTaskMapper mapper) { - AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( - taskRepository.getConnectorKind()); - if (!(connector instanceof AbstractLegacyRepositoryConnector)) { - return null; - } - final AbstractTaskDataHandler taskDataHandler = ((AbstractLegacyRepositoryConnector) connector).getLegacyTaskDataHandler(); - if (taskDataHandler == null) { - return null; - } - - AbstractAttributeFactory attributeFactory = taskDataHandler.getAttributeFactory( - taskRepository.getRepositoryUrl(), taskRepository.getConnectorKind(), AbstractTask.DEFAULT_TASK_KIND); - - final RepositoryTaskData taskData = new RepositoryTaskData(attributeFactory, taskRepository.getConnectorKind(), - taskRepository.getRepositoryUrl(), TasksUiPlugin.getDefault().getNextNewRepositoryTaskId()); - taskData.setNew(true); - - mapper.applyTo(taskData); - + public void postProcess(AttributeTaskMapper mapper) { + Assert.isNotNull(mapper); + TaskData taskData; try { - IRunnableWithProgress runnable = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - if (!taskDataHandler.initializeTaskData(taskRepository, taskData, monitor)) { - throw new InvocationTargetException(new Exception()); - } - } catch (CoreException e) { - throw new InvocationTargetException(e); - } catch (OperationCanceledException e) { - throw new InterruptedException(); - } - } - }; - - PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable); - } catch (InvocationTargetException e) { - return null; - } catch (InterruptedException e) { - throw new OperationCanceledException(); + taskData = mapper.createTaskData(null); + TasksUiInternal.createAndOpenNewTask(taskData); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } + } - taskDataHandler.cloneTaskData(mapper.createTaskSelection().getLegacyTaskData(), taskData); - - return taskData; + public void handle(final IStatus status) { + ReportErrorWizard wizard = new ReportErrorWizard(TaskErrorReporter.this, status); + WizardDialog dialog = new WizardDialog(TasksUiInternal.getShell(), wizard); + dialog.setBlockOnOpen(false); + dialog.open(); } + // legacy support +// TaskRepository taskRepository = mapper.getTaskRepository(); +// if (taskRepository != null) { +// AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( +// taskRepository.getConnectorKind()); +// if (connector instanceof AbstractLegacyRepositoryConnector) { +// try { +// if (openLegacyTaskEditor(status, taskRepository, mapper)) { +// return; +// } +// } catch (OperationCanceledException e) { +// return; +// } +// } +// } +// +// @Deprecated +// private boolean openLegacyTaskEditor(IStatus status, TaskRepository taskRepository, AttributeTaskMapper mapper) { +// RepositoryTaskData taskData = createLegacyTaskData(taskRepository, mapper); +// if (taskData != null) { +// taskData.setSummary(status.getMessage()); +// +// TaskContributorManager manager = new TaskContributorManager(); +// manager.updateAttributes(taskData, status); +// +// String editorId = manager.getEditorId(status); +// +// NewTaskEditorInput editorInput = new NewTaskEditorInput(taskRepository, taskData); +// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); +// TasksUiUtil.openEditor(editorInput, editorId, page); +// return true; +// } +// return false; +// } +// +// @Deprecated +// private RepositoryTaskData createLegacyTaskData(final TaskRepository taskRepository, AttributeTaskMapper mapper) { +// AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( +// taskRepository.getConnectorKind()); +// if (!(connector instanceof AbstractLegacyRepositoryConnector)) { +// return null; +// } +// final AbstractTaskDataHandler taskDataHandler = ((AbstractLegacyRepositoryConnector) connector).getLegacyTaskDataHandler(); +// if (taskDataHandler == null) { +// return null; +// } +// +// AbstractAttributeFactory attributeFactory = taskDataHandler.getAttributeFactory( +// taskRepository.getRepositoryUrl(), taskRepository.getConnectorKind(), AbstractTask.DEFAULT_TASK_KIND); +// +// final RepositoryTaskData taskData = new RepositoryTaskData(attributeFactory, taskRepository.getConnectorKind(), +// taskRepository.getRepositoryUrl(), TasksUiPlugin.getDefault().getNextNewRepositoryTaskId()); +// taskData.setNew(true); +// +// mapper.applyTo(taskData); +// +// try { +// IRunnableWithProgress runnable = new IRunnableWithProgress() { +// public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { +// try { +// if (!taskDataHandler.initializeTaskData(taskRepository, taskData, monitor)) { +// throw new InvocationTargetException(new Exception()); +// } +// } catch (CoreException e) { +// throw new InvocationTargetException(e); +// } catch (OperationCanceledException e) { +// throw new InterruptedException(); +// } +// } +// }; +// +// PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable); +// } catch (InvocationTargetException e) { +// return null; +// } catch (InterruptedException e) { +// throw new OperationCanceledException(); +// } +// +// taskDataHandler.cloneTaskData(mapper.createTaskSelection().getLegacyTaskData(), taskData); +// +// return taskData; +// } + } diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java index 3d1dc6472..2ae9d6014 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java @@ -8,6 +8,11 @@ package org.eclipse.mylyn.internal.tasks.bugs; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.mylyn.commons.core.AbstractErrorReporter; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; @@ -16,8 +21,31 @@ import org.osgi.framework.BundleContext; */ public class TasksBugsPlugin extends AbstractUIPlugin { + public static class Reporter extends AbstractErrorReporter { + + @Override + public int getPriority(IStatus status) { + return getTaskErrorReporter().getPriority(status); + } + + @Override + public void handle(final IStatus status) { + IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench != null) { + Display display = workbench.getDisplay(); + if (display != null && !display.isDisposed()) { + display.asyncExec(new Runnable() { + public void run() { + getTaskErrorReporter().handle(status); + } + }); + } + } + } + } + public static final String ID_PLUGIN = "org.eclipse.mylyn.tasks.bugs"; - + private static TasksBugsPlugin INSTANCE; private static TaskErrorReporter taskErrorReporter; @@ -32,7 +60,7 @@ public class TasksBugsPlugin extends AbstractUIPlugin { } return taskErrorReporter; } - + public TasksBugsPlugin() { } @@ -47,5 +75,5 @@ public class TasksBugsPlugin extends AbstractUIPlugin { INSTANCE = null; super.stop(context); } - + } diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java index 0063f7e7c..0446a18d5 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java @@ -17,8 +17,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin; -import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskSelection; -import org.eclipse.mylyn.tasks.ui.TasksUiUtil; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; @@ -84,13 +82,8 @@ public class NewTaskFromErrorAction implements IObjectActionDelegate { StringBuilder sb = new StringBuilder(); buildDescriptionFromLogEntry(entry, sb, includeChildren); - if (TasksBugsPlugin.getTaskErrorReporter().isEnabled()) { - Status status = new Status(entry.getSeverity(), entry.getPluginId(), entry.getMessage()); - TasksBugsPlugin.getTaskErrorReporter().handle(status); - } else { - TaskSelection taskSelection = new TaskSelection("", sb.toString()); - TasksUiUtil.openNewTaskEditor(shell, taskSelection, null); - } + Status status = new Status(entry.getSeverity(), entry.getPluginId(), entry.getMessage()); + TasksBugsPlugin.getTaskErrorReporter().handle(status); } public void run() { diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java index 9a6f72ea4..751ab24b4 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java @@ -11,9 +11,7 @@ package org.eclipse.mylyn.internal.tasks.bugs.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.WizardDialog; -import org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin; import org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugOrEnhancementWizard; -import org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; @@ -32,12 +30,8 @@ public class ReportBugAction implements IWorkbenchWindowActionDelegate { } public void run(IAction action) { - if (TasksBugsPlugin.getTaskErrorReporter().isEnabled()) { - WizardDialog dialog = new WizardDialog(window.getShell(), new ReportBugOrEnhancementWizard()); - dialog.open(); - } else { - new NewTaskAction().run(action); - } + WizardDialog dialog = new WizardDialog(window.getShell(), new ReportBugOrEnhancementWizard()); + dialog.open(); } public void selectionChanged(IAction action, ISelection selection) { diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java index 09d2ae0e1..0b0b8878b 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java @@ -8,13 +8,20 @@ package org.eclipse.mylyn.internal.tasks.bugs.wizards; -import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IStatus; +import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.mylyn.internal.tasks.bugs.AttributeTaskMapper; +import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; /** * @author Steffen Pingel @@ -23,23 +30,85 @@ public class ReportErrorPage extends WizardPage { private final IStatus status; - public ReportErrorPage(IStatus status) { + private final AttributeTaskMapper mapper; + + protected TaskRepository taskRepository; + + public ReportErrorPage(AttributeTaskMapper mapper, IStatus status) { super("reportError"); - Assert.isNotNull(status); + this.mapper = mapper; this.status = status; setTitle("Unexpected Error"); setMessage("An unexcpeted error has occured"); } - public void createControl(Composite parent) { + public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(1, true); - composite.setLayout(layout); - - Label label = new Label(parent, SWT.NONE); + composite.setLayout(new GridLayout(1, true)); + + Group errorGroup = new Group(composite, SWT.NONE); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(errorGroup); + errorGroup.setText("Error"); + errorGroup.setLayout(new GridLayout(1, true)); + + Label label = new Label(errorGroup, SWT.NONE); label.setText(status.getMessage()); - + + Link link = new Link(composite, SWT.NONE); + link.setText("<a href=\"errorlog\">Show in error log</a>"); + + // space + new Label(composite, SWT.NONE); + + if (mapper.isMappingComplete()) { + final Button defaultRepositoryButton = new Button(composite, SWT.RADIO); + defaultRepositoryButton.setText("Report to: " + mapper.getTaskRepository().getRepositoryLabel()); + defaultRepositoryButton.setSelection(true); + + final Button selectRepositoryButton = new Button(composite, SWT.RADIO); + selectRepositoryButton.setText("Select repository"); + + defaultRepositoryButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent event) { + if (defaultRepositoryButton.getSelection()) { + selectRepositoryButton.setSelection(false); + } + taskRepository = mapper.getTaskRepository(); + getContainer().updateButtons(); + } + }); + + selectRepositoryButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent event) { + if (selectRepositoryButton.getSelection()) { + defaultRepositoryButton.setSelection(false); + } + taskRepository = null; + getContainer().updateButtons(); + } + }); + + taskRepository = mapper.getTaskRepository(); + } else { + taskRepository = null; + } setControl(composite); } - + + @Override + public boolean canFlipToNextPage() { + return taskRepository == null; + } + + public TaskRepository getTaskRepository() { + return taskRepository; + } + + @Override + public boolean isPageComplete() { + return true; + } + }
\ No newline at end of file diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java index dd3268cd9..83925fd49 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java @@ -10,9 +10,10 @@ package org.eclipse.mylyn.internal.tasks.bugs.wizards; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.wizard.Wizard; +import org.eclipse.mylyn.internal.tasks.bugs.AttributeTaskMapper; +import org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter; import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter; import org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskPage; -import org.eclipse.mylyn.tasks.core.ITaskMapping; /** * @author Steffen Pingel @@ -21,31 +22,37 @@ public class ReportErrorWizard extends Wizard { private final IStatus status; - private final ITaskMapping taskMapping; + private final AttributeTaskMapper mapper; private ReportErrorPage reportErrorPage; private NewTaskPage newTaskPage; - public ReportErrorWizard(IStatus status, ITaskMapping taskMapping) { + private final TaskErrorReporter taskErrorReporter; + + public ReportErrorWizard(TaskErrorReporter taskErrorReporter, IStatus status) { + this.taskErrorReporter = taskErrorReporter; this.status = status; - this.taskMapping = taskMapping; + this.mapper = taskErrorReporter.preProcess(status); setWindowTitle("Report Error"); } @SuppressWarnings("restriction") @Override public void addPages() { - reportErrorPage = new ReportErrorPage(status); - addPage(reportErrorPage); - newTaskPage = new NewTaskPage(ITaskRepositoryFilter.CAN_CREATE_NEW_TASK, taskMapping); + reportErrorPage = new ReportErrorPage(mapper, status); addPage(reportErrorPage); + newTaskPage = new NewTaskPage(ITaskRepositoryFilter.CAN_CREATE_NEW_TASK, mapper.getTaskMapping()); + addPage(newTaskPage); } @Override public boolean performFinish() { - // ignore - return false; + if (reportErrorPage.getTaskRepository() != null) { + taskErrorReporter.postProcess(mapper); + return true; + } else { + return newTaskPage.performFinish(); + } } - } diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/tasks/bugs/AbstractTaskContributor.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/tasks/bugs/AbstractTaskContributor.java index 62e9ffb35..3814166e2 100644 --- a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/tasks/bugs/AbstractTaskContributor.java +++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/tasks/bugs/AbstractTaskContributor.java @@ -11,19 +11,21 @@ package org.eclipse.mylyn.tasks.bugs; import java.util.Map; import org.eclipse.core.runtime.IStatus; +import org.eclipse.mylyn.tasks.core.data.TaskData; /** - * Note: This API is likely to change for 3.0. - * * @author Steffen Pingel - * @since 2.3 + * @since 3.0 */ public abstract class AbstractTaskContributor { public abstract Map<String, String> getAttributes(IStatus status); - - public abstract String getDescription(IStatus status); - - public abstract String getEditorId(IStatus status); - + + public String getEditorId(IStatus status) { + return null; + } + + public void postProcess(IStatus status, TaskData taskData) { + } + } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java index 8e8940631..aea5fdac6 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java @@ -17,7 +17,6 @@ import org.eclipse.mylyn.tasks.core.data.TaskData; * @author Steffen Pingel * @since 3.0 */ -// API 3.0 find a better name? public interface ITaskMapping { public abstract Date getCompletionDate(); @@ -50,32 +49,4 @@ public interface ITaskMapping { public void copyFrom(ITaskMapping source); - // public abstract void setCompletionDate(Date dateCompleted); -// -// public abstract void setComponent(String component); -// -// public abstract void setCreationDate(Date dateCreated); -// -// public abstract void setDescription(String description); -// -// public abstract void setDueDate(Date value); -// -// public abstract void setModificationDate(Date dateModified); -// -// // TODO use Person class? -// public abstract void setOwner(String owner); -// -// public abstract void setPriority(PriorityLevel priority); -// -// public abstract void setProduct(String product); -// -// // TODO use Person class? -// public abstract void setReporter(String reporter); -// -// public abstract void setSummary(String summary); -// -// public abstract void setTaskKind(String taskKind); -// -// public abstract void setTaskUrl(String taskUrl); - }
\ No newline at end of file diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskMapping.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskMapping.java new file mode 100644 index 000000000..d28b4afff --- /dev/null +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskMapping.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Mylyn project committers 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 + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.core; + +import java.util.Date; + +import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel; +import org.eclipse.mylyn.tasks.core.data.TaskData; + +/** + * @author Steffen Pingel + * @since 3.0 + */ +public class TaskMapping implements ITaskMapping { + + public void copyFrom(ITaskMapping source) { + // ignore + } + + public Date getCompletionDate() { + // ignore + return null; + } + + public String getComponent() { + // ignore + return null; + } + + public Date getCreationDate() { + // ignore + return null; + } + + public String getDescription() { + // ignore + return null; + } + + public Date getDueDate() { + // ignore + return null; + } + + public Date getModificationDate() { + // ignore + return null; + } + + public String getOwner() { + // ignore + return null; + } + + public PriorityLevel getPriority() { + // ignore + return null; + } + + public String getProduct() { + // ignore + return null; + } + + public String getSummary() { + // ignore + return null; + } + + public TaskData getTaskData() { + // ignore + return null; + } + + public String getTaskKey() { + // ignore + return null; + } + + public String getTaskKind() { + // ignore + return null; + } + + public String getTaskUrl() { + // ignore + return null; + } + +} diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java index dab2e1ed6..731e4927b 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java @@ -13,6 +13,7 @@ import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.RepositoryResponse; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -49,8 +50,8 @@ public abstract class AbstractTaskDataHandler { /** * Initialize a new task data object with default attributes and values */ - public abstract boolean initializeTaskData(TaskRepository repository, TaskData data, IProgressMonitor monitor) - throws CoreException; + public abstract boolean initializeTaskData(TaskRepository repository, TaskData data, + ITaskMapping initializationData, IProgressMonitor monitor) throws CoreException; /** * @since 2.2 diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java index 0a663fe96..ac35cfb93 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java @@ -279,10 +279,18 @@ public class TaskMapper implements ITaskMapping { copyAttributeValue(sourceAttribute, this.getTaskData().getRoot().getAttribute(sourceAttribute.getId())); } } else { - setDescription(source.getDescription()); - setSummary(source.getSummary()); - setPriority(getPriority()); - setProduct(getProduct()); + if (source.getDescription() != null) { + setDescription(source.getDescription()); + } + if (source.getSummary() != null) { + setSummary(source.getSummary()); + } + if (source.getPriority() != null) { + setPriority(source.getPriority()); + } + if (source.getProduct() != null) { + setProduct(source.getProduct()); + } } // targetTaskData.setSummary(sourceTaskData.getSummary()); // targetTaskData.setDescription(sourceTaskData.getDescription()); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java index 2908bd303..7ff0050a1 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java @@ -39,14 +39,12 @@ import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel; import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler; -import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy; import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.TasksUiImages; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; -import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; import org.eclipse.ui.IViewActionDelegate; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; @@ -73,6 +71,7 @@ public class NewSubTaskAction extends Action implements IViewActionDelegate, IEx setImageDescriptor(TasksUiImages.TASK_NEW_SUB); } + @SuppressWarnings( { "deprecation", "restriction" }) @Override public void run() { if (selectedTask == null) { @@ -94,29 +93,19 @@ public class NewSubTaskAction extends Action implements IViewActionDelegate, IEx AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( selectedTask.getConnectorKind()); if (connector instanceof AbstractLegacyRepositoryConnector) { - runLegacy((AbstractLegacyRepositoryConnector) connector); + createLegacyTask((AbstractLegacyRepositoryConnector) connector); return; } - ITask task = TasksUiUtil.createOutgoingNewTask(selectedTask.getConnectorKind()); TaskData taskData = createTaskData(connector); if (taskData != null) { - ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(task, taskData); try { - workingCopy.save(null, null); + TasksUiInternal.createAndOpenNewTask(taskData); } catch (CoreException e) { - StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, - "Failed to save task data for task: " + task.getUrl(), e)); - TasksUiInternal.displayStatus("Unable to create subtask", new Status(IStatus.WARNING, - TasksUiPlugin.ID_PLUGIN, "Could not retrieve task data for task: " + selectedTask.getUrl())); - return; + StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to open new sub task", e)); + TasksUiInternal.displayStatus("Unable to create subtask", new Status(IStatus.ERROR, + TasksUiPlugin.ID_PLUGIN, "Failed to create new sub task: " + e.getMessage())); } - - TaskRepository localTaskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(), - task.getRepositoryUrl()); - TaskEditorInput editorInput = new TaskEditorInput(localTaskRepository, task); - IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - TasksUiUtil.openEditor(editorInput, TaskEditor.ID_EDITOR, page); } } @@ -186,7 +175,7 @@ public class NewSubTaskAction extends Action implements IViewActionDelegate, IEx } @Deprecated - private void runLegacy(AbstractLegacyRepositoryConnector connector) { + private void createLegacyTask(AbstractLegacyRepositoryConnector connector) { final org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler taskDataHandler = connector.getLegacyTaskDataHandler(); if (taskDataHandler == null) { return; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java index 5b12f6249..e91e06b67 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java @@ -73,7 +73,11 @@ import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.Capability; import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel; import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState; import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource; +import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler; +import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; +import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob; import org.eclipse.mylyn.tasks.core.sync.TaskJob; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; @@ -719,4 +723,39 @@ public class TasksUiInternal { TasksUi.getTaskDataManager())); } + public static Shell getShell() { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window != null) { + return window.getShell(); + } + return Display.getDefault().getActiveShell(); + } + + public static TaskData createTaskData(TaskRepository taskRepository, ITaskMapping initializationData, + ITaskMapping selectionData, IProgressMonitor monitor) throws CoreException { + AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( + taskRepository.getConnectorKind()); + AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler(); + TaskAttributeMapper mapper = taskDataHandler.getAttributeMapper(taskRepository); + TaskData taskData = new TaskData(mapper, taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(), + ""); + taskDataHandler.initializeTaskData(taskRepository, taskData, initializationData, monitor); + if (selectionData != null) { + connector.getTaskMapping(taskData).copyFrom(selectionData); + } + return taskData; + } + + public static void createAndOpenNewTask(TaskData taskData) throws CoreException { + ITask task = TasksUiUtil.createOutgoingNewTask(taskData.getConnectorKind()); + ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(task, taskData); + workingCopy.save(null, null); + + TaskRepository localTaskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(), + task.getRepositoryUrl()); + TaskEditorInput editorInput = new TaskEditorInput(localTaskRepository, task); + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + TasksUiUtil.openEditor(editorInput, TaskEditor.ID_EDITOR, page); + } + } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java index ce233b69c..dffbef046 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java @@ -13,15 +13,16 @@ import java.lang.reflect.InvocationTargetException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.text.Assert; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskSelection; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; @@ -31,7 +32,9 @@ import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.ui.TasksUi; +import org.eclipse.mylyn.tasks.ui.TasksUiImages; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; import org.eclipse.ui.INewWizard; @@ -55,8 +58,11 @@ public class NewTaskWizard extends Wizard implements INewWizard { * @since 3.0 */ public NewTaskWizard(TaskRepository taskRepository, ITaskMapping taskSelection) { + Assert.isNotNull(taskRepository); this.taskRepository = taskRepository; this.taskSelection = taskSelection; + setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY); + setNeedsProgressMonitor(true); } public NewTaskWizard(TaskRepository taskRepository) { @@ -75,68 +81,128 @@ public class NewTaskWizard extends Wizard implements INewWizard { return true; } + /** + * @since 3.0 + */ + protected ITaskMapping getInitializationData() { + return null; + } + + /** + * @since 3.0 + */ + public TaskRepository getTaskRepository() { + return taskRepository; + } + + /** + * @since 3.0 + */ + public ITaskMapping getTaskSelection() { + return taskSelection; + } + @SuppressWarnings( { "deprecation", "restriction" }) @Override public boolean performFinish() { - // FIXME 3.0 implement TaskData support AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( taskRepository.getConnectorKind()); if (connector instanceof AbstractLegacyRepositoryConnector) { - AbstractLegacyRepositoryConnector legacyConnector = (AbstractLegacyRepositoryConnector) connector; - - final AbstractTaskDataHandler taskDataHandler = legacyConnector.getLegacyTaskDataHandler(); - if (taskDataHandler == null) { - TasksUiInternal.displayStatus("Error creating new task", new RepositoryStatus(IStatus.ERROR, - TasksUiPlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY, - "The selected repository does not support creating new tasks.")); - return false; - } + return createLegacyTask((AbstractLegacyRepositoryConnector) connector); + } - AbstractAttributeFactory attributeFactory = taskDataHandler.getAttributeFactory( - taskRepository.getRepositoryUrl(), taskRepository.getConnectorKind(), - AbstractTask.DEFAULT_TASK_KIND); - - final RepositoryTaskData taskData = new RepositoryTaskData(attributeFactory, - taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(), TasksUiPlugin.getDefault() - .getNextNewRepositoryTaskId()); - taskData.setNew(true); - - try { - IRunnableWithProgress runnable = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - if (!taskDataHandler.initializeTaskData(taskRepository, taskData, monitor)) { - throw new CoreException(new RepositoryStatus(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, - RepositoryStatus.ERROR_REPOSITORY, - "The selected repository does not support creating new tasks.")); - } - } catch (CoreException e) { - throw new InvocationTargetException(e); - } + final TaskData[] taskData = new TaskData[1]; + final ITaskMapping initializationData = getInitializationData(); + final ITaskMapping selectionData = getTaskSelection(); + try { + IRunnableWithProgress runnable = new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + taskData[0] = TasksUiInternal.createTaskData(taskRepository, initializationData, selectionData, + monitor); + } catch (OperationCanceledException e) { + throw new InterruptedException(); + } catch (CoreException e) { + throw new InvocationTargetException(e); } - }; - - getContainer().run(true, true, runnable); - } catch (InvocationTargetException e) { - if (e.getCause() instanceof CoreException) { - TasksUiInternal.displayStatus("Error creating new task", ((CoreException) e.getCause()).getStatus()); - } else { - StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error creating new task", - e.getCause())); } - return false; - } catch (InterruptedException e) { - return false; + }; + getContainer().run(true, true, runnable); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof CoreException) { + TasksUiInternal.displayStatus("Error creating new task", ((CoreException) e.getCause()).getStatus()); + } else { + StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error creating new task", + e.getCause())); } + return false; + } catch (InterruptedException e) { + return false; + } - if (taskSelection instanceof TaskSelection) { - taskDataHandler.cloneTaskData(((TaskSelection) taskSelection).getLegacyTaskData(), taskData); + try { + TasksUiInternal.createAndOpenNewTask(taskData[0]); + return true; + } catch (CoreException e) { + StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to open new task", e)); + TasksUiInternal.displayStatus("Create Task", new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, + "Failed to create new task: " + e.getMessage())); + return false; + } + } + + @SuppressWarnings( { "deprecation", "restriction" }) + private boolean createLegacyTask(AbstractLegacyRepositoryConnector legacyConnector) { + final org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler taskDataHandler = legacyConnector.getLegacyTaskDataHandler(); + if (taskDataHandler == null) { + TasksUiInternal.displayStatus("Error creating new task", new RepositoryStatus(IStatus.ERROR, + TasksUiPlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY, + "The selected repository does not support creating new tasks.")); + return false; + } + + AbstractAttributeFactory attributeFactory = taskDataHandler.getAttributeFactory( + taskRepository.getRepositoryUrl(), taskRepository.getConnectorKind(), AbstractTask.DEFAULT_TASK_KIND); + + final RepositoryTaskData taskData = new RepositoryTaskData(attributeFactory, taskRepository.getConnectorKind(), + taskRepository.getRepositoryUrl(), TasksUiPlugin.getDefault().getNextNewRepositoryTaskId()); + taskData.setNew(true); + + try { + IRunnableWithProgress runnable = new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + if (!taskDataHandler.initializeTaskData(taskRepository, taskData, monitor)) { + throw new CoreException(new RepositoryStatus(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, + RepositoryStatus.ERROR_REPOSITORY, + "The selected repository does not support creating new tasks.")); + } + } catch (CoreException e) { + throw new InvocationTargetException(e); + } + } + }; + + getContainer().run(true, true, runnable); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof CoreException) { + TasksUiInternal.displayStatus("Error creating new task", ((CoreException) e.getCause()).getStatus()); + } else { + StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error creating new task", + e.getCause())); } + return false; + } catch (InterruptedException e) { + return false; + } - NewTaskEditorInput editorInput = new NewTaskEditorInput(taskRepository, taskData); - IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - TasksUiUtil.openEditor(editorInput, TaskEditor.ID_EDITOR, page); + if (taskSelection instanceof TaskSelection) { + taskDataHandler.cloneTaskData(((TaskSelection) taskSelection).getLegacyTaskData(), taskData); } + + NewTaskEditorInput editorInput = new NewTaskEditorInput(taskRepository, taskData); + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + TasksUiUtil.openEditor(editorInput, TaskEditor.ID_EDITOR, page); return true; } } |