diff options
author | spingel | 2008-05-14 04:07:46 +0000 |
---|---|---|
committer | spingel | 2008-05-14 04:07:46 +0000 |
commit | d6766a52ec7442063d818ca51b2fae0b8bc55108 (patch) | |
tree | 3a70bd3dfd897c0e23c547df824ab4fb35a22e3e /org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal | |
parent | 839c9ae28ce335ef04382223014033421b3f0541 (diff) | |
download | org.eclipse.mylyn.tasks-d6766a52ec7442063d818ca51b2fae0b8bc55108.tar.gz org.eclipse.mylyn.tasks-d6766a52ec7442063d818ca51b2fae0b8bc55108.tar.xz org.eclipse.mylyn.tasks-d6766a52ec7442063d818ca51b2fae0b8bc55108.zip |
NEW - bug 197181: [api] make duplicate detection support generic
https://bugs.eclipse.org/bugs/show_bug.cgi?id=197181
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal')
5 files changed, 190 insertions, 47 deletions
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 35c4dae15..ca52ad55b 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 @@ -52,6 +52,7 @@ import org.eclipse.mylyn.context.core.ContextCore; import org.eclipse.mylyn.internal.context.core.ContextPreferenceContstants; import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors; +import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector; @@ -66,7 +67,6 @@ import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.core.TasksModel; import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager; import org.eclipse.mylyn.internal.tasks.core.data.TaskDataStore; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager; import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationParticipant; @@ -76,6 +76,7 @@ import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationQue import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationReminder; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader; import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; @@ -178,6 +179,8 @@ public class TasksUiPlugin extends AbstractUIPlugin { private TaskJobFactory tasksJobFactory; + private final List<AbstractSearchHandler> searchHandlers = new ArrayList<AbstractSearchHandler>(); + private static final boolean DEBUG_HTTPCLIENT = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.mylyn.tasks.ui/debug/httpclient")); // XXX reconsider if this is necessary @@ -1021,9 +1024,8 @@ public class TasksUiPlugin extends AbstractUIPlugin { } public void addDuplicateDetector(AbstractDuplicateDetector duplicateDetector) { - if (duplicateDetector != null) { - duplicateDetectors.add(duplicateDetector); - } + Assert.isNotNull(duplicateDetector); + duplicateDetectors.add(duplicateDetector); } public Set<AbstractDuplicateDetector> getDuplicateSearchCollectorsList() { @@ -1150,4 +1152,23 @@ public class TasksUiPlugin extends AbstractUIPlugin { public static TasksModel getTasksModel() { return tasksModel; } + + public void addSearchHandler(AbstractSearchHandler searchHandler) { + searchHandlers.add(searchHandler); + } + + public void removeSearchHandler(AbstractSearchHandler searchHandler) { + searchHandlers.remove(searchHandler); + } + + public AbstractSearchHandler getSearchHandler(String connectorKind) { + Assert.isNotNull(connectorKind); + for (AbstractSearchHandler searchHandler : searchHandlers) { + if (searchHandler.getConnectorKind().equals(connectorKind)) { + return searchHandler; + } + } + return null; + } + } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/deprecated/AbstractRepositoryTaskEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/deprecated/AbstractRepositoryTaskEditor.java index 43508b154..8d1dd3628 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/deprecated/AbstractRepositoryTaskEditor.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/deprecated/AbstractRepositoryTaskEditor.java @@ -78,7 +78,7 @@ import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory; import org.eclipse.mylyn.internal.tasks.core.CommentQuoter; import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector; +import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyDuplicateDetector; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryAttachment; @@ -116,6 +116,7 @@ import org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink; import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITaskElement; @@ -1224,11 +1225,11 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { /** * @since 3.0 */ - protected AbstractDuplicateDetector getDuplicateDetector(String name) { + protected AbstractLegacyDuplicateDetector getDuplicateDetector(String name) { String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name; - Set<AbstractDuplicateDetector> allDetectors = getDuplicateDetectorList(); + Set<AbstractLegacyDuplicateDetector> allDetectors = getDuplicateDetectorList(); - for (AbstractDuplicateDetector detector : allDetectors) { + for (AbstractLegacyDuplicateDetector detector : allDetectors) { if (detector.getName().equals(duplicateDetectorName)) { return detector; } @@ -1240,13 +1241,14 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { /** * @since 3.0 */ - protected Set<AbstractDuplicateDetector> getDuplicateDetectorList() { - Set<AbstractDuplicateDetector> duplicateDetectors = new HashSet<AbstractDuplicateDetector>(); + protected Set<AbstractLegacyDuplicateDetector> getDuplicateDetectorList() { + Set<AbstractLegacyDuplicateDetector> duplicateDetectors = new HashSet<AbstractLegacyDuplicateDetector>(); for (AbstractDuplicateDetector abstractDuplicateDetector : TasksUiPlugin.getDefault() .getDuplicateSearchCollectorsList()) { - if (abstractDuplicateDetector.getKind() == null - || abstractDuplicateDetector.getKind().equals(getConnector().getConnectorKind())) { - duplicateDetectors.add(abstractDuplicateDetector); + if (abstractDuplicateDetector instanceof AbstractLegacyDuplicateDetector + && (abstractDuplicateDetector.getConnectorKind() == null || abstractDuplicateDetector.getConnectorKind() + .equals(getConnector().getConnectorKind()))) { + duplicateDetectors.add((AbstractLegacyDuplicateDetector) abstractDuplicateDetector); } } return duplicateDetectors; @@ -1254,7 +1256,7 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { public boolean searchForDuplicates() { String duplicateDetectorName = duplicateDetectorChooser.getItem(duplicateDetectorChooser.getSelectionIndex()); - AbstractDuplicateDetector duplicateDetector = getDuplicateDetector(duplicateDetectorName); + AbstractLegacyDuplicateDetector duplicateDetector = getDuplicateDetector(duplicateDetectorName); if (duplicateDetector != null) { RepositoryQuery duplicatesQuery = duplicateDetector.getDuplicatesQuery(repository, taskData); if (duplicatesQuery != null) { @@ -1928,7 +1930,7 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { } protected void addDuplicateDetection(Composite composite) { - List<AbstractDuplicateDetector> allCollectors = new ArrayList<AbstractDuplicateDetector>(); + List<AbstractLegacyDuplicateDetector> allCollectors = new ArrayList<AbstractLegacyDuplicateDetector>(); if (getDuplicateDetectorList() != null) { allCollectors.addAll(getDuplicateDetectorList()); } @@ -1951,15 +1953,15 @@ public abstract class AbstractRepositoryTaskEditor extends TaskFormPage { duplicateDetectorChooser.setFont(TEXT_FONT); duplicateDetectorChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create()); - Collections.sort(allCollectors, new Comparator<AbstractDuplicateDetector>() { + Collections.sort(allCollectors, new Comparator<AbstractLegacyDuplicateDetector>() { - public int compare(AbstractDuplicateDetector c1, AbstractDuplicateDetector c2) { + public int compare(AbstractLegacyDuplicateDetector c1, AbstractLegacyDuplicateDetector c2) { return c1.getName().compareToIgnoreCase(c2.getName()); } }); - for (AbstractDuplicateDetector detector : allCollectors) { + for (AbstractLegacyDuplicateDetector detector : allCollectors) { duplicateDetectorChooser.add(detector.getName()); } 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 3f4f47888..9db7340a9 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 @@ -15,15 +15,17 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.layout.GridDataFactory; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; -import org.eclipse.mylyn.internal.tasks.core.IdentityAttributeFactory; -import org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector; +import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyDuplicateDetector; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; +import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.search.ui.NewSearchUI; import org.eclipse.swt.SWT; @@ -39,6 +41,9 @@ import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; +/** + * @author Steffen Pingel + */ public class TaskEditorDescriptionPart extends TaskEditorRichTextPart { private static final String LABEL_SEARCH_DUPS = "Search"; @@ -56,8 +61,11 @@ public class TaskEditorDescriptionPart extends TaskEditorRichTextPart { allCollectors.addAll(getDuplicateSearchCollectorsList()); } if (!allCollectors.isEmpty()) { - Section duplicatesSection = toolkit.createSection(composite, ExpandableComposite.TWISTIE - | ExpandableComposite.SHORT_TITLE_BAR); + int style = ExpandableComposite.TWISTIE | ExpandableComposite.SHORT_TITLE_BAR; + if (getTaskData().isNew()) { + style |= ExpandableComposite.EXPANDED; + } + Section duplicatesSection = toolkit.createSection(composite, style); duplicatesSection.setText(LABEL_SELECT_DETECTOR); duplicatesSection.setLayout(new GridLayout()); GridDataFactory.fillDefaults().indent(SWT.DEFAULT, 15).applyTo(duplicatesSection); @@ -124,44 +132,48 @@ public class TaskEditorDescriptionPart extends TaskEditorRichTextPart { toolBar.add(replyAction); } - protected RepositoryQuery getDuplicateSearchCollector(String name) { + protected IRepositoryQuery getDuplicateQuery(String name) throws CoreException { String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name; - Set<AbstractDuplicateDetector> allDetectors = getDuplicateSearchCollectorsList(); - - for (AbstractDuplicateDetector detector : allDetectors) { + for (AbstractDuplicateDetector detector : getDuplicateSearchCollectorsList()) { if (detector.getName().equals(duplicateDetectorName)) { - return detector.getDuplicatesQuery(getTaskEditorPage().getTaskRepository(), TaskDataUtil.toLegacyData( - getTaskData(), IdentityAttributeFactory.getInstance())); + return detector.getDuplicatesQuery(getTaskEditorPage().getTaskRepository(), getTaskData()); } } - // didn't find it return null; } protected Set<AbstractDuplicateDetector> getDuplicateSearchCollectorsList() { Set<AbstractDuplicateDetector> duplicateDetectors = new HashSet<AbstractDuplicateDetector>(); - for (AbstractDuplicateDetector abstractDuplicateDetector : TasksUiPlugin.getDefault() - .getDuplicateSearchCollectorsList()) { - if (abstractDuplicateDetector.getKind() == null - || abstractDuplicateDetector.getKind().equals(getTaskEditorPage().getConnectorKind())) { - duplicateDetectors.add(abstractDuplicateDetector); + for (AbstractDuplicateDetector detector : TasksUiPlugin.getDefault().getDuplicateSearchCollectorsList()) { + if (isValidDuplicateDetector(detector)) { + duplicateDetectors.add(detector); } } return duplicateDetectors; } - public boolean searchForDuplicates(String duplicateDetectorName) { - RepositoryQuery duplicatesQuery = getDuplicateSearchCollector(duplicateDetectorName); - if (duplicatesQuery != null) { - SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(), - getTaskEditorPage().getTaskRepository(), duplicatesQuery); - if (collector != null) { + @SuppressWarnings( { "deprecation", "restriction" }) + private boolean isValidDuplicateDetector(AbstractDuplicateDetector detector) { + return !(detector instanceof AbstractLegacyDuplicateDetector) // + && (detector.getConnectorKind() == null || detector.getConnectorKind().equals( + getTaskEditorPage().getConnectorKind())) // + && detector.canQuery(getTaskData()); + } + + public void searchForDuplicates(String duplicateDetectorName) { + try { + IRepositoryQuery duplicatesQuery = getDuplicateQuery(duplicateDetectorName); + if (duplicatesQuery != null) { + SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(), + getTaskEditorPage().getTaskRepository(), duplicatesQuery); NewSearchUI.runQueryInBackground(collector); - return true; + } else { + TasksUiInternal.displayStatus("Duplicate Detection Failed", new Status(IStatus.ERROR, + TasksUiPlugin.ID_PLUGIN, "The duplicate detector did not return a valid query.")); } + } catch (CoreException e) { + TasksUiInternal.displayStatus("Duplicate Detection Failed", e.getStatus()); } - - return false; } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/StackTraceDuplicateDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/StackTraceDuplicateDetector.java new file mode 100644 index 000000000..984063f60 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/StackTraceDuplicateDetector.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * 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.tasks.ui.search; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; +import org.eclipse.mylyn.tasks.core.IRepositoryQuery; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskData; +import org.eclipse.mylyn.tasks.ui.TasksUi; + +/** + * @author Gail Murphy + * @author Steffen Pingel + */ +public class StackTraceDuplicateDetector extends AbstractDuplicateDetector { + + @Override + public boolean canQuery(TaskData taskData) { + return TasksUiPlugin.getDefault().getSearchHandler(taskData.getConnectorKind()) != null; + } + + private String getDescription(TaskData taskData) { + TaskAttribute attribute = taskData.getMappedAttribute(TaskAttribute.DESCRIPTION); + if (attribute == null) { + attribute = taskData.getMappedAttribute(TaskAttribute.COMMENT_NEW); + } + return (attribute != null) ? attribute.getTaskData().getAttributeMapper().getValueLabel(attribute) : ""; + } + + @Override + public IRepositoryQuery getDuplicatesQuery(TaskRepository taskRepository, TaskData taskData) throws CoreException { + String description = getDescription(taskData); + String searchString = getStackTraceFromDescription(description); + if (searchString == null) { + throw new CoreException(new Status(IStatus.INFO, TasksUiPlugin.ID_PLUGIN, + "Unable to locate a stack trace in the description text.")); + } + + IRepositoryQuery query = TasksUi.getTasksModel().createQuery(taskRepository); + AbstractSearchHandler searchHandler = TasksUiPlugin.getDefault().getSearchHandler( + taskRepository.getConnectorKind()); + if (searchHandler.queryForText(taskRepository, query, taskData, searchString)) { + return query; + } + return null; + } + + 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/util/TasksUiExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java index 1254e7d5f..273e684d9 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java @@ -22,7 +22,6 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer; @@ -30,6 +29,7 @@ import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation; import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView; +import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.RepositoryTemplate; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; @@ -283,7 +283,7 @@ public class TasksUiExtensionReader { if (obj instanceof AbstractDuplicateDetector) { AbstractDuplicateDetector duplicateDetector = (AbstractDuplicateDetector) obj; duplicateDetector.setName(element.getAttribute(ATTR_NAME)); - duplicateDetector.setKind(element.getAttribute(ATTR_KIND)); + duplicateDetector.setConnectorKind(element.getAttribute(ATTR_KIND)); TasksUiPlugin.getDefault().addDuplicateDetector(duplicateDetector); } else { StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, |