Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkersten2006-10-19 05:10:42 +0000
committermkersten2006-10-19 05:10:42 +0000
commitdae0cfd297541c0dbd352ba514f8b46c896f1256 (patch)
tree32aa07b3b037032bfb810efe19ddc40cead89654
parent2cd0ef98de382fbc84e829c58a356e9be68907c3 (diff)
downloadorg.eclipse.mylyn.tasks-dae0cfd297541c0dbd352ba514f8b46c896f1256.tar.gz
org.eclipse.mylyn.tasks-dae0cfd297541c0dbd352ba514f8b46c896f1256.tar.xz
org.eclipse.mylyn.tasks-dae0cfd297541c0dbd352ba514f8b46c896f1256.zip
NEW - bug 158674: When hits opened with overlapping queries not all hits become tasks
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java69
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListNotificationManagerTest.java6
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskReportGeneratorTest.java2
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java10
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryQuery.java48
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java2
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java2
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskList.java83
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java34
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java8
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java7
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQueryTest.java4
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java5
13 files changed, 164 insertions, 116 deletions
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java
index 7d1eeb192..6a94ddbbc 100644
--- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java
@@ -225,23 +225,35 @@ public class BugzillaRepositoryConnectorTest extends AbstractBugzillaTest {
}
-// public void testUniqueQueryHitObjects() {
-// init222();
-// BugzillaRepositoryQuery query1 = new BugzillaRepositoryQuery(IBugzillaConstants.TEST_BUGZILLA_222_URL,
-// "queryurl", "description1", "-1", taskList);
-// BugzillaQueryHit query1Hit = new BugzillaQueryHit(taskList, "description1", "P1",
-// IBugzillaConstants.TEST_BUGZILLA_222_URL, "1", null, "status");
-// query1.addHit(query1Hit, taskList);
-// taskList.addQuery(query1);
-//
-// BugzillaRepositoryQuery query2 = new BugzillaRepositoryQuery(IBugzillaConstants.TEST_BUGZILLA_222_URL,
-// "queryurl2", "description2", "-1", taskList);
-// BugzillaQueryHit query2Hit = new BugzillaQueryHit(taskList, "description2", "P1",
-// IBugzillaConstants.TEST_BUGZILLA_222_URL, "1", null, "status");
-// query2.addHit(query2Hit, taskList);
-// taskList.addQuery(query2);
-// assertEquals(2, taskList.getQueries().size());
-//
+ public void testUniqueQueryHitObjects() {
+ init222();
+ BugzillaRepositoryQuery query1 = new BugzillaRepositoryQuery(IBugzillaConstants.TEST_BUGZILLA_222_URL,
+ "queryurl", "description1", "-1", taskList);
+ BugzillaQueryHit query1Hit = new BugzillaQueryHit(taskList, "description1", "P1",
+ IBugzillaConstants.TEST_BUGZILLA_222_URL, "1", null, "status");
+ query1.addHit(query1Hit);
+ taskList.addQuery(query1);
+
+ BugzillaRepositoryQuery query2 = new BugzillaRepositoryQuery(IBugzillaConstants.TEST_BUGZILLA_222_URL,
+ "queryurl2", "description2", "-1", taskList);
+ BugzillaQueryHit query2Hit = new BugzillaQueryHit(taskList, "description2", "P1",
+ IBugzillaConstants.TEST_BUGZILLA_222_URL, "1", null, "status");
+ query2.addHit(query2Hit);
+ taskList.addQuery(query2);
+ assertEquals(2, taskList.getQueries().size());
+ assertEquals(1, taskList.getQueryHits().size());
+ for (AbstractQueryHit hit: query1.getHits()) {
+ for (AbstractQueryHit hit2: query2.getHits()) {
+ assertTrue(hit.getClass().equals(hit2.getClass()));
+ }
+ }
+
+ taskList.deleteQuery(query1);
+ taskList.deleteQuery(query2);
+ assertEquals(1, taskList.getQueryHits().size());
+ taskList.removeOrphanedHits();
+ assertEquals(0, taskList.getQueryHits().size());
+
// List<AbstractQueryHit> hitsForHandle = new ArrayList<AbstractQueryHit>();
// for (AbstractRepositoryQuery query : taskList.getQueries()) {
// AbstractQueryHit foundHit = query.findQueryHit(AbstractRepositoryTask.getHandle(
@@ -252,19 +264,18 @@ public class BugzillaRepositoryConnectorTest extends AbstractBugzillaTest {
// }
//
// // IF two queries have the same hit there should only be one instance of
-// // a hit for a given handle.
+// // a hit with a given handle.
// assertEquals(1, hitsForHandle.size());
-//
-// // IF two queries have the same hit there should only be one instance of
-// // a hit for a given handle.
-// // Note that getQueryHitsForHandle will always return a set of unique
-// // elements (even if there are duplicates among queries because
-// // it returns a set.
-// // assertEquals(1,
-// // taskList.getQueryHitsForHandle(AbstractRepositoryTask.getHandle(IBugzillaConstants.TEST_BUGZILLA_222_URL,
-// // "1")).size());
-//
-// }
+
+ // IF two queries have the same hit there should only be one instance of
+ // a hit for a given handle.
+ // Note that getQueryHitsForHandle will always return a set of unique
+ // elements (even if there are duplicates among queries because
+ // it returns a set.
+// assertEquals(1, taskList.getQueryHits(
+// AbstractRepositoryTask.getHandle(IBugzillaConstants.TEST_BUGZILLA_222_URL, "1")).size());
+
+ }
public void testAttachToExistingReport() throws Exception {
init222();
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListNotificationManagerTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListNotificationManagerTest.java
index 4b50abbe2..c364d0647 100644
--- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListNotificationManagerTest.java
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListNotificationManagerTest.java
@@ -100,7 +100,7 @@ public class TaskListNotificationManagerTest extends TestCase {
assertFalse(hit.isNotified());
BugzillaRepositoryQuery query = new BugzillaRepositoryQuery("https://bugs.eclipse.org/bugs", "queryUrl",
"description", "10", TasksUiPlugin.getTaskListManager().getTaskList());
- query.addHit(hit, TasksUiPlugin.getTaskListManager().getTaskList());
+ query.addHit(hit);
TasksUiPlugin.getTaskListManager().getTaskList().addQuery(query);
TaskListNotificationManager notificationManager = TasksUiPlugin.getDefault()
.getTaskListNotificationManager();
@@ -117,7 +117,7 @@ public class TaskListNotificationManagerTest extends TestCase {
assertFalse(hit.isNotified());
BugzillaRepositoryQuery query = new BugzillaRepositoryQuery("https://bugs.eclipse.org/bugs", "queryUrl",
"description", "10", TasksUiPlugin.getTaskListManager().getTaskList());
- query.addHit(hit, TasksUiPlugin.getTaskListManager().getTaskList());
+ query.addHit(hit);
TasksUiPlugin.getTaskListManager().getTaskList().addQuery(query);
TaskListNotificationManager notificationManager = TasksUiPlugin.getDefault()
.getTaskListNotificationManager();
@@ -130,7 +130,7 @@ public class TaskListNotificationManagerTest extends TestCase {
assertEquals(0, TasksUiPlugin.getTaskListManager().getTaskList().getQueries().size());
assertTrue(TasksUiPlugin.getTaskListManager().readExistingOrCreateNewList());
assertEquals(1, TasksUiPlugin.getTaskListManager().getTaskList().getQueries().size());
- BugzillaQueryHit hitLoaded = (BugzillaQueryHit)TasksUiPlugin.getTaskListManager().getTaskList().getQueryHitForHandle(hitHandle);
+ BugzillaQueryHit hitLoaded = (BugzillaQueryHit)TasksUiPlugin.getTaskListManager().getTaskList().getQueryHit(hitHandle);
assertNotNull(hitLoaded);
assertTrue(hitLoaded.isNotified());
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskReportGeneratorTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskReportGeneratorTest.java
index 661f3daac..8b61b89b5 100644
--- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskReportGeneratorTest.java
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskReportGeneratorTest.java
@@ -175,7 +175,7 @@ public class TaskReportGeneratorTest extends TestCase {
generator.run(new NullProgressMonitor());
assertEquals(0, generator.getAllCollectedTasks().size());
- bugQuery.addHit(new BugzillaQueryHit(null, "task1description", "low", "repositoryURL", "1", task1, "FIXED"), manager.getTaskList());
+ bugQuery.addHit(new BugzillaQueryHit(null, "task1description", "low", "repositoryURL", "1", task1, "FIXED"));
generator.run(new NullProgressMonitor());
assertEquals(0, generator.getAllCollectedTasks().size());
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java
index a2b0385c8..3b957e105 100644
--- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java
@@ -82,11 +82,13 @@ public class BugzillaQueryTest extends TestCase {
public void testCredentialsEncoding() throws IOException, BugzillaException, KeyManagementException,
GeneralSecurityException {
- String poundSignUTF8 = BugzillaServerFacade.addCredentials(IBugzillaConstants.TEST_BUGZILLA_222_URL, "UTF-8", "testUser", "£");
+ String poundSignUTF8 = BugzillaServerFacade.addCredentials(IBugzillaConstants.TEST_BUGZILLA_222_URL, "UTF-8",
+ "testUser", "£");
assertTrue(poundSignUTF8.endsWith("password=%C2%A3"));
- String poundSignISO = BugzillaServerFacade.addCredentials(IBugzillaConstants.TEST_BUGZILLA_222_URL, "ISO-8859-1", "testUser", "£");
+ String poundSignISO = BugzillaServerFacade.addCredentials(IBugzillaConstants.TEST_BUGZILLA_222_URL,
+ "ISO-8859-1", "testUser", "£");
assertFalse(poundSignISO.contains("%C2%A3"));
- assertTrue(poundSignISO.endsWith("password=%A3"));
+ assertTrue(poundSignISO.endsWith("password=%A3"));
}
public void testGetBug() throws Exception {
@@ -117,6 +119,8 @@ public class BugzillaQueryTest extends TestCase {
public void testQueryViaConnector() throws Exception {
String queryUrlString = repository.getUrl()
+ "/buglist.cgi?ctype=rdf&query_format=advanced&short_desc_type=allwordssubstr&short_desc=search-match-test&product=TestProduct&long_desc_type=substring&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&deadlinefrom=&deadlineto=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=&emailassigned_to2=1&emailreporter2=1&emailcc2=1&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=";
+
+ // holds onto actual hit objects
TaskList taskList = new TaskList();
QueryHitCollector collector = new QueryHitCollector(new TaskList());
BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector();
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryQuery.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryQuery.java
index 8c462f40d..02b03c2b3 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryQuery.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryQuery.java
@@ -24,7 +24,8 @@ public abstract class AbstractRepositoryQuery extends AbstractTaskContainer {
protected int maxHits;
- private Set<AbstractQueryHit> hits = new HashSet<AbstractQueryHit>();
+ //private Set<AbstractQueryHit> hits = new HashSet<AbstractQueryHit>();
+ private Set<String> hitHandles = new HashSet<String>();
protected String lastRefreshTimeStamp = "<never>";
@@ -32,6 +33,11 @@ public abstract class AbstractRepositoryQuery extends AbstractTaskContainer {
public abstract String getRepositoryKind();
+ /**
+ * Query must be added to tasklist or synchronization will result
+ * in empty result set due to removeOrphanedHits(). All hits
+ * that don't have a query in the tasklist are removed.
+ */
public AbstractRepositoryQuery(String description, TaskList taskList) {
super(description, taskList);
}
@@ -57,52 +63,54 @@ public abstract class AbstractRepositoryQuery extends AbstractTaskContainer {
}
public synchronized AbstractQueryHit findQueryHit(String handle) {
- if (handle != null) {
- for (AbstractQueryHit hit : hits) {
- if (handle.equals(hit.getHandleIdentifier())) {
- return hit;
- }
- }
+ if(hitHandles.contains(handle)) {
+ return taskList.getQueryHit(handle);
}
return null;
}
public synchronized Set<AbstractQueryHit> getHits() {
- return new HashSet<AbstractQueryHit>(hits);
+ return taskList.getQueryHits(hitHandles);
}
public synchronized void updateHits(List<AbstractQueryHit> newHits, TaskList taskList) {
- Set<AbstractQueryHit> oldHits = new HashSet<AbstractQueryHit>(hits);
- hits.clear();
+ Set<AbstractQueryHit> oldHits = getHits();
+ hitHandles.clear();
for (AbstractQueryHit oldHit : oldHits) {
if (newHits.contains(oldHit)) {
newHits.get(newHits.indexOf(oldHit)).setNotified(oldHit.isNotified);
}
}
for (AbstractQueryHit hit : newHits) {
- this.addHit(hit, taskList);
+ this.addHit(hit);
}
}
- public synchronized void addHit(AbstractQueryHit hit, TaskList taskList) {
- ITask correspondingTask = taskList.getTask(hit.getHandleIdentifier());
- if (correspondingTask instanceof AbstractRepositoryTask) {
- hit.setCorrespondingTask((AbstractRepositoryTask) correspondingTask);
- }
+ public synchronized void addHit(AbstractQueryHit hit) {
+ if(hit.getCorrespondingTask() == null) {
+ ITask correspondingTask = taskList.getTask(hit.getHandleIdentifier());
+ if (correspondingTask instanceof AbstractRepositoryTask) {
+ hit.setCorrespondingTask((AbstractRepositoryTask) correspondingTask);
+ }
+ }
+ // Always replace even if exists (may have new description etc.)
+ taskList.addQueryHit(hit);
+
+ // TODO: this is meaningless since only one hit object exists now
hit.setParent(this);
- hits.add(hit);
+ hitHandles.add(hit.getHandleIdentifier());
}
public synchronized void removeHit(AbstractQueryHit hit) {
- hits.remove(hit);
+ hitHandles.remove(hit.getHandleIdentifier());
}
public synchronized String getPriority() {
- if (hits.isEmpty()) {
+ if (hitHandles.isEmpty()) {
return Task.PriorityLevel.P1.toString();
}
String highestPriority = Task.PriorityLevel.P5.toString();
- for (AbstractQueryHit hit : hits) {
+ for (AbstractQueryHit hit : getHits()) {
if (highestPriority.compareTo(hit.getPriority()) > 0) {
highestPriority = hit.getPriority();
}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java
index f9d40381c..023b8a344 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskContainer.java
@@ -24,7 +24,7 @@ public abstract class AbstractTaskContainer implements ITaskListElement {
private Set<String> childHandles = new HashSet<String>();
- private TaskList taskList;
+ protected TaskList taskList;
/**
* Optional URL corresponding to the web resource associated with this container.
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java
index 7eef923f5..ed091e4d3 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java
@@ -552,7 +552,7 @@ public class DelegatingTaskExternalizer implements ITaskListExternalizer {
hit.setCorrespondingTask((AbstractRepositoryTask) correspondingTask);
}
- query.addHit(hit, taskList);
+ query.addHit(hit);
}
public List<ITaskListExternalizer> getDelegateExternalizers() {
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskList.java
index c56ca5f06..8da830438 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskList.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskList.java
@@ -37,6 +37,8 @@ public class TaskList {
private Map<String, ITask> tasks;
+ private Map<String, AbstractQueryHit> queryHits;
+
private TaskArchive archiveContainer;
private TaskCategory rootCategory;
@@ -56,6 +58,7 @@ public class TaskList {
*/
public void reset() {
tasks = new HashMap<String, ITask>();
+ queryHits = new HashMap<String, AbstractQueryHit>();
archiveContainer = new TaskArchive(this);
rootCategory = new TaskCategory(LABEL_ROOT, this);
categories = new HashSet<AbstractTaskContainer>();
@@ -209,7 +212,7 @@ public class TaskList {
}
public void deleteQuery(AbstractRepositoryQuery query) {
- queries.remove(query);
+ queries.remove(query);
for (ITaskListChangeListener listener : changeListeners) {
listener.containerDeleted(query);
}
@@ -354,22 +357,6 @@ public class TaskList {
return null;
}
- /**
- * NOTE: will only return first occurrence of the hit in the first category
- * it is matched in.
- */
- public AbstractQueryHit getQueryHitForHandle(String handle) {
- if (handle != null) {
- for (AbstractRepositoryQuery query : queries) {
- AbstractQueryHit foundHit = query.findQueryHit(handle);
- if (foundHit != null) {
- return foundHit;
- }
- }
- }
- return null;
- }
-
public boolean isEmpty() {
boolean archiveIsEmpty = getCategories().size() == 1
&& getCategories().iterator().next().equals(archiveContainer)
@@ -414,6 +401,38 @@ public class TaskList {
return queriesForHandle;
}
+ /** if handle == null or no query hits found an empty set is returned * */
+ public Set<AbstractQueryHit> getQueryHits(Set<String> handles) {
+ if (handles == null) {
+ return Collections.emptySet();
+ }
+ HashSet<AbstractQueryHit> result = new HashSet<AbstractQueryHit>();
+ for (String handle : handles) {
+ AbstractQueryHit hit = queryHits.get(handle);
+ if(hit != null) {
+ result.add(queryHits.get(handle));
+ }
+ }
+ return result;
+ }
+
+ public AbstractQueryHit getQueryHit(String handle) {
+ if (handle != null) {
+ return queryHits.get(handle);
+ }
+ return null;
+ }
+
+ /** for testing */
+ public Set<AbstractQueryHit> getQueryHits() {
+ return new HashSet<AbstractQueryHit>(queryHits.values());
+ }
+
+ /** called by AbstractRepositoryQuery */
+ public void addQueryHit(AbstractQueryHit hit) {
+ queryHits.put(hit.getHandleIdentifier(), hit);
+ }
+
/**
* return all queries for the given repository url
*/
@@ -447,21 +466,6 @@ public class TaskList {
return repositoryTasks;
}
- /** if handle == null or no query hits found an empty set is returned * */
- public Set<AbstractQueryHit> getQueryHitsForHandle(String handle) {
- if (handle == null) {
- return Collections.emptySet();
- }
- Set<AbstractQueryHit> hitsForHandle = new HashSet<AbstractQueryHit>();
- for (AbstractRepositoryQuery query : queries) {
- AbstractQueryHit foundHit = query.findQueryHit(handle);
- if (foundHit != null) {
- hitsForHandle.add(foundHit);
- }
- }
- return hitsForHandle;
- }
-
/**
* Exposed for unit testing
*
@@ -545,4 +549,19 @@ public class TaskList {
}
return max;
}
+
+ /**
+ * Orphaned hits arise when no query in the tasklist references a hit in the
+ * master list maintained by the tasklist. Orphaned hits don't span workbench
+ * re-start but this just helps maintain the list in case of prolonged
+ * workbench uptime.
+ */
+ public void removeOrphanedHits() {
+ for (String handle : new HashSet<String>(queryHits.keySet())) {
+ Set<AbstractRepositoryQuery> queries = getQueriesForHandle(handle);
+ if (queries == null || queries.isEmpty()) {
+ queryHits.remove(handle);
+ }
+ }
+ }
}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java
index f4000e72d..dcda1fac8 100644
--- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java
@@ -398,7 +398,7 @@ public class TaskListManagerTest extends TestCase {
MockRepositoryQuery query = new MockRepositoryQuery("query", taskList);
MockQueryHit hit = new MockQueryHit(repositoryUrl, task.getDescription(), "1");
hit.setCorrespondingTask(task);
- query.addHit(new MockQueryHit(repositoryUrl, task.getDescription(), "1"), manager.getTaskList());
+ query.addHit(new MockQueryHit(repositoryUrl, task.getDescription(), "1"));
taskList.addQuery(query);
assertEquals(1, taskList.getAllTasks().size());
assertEquals(1, taskList.getRootTasks().size());
@@ -578,14 +578,14 @@ public class TaskListManagerTest extends TestCase {
MockRepositoryQuery query1 = new MockRepositoryQuery("query1", manager.getTaskList());
MockRepositoryQuery query2 = new MockRepositoryQuery("query2", manager.getTaskList());
- query1.addHit(hit1, manager.getTaskList());
- query1.addHit(hit2, manager.getTaskList());
- query1.addHit(hit3, manager.getTaskList());
+ query1.addHit(hit1);
+ query1.addHit(hit2);
+ query1.addHit(hit3);
assertEquals(query1.getHits().size(), 3);
- query2.addHit(hit1twin, manager.getTaskList());
- query2.addHit(hit2twin, manager.getTaskList());
- query2.addHit(hit3twin, manager.getTaskList());
+ query2.addHit(hit1twin);
+ query2.addHit(hit2twin);
+ query2.addHit(hit3twin);
assertEquals(query2.getHits().size(), 3);
manager.getTaskList().addQuery(query1);
@@ -599,8 +599,10 @@ public class TaskListManagerTest extends TestCase {
assertTrue(queriesReturned.contains(query1));
assertTrue(queriesReturned.contains(query2));
- Set<AbstractQueryHit> hitsReturned = taskList.getQueryHitsForHandle(AbstractRepositoryTask.getHandle(
+ Set<String> handles = new HashSet<String>();
+ handles.add(AbstractRepositoryTask.getHandle(
"repositoryURL", 2));
+ Set<AbstractQueryHit> hitsReturned = taskList.getQueryHits(handles);
assertNotNull(hitsReturned);
assertEquals(1, hitsReturned.size());
assertTrue(hitsReturned.contains(hit2));
@@ -612,7 +614,7 @@ public class TaskListManagerTest extends TestCase {
MockQueryHit hit1 = new MockQueryHit(MOCK_REPOSITORY_URL, "description1", "1");
assertNull(hit1.getParent());
MockRepositoryQuery query1 = new MockRepositoryQuery("query1", manager.getTaskList());
- query1.addHit(hit1, manager.getTaskList());
+ query1.addHit(hit1);
assertEquals(query1, hit1.getParent());
}
@@ -629,9 +631,9 @@ public class TaskListManagerTest extends TestCase {
MockRepositoryQuery query1 = new MockRepositoryQuery("query1", manager.getTaskList());
- query1.addHit(hit1, manager.getTaskList());
- query1.addHit(hit2, manager.getTaskList());
- query1.addHit(hit3, manager.getTaskList());
+ query1.addHit(hit1);
+ query1.addHit(hit2);
+ query1.addHit(hit3);
assertEquals(3, query1.getHits().size());
List<AbstractQueryHit> newHits = new ArrayList<AbstractQueryHit>();
query1.updateHits(newHits, manager.getTaskList());
@@ -712,8 +714,8 @@ public class TaskListManagerTest extends TestCase {
MockQueryHit hit1 = new MockQueryHit(repositoryUrl, "description", "1");
MockQueryHit hit2 = new MockQueryHit(repositoryUrl, "description", "2");
MockRepositoryQuery query = new MockRepositoryQuery("description", manager.getTaskList());
- query.addHit(hit1, manager.getTaskList());
- query.addHit(hit2, manager.getTaskList());
+ query.addHit(hit1);
+ query.addHit(hit2);
manager.getTaskList().addQuery(query);
elements.clear();
@@ -748,8 +750,8 @@ public class TaskListManagerTest extends TestCase {
MockQueryHit hit1 = new MockQueryHit(repositoryUrl, "description", "1");
MockQueryHit hit2 = new MockQueryHit(repositoryUrl, "description", "2");
MockRepositoryQuery query = new MockRepositoryQuery("description", manager.getTaskList());
- query.addHit(hit1, manager.getTaskList());
- query.addHit(hit2, manager.getTaskList());
+ query.addHit(hit1);
+ query.addHit(hit2);
manager.getTaskList().addQuery(query);
elements.clear();
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java
index 6c9424fd1..70aa141b2 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java
@@ -166,9 +166,8 @@ public class TaskListContentProvider implements IStructuredContentProvider, ITre
private boolean shouldAlwaysShow(AbstractTaskContainer container) {
for (ITask task : container.getChildren()) {
if (shouldAlwaysShow(task)) {
- if (container instanceof TaskArchive) {
- Set<AbstractQueryHit> existingHits = TasksUiPlugin.getTaskListManager().getTaskList().getQueryHitsForHandle(task.getHandleIdentifier());
- if (existingHits.isEmpty()) {
+ if (container instanceof TaskArchive) {
+ if (TasksUiPlugin.getTaskListManager().getTaskList().getQueryHit(task.getHandleIdentifier()) != null) {
return true;
}
} else {
@@ -197,8 +196,7 @@ public class TaskListContentProvider implements IStructuredContentProvider, ITre
for (ITask task : ((AbstractTaskContainer) parent).getChildren()) {
if (shouldAlwaysShow(task)) {
// TODO: archive logic?
- Set<AbstractQueryHit> existingHits = TasksUiPlugin.getTaskListManager().getTaskList().getQueryHitsForHandle(task.getHandleIdentifier());
- if (existingHits.isEmpty()) {
+ if (TasksUiPlugin.getTaskListManager().getTaskList().getQueryHit(task.getHandleIdentifier()) == null) {
children.add(task);
}
}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java
index 1fc3724a0..4fa0e2f17 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java
@@ -86,7 +86,7 @@ class SynchronizeQueryJob extends Job {
repositoryQuery.updateHits(collector.getHits(), taskList);
if (synchTasks) {
// TODO: Should sync changed per repository not per
- // query
+ // query
TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository);
}
} else if (!(resultingStatus.getException() instanceof IOException)) {
@@ -109,6 +109,11 @@ class SynchronizeQueryJob extends Job {
TasksUiPlugin.getTaskListManager().getTaskList().notifyContainerUpdated(repositoryQuery);
monitor.worked(1);
}
+
+ if (queries != null && queries.size() > 0) {
+ taskList.removeOrphanedHits();
+ }
+
return Status.OK_STATUS;
}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQueryTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQueryTest.java
index c4619561f..9e7a309de 100644
--- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQueryTest.java
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQueryTest.java
@@ -39,7 +39,7 @@ public class TracRepositoryQueryTest extends TestCase {
TracSearch search = new TracSearch();
String queryUrl = repository.getUrl() + ITracClient.QUERY_URL + search.toUrl();
- TracRepositoryQuery query = new TracRepositoryQuery(repository.getUrl(), queryUrl, "description", null);
+ TracRepositoryQuery query = new TracRepositoryQuery(repository.getUrl(), queryUrl, "description", TasksUiPlugin.getTaskListManager().getTaskList());
TasksUiPlugin.getTaskListManager().getTaskList().addQuery(query);
String oldUrl = repository.getUrl();
@@ -55,7 +55,7 @@ public class TracRepositoryQueryTest extends TestCase {
String repositoryUrl = "https://foo.bar/repo";
String parameterUrl = "&status=new&status=assigned&status=reopened&milestone=0.1";
String queryUrl = repositoryUrl + ITracClient.QUERY_URL + parameterUrl;
- TracRepositoryQuery query = new TracRepositoryQuery(repositoryUrl, queryUrl, "description", null);
+ TracRepositoryQuery query = new TracRepositoryQuery(repositoryUrl, queryUrl, "description", TasksUiPlugin.getTaskListManager().getTaskList());
TracSearch filterList = query.getTracSearch();
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java
index 11f716a8e..f92ba5712 100644
--- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java
@@ -15,6 +15,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.mylar.context.core.MylarStatusHandler;
import org.eclipse.mylar.internal.tasks.ui.editors.MylarTaskEditor;
import org.eclipse.mylar.internal.tasks.ui.editors.NewBugEditorInput;
@@ -79,8 +80,8 @@ public class NewTracTaskEditor extends MylarTaskEditor {
@Override
public void doSave(IProgressMonitor monitor) {
- // ignore
-
+ MessageDialog.openWarning(this.newBugEditor.getSite().getShell(), "Operation not supported", "Save of un-submitted new tasks is not currently supported.\nPlease submit all new tasks.");
+ monitor.setCanceled(true);
}
@Override

Back to the top