diff options
author | mkersten | 2006-10-19 05:10:42 +0000 |
---|---|---|
committer | mkersten | 2006-10-19 05:10:42 +0000 |
commit | dae0cfd297541c0dbd352ba514f8b46c896f1256 (patch) | |
tree | 32aa07b3b037032bfb810efe19ddc40cead89654 | |
parent | 2cd0ef98de382fbc84e829c58a356e9be68907c3 (diff) | |
download | org.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
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 |