diff options
author | relves | 2006-11-15 01:40:00 +0000 |
---|---|---|
committer | relves | 2006-11-15 01:40:00 +0000 |
commit | db1567a8da1771e8e4cfc265512f2bc926bad92f (patch) | |
tree | 9e9d7220078453ac5f35ffd4d85dcce6e52a20b2 | |
parent | 0e8ba06ed4bb8378432720f6ce194ca3bbe4b9e1 (diff) | |
download | org.eclipse.mylyn.tasks-db1567a8da1771e8e4cfc265512f2bc926bad92f.tar.gz org.eclipse.mylyn.tasks-db1567a8da1771e8e4cfc265512f2bc926bad92f.tar.xz org.eclipse.mylyn.tasks-db1567a8da1771e8e4cfc265512f2bc926bad92f.zip |
NEW - bug 161820: Fix synchronization of Trac tasks accessed through the web
https://bugs.eclipse.org/bugs/show_bug.cgi?id=161820
12 files changed, 153 insertions, 66 deletions
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java index 486e3bdf2..a1ad3c62a 100644 --- a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java +++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java @@ -53,6 +53,10 @@ public class AbstractReportFactory { protected void collectResults(DefaultHandler contentHandler, boolean clean) throws IOException, BugzillaException, GeneralSecurityException { + if(inStream == null) { + return; + } + BufferedReader in; if (characterEncoding != null) { in = new BufferedReader(new InputStreamReader(inStream, characterEncoding)); diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java index fb287212c..e6cd148aa 100644 --- a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java +++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java @@ -250,7 +250,7 @@ public class BugzillaRepositoryConnector extends AbstractRepositoryConnector { // } @Override - public void updateTaskState(AbstractRepositoryTask repositoryTask) { + public void updateTask(TaskRepository repository, AbstractRepositoryTask repositoryTask) { // ignore } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/.AbstractRepositoryTask.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/.AbstractRepositoryTask.java index 5f91d3ba1..83c5286e6 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/.AbstractRepositoryTask.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/.AbstractRepositoryTask.java @@ -13,6 +13,7 @@ package org.eclipse.mylar.tasks.core; import java.util.Date; +import org.eclipse.core.runtime.IStatus; import org.eclipse.mylar.internal.tasks.core.HtmlStreamTokenizer; /** @@ -50,6 +51,8 @@ public abstract class AbstractRepositoryTask extends Task { public static final String HANDLE_DELIM = "-"; + protected IStatus status = null; + public AbstractRepositoryTask(String handle, String label, boolean newTask) { super(handle, label, newTask); } @@ -173,4 +176,13 @@ public abstract class AbstractRepositoryTask extends Task { public String getOwner() { return "<unknown>"; } + + public IStatus getStatus() { + return status; + } + + public void setStatus(IStatus status) { + this.status = status; + } + } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java index 5bf7b5390..7411d81f4 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java @@ -100,7 +100,26 @@ public abstract class AbstractRepositoryConnector { public abstract List<String> getSupportedVersions(); - public abstract void updateTaskState(AbstractRepositoryTask repositoryTask); + /** + * Updates the properties of <code>repositoryTask</code>. Invoked when on + * task synchronization if {@link #getOfflineTaskHandler()} returns + * <code>null</code> or + * {@link IOfflineTaskHandler#downloadTaskData(TaskRepository, String, Proxy)} + * returns <code>null</code>. + * + * <p> + * Connectors that provide {@link RepositoryTaskData} objects for all tasks + * do not need to implement this method. + * + * @param repository + * the repository + * @param repositoryTask + * the task that is synchronized + * @throws CoreException + * thrown in case of error while synchronizing + * @see {@link #getOfflineTaskHandler()} + */ + public abstract void updateTask(TaskRepository repository, AbstractRepositoryTask repositoryTask) throws CoreException; public String[] repositoryPropertyNames() { return new String[] { IRepositoryConstants.PROPERTY_VERSION, IRepositoryConstants.PROPERTY_TIMEZONE, diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryTask.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryTask.java index 5f91d3ba1..83c5286e6 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryTask.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryTask.java @@ -13,6 +13,7 @@ package org.eclipse.mylar.tasks.core; import java.util.Date; +import org.eclipse.core.runtime.IStatus; import org.eclipse.mylar.internal.tasks.core.HtmlStreamTokenizer; /** @@ -50,6 +51,8 @@ public abstract class AbstractRepositoryTask extends Task { public static final String HANDLE_DELIM = "-"; + protected IStatus status = null; + public AbstractRepositoryTask(String handle, String label, boolean newTask) { super(handle, label, newTask); } @@ -173,4 +176,13 @@ public abstract class AbstractRepositoryTask extends Task { public String getOwner() { return "<unknown>"; } + + public IStatus getStatus() { + return status; + } + + public void setStatus(IStatus status) { + this.status = status; + } + } diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java index 47c1a295f..61d9f99cf 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java @@ -92,7 +92,7 @@ public class MockRepositoryConnector extends AbstractRepositoryConnector { } @Override - public void updateTaskState(AbstractRepositoryTask repositoryTask) { + public void updateTask(TaskRepository repository, AbstractRepositoryTask repositoryTask) { // ignore } diff --git a/org.eclipse.mylyn.tasks.ui/icons/ovr16/overlay-warning.gif b/org.eclipse.mylyn.tasks.ui/icons/ovr16/overlay-warning.gif Binary files differnew file mode 100644 index 000000000..059c630e8 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/icons/ovr16/overlay-warning.gif diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListImages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListImages.java index 6fd4c7d82..5247840ad 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListImages.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListImages.java @@ -37,6 +37,8 @@ public class TaskListImages { private static final String T_WIZBAN = "wizban"; + private static final String T_OVR = "ovr16"; + public static final Point SIZE = new Point(16, 16); private static final URL baseURL = TasksUiPlugin.getDefault().getBundle().getEntry("/icons/"); @@ -107,6 +109,8 @@ public class TaskListImages { public static final ImageDescriptor OVERLAY_REPOSITORY_CONTEXT = create(T_EVIEW, "overlay-repository-context.gif"); + public static final ImageDescriptor OVERLAY_WARNING = create(T_OVR, "overlay-warning.gif"); + public static final ImageDescriptor STATUS_NORMAL = create(T_EVIEW, "status-normal.gif"); public static final ImageDescriptor STATUS_CONTEXT = create(T_EVIEW, "status-server-context.gif"); @@ -134,7 +138,7 @@ public class TaskListImages { public static final ImageDescriptor STATUS_CONTEXT_CONFLICT = createWithOverlay( STATUS_CONTEXT, OVERLAY_CONFLICT, true, true); - + public static final ImageDescriptor QUERY = createSize(create(T_TOOL, "query.gif"), SIZE); public static final ImageDescriptor QUERY_NEW = create(T_TOOL, "query-new.gif"); @@ -159,7 +163,6 @@ public class TaskListImages { public static final ImageDescriptor TASK_INACTIVE_CONTEXT = createSize(create(T_TOOL, "task-context.gif"), SIZE); - public static final ImageDescriptor TASK_COMPLETE = create(T_TOOL, "task-complete.gif"); @@ -199,7 +202,7 @@ public class TaskListImages { return new TaskListImageDescriptor(base, size); } - private static ImageDescriptor createWithOverlay(ImageDescriptor base, ImageDescriptor overlay, boolean top, + public static ImageDescriptor createWithOverlay(ImageDescriptor base, ImageDescriptor overlay, boolean top, boolean left) { return new TaskListImageDescriptor(base, overlay, top, left); } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListTableLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListTableLabelProvider.java index 8c179807c..5aaecb666 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListTableLabelProvider.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListTableLabelProvider.java @@ -15,6 +15,7 @@ package org.eclipse.mylar.internal.tasks.ui.views; import java.util.Arrays; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; @@ -116,12 +117,22 @@ public class TaskListTableLabelProvider extends DecoratingLabelProvider implemen repositoryTask = (AbstractRepositoryTask)element; } if (repositoryTask != null) { + ImageDescriptor image = null; if (repositoryTask.getSyncState() == RepositoryTaskSyncState.OUTGOING) { - return TaskListImages.getImage(TaskListImages.STATUS_NORMAL_OUTGOING); + image = TaskListImages.STATUS_NORMAL_OUTGOING; } else if (repositoryTask.getSyncState() == RepositoryTaskSyncState.INCOMING) { - return TaskListImages.getImage(TaskListImages.STATUS_NORMAL_INCOMING); + image = TaskListImages.STATUS_NORMAL_INCOMING; } else if (repositoryTask.getSyncState() == RepositoryTaskSyncState.CONFLICT) { - return TaskListImages.getImage(TaskListImages.STATUS_NORMAL_CONFLICT); + image = TaskListImages.STATUS_NORMAL_CONFLICT; + } + if (repositoryTask.getStatus() != null) { + if (image == null) { + image = TaskListImages.STATUS_NORMAL; + } + return TaskListImages.getImage(TaskListImages.createWithOverlay(image, + TaskListImages.OVERLAY_WARNING, false, true)); + } else if (image != null) { + return TaskListImages.getImage(image); } } else if (element instanceof AbstractQueryHit){ return TaskListImages.getImage(TaskListImages.STATUS_NORMAL_INCOMING); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTipHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTipHandler.java index 6850a2c5a..8736e9891 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTipHandler.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTipHandler.java @@ -54,7 +54,8 @@ import org.eclipse.ui.PlatformUI; */ public class TaskListToolTipHandler { - private static final String SEPARATOR = "\n---------------\n"; + //private static final String SEPARATOR = "\n---------------\n"; + private static final String SEPARATOR = "\n\n"; private Shell tipShell; @@ -204,6 +205,10 @@ public class TaskListToolTipHandler { tooltip += ((ITaskListElement) element).getDescription(); if (repositoryTask != null) { tooltip += "\n" + repositoryTask.getRepositoryUrl() + formatScheduledFor(repositoryTask); + + if (repositoryTask.getStatus() != null) { + tooltip += SEPARATOR + "Last Error: " + repositoryTask.getStatus().getMessage(); + } } return tooltip; } else if (element != null) { @@ -381,7 +386,7 @@ public class TaskListToolTipHandler { tipLabelText.setText(text + progressText); tipLabelImage.setImage(image); // accepts null - + tipShell.pack(); setHoverLocation(tipShell, tipPosition); tipShell.setVisible(true); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java index a9dc9cea8..ab0ce57cc 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java @@ -43,6 +43,7 @@ import org.eclipse.ui.progress.IProgressConstants; /** * @author Mik Kersten * @author Rob Elves + * @author Steffen Pingel */ class SynchronizeTaskJob extends Job { @@ -76,65 +77,40 @@ class SynchronizeTaskJob extends Job { setProperty(IProgressConstants.ICON_PROPERTY, TaskListImages.REPOSITORY_SYNCHRONIZE); for (final AbstractRepositoryTask repositoryTask : repositoryTasks) { - if (monitor.isCanceled()) + if (monitor.isCanceled()) { throw new OperationCanceledException(); + } - boolean canNotSynch = repositoryTask.isDirty(); - boolean hasLocalChanges = repositoryTask.getSyncState() == RepositoryTaskSyncState.OUTGOING - || repositoryTask.getSyncState() == RepositoryTaskSyncState.CONFLICT; - if (forceSync || (!canNotSynch && !hasLocalChanges) || !repositoryTask.isDownloaded()) { - monitor.setTaskName(LABEL_SYNCHRONIZING + repositoryTask.getDescription()); - // repositoryTask.setCurrentlySynchronizing(true); - TasksUiPlugin.getTaskListManager().getTaskList().notifyRepositoryInfoChanged(repositoryTask); - IOfflineTaskHandler offlineHandler = connector.getOfflineTaskHandler(); - if (offlineHandler != null) { - RepositoryTaskData downloadedTaskData = null; - try { - final TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository( - repositoryTask.getRepositoryKind(), repositoryTask.getRepositoryUrl()); - if (repository == null) { - throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, 0, - "Associated repository could not be found. Ensure proper repository configuration of " - + repositoryTask.getRepositoryUrl() + " in " - + TaskRepositoriesView.NAME + ".", null)); - } else { - String taskId = AbstractRepositoryTask.getTaskId(repositoryTask.getHandleIdentifier()); - downloadedTaskData = offlineHandler.downloadTaskData(repository, taskId, - TasksUiPlugin.getDefault().getProxySettings()); - } - } catch (final CoreException e) { - if (e.getStatus().getException() instanceof UnrecognizedReponseException) { - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { - public void run() { - WebBrowserDialog.openAcceptAgreement(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Unrecognized response from server", e.getStatus().getMessage(), e.getStatus().getException() - .getMessage()); - MylarStatusHandler.log(e.getStatus()); - } - }); - } else if (!forceSync && e.getStatus().getException() instanceof LoginException) { - MylarStatusHandler.log(e.getStatus().getException(), "Login credentials are invalid for "+repositoryTask.getRepositoryUrl()); - } else if(forceSync) { - MylarStatusHandler.fail(e.getStatus().getException(), "Unable to retrieve task#"+AbstractRepositoryTask.getTaskId(repositoryTask.getHandleIdentifier())+" from "+repositoryTask.getRepositoryUrl(), true, e.getStatus().getSeverity()); + repositoryTask.setStatus(null); + + try { + syncTask(monitor, repositoryTask); + } catch (final CoreException e) { + if (e.getStatus().getException() instanceof UnrecognizedReponseException) { + // TODO move this handler + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + public void run() { + WebBrowserDialog.openAcceptAgreement(PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getShell(), "Unrecognized response from server", e + .getStatus().getMessage(), e.getStatus().getException().getMessage()); + MylarStatusHandler.log(e.getStatus()); } - continue; - } - - if (downloadedTaskData != null) { - TasksUiPlugin.getSynchronizationManager().updateOfflineState(repositoryTask, - downloadedTaskData, forceSync); -// connector.updateTaskState(repositoryTask); - refreshEditors(repositoryTask); - } - } else { - connector.updateTaskState(repositoryTask); + }); + } else if (e.getStatus().getException() instanceof LoginException) { + MylarStatusHandler.fail(e, "Report download failed. Ensure proper repository configuration of " + + repositoryTask.getRepositoryUrl() + " in " + TaskRepositoriesView.NAME + ".", true); + repositoryTask.setStatus(e.getStatus()); + } else if (forceSync) { + MylarStatusHandler.log(e.getStatus().getException(), "Unable to retrieve task " + + AbstractRepositoryTask.getTaskId(repositoryTask.getHandleIdentifier()) + " from " + + repositoryTask.getRepositoryUrl()); + repositoryTask.setStatus(e.getStatus()); } - repositoryTask.setCurrentlySynchronizing(false); - TasksUiPlugin.getTaskListManager().getTaskList().notifyRepositoryInfoChanged(repositoryTask); - - } else { - repositoryTask.setCurrentlySynchronizing(false); } + repositoryTask.setCurrentlySynchronizing(false); + TasksUiPlugin.getTaskListManager().getTaskList().notifyRepositoryInfoChanged(repositoryTask); + monitor.worked(1); } // TasksUiPlugin.getDefault().getTaskListNotificationManager().startNotification(1); @@ -148,6 +124,42 @@ class SynchronizeTaskJob extends Job { return Status.OK_STATUS; } + private void syncTask(IProgressMonitor monitor, final AbstractRepositoryTask repositoryTask) throws LoginException, + CoreException { + boolean canNotSynch = repositoryTask.isDirty(); + boolean hasLocalChanges = repositoryTask.getSyncState() == RepositoryTaskSyncState.OUTGOING + || repositoryTask.getSyncState() == RepositoryTaskSyncState.CONFLICT; + if (forceSync || (!canNotSynch && !hasLocalChanges) || !repositoryTask.isDownloaded()) { + monitor.setTaskName(LABEL_SYNCHRONIZING + repositoryTask.getDescription()); + + final TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository( + repositoryTask.getRepositoryKind(), repositoryTask.getRepositoryUrl()); + if (repository == null) { + throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, 0, + "Associated repository could not be found. Ensure proper repository configuration of " + + repositoryTask.getRepositoryUrl() + " in " + TaskRepositoriesView.NAME + ".", null)); + } + + TasksUiPlugin.getTaskListManager().getTaskList().notifyRepositoryInfoChanged(repositoryTask); + IOfflineTaskHandler offlineHandler = connector.getOfflineTaskHandler(); + if (offlineHandler != null) { + String taskId = AbstractRepositoryTask.getTaskId(repositoryTask.getHandleIdentifier()); + RepositoryTaskData downloadedTaskData = offlineHandler.downloadTaskData(repository, taskId, + TasksUiPlugin.getDefault().getProxySettings()); + + if (downloadedTaskData != null) { + TasksUiPlugin.getSynchronizationManager().updateOfflineState(repositoryTask, downloadedTaskData, + forceSync); + refreshEditors(repositoryTask); + } else { + connector.updateTask(repository, repositoryTask); + } + } else { + connector.updateTask(repository, repositoryTask); + } + } + } + private void refreshEditors(final AbstractRepositoryTask repositoryTask) { // TODO: move out of SynchronizeTaskJob (but beware of race conditions) if (repositoryTask.getSyncState() == RepositoryTaskSyncState.INCOMING diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java index 08479adf8..7f7a9660b 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java @@ -107,8 +107,17 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector { } @Override - public void updateTaskState(AbstractRepositoryTask repositoryTask) { - // TODO Auto-generated method stub + public void updateTask(TaskRepository repository, AbstractRepositoryTask repositoryTask) throws CoreException { + if (repositoryTask instanceof TracTask) { + String id = AbstractRepositoryTask.getTaskId(repositoryTask.getHandleIdentifier()); + try { + ITracClient connection = getClientManager().getRepository(repository); + TracTicket ticket = connection.getTicket(Integer.parseInt(id)); + updateTaskDetails((TracTask) repositoryTask, ticket, false); + } catch (Exception e) { + throw new CoreException(TracCorePlugin.toStatus(e)); + } + } } @Override |