diff options
-rw-r--r-- | org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java | 3 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.core.tests/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewMappingStoreTest.java (renamed from org.eclipse.mylyn.reviews.core.tests/src/org/eclipse/mylyn/reviews/core/internal/TaskReviewMappingStoreTest.java) | 132 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/spi/ReviewsConnector.java | 13 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewsMappingsStore.java | 163 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/Messages.java | 2 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/ReviewsUiPlugin.java | 19 | ||||
-rw-r--r-- | org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/messages.properties | 1 |
7 files changed, 198 insertions, 135 deletions
diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java index dcd264093..d5cd8cd9c 100644 --- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java @@ -69,7 +69,7 @@ import com.google.gwtorm.server.StandardKeyEncoder; /** * The Gerrit connector core. - * + * * @author Mikael Kober * @author Thomas Westling * @author Sascha Scholz @@ -333,6 +333,7 @@ public class GerritConnector extends ReviewsConnector { taskData.getRoot().getAttribute(GerritTaskSchema.getDefault().REVIEW_STATE.getKey()).getValue()); task.setAttribute(ReviewsCoreConstants.VERIFIED, taskData.getRoot().getAttribute(GerritTaskSchema.getDefault().VERIFY_STATE.getKey()).getValue()); + super.updateTaskFromTaskData(taskRepository, task, taskData); } public GerritSystemInfo validate(TaskRepository repository, IProgressMonitor monitor) throws CoreException { diff --git a/org.eclipse.mylyn.reviews.core.tests/src/org/eclipse/mylyn/reviews/core/internal/TaskReviewMappingStoreTest.java b/org.eclipse.mylyn.reviews.core.tests/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewMappingStoreTest.java index 0bfecb08e..0f4831fe4 100644 --- a/org.eclipse.mylyn.reviews.core.tests/src/org/eclipse/mylyn/reviews/core/internal/TaskReviewMappingStoreTest.java +++ b/org.eclipse.mylyn.reviews.core.tests/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewMappingStoreTest.java @@ -9,8 +9,9 @@ * Blaine Lewis *******************************************************************************/ -package org.eclipse.mylyn.reviews.core.internal; +package org.eclipse.mylyn.reviews.internal.core; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -21,10 +22,11 @@ import java.util.Collection; import org.eclipse.core.runtime.CoreException; import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta; import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta.Kind; +import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; +import org.eclipse.mylyn.internal.tasks.core.TaskTask; import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager; import org.eclipse.mylyn.reviews.core.spi.ReviewsConnector; -import org.eclipse.mylyn.reviews.internal.core.TaskReviewsMappingsStore; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; @@ -45,9 +47,9 @@ public class TaskReviewMappingStoreTest { final String notATaskUrl = "www.hello.com"; - final ITask task1 = mock(ITask.class); + ITask task1; - final ITask task2 = mock(ITask.class); + ITask task2; final String reviewUrl1 = "https://git.eclipse.org/r/#/c/56269/"; @@ -71,28 +73,30 @@ public class TaskReviewMappingStoreTest { + " associated reviews Change-Id: I3a38d375688aad7be36bfd58c3311d692eb51ed " + notATaskUrl + " Signed-off-by: Blaine Lewis <Blaine1@ualberta.ca>"; - final ITask review1 = mock(ITask.class); + ITask review1; - final ITask review2 = mock(ITask.class); + ITask review2; - final ITask reviewNoTask = mock(ITask.class); + ITask reviewNoTask; private TaskDataManager taskDataManager; @Before public void setup() { + review1 = new TaskTask("reviewKind", reviewUrl1, "3"); + review1.setUrl(reviewUrl1); - when(review1.getUrl()).thenReturn(reviewUrl1); - when(review2.getUrl()).thenReturn(reviewUrl2); - when(reviewNoTask.getUrl()).thenReturn(reviewUrlNoTask); - when(task1.getUrl()).thenReturn(taskUrl1); - when(task2.getUrl()).thenReturn(taskUrl2); - when(task1.getTaskId()).thenReturn("1"); - when(task1.getTaskId()).thenReturn("2"); - when(review1.getTaskId()).thenReturn("3"); - when(review2.getTaskId()).thenReturn("4"); - when(reviewNoTask.getTaskId()).thenReturn("5"); + review2 = new TaskTask("reviewKind", reviewUrl2, "4"); + review2.setUrl(reviewUrl2); + reviewNoTask = new TaskTask("reviewKind", reviewUrlNoTask, "5"); + reviewNoTask.setUrl(reviewUrlNoTask); + + task1 = new TaskTask("reviewKind", taskUrl1, "1"); + task1.setUrl(taskUrl1); + + task2 = new TaskTask("reviewKind", taskUrl2, "2"); + task2.setUrl(taskUrl2); } public TaskReviewsMappingsStore getEmptyTaskReviewStore() { @@ -104,135 +108,185 @@ public class TaskReviewMappingStoreTest { when(repositoryManager.getConnectorForRepositoryTaskUrl(Matchers.anyString())).thenReturn(connector); when(repositoryManager.getRepositoryConnector(Matchers.anyString())).thenReturn(connector); - TaskReviewsMappingsStore taskReviewsMappingStore = new TaskReviewsMappingsStore(taskDataManager, + TaskReviewsMappingsStore taskReviewsMappingStore = new MockTaskReviewsMappingsStore(mock(TaskList.class), repositoryManager); + return taskReviewsMappingStore; } - public void addReviewData(ITask review, String description) throws CoreException { + public TaskData addReviewData(ITask review, String description) throws CoreException { TaskData reviewData = new TaskData(new TaskAttributeMapper(new TaskRepository("", "")), "", review.getUrl(), review.getTaskId()); reviewData.getRoot().createMappedAttribute(TaskAttribute.DESCRIPTION).setValue(description); when(taskDataManager.getTaskData(review)).thenReturn(reviewData); + + return reviewData; } @Test public void testAdd() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithTaskUrl1); + TaskData reviewData1 = addReviewData(review1, descriptionWithTaskUrl1); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl1).equals(taskUrl1)); + assertTrue(taskReviewsMappingStore.getTaskUrl(review1).equals(taskUrl1)); } @Test public void testAddTwice() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithTaskUrl1); + TaskData reviewData1 = addReviewData(review1, descriptionWithTaskUrl1); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); Collection<String> reviewUrls = taskReviewsMappingStore.getReviewUrls(taskUrl1); assertTrue(reviewUrls.contains(reviewUrl1)); assertTrue(reviewUrls.size() == 1); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl1).equals(taskUrl1)); + assertTrue(taskReviewsMappingStore.getTaskUrl(review1).equals(taskUrl1)); } @Test public void testAddMultiple() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithTaskUrl1); - addReviewData(review2, descriptionWithTaskUrl2); + TaskData reviewData1 = addReviewData(review1, descriptionWithTaskUrl1); + TaskData reviewData2 = addReviewData(review2, descriptionWithTaskUrl2); TaskContainerDelta delta1 = new TaskContainerDelta(review1, Kind.ADDED); TaskContainerDelta delta2 = new TaskContainerDelta(review2, Kind.ADDED); + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); + taskReviewsMappingStore.addTaskAssocation(review2, reviewData2); + taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta1, delta2)); assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl1).equals(taskUrl1)); + assertTrue(taskReviewsMappingStore.getTaskUrl(review1).equals(taskUrl1)); assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl2).contains(reviewUrl2)); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl2).equals(taskUrl2)); + assertTrue(taskReviewsMappingStore.getTaskUrl(review2).equals(taskUrl2)); } @Test public void testRemove() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithTaskUrl1); + TaskData reviewData1 = addReviewData(review1, descriptionWithTaskUrl1); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); + assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); delta = new TaskContainerDelta(review1, Kind.DELETED); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); + assertFalse(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl1) == null); + assertTrue(taskReviewsMappingStore.getTaskUrl(review1) == null); } @Test public void testUpdate() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithTaskUrl1); + TaskData reviewData1 = addReviewData(review1, descriptionWithTaskUrl1); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); + assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); - addReviewData(review1, descriptionWithTaskUrl2); + reviewData1 = addReviewData(review1, descriptionWithTaskUrl2); delta = new TaskContainerDelta(review1, Kind.CONTENT); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); + assertFalse(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl2).contains(reviewUrl1)); - + assertEquals(taskUrl2, taskReviewsMappingStore.getTaskUrl(review1)); } @Test public void testUpdateNoTask() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithTaskUrl1); + TaskData reviewData1 = addReviewData(review1, descriptionWithTaskUrl1); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); - assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); - addReviewData(review1, descriptionWithNoTaskUrl); + assertTrue(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); + reviewData1 = addReviewData(review1, descriptionWithNoTaskUrl); delta = new TaskContainerDelta(review1, Kind.CONTENT); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); + assertFalse(taskReviewsMappingStore.getReviewUrls(taskUrl1).contains(reviewUrl1)); + assertTrue(taskReviewsMappingStore.getTaskUrl(review1) == null); } @Test public void testAddNoTask() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithNoTaskUrl); + TaskData reviewData1 = addReviewData(review1, descriptionWithNoTaskUrl); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl1) == null); + + assertTrue(taskReviewsMappingStore.getTaskUrl(review1) == null); } @Test public void testAddANonTaskUrl() throws CoreException { TaskReviewsMappingsStore taskReviewsMappingStore = getEmptyTaskReviewStore(); - addReviewData(review1, descriptionWithNotATaskUrl); + TaskData reviewData1 = addReviewData(review1, descriptionWithNotATaskUrl); TaskContainerDelta delta = new TaskContainerDelta(review1, Kind.ADDED); + taskReviewsMappingStore.addTaskAssocation(review1, reviewData1); taskReviewsMappingStore.containersChanged(ImmutableSet.of(delta)); - assertTrue(taskReviewsMappingStore.getTaskUrl(reviewUrl1) == null); + assertTrue(taskReviewsMappingStore.getTaskUrl(review1) == null); + } + + class MockTaskReviewsMappingsStore extends TaskReviewsMappingsStore { + + public MockTaskReviewsMappingsStore(TaskList taskList, TaskRepositoryManager repositoryManager) { + super(taskList, repositoryManager); + } + + @Override + ITask getTaskByUrl(String url) { + switch (url) { + case taskUrl1: + return task1; + case taskUrl2: + return task2; + } + return null; + } + } } diff --git a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/spi/ReviewsConnector.java b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/spi/ReviewsConnector.java index 4e642156e..42486b2c5 100644 --- a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/spi/ReviewsConnector.java +++ b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/spi/ReviewsConnector.java @@ -15,8 +15,11 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.mylyn.reviews.core.spi.remote.RemoteFactoryProviderConfigurer; +import org.eclipse.mylyn.reviews.internal.core.TaskReviewsMappingsStore; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; +import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.TaskData; public abstract class ReviewsConnector extends AbstractRepositoryConnector { @@ -52,4 +55,14 @@ public abstract class ReviewsConnector extends AbstractRepositoryConnector { public RemoteFactoryProviderConfigurer getFactoryProviderConfigurer() { return factoryProviderConfigurer; } + + /** + * Subclasses should call super to update the task review mapping. + */ + @Override + public void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) { + if (TaskReviewsMappingsStore.getInstance() != null) { + TaskReviewsMappingsStore.getInstance().addTaskAssocation(task, taskData); + } + } } diff --git a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewsMappingsStore.java b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewsMappingsStore.java index 24d01be70..06f5fc964 100644 --- a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewsMappingsStore.java +++ b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewsMappingsStore.java @@ -3,17 +3,15 @@ package org.eclipse.mylyn.reviews.internal.core; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; -import java.util.Map.Entry; import java.util.Set; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener; import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta; +import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta.Kind; +import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; -import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager; +import org.eclipse.mylyn.internal.tasks.core.util.TasksCoreUtil; import org.eclipse.mylyn.reviews.core.spi.ReviewsConnector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.IRepositoryElement; @@ -21,6 +19,7 @@ import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.core.data.TaskData; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimaps; import com.google.common.collect.SetMultimap; @@ -30,68 +29,72 @@ import com.google.common.collect.SetMultimap; * TaskEditorReviewPart to give a table of the reviews pertaining to a task. The class is limited as it maps one task to * many reviews. It is however possible (albeit strange) to have multiple tasks for one review. This is a limitation by * design. - * + * * @author Blaine Lewis */ @SuppressWarnings("restriction") public class TaskReviewsMappingsStore implements ITaskListChangeListener { + static final String ATTR_ASSOCIATED_TASK = "org.eclipse.mylyn.associated.task"; //$NON-NLS-1$ private final SetMultimap<String, String> taskReviewsMap; private final TaskRepositoryManager repositoryManager; - private final TaskDataManager taskDataManager; + private final TaskList taskList; - public TaskReviewsMappingsStore(TaskDataManager taskDataManager, TaskRepositoryManager repositoryManager) { - //BUG: This class is actually really volatile at the moment we have no - // collision rules for if we serialize and deserialize at the same time. + private static TaskReviewsMappingsStore instance; + public TaskReviewsMappingsStore(TaskList taskList, TaskRepositoryManager repositoryManager) { + this.taskList = taskList; this.repositoryManager = repositoryManager; - this.taskDataManager = taskDataManager; taskReviewsMap = Multimaps.synchronizedSetMultimap(LinkedHashMultimap.<String, String> create()); } - /* - * Updates or adds a mapping given a reviewUrl and a taskDescription. If no URL is found in the description we do nothing. - */ - private void updateMapping(String reviewUrl, String reviewDescription) { - String oldTaskUrl = getTaskUrl(reviewUrl); - String newTaskUrl = this.extractTaskUrl(reviewDescription); - - if (newTaskUrl == null && oldTaskUrl != null) { - taskReviewsMap.remove(oldTaskUrl, reviewUrl); - } else if (newTaskUrl != null) { - if (oldTaskUrl != null && !oldTaskUrl.equals(newTaskUrl)) { - taskReviewsMap.remove(oldTaskUrl, reviewUrl); - } - if (newTaskUrl != null) { - taskReviewsMap.put(newTaskUrl, reviewUrl); + public void readFromTaskList() { + for (AbstractTask review : taskList.getAllTasks()) { + String task = getTaskUrl(review); + if (task != null) { + taskReviewsMap.put(review.getUrl(), task); } } } - public Collection<String> getReviewUrls(String taskUrl) { - return taskReviewsMap.get(taskUrl); + private void updateMapping(ITask review, String newTaskUrl) { + String reviewUrl = review.getUrl(); + String oldTaskUrl = getTaskUrl(review); + + if (oldTaskUrl != null && !oldTaskUrl.equals(newTaskUrl)) { + taskReviewsMap.remove(oldTaskUrl, reviewUrl); + } + taskReviewsMap.put(newTaskUrl, reviewUrl); + review.setAttribute(ATTR_ASSOCIATED_TASK, newTaskUrl); } /* * This method of extracting URLs is deficient because if we have "(www.helloworld.com)" it will be * a valid URL. This is difficult to format though so we won't handle that case. */ - private String extractTaskUrl(String description) { + public void addTaskAssocation(ITask review, TaskData taskData) { + TaskAttribute attr = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION); - for (String token : description.split("\\s+")) { //$NON-NLS-1$ - if (token.contains("://")) { //$NON-NLS-1$ + if (attr == null) { + return; + } + String oldTaskUrl = getTaskUrl(review); + String description = attr.getValue(); + for (String token : description.split("\\s+")) { //$NON-NLS-1$ + if (token.equals(oldTaskUrl)) { + return;// don't do expensive getTaskByUrl lookup if nothing changed + } else if (token.contains("://")) { //$NON-NLS-1$ try { - @SuppressWarnings("unused") - URL url = new URL(token); - - AbstractRepositoryConnector connector = repositoryManager.getConnectorForRepositoryTaskUrl(token); + new URL(token); + ITask task = getTaskByUrl(token); - if (connector != null) { - return token; + if (task != null) { + updateMapping(review, token); + return; } } catch (MalformedURLException e) { //Do nothing, this is expected behavior when there is no URL @@ -99,78 +102,58 @@ public class TaskReviewsMappingsStore implements ITaskListChangeListener { } } - return null; + deleteMappingsTo(review); } - public String getTaskUrl(String reviewUrlToFind) { - for (Entry<String, String> mapping : taskReviewsMap.entries()) { - int index = mapping.getValue().indexOf(reviewUrlToFind); + public String getTaskUrl(ITask review) { + return review.getAttribute(ATTR_ASSOCIATED_TASK); + } - if (index != -1) { - return mapping.getKey(); - } + public Collection<String> getReviewUrls(String taskUrl) { + synchronized (taskReviewsMap) { + return ImmutableSet.copyOf(taskReviewsMap.get(taskUrl)); } + } - return null; + ITask getTaskByUrl(String url) { + return TasksCoreUtil.getTaskByUrl(taskList, repositoryManager, url); } @Override public void containersChanged(Set<TaskContainerDelta> containers) { - for (TaskContainerDelta delta : containers) { - IRepositoryElement reviewRepoElement = delta.getElement(); - - if (!(reviewRepoElement instanceof ITask)) { - return; - } - - ITask review = (ITask) reviewRepoElement; - - AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(review.getConnectorKind()); - - if (review != null && connector instanceof ReviewsConnector) { - - try { - String reviewUrl = review.getUrl(); - - switch (delta.getKind()) { - case DELETED: - deleteMappingsTo(reviewUrl); - break; - case ADDED: - case CONTENT: - TaskData taskData = taskDataManager.getTaskData(review); + if (delta.getKind() == Kind.DELETED) { + IRepositoryElement reviewRepoElement = delta.getElement(); - if (taskData == null) { - continue; - } - - TaskAttribute attr = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION); + if (!(reviewRepoElement instanceof ITask)) { + continue; + } - if (attr == null) { - continue; - } - String reviewDescription = attr.getValue(); + ITask review = (ITask) reviewRepoElement; - updateMapping(reviewUrl, reviewDescription); - break; - } - } catch (CoreException e) { - StatusHandler.log( - new Status(IStatus.ERROR, ReviewsCoreConstants.PLUGIN_ID, "Error getting taskData.", e)); //$NON-NLS-1$ + //We need to check it in case the mapping was removed from the task + AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(review.getConnectorKind()); + if (review != null && connector instanceof ReviewsConnector) { + deleteMappingsTo(review); } } } } - private void deleteMappingsTo(String reviewUrl) { - String taskUrl = getTaskUrl(reviewUrl); + private void deleteMappingsTo(ITask review) { + String taskUrl = getTaskUrl(review); if (taskUrl != null) { - Set<String> reviews = taskReviewsMap.get(taskUrl); - if (reviews != null) { - reviews.remove(reviewUrl); - } + taskReviewsMap.remove(taskUrl, review.getUrl()); + review.setAttribute(ATTR_ASSOCIATED_TASK, null); } } + + public static void setInstance(TaskReviewsMappingsStore instance) { + TaskReviewsMappingsStore.instance = instance; + } + + public static TaskReviewsMappingsStore getInstance() { + return instance; + } }
\ No newline at end of file diff --git a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/Messages.java b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/Messages.java index d257c4358..4d6862110 100644 --- a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/Messages.java +++ b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/Messages.java @@ -64,6 +64,8 @@ public class Messages extends NLS { public static String ReviewsLabelProvider_X_Revision_Y; + public static String ReviewsUiPlugin_Updating_task_review_mapping; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/ReviewsUiPlugin.java b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/ReviewsUiPlugin.java index 663854f57..bc552422a 100644 --- a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/ReviewsUiPlugin.java +++ b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/ReviewsUiPlugin.java @@ -13,6 +13,7 @@ package org.eclipse.mylyn.internal.reviews.ui; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.reviews.internal.core.TaskReviewsMappingsStore; import org.eclipse.ui.plugin.AbstractUIPlugin; @@ -33,8 +34,6 @@ public class ReviewsUiPlugin extends AbstractUIPlugin { private TaskReviewsMappingsStore taskReviewsMappingStore; - private final String INITIALIZE_TASK_REVIEW_MAPPING_STORE_JOB = "initialize task review mapping store job"; //$NON-NLS-1$ - public ReviewsUiPlugin() { } @@ -45,13 +44,23 @@ public class ReviewsUiPlugin extends AbstractUIPlugin { reviewManager = new ActiveReviewManager(); //We need to schedule initialization otherwise TasksUiPlugin hasn't finished initialization. - UIJob job = new UIJob(INITIALIZE_TASK_REVIEW_MAPPING_STORE_JOB) { + UIJob job = new UIJob(Messages.ReviewsUiPlugin_Updating_task_review_mapping) { @Override public IStatus runInUIThread(IProgressMonitor monitor) { - taskReviewsMappingStore = new TaskReviewsMappingsStore(TasksUiPlugin.getTaskDataManager(), + taskReviewsMappingStore = new TaskReviewsMappingsStore(TasksUiPlugin.getTaskList(), TasksUiPlugin.getRepositoryManager()); - + TaskReviewsMappingsStore.setInstance(taskReviewsMappingStore); TasksUiPlugin.getTaskList().addChangeListener(taskReviewsMappingStore); + Job job = new Job(Messages.ReviewsUiPlugin_Updating_task_review_mapping) { + @Override + protected IStatus run(IProgressMonitor monitor) { + taskReviewsMappingStore.readFromTaskList(); + return Status.OK_STATUS; + } + }; + job.setSystem(true); + job.setUser(false); + job.schedule(); return Status.OK_STATUS; } }; diff --git a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/messages.properties b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/messages.properties index 8bee8b6e3..a60b8d401 100644 --- a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/messages.properties +++ b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/messages.properties @@ -31,3 +31,4 @@ ReviewsLabelProvider_X_dot_dot_dot={0}... ReviewsLabelProvider_X_drafts=\ \ [{0} drafts] ReviewsLabelProvider_X_renamed_from_Y_Z={0}\n renamed from: {1} {2} ReviewsLabelProvider_X_Revision_Y={0} Revision: {1} +ReviewsUiPlugin_Updating_task_review_mapping=Updating task review mapping |