Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBlaine Lewis2015-11-27 19:54:10 +0000
committerSam Davis2015-12-10 18:04:29 +0000
commit7ec7690d253aeafe01625501da8c054cbabbae33 (patch)
treec4417544052d1a1398c7d862f17754cdef6343c9
parent03a47c7ebc66e39a2526e453b541b7f5daba5790 (diff)
downloadorg.eclipse.mylyn.reviews-7ec7690d253aeafe01625501da8c054cbabbae33.tar.gz
org.eclipse.mylyn.reviews-7ec7690d253aeafe01625501da8c054cbabbae33.tar.xz
org.eclipse.mylyn.reviews-7ec7690d253aeafe01625501da8c054cbabbae33.zip
482534: [UCOSP] store task review mapping using attribute on review
ITasks Change-Id: I621893f4cfac6a59a03c61ed2599c21cf2f4b4c8 Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=482534 Signed-off-by: Blaine Lewis <Blaine1@ualberta.ca>
-rw-r--r--org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java3
-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.java13
-rw-r--r--org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/TaskReviewsMappingsStore.java163
-rw-r--r--org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/Messages.java2
-rw-r--r--org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/ReviewsUiPlugin.java19
-rw-r--r--org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/messages.properties1
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

Back to the top