Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.mylyn.bugzilla.core/plugin.xml9
-rw-r--r--org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/StackTraceDuplicateDetector.java (renamed from org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/StackTraceDuplicateDetector.java)25
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/DuplicateDetetionTest.java18
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/plugin.xml10
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java92
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java2
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java20
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractDuplicateDetector.java45
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractNewRepositoryTaskEditor.java47
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java29
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java33
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracDuplicateDetector.java46
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;
+ }
+
+}

Back to the top