diff options
12 files changed, 198 insertions, 178 deletions
diff --git a/org.eclipse.mylyn.bugzilla.core/plugin.xml b/org.eclipse.mylyn.bugzilla.core/plugin.xml index 12c42ad81..62fd94b4d 100644 --- a/org.eclipse.mylyn.bugzilla.core/plugin.xml +++ b/org.eclipse.mylyn.bugzilla.core/plugin.xml @@ -2,5 +2,12 @@ <?eclipse version="3.2"?> <plugin> <extension-point id="languages" name="languages" schema="schema/languages.exsd"/> - +<extension + point="org.eclipse.mylyn.tasks.ui.duplicateDetectors"> + <detector + class="org.eclipse.mylyn.internal.bugzilla.core.StackTraceDuplicateDetector" + kind="bugzilla" + name="Stack Trace"> + </detector> + </extension> </plugin> diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/StackTraceDuplicateDetector.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/StackTraceDuplicateDetector.java index 92e18a6db..9f7a36924 100644 --- a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/StackTraceDuplicateDetector.java +++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/StackTraceDuplicateDetector.java @@ -5,22 +5,18 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.mylyn.internal.bugzilla.ui; +package org.eclipse.mylyn.internal.bugzilla.core; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryQuery; import org.eclipse.mylyn.monitor.core.StatusHandler; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; import org.eclipse.mylyn.tasks.core.RepositoryTaskData; import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.AbstractDuplicateDetector; -import org.eclipse.mylyn.tasks.ui.TasksUi; -import org.eclipse.mylyn.tasks.ui.editors.AbstractNewRepositoryTaskEditor; -import org.eclipse.mylyn.tasks.ui.search.SearchHitCollector; /** * @author Meghan Allen @@ -29,18 +25,18 @@ public class StackTraceDuplicateDetector extends AbstractDuplicateDetector { private static final int DESCRIPTION_MAX_CHARS = 6000; - private static final String NO_STACK_MESSAGE = "Unable to locate a stack trace in the description text."; + //private static final String NO_STACK_MESSAGE = "Unable to locate a stack trace in the description text."; @Override - public SearchHitCollector getSearchHitCollector(TaskRepository repository, RepositoryTaskData taskData) { + public AbstractRepositoryQuery getDiplicatesQuery(TaskRepository repository, RepositoryTaskData taskData) { String queryUrl = ""; - String searchString = AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(taskData.getDescription()); + String searchString = AbstractDuplicateDetector.getStackTraceFromDescription(taskData.getDescription()); if (searchString != null && searchString.length() > DESCRIPTION_MAX_CHARS) { searchString = searchString.substring(0, DESCRIPTION_MAX_CHARS); } if (searchString == null) { - MessageDialog.openWarning(null, "No Stack Trace Found", NO_STACK_MESSAGE); + //MessageDialog.openWarning(null, "No Stack Trace Found", NO_STACK_MESSAGE); return null; } @@ -48,17 +44,14 @@ public class StackTraceDuplicateDetector extends AbstractDuplicateDetector { queryUrl = repository.getRepositoryUrl() + "/buglist.cgi?long_desc_type=allwordssubstr&long_desc=" + URLEncoder.encode(searchString, repository.getCharacterEncoding()); } catch (UnsupportedEncodingException e) { - StatusHandler.log(new Status(IStatus.WARNING, BugzillaUiPlugin.PLUGIN_ID, "Error during duplicate detection", e)); + StatusHandler.log(new Status(IStatus.WARNING, BugzillaCorePlugin.PLUGIN_ID, "Error during duplicate detection", e)); return null; } queryUrl += "&product=" + taskData.getProduct(); BugzillaRepositoryQuery bugzillaQuery = new BugzillaRepositoryQuery(repository.getRepositoryUrl(), queryUrl, "search"); - - SearchHitCollector collector = new SearchHitCollector(TasksUi.getTaskListManager().getTaskList(), - repository, bugzillaQuery); - return collector; + return bugzillaQuery; } } diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/DuplicateDetetionTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/DuplicateDetetionTest.java index aaec5eb7c..ecca61ed3 100644 --- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/DuplicateDetetionTest.java +++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/DuplicateDetetionTest.java @@ -15,10 +15,10 @@ import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin; import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants; import org.eclipse.mylyn.internal.bugzilla.ui.editor.NewBugzillaTaskEditor; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.RepositoryTaskData; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; -import org.eclipse.mylyn.tasks.ui.editors.AbstractNewRepositoryTaskEditor; import org.eclipse.mylyn.tasks.ui.editors.NewTaskEditorInput; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; import org.eclipse.ui.IWorkbenchPage; @@ -72,7 +72,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertNull(AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription())); + assertNull(AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription())); editor.markDirty(false); editor.close(); @@ -95,7 +95,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); @@ -125,7 +125,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); @@ -156,7 +156,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); @@ -183,7 +183,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); @@ -208,7 +208,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); @@ -236,7 +236,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); @@ -262,7 +262,7 @@ public class DuplicateDetetionTest extends TestCase { TaskEditor taskEditor = (TaskEditor) page.getActiveEditor(); NewBugzillaTaskEditor editor = (NewBugzillaTaskEditor) taskEditor.getActivePageInstance(); - assertEquals(stackTrace, AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(model.getDescription()) + assertEquals(stackTrace, AbstractDuplicateDetector.getStackTraceFromDescription(model.getDescription()) .trim()); editor.markDirty(false); diff --git a/org.eclipse.mylyn.bugzilla.ui/plugin.xml b/org.eclipse.mylyn.bugzilla.ui/plugin.xml index 3be9889a3..949236c24 100644 --- a/org.eclipse.mylyn.bugzilla.ui/plugin.xml +++ b/org.eclipse.mylyn.bugzilla.ui/plugin.xml @@ -71,15 +71,5 @@ <newWizardShortcut id="org.eclipse.mylyn.bugzilla.bugWizard"/> </perspectiveExtension> </extension> - - - <extension - point="org.eclipse.mylyn.tasks.ui.duplicateDetectors"> - <detector - class="org.eclipse.mylyn.internal.bugzilla.ui.StackTraceDuplicateDetector" - kind="bugzilla" - name="Stack Trace"> - </detector> - </extension> </plugin> diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java new file mode 100644 index 000000000..41ee0dea0 --- /dev/null +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Mylyn project committers and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.core; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Extend to provide task duplicate detection facilities to the task editor (e.g. Java stack trace matching). + * + * @author Gail Murphy + * @since 2.0 + */ +public abstract class AbstractDuplicateDetector { + + protected String name; + + protected String kind; + + public abstract AbstractRepositoryQuery getDiplicatesQuery(TaskRepository repository, RepositoryTaskData taskData); + + public void setName(String name) { + this.name = name; + } + + public void setKind(String kind) { + this.kind = kind; + } + + public String getName() { + return this.name; + } + + public String getKind() { + return this.kind; + } + + /** + * TODO: Move to a core utility class + */ + public static String getStackTraceFromDescription(String description) { + String stackTrace = null; + + if (description == null) { + return null; + } + + String punct = "!\"#$%&'\\(\\)*+,-./:;\\<=\\>?@\\[\\]^_`\\{|\\}~\n"; + String lineRegex = " *at\\s+[\\w" + punct + "]+ ?\\(.*\\) *\n?"; + Pattern tracePattern = Pattern.compile(lineRegex); + Matcher match = tracePattern.matcher(description); + + if (match.find()) { + // record the index of the first stack trace line + int start = match.start(); + int lastEnd = match.end(); + + // find the last stack trace line + while (match.find()) { + lastEnd = match.end(); + } + + // make sure there's still room to find the exception + if (start <= 0) { + return null; + } + + // count back to the line before the stack trace to find the + // exception + int stackStart = 0; + int index = start - 1; + while (index > 1 && description.charAt(index) == ' ') { + index--; + } + + // locate the exception line index + stackStart = description.substring(0, index - 1).lastIndexOf("\n"); + stackStart = (stackStart == -1) ? 0 : stackStart + 1; + + stackTrace = description.substring(stackStart, lastEnd); + } + + return stackTrace; + } + +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java index f95516fe7..336ce0020 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java @@ -60,6 +60,7 @@ import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader; import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView; import org.eclipse.mylyn.monitor.core.StatusHandler; import org.eclipse.mylyn.tasks.core.AbstractAttributeFactory; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; import org.eclipse.mylyn.tasks.core.AbstractTask; @@ -74,7 +75,6 @@ import org.eclipse.mylyn.tasks.core.TaskComment; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.AbstractTask.PriorityLevel; import org.eclipse.mylyn.tasks.core.AbstractTask.RepositoryTaskSyncState; -import org.eclipse.mylyn.tasks.ui.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java index 87d7caf31..fbd542e70 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java @@ -19,9 +19,11 @@ import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; import org.eclipse.mylyn.tasks.core.IdentityAttributeFactory; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; -import org.eclipse.mylyn.tasks.ui.AbstractDuplicateDetector; +import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.search.SearchHitCollector; import org.eclipse.search.ui.NewSearchUI; import org.eclipse.swt.SWT; @@ -122,13 +124,13 @@ public class TaskEditorDescriptionPart extends TaskEditorRichTextPart { toolBar.add(replyAction); } - protected SearchHitCollector getDuplicateSearchCollector(String name) { + protected AbstractRepositoryQuery getDuplicateSearchCollector(String name) { String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name; Set<AbstractDuplicateDetector> allDetectors = getDuplicateSearchCollectorsList(); for (AbstractDuplicateDetector detector : allDetectors) { if (detector.getName().equals(duplicateDetectorName)) { - return detector.getSearchHitCollector(getTaskEditorPage().getTaskRepository(), + return detector.getDiplicatesQuery(getTaskEditorPage().getTaskRepository(), TaskDataUtil.toLegacyData(getTaskData(), IdentityAttributeFactory.getInstance())); } } @@ -149,10 +151,14 @@ public class TaskEditorDescriptionPart extends TaskEditorRichTextPart { } public boolean searchForDuplicates(String duplicateDetectorName) { - SearchHitCollector collector = getDuplicateSearchCollector(duplicateDetectorName); - if (collector != null) { - NewSearchUI.runQueryInBackground(collector); - return true; + AbstractRepositoryQuery duplicatesQuery = getDuplicateSearchCollector(duplicateDetectorName); + if (duplicatesQuery != null) { + SearchHitCollector collector = new SearchHitCollector(TasksUi.getTaskListManager().getTaskList(), + getTaskEditorPage().getTaskRepository(), duplicatesQuery); + if (collector != null) { + NewSearchUI.runQueryInBackground(collector); + return true; + } } return false; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractDuplicateDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractDuplicateDetector.java deleted file mode 100644 index 721928d3e..000000000 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractDuplicateDetector.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2007 Mylyn project committers and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ - -package org.eclipse.mylyn.tasks.ui; - -import org.eclipse.mylyn.tasks.core.RepositoryTaskData; -import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.search.SearchHitCollector; - -/** - * Extend to provide task duplicate detection facilities to the task editor (e.g. Java stack trace matching). - * - * @author Gail Murphy - * @since 2.0 - */ -public abstract class AbstractDuplicateDetector { - - protected String name; - - protected String kind; - - public abstract SearchHitCollector getSearchHitCollector(TaskRepository repository, RepositoryTaskData taskData); - - public void setName(String name) { - this.name = name; - } - - public void setKind(String kind) { - this.kind = kind; - } - - public String getName() { - return this.name; - } - - public String getKind() { - return this.kind; - } - -} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java index a4fc7a6f7..5928abfeb 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java @@ -12,8 +12,6 @@ import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -518,51 +516,6 @@ public abstract class AbstractNewRepositoryTaskEditor extends AbstractRepository return; } - public static String getStackTraceFromDescription(String description) { - String stackTrace = null; - - if (description == null) { - return null; - } - - String punct = "!\"#$%&'\\(\\)*+,-./:;\\<=\\>?@\\[\\]^_`\\{|\\}~\n"; - String lineRegex = " *at\\s+[\\w" + punct + "]+ ?\\(.*\\) *\n?"; - Pattern tracePattern = Pattern.compile(lineRegex); - Matcher match = tracePattern.matcher(description); - - if (match.find()) { - // record the index of the first stack trace line - int start = match.start(); - int lastEnd = match.end(); - - // find the last stack trace line - while (match.find()) { - lastEnd = match.end(); - } - - // make sure there's still room to find the exception - if (start <= 0) { - return null; - } - - // count back to the line before the stack trace to find the - // exception - int stackStart = 0; - int index = start - 1; - while (index > 1 && description.charAt(index) == ' ') { - index--; - } - - // locate the exception line index - stackStart = description.substring(0, index - 1).lastIndexOf("\n"); - stackStart = (stackStart == -1) ? 0 : stackStart + 1; - - stackTrace = description.substring(stackStart, lastEnd); - } - - return stackTrace; - } - @Override public boolean searchForDuplicates() { // called so that the description text is set on taskData before we diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java index 89ceb8b7c..065d4e6a9 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java @@ -101,7 +101,9 @@ import org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink; import org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction; import org.eclipse.mylyn.monitor.core.DateUtil; import org.eclipse.mylyn.monitor.core.StatusHandler; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; import org.eclipse.mylyn.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.AbstractTaskCategory; import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; @@ -116,7 +118,6 @@ import org.eclipse.mylyn.tasks.core.TaskComment; import org.eclipse.mylyn.tasks.core.TaskContainerDelta; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.AbstractTask.RepositoryTaskSyncState; -import org.eclipse.mylyn.tasks.ui.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; @@ -1194,20 +1195,20 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { // } } - protected SearchHitCollector getDuplicateSearchCollector(String name) { + protected AbstractDuplicateDetector getDuplicateDetector(String name) { String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name; - Set<AbstractDuplicateDetector> allDetectors = getDuplicateSearchCollectorsList(); + Set<AbstractDuplicateDetector> allDetectors = getDuplicateDetectorList(); for (AbstractDuplicateDetector detector : allDetectors) { if (detector.getName().equals(duplicateDetectorName)) { - return detector.getSearchHitCollector(repository, taskData); + return detector; } } // didn't find it return null; } - protected Set<AbstractDuplicateDetector> getDuplicateSearchCollectorsList() { + protected Set<AbstractDuplicateDetector> getDuplicateDetectorList() { Set<AbstractDuplicateDetector> duplicateDetectors = new HashSet<AbstractDuplicateDetector>(); for (AbstractDuplicateDetector abstractDuplicateDetector : TasksUiPlugin.getDefault() .getDuplicateSearchCollectorsList()) { @@ -1221,11 +1222,15 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { public boolean searchForDuplicates() { String duplicateDetectorName = duplicateDetectorChooser.getItem(duplicateDetectorChooser.getSelectionIndex()); - - SearchHitCollector collector = getDuplicateSearchCollector(duplicateDetectorName); - if (collector != null) { - NewSearchUI.runQueryInBackground(collector); - return true; + AbstractDuplicateDetector duplicateDetector = getDuplicateDetector(duplicateDetectorName); + if (duplicateDetector != null) { + AbstractRepositoryQuery duplicatesQuery = duplicateDetector.getDiplicatesQuery(repository, taskData); + if (duplicatesQuery != null) { + SearchHitCollector collector = new SearchHitCollector(TasksUi.getTaskListManager().getTaskList(), + repository, duplicatesQuery); + NewSearchUI.runQueryInBackground(collector); + return true; + } } return false; @@ -1892,8 +1897,8 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { protected void addDuplicateDetection(Composite composite) { List<AbstractDuplicateDetector> allCollectors = new ArrayList<AbstractDuplicateDetector>(); - if (getDuplicateSearchCollectorsList() != null) { - allCollectors.addAll(getDuplicateSearchCollectorsList()); + if (getDuplicateDetectorList() != null) { + allCollectors.addAll(getDuplicateDetectorList()); } if (!allCollectors.isEmpty()) { Section duplicatesSection = toolkit.createSection(composite, ExpandableComposite.TWISTIE 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 2c3cad1c7..462e7471d 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 @@ -11,15 +11,9 @@ package org.eclipse.mylyn.internal.trac.ui.editor; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.mylyn.internal.trac.core.ITracClient; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; -import org.eclipse.mylyn.internal.trac.core.model.TracSearch; -import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter; -import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute; -import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.editors.AbstractNewRepositoryTaskEditor; -import org.eclipse.mylyn.tasks.ui.search.SearchHitCollector; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -40,29 +34,8 @@ public class NewTracTaskEditor extends AbstractNewRepositoryTaskEditor { } @Override - public SearchHitCollector getDuplicateSearchCollector(String name) { - TracSearchFilter filter = new TracSearchFilter("description"); - filter.setOperator(CompareOperator.CONTAINS); - - String searchString = AbstractNewRepositoryTaskEditor.getStackTraceFromDescription(taskData.getDescription()); - - filter.addValue(searchString); - - TracSearch search = new TracSearch(); - search.addFilter(filter); - - // TODO copied from TracCustomQueryPage.getQueryUrl() - StringBuilder sb = new StringBuilder(); - sb.append(repository.getRepositoryUrl()); - sb.append(ITracClient.QUERY_URL); - sb.append(search.toUrl()); - - TracRepositoryQuery query = new TracRepositoryQuery(repository.getRepositoryUrl(), sb.toString(), - "<Duplicate Search>"); - - SearchHitCollector collector = new SearchHitCollector(TasksUi.getTaskListManager().getTaskList(), repository, - query); - return collector; + public AbstractDuplicateDetector getDuplicateDetector(String name) { + return new TracDuplicateDetector(); } @Override diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracDuplicateDetector.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracDuplicateDetector.java new file mode 100644 index 000000000..4e9e0f8a1 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracDuplicateDetector.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Mylyn project committers and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.mylyn.internal.trac.ui.editor; + +import org.eclipse.mylyn.internal.trac.core.ITracClient; +import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; +import org.eclipse.mylyn.internal.trac.core.model.TracSearch; +import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter; +import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; +import org.eclipse.mylyn.tasks.core.RepositoryTaskData; +import org.eclipse.mylyn.tasks.core.TaskRepository; + +public class TracDuplicateDetector extends AbstractDuplicateDetector { + + @Override + public AbstractRepositoryQuery getDiplicatesQuery(TaskRepository repository, RepositoryTaskData taskData) { + TracSearchFilter filter = new TracSearchFilter("description"); + filter.setOperator(CompareOperator.CONTAINS); + + String searchString = AbstractDuplicateDetector.getStackTraceFromDescription(taskData.getDescription()); + + filter.addValue(searchString); + + TracSearch search = new TracSearch(); + search.addFilter(filter); + + // TODO copied from TracCustomQueryPage.getQueryUrl() + StringBuilder sb = new StringBuilder(); + sb.append(repository.getRepositoryUrl()); + sb.append(ITracClient.QUERY_URL); + sb.append(search.toUrl()); + + TracRepositoryQuery query = new TracRepositoryQuery(repository.getRepositoryUrl(), sb.toString(), + "<Duplicate Search>"); + return query; + } + +} |