diff options
51 files changed, 1892 insertions, 1944 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java index d177f8c34..dd5ea63a0 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java @@ -99,7 +99,7 @@ public final class TaskAttribute { public static final String KIND_OPERATION = "task.common.kind.operation"; - public static final String KIND_PEOPLE = "task.common.kind.default"; + public static final String KIND_PEOPLE = "task.common.kind.people"; //public static final String META_SHOW_IN_ATTRIBUTES_SECTION = "task.meta.showInTaskEditorAttributesSection"; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PreviewAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PreviewAttributeEditor.java index c1b3f0a3a..a04e16413 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PreviewAttributeEditor.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PreviewAttributeEditor.java @@ -40,6 +40,10 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.forms.widgets.FormToolkit; +/** + * @author Steffen Pingel + * @author Xiaoyang Guan + */ public class PreviewAttributeEditor extends AbstractAttributeEditor { private final RichTextAttributeEditor editor; @@ -87,26 +91,30 @@ public class PreviewAttributeEditor extends AbstractAttributeEditor { @Override public void createControl(Composite parent, FormToolkit toolkit) { - final Composite sectionComposite = toolkit.createComposite(parent); - sectionComposite.setLayout(new GridLayout(1, false)); + final Composite composite = toolkit.createComposite(parent); + composite.setLayout(new GridLayout(1, false)); // composite with StackLayout to hold text editor and preview widget - Composite editorComposite = toolkit.createComposite(sectionComposite); + Composite editorComposite = toolkit.createComposite(composite); editorComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); GridData gd = new GridData(GridData.FILL_BOTH); gd.widthHint = EditorUtil.MAXIMUM_WIDTH; gd.minimumHeight = EditorUtil.MAXIMUM_HEIGHT; gd.grabExcessHorizontalSpace = true; editorComposite.setLayoutData(gd); - final StackLayout descriptionLayout = new StackLayout(); + StackLayout descriptionLayout = new StackLayout(); editorComposite.setLayout(descriptionLayout); editor.createControl(editorComposite, toolkit); // composite for edit/preview button - Composite buttonComposite = toolkit.createComposite(sectionComposite); + Composite buttonComposite = toolkit.createComposite(composite); buttonComposite.setLayout(new GridLayout()); createPreviewButton(buttonComposite, editor.getViewer(), editorComposite, descriptionLayout, toolkit); + descriptionLayout.topControl = editor.getControl(); + + toolkit.paintBordersFor(composite); + setControl(composite); } /** @@ -157,7 +165,6 @@ public class PreviewAttributeEditor extends AbstractAttributeEditor { buttonState = ++buttonState % 2; if (buttonState == 1) { - setText(previewBrowser, "Loading preview..."); previewWiki(previewBrowser, editor.getTextWidget().getText()); } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java index 412d68bb7..2c59b1e93 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java @@ -30,6 +30,7 @@ import org.eclipse.jface.action.ControlContribution; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.util.SafeRunnable; @@ -285,15 +286,15 @@ public abstract class AbstractTaskEditorPage extends FormPage implements ISelect public static final String ID_PART_COMMENTS = "org.eclipse.mylyn.tasks.ui.editors.parts.comments"; - public static final String ID_PART_DESCRIPTION = "org.eclipse.mylyn.tasks.ui.editors.part.descriptions"; + public static final String ID_PART_DESCRIPTION = "org.eclipse.mylyn.tasks.ui.editors.parts.descriptions"; - public static final String ID_PART_NEW_COMMENT = "org.eclipse.mylyn.tasks.ui.editors.part.newComment"; + public static final String ID_PART_NEW_COMMENT = "org.eclipse.mylyn.tasks.ui.editors.parts.newComment"; - public static final String ID_PART_PEOPLE = "org.eclipse.mylyn.tasks.ui.editors.part.people"; + public static final String ID_PART_PEOPLE = "org.eclipse.mylyn.tasks.ui.editors.parts.people"; - public static final String ID_PART_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.part.planning"; + public static final String ID_PART_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.parts.planning"; - public static final String ID_PART_SUMMARY = "org.eclipse.mylyn.tasks.ui.editors.part.summary"; + public static final String ID_PART_SUMMARY = "org.eclipse.mylyn.tasks.ui.editors.parts.summary"; public static final String PATH_ACTIONS = "actions"; @@ -594,7 +595,7 @@ public abstract class AbstractTaskEditorPage extends FormPage implements ISelect createParts(PATH_PLANNING, editorComposite, descriptors); // two column Composite bottomComposite = toolkit.createComposite(editorComposite); - bottomComposite.setLayout(new GridLayout(2, false)); + bottomComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create()); GridDataFactory.fillDefaults().grab(true, false).applyTo(bottomComposite); createParts(PATH_ACTIONS, bottomComposite, descriptors); createParts(PATH_PEOPLE, bottomComposite, descriptors); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java index d692f8e52..bf42bc916 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java @@ -58,14 +58,7 @@ public abstract class TaskEditorPartDescriptor { return false; } TaskEditorPartDescriptor other = (TaskEditorPartDescriptor) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - return true; + return id.equals(other.id); } public String getId() { @@ -80,7 +73,7 @@ public abstract class TaskEditorPartDescriptor { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + id.hashCode(); return result; } diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java index 208b1ab47..5cba7aee3 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java @@ -13,19 +13,19 @@ import java.io.InputStream; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttachmentHandler; -import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskAttachment; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryAttachment; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; import org.eclipse.mylyn.internal.trac.core.model.TracTicket; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler; +import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource; +import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; /** * @author Steffen Pingel */ -public class TracAttachmentHandler extends AbstractAttachmentHandler { +public class TracAttachmentHandler extends AbstractTaskAttachmentHandler { private final TracRepositoryConnector connector; @@ -34,18 +34,19 @@ public class TracAttachmentHandler extends AbstractAttachmentHandler { } @Override - public InputStream getAttachmentAsStream(TaskRepository repository, RepositoryAttachment attachment, + public InputStream getContent(TaskRepository repository, ITask task, TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws CoreException { - String filename = attachment.getAttributeValue(RepositoryTaskAttribute.ATTACHMENT_FILENAME); - if (filename == null) { - throw new CoreException(new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, TracCorePlugin.ID_PLUGIN, - RepositoryStatus.ERROR_REPOSITORY, "Attachment download from " + repository.getRepositoryUrl() - + " failed, missing attachment filename.")); + TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(attachmentAttribute); + String filename = mapper.getFileName(); + if (filename == null || filename.length() == 0) { + throw new CoreException(new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, + TracCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY, "Attachment download from " + + repository.getRepositoryUrl() + " failed, missing attachment filename.")); } try { ITracClient client = connector.getClientManager().getTracClient(repository); - int id = Integer.parseInt(attachment.getTaskId()); + int id = Integer.parseInt(task.getTaskId()); return client.getAttachmentData(id, filename, monitor); } catch (Exception e) { throw new CoreException(TracCorePlugin.toStatus(e, repository)); @@ -53,11 +54,24 @@ public class TracAttachmentHandler extends AbstractAttachmentHandler { } @Override - public void uploadAttachment(TaskRepository repository, ITask task, ITaskAttachment attachment, - String comment, IProgressMonitor monitor) throws CoreException { + public void postContent(TaskRepository repository, ITask task, AbstractTaskAttachmentSource source, String comment, + TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws CoreException { if (!TracRepositoryConnector.hasAttachmentSupport(repository, task)) { - throw new CoreException(new RepositoryStatus(repository.getRepositoryUrl(), IStatus.INFO, TracCorePlugin.ID_PLUGIN, - RepositoryStatus.ERROR_REPOSITORY, "Attachments are not supported by this repository access type")); + throw new CoreException(new RepositoryStatus(repository.getRepositoryUrl(), IStatus.INFO, + TracCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY, + "Attachments are not supported by this repository access type")); + } + + String filename = source.getName(); + String description = source.getDescription(); + if (attachmentAttribute != null) { + TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(attachmentAttribute); + if (mapper.getFileName() != null) { + filename = mapper.getFileName(); + } + if (mapper.getDescription() != null) { + description = mapper.getDescription(); + } } monitor.beginTask("Uploading attachment", IProgressMonitor.UNKNOWN); @@ -65,8 +79,7 @@ public class TracAttachmentHandler extends AbstractAttachmentHandler { try { ITracClient client = connector.getClientManager().getTracClient(repository); int id = Integer.parseInt(task.getTaskId()); - client.putAttachmentData(id, attachment.getFilename(), attachment.getDescription(), - attachment.createInputStream(), monitor); + client.putAttachmentData(id, filename, description, source.createInputStream(monitor), monitor); if (comment != null && comment.length() > 0) { TracTicket ticket = new TracTicket(id); client.updateTicket(ticket, comment, monitor); @@ -80,29 +93,13 @@ public class TracAttachmentHandler extends AbstractAttachmentHandler { } @Override - public boolean canDownloadAttachment(TaskRepository repository, ITask task) { - if (repository == null) { - return false; - } + public boolean canGetContent(TaskRepository repository, ITask task) { return TracRepositoryConnector.hasAttachmentSupport(repository, task); } @Override - public boolean canUploadAttachment(TaskRepository repository, ITask task) { - if (repository == null) { - return false; - } + public boolean canPostContent(TaskRepository repository, ITask task) { return TracRepositoryConnector.hasAttachmentSupport(repository, task); } - @Override - public boolean canDeprecate(TaskRepository repository, RepositoryAttachment attachment) { - return false; - } - - @Override - public void updateAttachment(TaskRepository repository, RepositoryAttachment attachment) throws CoreException { - throw new UnsupportedOperationException(); - } - } diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttribute.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttribute.java new file mode 100644 index 000000000..cc305203d --- /dev/null +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttribute.java @@ -0,0 +1,137 @@ +/******************************************************************************* + * 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.core; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.Flag; +import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; + +/** + * @author Steffen Pingel + */ +public enum TracAttribute { + + CC(Key.CC, "CC:", TaskAttribute.USER_CC, TaskAttribute.TYPE_SHORT_TEXT, EnumSet.of(Flag.PEOPLE)), + + CHANGE_TIME(Key.CHANGE_TIME, "Last Modification:", TaskAttribute.DATE_MODIFICATION, TaskAttribute.TYPE_DATE, + EnumSet.of(Flag.READ_ONLY)), + + COMPONENT(Key.COMPONENT, "Component:", TaskAttribute.PRODUCT, TaskAttribute.TYPE_SINGLE_SELECT, + EnumSet.of(Flag.ATTRIBUTE)), + + DESCRIPTION(Key.DESCRIPTION, "Description:", TaskAttribute.DESCRIPTION, TaskAttribute.TYPE_LONG_RICH_TEXT), + + ID(Key.ID, "ID:", TaskAttribute.TASK_KEY, TaskAttribute.TYPE_SHORT_TEXT, EnumSet.of(Flag.PEOPLE)), + + KEYWORDS(Key.KEYWORDS, "Keywords:", TaskAttribute.KEYWORDS, TaskAttribute.TYPE_SHORT_TEXT, + EnumSet.of(Flag.ATTRIBUTE)), + + MILESTONE(Key.MILESTONE, "Milestone:", null, TaskAttribute.TYPE_SINGLE_SELECT, EnumSet.of(Flag.ATTRIBUTE)), + + OWNER(Key.OWNER, "Assigned to:", TaskAttribute.USER_ASSIGNED, TaskAttribute.TYPE_PERSON, EnumSet.of(Flag.PEOPLE)), + + PRIORITY(Key.PRIORITY, "Priority:", TaskAttribute.PRIORITY, TaskAttribute.TYPE_SINGLE_SELECT, + EnumSet.of(Flag.ATTRIBUTE)), + + REPORTER(Key.REPORTER, "Reporter:", TaskAttribute.USER_REPORTER, TaskAttribute.TYPE_PERSON, + EnumSet.of(Flag.READ_ONLY)), + + RESOLUTION(Key.RESOLUTION, "Resolution:", TaskAttribute.RESOLUTION, TaskAttribute.TYPE_SINGLE_SELECT), + + SEVERITY(Key.SEVERITY, "Severity:", null, TaskAttribute.TYPE_SINGLE_SELECT, EnumSet.of(Flag.ATTRIBUTE)), + + STATUS(Key.STATUS, "Status:", TaskAttribute.STATUS, TaskAttribute.TYPE_SHORT_TEXT), + + SUMMARY(Key.SUMMARY, "Summary:", TaskAttribute.SUMMARY, TaskAttribute.TYPE_SHORT_RICH_TEXT), + + TIME(Key.TIME, "Created:", TaskAttribute.DATE_CREATION, TaskAttribute.TYPE_DATE, EnumSet.of(Flag.READ_ONLY)), + + TYPE(Key.TYPE, "Type:", null, TaskAttribute.TYPE_SINGLE_SELECT, EnumSet.of(Flag.ATTRIBUTE)), + + VERSION(Key.VERSION, "Version:", null, TaskAttribute.TYPE_SINGLE_SELECT, EnumSet.of(Flag.ATTRIBUTE)); + + static Map<String, TracAttribute> attributeByTracKey = new HashMap<String, TracAttribute>(); + + static Map<String, String> tracKeyByTaskKey = new HashMap<String, String>(); + + private final String tracKey; + + private final String prettyName; + + private final String taskKey; + + private final String type; + + private EnumSet<Flag> flags; + + public static TracAttribute getByTaskKey(String taskKey) { + for (TracAttribute attribute : values()) { + if (taskKey.equals(attribute.getTaskKey())) { + return attribute; + } + } + return null; + } + + public static TracAttribute getByTracKey(String tracKey) { + for (TracAttribute attribute : values()) { + if (tracKey.equals(attribute.getTracKey())) { + return attribute; + } + } + return null; + } + + TracAttribute(Key tracKey, String prettyName, String taskKey, String type, EnumSet<Flag> flags) { + this.tracKey = tracKey.getKey(); + this.taskKey = taskKey; + this.prettyName = prettyName; + this.type = type; + this.flags = flags; + } + + TracAttribute(Key tracKey, String prettyName, String taskKey, String type) { + this(tracKey, prettyName, taskKey, type, TracAttributeMapper.NO_FLAGS); + } + + public String getTaskKey() { + return taskKey; + } + + public String getTracKey() { + return tracKey; + } + + public String getKind() { + if (flags.contains(Flag.ATTRIBUTE)) { + return TaskAttribute.KIND_DEFAULT; + } else if (flags.contains(Flag.PEOPLE)) { + return TaskAttribute.KIND_PEOPLE; + } + return null; + } + + public String getType() { + return type; + } + + public boolean isReadOnly() { + return flags.contains(Flag.READ_ONLY); + } + + @Override + public String toString() { + return prettyName; + } + +} diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeFactory.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeFactory.java deleted file mode 100644 index ec6c59f4a..000000000 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeFactory.java +++ /dev/null @@ -1,173 +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.internal.trac.core; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; -import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key; -import org.eclipse.mylyn.internal.trac.core.util.TracUtils; - -/** - * Provides a mapping from Mylyn task keys to Trac ticket keys. - * - * @author Steffen Pingel - */ -public class TracAttributeFactory extends AbstractAttributeFactory { - - private static final long serialVersionUID = 5333211422546115138L; - - private static Map<String, Attribute> attributeByTracKey = new HashMap<String, Attribute>(); - - private static Map<String, String> tracKeyByTaskKey = new HashMap<String, String>(); - - public enum Attribute { - CC(Key.CC, "CC:", RepositoryTaskAttribute.USER_CC, true, false), // - CHANGE_TIME(Key.CHANGE_TIME, "Last Modification:", RepositoryTaskAttribute.DATE_MODIFIED, true, true), // - COMPONENT(Key.COMPONENT, "Component:", RepositoryTaskAttribute.PRODUCT), // - DESCRIPTION(Key.DESCRIPTION, "Description:", RepositoryTaskAttribute.DESCRIPTION, true, false), // - ID(Key.ID, "<used by search engine>", null, true), // - KEYWORDS(Key.KEYWORDS, "Keywords:", RepositoryTaskAttribute.KEYWORDS), // - MILESTONE(Key.MILESTONE, "Milestone:", null), // - NEW_CC(RepositoryTaskAttribute.NEW_CC, "Add CC:"), // - OWNER(Key.OWNER, "Assigned to:", RepositoryTaskAttribute.USER_ASSIGNED, true, true), // - PRIORITY(Key.PRIORITY, "Priority:", null), // - REPORTER(Key.REPORTER, "Reporter:", RepositoryTaskAttribute.USER_REPORTER, true, true), // - RESOLUTION(Key.RESOLUTION, "Resolution:", RepositoryTaskAttribute.RESOLUTION, false, true), // - SEVERITY(Key.SEVERITY, "Severity:", null), // - STATUS(Key.STATUS, "Status:", RepositoryTaskAttribute.STATUS, false, true), // - SUMMARY(Key.SUMMARY, "Summary:", RepositoryTaskAttribute.SUMMARY, true), // - TIME(Key.TIME, "Created:", RepositoryTaskAttribute.DATE_CREATION, true, true), // - TYPE(Key.TYPE, "Type:", null), // - VERSION(Key.VERSION, "Version:", null); - - private final boolean isHidden; - - private final boolean isReadOnly; - - private final String tracKey; - - private final String prettyName; - - private final String taskKey; - - Attribute(String tracKey, String prettyName, String taskKey, boolean hidden, boolean readonly) { - this.tracKey = tracKey; - this.taskKey = taskKey; - this.prettyName = prettyName; - this.isHidden = hidden; - this.isReadOnly = readonly; - - attributeByTracKey.put(tracKey, this); - if (taskKey != null) { - tracKeyByTaskKey.put(taskKey, tracKey); - } - } - - Attribute(Key key, String prettyName, String taskKey, boolean hidden, boolean readonly) { - this(key.getKey(), prettyName, taskKey, hidden, readonly); - } - - Attribute(Key key, String prettyName, String taskKey, boolean hidden) { - this(key.getKey(), prettyName, taskKey, hidden, false); - } - - Attribute(Key key, String prettyName, String taskKey) { - this(key.getKey(), prettyName, taskKey, false, false); - } - - /** - * This is for Mylyn attributes that do not map to Trac attributes. - */ - Attribute(String taskKey, String prettyName) { - this(taskKey, prettyName, taskKey, true, false); - } - - public String getTaskKey() { - return taskKey; - } - - public String getTracKey() { - return tracKey; - } - - public boolean isHidden() { - return isHidden; - } - - public boolean isReadOnly() { - return isReadOnly; - } - - @Override - public String toString() { - return prettyName; - } - } - - static { - // make sure hash maps get initialized when class is loaded - Attribute.values(); - } - - @Override - public boolean isHidden(String key) { - if (isInternalAttribute(key)) { - return true; - } - - Attribute attribute = attributeByTracKey.get(key); - return (attribute != null) ? attribute.isHidden() : false; - } - - @Override - public String getName(String key) { - Attribute attribute = attributeByTracKey.get(key); - // TODO if attribute == null it is probably a custom field: need - // to query custom field information from repoository - return (attribute != null) ? attribute.toString() : key; - } - - @Override - public boolean isReadOnly(String key) { - Attribute attribute = attributeByTracKey.get(key); - return (attribute != null) ? attribute.isReadOnly() : false; - } - - @Override - public String mapCommonAttributeKey(String key) { - String tracKey = tracKeyByTaskKey.get(key); - return (tracKey != null) ? tracKey : key; - } - - static boolean isInternalAttribute(String id) { - return RepositoryTaskAttribute.COMMENT_NEW.equals(id) || RepositoryTaskAttribute.REMOVE_CC.equals(id) - || RepositoryTaskAttribute.NEW_CC.equals(id) || RepositoryTaskAttribute.ADD_SELF_CC.equals(id); - } - - @Override - public Date getDateForAttributeType(String attributeKey, String dateString) { - if (dateString == null || dateString.length() == 0) { - return null; - } - - try { - String mappedKey = mapCommonAttributeKey(attributeKey); - if (mappedKey.equals(Attribute.TIME.getTracKey()) || mappedKey.equals(Attribute.CHANGE_TIME.getTracKey())) { - return TracUtils.parseDate(Integer.valueOf(dateString)); - } - } catch (Exception e) { - } - return null; - } - -} diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeMapper.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeMapper.java new file mode 100644 index 000000000..3c3184712 --- /dev/null +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeMapper.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.internal.trac.core; + +import java.util.Date; +import java.util.EnumSet; + +import org.eclipse.mylyn.internal.trac.core.util.TracUtils; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; + +/** + * Provides a mapping from Mylyn task keys to Trac ticket keys. + * + * @author Steffen Pingel + */ +public class TracAttributeMapper extends TaskAttributeMapper { + + public enum Flag { + READ_ONLY, ATTRIBUTE, PEOPLE + }; + + public static final String NEW_CC = "task.common.newcc"; + + public static final String REMOVE_CC = "task.common.removecc"; + + public static final EnumSet<Flag> NO_FLAGS = EnumSet.noneOf(Flag.class); + + public static boolean isInternalAttribute(TaskAttribute attribute) { + if (TaskAttribute.TYPE_ATTACHMENT.equals(attribute.getMetaData().getType()) + || TaskAttribute.TYPE_OPERATION.equals(attribute.getMetaData().getType()) + || TaskAttribute.TYPE_COMMENT.equals(attribute.getMetaData().getType())) { + return true; + } + String id = attribute.getId(); + return TaskAttribute.COMMENT_NEW.equals(id) || TaskAttribute.ADD_SELF_CC.equals(id) || REMOVE_CC.equals(id) + || NEW_CC.equals(id); + } + +// +// @Override +// public boolean isHidden(String key) { +// if (isInternalAttribute(key)) { +// return true; +// } +// +// TracAttribute tracAttribute = attributeByTracKey.get(key); +// return (tracAttribute != null) ? tracAttribute.isHidden() : false; +// } +// +// @Override +// public String getName(String key) { +// TracAttribute tracAttribute = attributeByTracKey.get(key); +// // TODO if attribute == null it is probably a custom field: need +// // to query custom field information from repoository +// return (tracAttribute != null) ? tracAttribute.toString() : key; +// } +// +// @Override +// public boolean isReadOnly(String key) { +// TracAttribute tracAttribute = attributeByTracKey.get(key); +// return (tracAttribute != null) ? tracAttribute.isReadOnly() : false; +// } + + public TracAttributeMapper(TaskRepository taskRepository) { + super(taskRepository); + } + + @Override + public Date getDateValue(TaskAttribute attribute) { + return TracUtils.parseDate(Integer.valueOf(attribute.getValue())); + } + + @Override + public String mapToRepositoryKey(TaskAttribute parent, String key) { + TracAttribute attribute = TracAttribute.getByTaskKey(key); + return (attribute != null) ? attribute.getTracKey() : key; + } + + @Override + public void setDateValue(TaskAttribute attribute, Date date) { + attribute.setValue(TracUtils.toTracTime(date) + ""); + } + +} diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java index 47f772ca3..0bfd57a89 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java @@ -13,6 +13,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; +import org.eclipse.mylyn.internal.trac.core.util.TracUtils; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.osgi.framework.BundleContext; @@ -30,7 +31,7 @@ public class TracCorePlugin extends Plugin { private static TracCorePlugin plugin; - public final static String REPOSITORY_KIND = "trac"; + public final static String CONNECTOR_KIND = "trac"; private TracRepositoryConnector connector; @@ -79,17 +80,17 @@ public class TracCorePlugin extends Plugin { if (e instanceof TracLoginException) { return RepositoryStatus.createLoginError(repository.getRepositoryUrl(), ID_PLUGIN); } else if (e instanceof TracPermissionDeniedException) { - return TracStatus.createPermissionDeniedError(repository.getRepositoryUrl(), ID_PLUGIN); + return TracUtils.createPermissionDeniedError(repository.getRepositoryUrl(), ID_PLUGIN); } else if (e instanceof InvalidTicketException) { - return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, ID_PLUGIN, RepositoryStatus.ERROR_IO, - "The server returned an unexpected response", e); + return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, ID_PLUGIN, + RepositoryStatus.ERROR_IO, "The server returned an unexpected response", e); } else if (e instanceof TracException) { String message = e.getMessage(); if (message == null) { message = "I/O error has occured"; } - return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, ID_PLUGIN, RepositoryStatus.ERROR_IO, - message, e); + return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, ID_PLUGIN, + RepositoryStatus.ERROR_IO, message, e); } else if (e instanceof ClassCastException) { return new RepositoryStatus(IStatus.ERROR, ID_PLUGIN, RepositoryStatus.ERROR_IO, "Unexpected server response: " + e.getMessage(), e); diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java index ec39c9a27..010db0431 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java @@ -10,9 +10,12 @@ package org.eclipse.mylyn.internal.trac.core; import java.io.File; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; +import java.util.StringTokenizer; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -23,50 +26,298 @@ import org.eclipse.core.runtime.Status; import org.eclipse.mylyn.commons.net.AuthenticationCredentials; import org.eclipse.mylyn.commons.net.AuthenticationType; import org.eclipse.mylyn.commons.net.Policy; -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttachmentHandler; -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.LegacyTaskDataCollector; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.internal.trac.core.ITracClient.Version; -import org.eclipse.mylyn.internal.trac.core.TracAttributeFactory.Attribute; -import org.eclipse.mylyn.internal.trac.core.TracTask.Kind; import org.eclipse.mylyn.internal.trac.core.model.TracPriority; +import org.eclipse.mylyn.internal.trac.core.model.TracSearch; import org.eclipse.mylyn.internal.trac.core.model.TracTicket; -import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key; import org.eclipse.mylyn.internal.trac.core.util.TracUtils; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory; +import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel; +import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler; +import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskData; import org.eclipse.mylyn.tasks.core.data.TaskDataCollector; +import org.eclipse.mylyn.tasks.core.data.TaskMapper; +import org.eclipse.mylyn.tasks.core.data.TaskRelation; import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession; /** * @author Steffen Pingel */ -public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { +public class TracRepositoryConnector extends AbstractRepositoryConnector { + + public enum TaskKind { + DEFECT, ENHANCEMENT, TASK; + + public static TaskKind fromString(String type) { + if (type == null) { + return null; + } + if (type.equals("Defect")) { + return DEFECT; + } + if (type.equals("Enhancement")) { + return ENHANCEMENT; + } + if (type.equals("Task")) { + return TASK; + } + return null; + } + + public static TaskKind fromType(String type) { + if (type == null) { + return null; + } + if (type.equals("defect")) { + return DEFECT; + } + if (type.equals("enhancement")) { + return ENHANCEMENT; + } + if (type.equals("task")) { + return TASK; + } + return null; + } + + @Override + public String toString() { + switch (this) { + case DEFECT: + return "Defect"; + case ENHANCEMENT: + return "Enhancement"; + case TASK: + return "Task"; + default: + return ""; + } + } + + } + + public enum TaskStatus { + ASSIGNED, CLOSED, NEW, REOPENED; + + public static TaskStatus fromStatus(String status) { + if (status == null) { + return null; + } + if (status.equals("new")) { + return NEW; + } + if (status.equals("assigned")) { + return ASSIGNED; + } + if (status.equals("reopened")) { + return REOPENED; + } + if (status.equals("closed")) { + return CLOSED; + } + return null; + } + + public String toStatusString() { + switch (this) { + case NEW: + return "new"; + case ASSIGNED: + return "assigned"; + case REOPENED: + return "reopened"; + case CLOSED: + return "closed"; + default: + return ""; + } + } + + @Override + public String toString() { + switch (this) { + case NEW: + return "New"; + case ASSIGNED: + return "Assigned"; + case REOPENED: + return "Reopened"; + case CLOSED: + return "Closed"; + default: + return ""; + } + } + + } + + public enum TracPriorityLevel { + BLOCKER, CRITICAL, MAJOR, MINOR, TRIVIAL; + + public static TracPriorityLevel fromPriority(String priority) { + if (priority == null) { + return null; + } + if (priority.equals("blocker")) { + return BLOCKER; + } + if (priority.equals("critical")) { + return CRITICAL; + } + if (priority.equals("major")) { + return MAJOR; + } + if (priority.equals("minor")) { + return MINOR; + } + if (priority.equals("trivial")) { + return TRIVIAL; + } + return null; + } + + public PriorityLevel toPriorityLevel() { + switch (this) { + case BLOCKER: + return PriorityLevel.P1; + case CRITICAL: + return PriorityLevel.P2; + case MAJOR: + return PriorityLevel.P3; + case MINOR: + return PriorityLevel.P4; + case TRIVIAL: + return PriorityLevel.P5; + default: + return null; + } + } + + @Override + public String toString() { + switch (this) { + case BLOCKER: + return "blocker"; + case CRITICAL: + return "critical"; + case MAJOR: + return "major"; + case MINOR: + return "minor"; + case TRIVIAL: + return "trivial"; + default: + return null; + } + } + } private final static String CLIENT_LABEL = "Trac (supports 0.9 or 0.10 through Web and XML-RPC)"; - private TracClientManager clientManager; + private static int TASK_PRIORITY_LEVELS = 5; - private final TracTaskDataHandler taskDataHandler = new TracTaskDataHandler(this); + public static final String TASK_KEY_SUPPORTS_SUBTASKS = "SupportsSubtasks"; + + public static String getDisplayUsername(TaskRepository repository) { + AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY); + if (credentials != null && credentials.getUserName().length() > 0) { + return ITracClient.DEFAULT_USERNAME; + } + return repository.getUserName(); + } + + public static PriorityLevel getTaskPriority(String tracPriority) { + if (tracPriority != null) { + TracPriorityLevel priority = TracPriorityLevel.fromPriority(tracPriority); + if (priority != null) { + return priority.toPriorityLevel(); + } + } + return PriorityLevel.getDefault(); + } + + public static PriorityLevel getTaskPriority(String priority, TracPriority[] tracPriorities) { + if (priority != null && tracPriorities != null && tracPriorities.length > 0) { + int minValue = tracPriorities[0].getValue(); + int range = tracPriorities[tracPriorities.length - 1].getValue() - minValue; + for (TracPriority tracPriority : tracPriorities) { + if (priority.equals(tracPriority.getName())) { + float relativeValue = (float) (tracPriority.getValue() - minValue) / range; + int value = (int) (relativeValue * TASK_PRIORITY_LEVELS) + 1; + return PriorityLevel.fromLevel(value); + } + } + } + return getTaskPriority(priority); + } + + public static int getTicketId(String taskId) throws CoreException { + try { + return Integer.parseInt(taskId); + } catch (NumberFormatException e) { + throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.ID_PLUGIN, IStatus.OK, + "Invalid ticket id: " + taskId, e)); + } + } + + static List<String> getAttributeValues(TaskData data, String attributeId) { + TaskAttribute attribute = data.getRoot().getMappedAttribute(attributeId); + if (attribute != null) { + return attribute.getValues(); + } else { + return Collections.emptyList(); + } + } + + static String getAttributeValue(TaskData data, String attributeId) { + TaskAttribute attribute = data.getRoot().getMappedAttribute(attributeId); + if (attribute != null) { + return attribute.getValue(); + } else { + return ""; + } + } + + public static boolean hasAttachmentSupport(TaskRepository repository, ITask task) { + return Version.XML_RPC.name().equals(repository.getVersion()); + } + + public static boolean hasChangedSince(TaskRepository repository) { + return Version.XML_RPC.name().equals(repository.getVersion()); + } + + public static boolean hasRichEditor(TaskRepository repository) { + return Version.XML_RPC.name().equals(repository.getVersion()); + } + + public static boolean hasRichEditor(TaskRepository repository, ITask task) { + return hasRichEditor(repository); + } + + public static boolean isCompleted(String tracStatus) { + TaskStatus taskStatus = TaskStatus.fromStatus(tracStatus); + return taskStatus == TaskStatus.CLOSED; + } private final TracAttachmentHandler attachmentHandler = new TracAttachmentHandler(this); - private TaskRepositoryLocationFactory taskRepositoryLocationFactory = new TaskRepositoryLocationFactory(); + private TracClientManager clientManager; private File repositoryConfigurationCacheFile; - public TracRepositoryConnector(File repositoryConfigurationCacheFile) { - this.repositoryConfigurationCacheFile = repositoryConfigurationCacheFile; + private final TracTaskDataHandler taskDataHandler = new TracTaskDataHandler(this); - } + private TaskRepositoryLocationFactory taskRepositoryLocationFactory = new TaskRepositoryLocationFactory(); + + private final TracWikiHandler wikiHandler = new TracWikiHandler(this); public TracRepositoryConnector() { if (TracCorePlugin.getDefault() != null) { @@ -76,6 +327,11 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { } } + public TracRepositoryConnector(File repositoryConfigurationCacheFile) { + this.repositoryConfigurationCacheFile = repositoryConfigurationCacheFile; + + } + @Override public boolean canCreateNewTask(TaskRepository repository) { return true; @@ -86,19 +342,21 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { return true; } - private final TracWikiHandler wikiHandler = new TracWikiHandler(this); + @Override + public AbstractTaskAttachmentHandler getTaskAttachmentHandler() { + return attachmentHandler; + } - public boolean hasWiki(TaskRepository repository) { - // check the access mode to validate Wiki support - ITracClient client = getClientManager().getTracClient(repository); - if (client instanceof ITracWikiClient) { - return true; + public synchronized TracClientManager getClientManager() { + if (clientManager == null) { + clientManager = new TracClientManager(repositoryConfigurationCacheFile, taskRepositoryLocationFactory); } - return false; + return clientManager; } - public AbstractWikiHandler getWikiHandler() { - return wikiHandler; + @Override + public String getConnectorKind() { + return TracCorePlugin.CONNECTOR_KIND; } @Override @@ -107,8 +365,14 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { } @Override - public String getConnectorKind() { - return TracCorePlugin.REPOSITORY_KIND; + public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor) + throws CoreException { + return taskDataHandler.getTaskData(repository, taskId, monitor); + } + + @Override + public AbstractTaskDataHandler getTaskDataHandler() { + return taskDataHandler; } @Override @@ -130,18 +394,30 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { } @Override + public String getTaskIdPrefix() { + return "#"; + } + + public TaskRepositoryLocationFactory getTaskRepositoryLocationFactory() { + return taskRepositoryLocationFactory; + } + + @Override public String getTaskUrl(String repositoryUrl, String taskId) { return repositoryUrl + ITracClient.TICKET_URL + taskId; } - @Override - public AbstractAttachmentHandler getAttachmentHandler() { - return attachmentHandler; + public AbstractWikiHandler getWikiHandler() { + return wikiHandler; } - @Override - public AbstractTaskDataHandler getLegacyTaskDataHandler() { - return taskDataHandler; + public boolean hasWiki(TaskRepository repository) { + // check the access mode to validate Wiki support + ITracClient client = getClientManager().getTracClient(repository); + if (client instanceof ITracWikiClient) { + return true; + } + return false; } @Override @@ -150,20 +426,22 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { try { monitor.beginTask("Querying repository", IProgressMonitor.UNKNOWN); - final List<TracTicket> tickets = new ArrayList<TracTicket>(); + TracSearch search = TracUtils.toTracSearch(query); + if (search == null) { + return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, TracCorePlugin.ID_PLUGIN, + RepositoryStatus.ERROR_REPOSITORY, "The query is invalid: \"" + query.getUrl() + "\""); + } ITracClient client; try { client = getClientManager().getTracClient(repository); - if (query instanceof TracRepositoryQuery) { - client.search(((TracRepositoryQuery) query).getTracSearch(), tickets, monitor); - } + final List<TracTicket> tickets = new ArrayList<TracTicket>(); + client.search(search, tickets, monitor); client.updateAttributes(monitor, false); for (TracTicket ticket : tickets) { - RepositoryTaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, - monitor); - ((LegacyTaskDataCollector) resultCollector).accept(taskData); + TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, monitor); + resultCollector.accept(taskData); } } catch (Throwable e) { return TracCorePlugin.toStatus(e, repository); @@ -176,6 +454,34 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { } @Override + public void postSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException { + try { + monitor.beginTask("", 1); + if (event.isFullSynchronization()) { + Date date = getSynchronizationTimestamp(event); + if (date != null) { + event.getTaskRepository().setSynchronizationTimeStamp(TracUtils.toTracTime(date) + ""); + } + } + } finally { + monitor.done(); + } + } + + private Date getSynchronizationTimestamp(ISynchronizationSession event) { + Date mostRecent = new Date(0); + Date mostRecentTimeStamp = TracUtils.parseDate(event.getTaskRepository().getSynchronizationTimeStamp()); + for (ITask task : event.getChangedTasks()) { + Date taskModifiedDate = task.getModificationDate(); + if (taskModifiedDate != null && taskModifiedDate.after(mostRecent)) { + mostRecent = taskModifiedDate; + mostRecentTimeStamp = task.getModificationDate(); + } + } + return mostRecentTimeStamp; + } + + @Override public void preSynchronization(ISynchronizationSession session, IProgressMonitor monitor) throws CoreException { monitor = Policy.monitorFor(monitor); try { @@ -250,70 +556,12 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { } } - @Override - public AbstractTask createTask(String repositoryUrl, String id, String summary) { - TracTask tracTask = new TracTask(repositoryUrl, id, summary); - tracTask.setCreationDate(new Date()); - return tracTask; - } - - @Override - public boolean updateTaskFromTaskData(TaskRepository taskRepository, ITask task, RepositoryTaskData taskData) { - TracTask tracTask = (TracTask) task; - ITracClient client = getClientManager().getTracClient(taskRepository); - - task.setSummary(taskData.getSummary()); - task.setOwner(taskData.getAttributeValue(RepositoryTaskAttribute.USER_ASSIGNED)); - if (TracTask.isCompleted(taskData.getStatus())) { - task.setCompletionDate(TracUtils.parseDate(Integer.valueOf(taskData.getLastModified()))); - } else { - task.setCompletionDate(null); - } - task.setUrl(taskRepository.getRepositoryUrl() + ITracClient.TICKET_URL + taskData.getTaskId()); - - String priority = taskData.getAttributeValue(Attribute.PRIORITY.getTracKey()); - TracPriority[] tracPriorities = client.getPriorities(); - task.setPriority(TracTask.getTaskPriority(priority, tracPriorities).toString()); - - Kind kind = TracTask.Kind.fromType(taskData.getAttributeValue(Attribute.TYPE.getTracKey())); - task.setTaskKind((kind != null) ? kind.toString() : null); - - tracTask.setSupportsSubtasks(taskDataHandler.canInitializeSubTaskData(null, taskData)); - - // TODO check return value - return false; - } - - public static int getTicketId(String taskId) throws CoreException { - try { - return Integer.parseInt(taskId); - } catch (NumberFormatException e) { - throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.ID_PLUGIN, IStatus.OK, - "Invalid ticket id: " + taskId, e)); - } - } - - public synchronized TracClientManager getClientManager() { - if (clientManager == null) { - clientManager = new TracClientManager(repositoryConfigurationCacheFile, taskRepositoryLocationFactory); + public synchronized void setTaskRepositoryLocationFactory( + TaskRepositoryLocationFactory taskRepositoryLocationFactory) { + this.taskRepositoryLocationFactory = taskRepositoryLocationFactory; + if (this.clientManager != null) { + clientManager.setTaskRepositoryLocationFactory(taskRepositoryLocationFactory); } - return clientManager; - } - - public static boolean hasChangedSince(TaskRepository repository) { - return Version.XML_RPC.name().equals(repository.getVersion()); - } - - public static boolean hasRichEditor(TaskRepository repository) { - return Version.XML_RPC.name().equals(repository.getVersion()); - } - - public static boolean hasRichEditor(TaskRepository repository, ITask task) { - return hasRichEditor(repository); - } - - public static boolean hasAttachmentSupport(TaskRepository repository, ITask task) { - return Version.XML_RPC.name().equals(repository.getVersion()); } public void stop() { @@ -333,110 +581,73 @@ public class TracRepositoryConnector extends AbstractLegacyRepositoryConnector { } } - public static String getDisplayUsername(TaskRepository repository) { - AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY); - if (credentials != null && credentials.getUserName().length() > 0) { - return ITracClient.DEFAULT_USERNAME; + @Override + public void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) { + TaskMapper mapper = getTaskMapper(taskRepository, taskData); + mapper.applyTo(task); + if (isCompleted(mapper.getStatus())) { + task.setCompletionDate(mapper.getModificationDate()); + } else { + task.setCompletionDate(null); } - return repository.getUserName(); + task.setUrl(taskRepository.getRepositoryUrl() + ITracClient.TICKET_URL + taskData.getTaskId()); + task.setAttribute(TASK_KEY_SUPPORTS_SUBTASKS, Boolean.toString(taskDataHandler.supportsSubtasks(taskData))); } @Override - public String getTaskIdPrefix() { - return "#"; - } - - public static TracTicket getTracTicket(TaskRepository repository, RepositoryTaskData data) - throws InvalidTicketException, CoreException { - TracTicket ticket = new TracTicket(getTicketId(data.getTaskId())); - - List<RepositoryTaskAttribute> attributes = data.getAttributes(); - for (RepositoryTaskAttribute attribute : attributes) { - if (TracAttributeFactory.isInternalAttribute(attribute.getId())) { - // ignore - } else if (!attribute.isReadOnly()) { - ticket.putValue(attribute.getId(), attribute.getValue()); - } - } - - // set cc value - StringBuilder sb = new StringBuilder(); - List<String> removeValues = data.getAttributeValues(RepositoryTaskAttribute.REMOVE_CC); - List<String> values = data.getAttributeValues(RepositoryTaskAttribute.USER_CC); - for (String user : values) { - if (!removeValues.contains(user)) { - if (sb.length() > 0) { - sb.append(","); - } - sb.append(user); - } - } - if (data.getAttributeValue(RepositoryTaskAttribute.NEW_CC).length() > 0) { - if (sb.length() > 0) { - sb.append(","); - } - sb.append(data.getAttributeValue(RepositoryTaskAttribute.NEW_CC)); - } - if (RepositoryTaskAttribute.TRUE.equals(data.getAttributeValue(RepositoryTaskAttribute.ADD_SELF_CC))) { - if (sb.length() > 0) { - sb.append(","); - } - sb.append(repository.getUserName()); - } - ticket.putBuiltinValue(Key.CC, sb.toString()); - - RepositoryOperation operation = data.getSelectedOperation(); - if (operation != null) { - String action = operation.getKnobName(); - if (!"leave".equals(action)) { - if ("accept".equals(action)) { - ticket.putValue("status", TracTask.Status.ASSIGNED.toStatusString()); - ticket.putValue("owner", getDisplayUsername(repository)); - } else if ("resolve".equals(action)) { - ticket.putValue("status", TracTask.Status.CLOSED.toStatusString()); - ticket.putValue("resolution", operation.getOptionSelection()); - } else if ("reopen".equals(action)) { - ticket.putValue("status", TracTask.Status.REOPENED.toStatusString()); - ticket.putValue("resolution", ""); - } else if ("reassign".equals(operation.getKnobName())) { - ticket.putValue("status", TracTask.Status.NEW.toStatusString()); - ticket.putValue("owner", operation.getInputValue()); - } + public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) { + TaskMapper mapper = getTaskMapper(taskRepository, taskData); + if (taskData.isPartial()) { + return mapper.hasChanges(task); + } else { + Date repositoryDate = mapper.getModificationDate(); + Date localDate = task.getModificationDate(); + if (repositoryDate != null && repositoryDate.equals(localDate)) { + return false; } + return true; } - - return ticket; } - public TaskRepositoryLocationFactory getTaskRepositoryLocationFactory() { - return taskRepositoryLocationFactory; - } - - public synchronized void setTaskRepositoryLocationFactory( - TaskRepositoryLocationFactory taskRepositoryLocationFactory) { - this.taskRepositoryLocationFactory = taskRepositoryLocationFactory; - if (this.clientManager != null) { - clientManager.setTaskRepositoryLocationFactory(taskRepositoryLocationFactory); + @Override + public Collection<TaskRelation> getTaskRelations(TaskData taskData) { + TaskAttribute attribute = taskData.getRoot().getAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY); + if (attribute != null) { + List<TaskRelation> result = new ArrayList<TaskRelation>(); + StringTokenizer t = new StringTokenizer(attribute.getValue(), ", "); + while (t.hasMoreTokens()) { + result.add(TaskRelation.subtask(t.nextToken())); + } + return result; } + return Collections.emptySet(); } @Override - public RepositoryTaskData getLegacyTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor) - throws CoreException { - return getLegacyTaskDataHandler().getTaskData(repository, taskId, monitor); - } + public ITaskMapping getTaskMapping(TaskData taskData) { + return getTaskMapper(null, taskData); + } + + public TaskMapper getTaskMapper(TaskRepository taskRepository, TaskData taskData) { + final ITracClient client = (taskRepository != null) ? getClientManager().getTracClient(taskRepository) : null; + return new TaskMapper(taskData) { + @Override + public PriorityLevel getPriorityLevel() { + if (client != null) { + String priority = getPriority(); + TracPriority[] tracPriorities = client.getPriorities(); + return getTaskPriority(priority, tracPriorities); + } + return null; + } - @Override - public void postSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException { - try { - monitor.beginTask("", 1); - if (event.isFullSynchronization()) { - event.getTaskRepository().setSynchronizationTimeStamp( - getSynchronizationTimestamp(event.getTaskRepository(), event.getChangedTasks())); + @Override + public String getTaskKind() { + TaskKind taskKind = TaskKind.fromType(super.getTaskKind()); + return (taskKind != null) ? taskKind.toString() : null; } - } finally { - monitor.done(); - } + + }; } }
\ No newline at end of file diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracStatus.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracStatus.java deleted file mode 100644 index 555a6ad2b..000000000 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracStatus.java +++ /dev/null @@ -1,24 +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.internal.trac.core; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.mylyn.tasks.core.RepositoryStatus; - -/** - * @author Steffen Pingel - */ -public class TracStatus { - - public static IStatus createPermissionDeniedError(String repositoryUrl, String pluginId) { - return new RepositoryStatus(repositoryUrl, IStatus.ERROR, TracCorePlugin.ID_PLUGIN, - RepositoryStatus.ERROR_PERMISSION_DENIED, "Permission denied."); - } - -} diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTask.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTask.java deleted file mode 100644 index 30d94f878..000000000 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTask.java +++ /dev/null @@ -1,244 +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.internal.trac.core; - -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.trac.core.model.TracPriority; - -/** - * @author Steffen Pingel - */ -public class TracTask extends AbstractTask { - - public enum Kind { - DEFECT, ENHANCEMENT, TASK; - - public static Kind fromString(String type) { - if (type == null) { - return null; - } - if (type.equals("Defect")) { - return DEFECT; - } - if (type.equals("Enhancement")) { - return ENHANCEMENT; - } - if (type.equals("Task")) { - return TASK; - } - return null; - } - - public static Kind fromType(String type) { - if (type == null) { - return null; - } - if (type.equals("defect")) { - return DEFECT; - } - if (type.equals("enhancement")) { - return ENHANCEMENT; - } - if (type.equals("task")) { - return TASK; - } - return null; - } - - @Override - public String toString() { - switch (this) { - case DEFECT: - return "Defect"; - case ENHANCEMENT: - return "Enhancement"; - case TASK: - return "Task"; - default: - return ""; - } - } - - } - - public enum Status { - ASSIGNED, CLOSED, NEW, REOPENED; - - public static Status fromStatus(String status) { - if (status == null) { - return null; - } - if (status.equals("new")) { - return NEW; - } - if (status.equals("assigned")) { - return ASSIGNED; - } - if (status.equals("reopened")) { - return REOPENED; - } - if (status.equals("closed")) { - return CLOSED; - } - return null; - } - - public String toStatusString() { - switch (this) { - case NEW: - return "new"; - case ASSIGNED: - return "assigned"; - case REOPENED: - return "reopened"; - case CLOSED: - return "closed"; - default: - return ""; - } - } - - @Override - public String toString() { - switch (this) { - case NEW: - return "New"; - case ASSIGNED: - return "Assigned"; - case REOPENED: - return "Reopened"; - case CLOSED: - return "Closed"; - default: - return ""; - } - } - - } - - public enum TracPriorityLevel { - BLOCKER, CRITICAL, MAJOR, MINOR, TRIVIAL; - - public static TracPriorityLevel fromPriority(String priority) { - if (priority == null) { - return null; - } - if (priority.equals("blocker")) { - return BLOCKER; - } - if (priority.equals("critical")) { - return CRITICAL; - } - if (priority.equals("major")) { - return MAJOR; - } - if (priority.equals("minor")) { - return MINOR; - } - if (priority.equals("trivial")) { - return TRIVIAL; - } - return null; - } - - public PriorityLevel toPriorityLevel() { - switch (this) { - case BLOCKER: - return PriorityLevel.P1; - case CRITICAL: - return PriorityLevel.P2; - case MAJOR: - return PriorityLevel.P3; - case MINOR: - return PriorityLevel.P4; - case TRIVIAL: - return PriorityLevel.P5; - default: - return null; - } - } - - @Override - public String toString() { - switch (this) { - case BLOCKER: - return "blocker"; - case CRITICAL: - return "critical"; - case MAJOR: - return "major"; - case MINOR: - return "minor"; - case TRIVIAL: - return "trivial"; - default: - return null; - } - } - - } - - private static int TASK_PRIORITY_LEVELS = 5; - - public static PriorityLevel getTaskPriority(String tracPriority) { - if (tracPriority != null) { - TracPriorityLevel priority = TracPriorityLevel.fromPriority(tracPriority); - if (priority != null) { - return priority.toPriorityLevel(); - } - } - return PriorityLevel.getDefault(); - } - - public static PriorityLevel getTaskPriority(String priority, TracPriority[] tracPriorities) { - if (priority != null && tracPriorities != null && tracPriorities.length > 0) { - int minValue = tracPriorities[0].getValue(); - int range = tracPriorities[tracPriorities.length - 1].getValue() - minValue; - for (TracPriority tracPriority : tracPriorities) { - if (priority.equals(tracPriority.getName())) { - float relativeValue = (float) (tracPriority.getValue() - minValue) / range; - int value = (int) (relativeValue * TASK_PRIORITY_LEVELS) + 1; - return PriorityLevel.fromLevel(value); - } - } - } - return getTaskPriority(priority); - } - - public static boolean isCompleted(String tracStatus) { - TracTask.Status status = TracTask.Status.fromStatus(tracStatus); - return status == TracTask.Status.CLOSED; - } - - private boolean supportsSubtasks = false; - - public TracTask(String repositoryUrl, String id, String label) { - super(repositoryUrl, id, label); - setUrl(repositoryUrl + ITracClient.TICKET_URL + id); - } - - @Override - public String getConnectorKind() { - return TracCorePlugin.REPOSITORY_KIND; - } - - @Override - public boolean isLocal() { - return false; - } - - public boolean getSupportsSubtasks() { - return supportsSubtasks; - } - - public void setSupportsSubtasks(boolean supportsSubtasks) { - this.supportsSubtasks = supportsSubtasks; - } - -} diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java index bad39705b..81c2afaf6 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java @@ -10,9 +10,8 @@ package org.eclipse.mylyn.internal.trac.core; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; +import java.util.Collection; import java.util.Date; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -23,26 +22,26 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.mylyn.commons.net.Policy; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler; -import org.eclipse.mylyn.internal.tasks.core.deprecated.DefaultTaskSchema; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryAttachment; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; -import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment; -import org.eclipse.mylyn.internal.trac.core.TracAttributeFactory.Attribute; -import org.eclipse.mylyn.internal.trac.core.TracTask.Kind; import org.eclipse.mylyn.internal.trac.core.model.TracAttachment; import org.eclipse.mylyn.internal.trac.core.model.TracComment; -import org.eclipse.mylyn.internal.trac.core.model.TracPriority; import org.eclipse.mylyn.internal.trac.core.model.TracTicket; import org.eclipse.mylyn.internal.trac.core.model.TracTicketField; import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key; import org.eclipse.mylyn.internal.trac.core.util.TracUtils; import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskMapping; +import org.eclipse.mylyn.tasks.core.RepositoryResponse; import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind; +import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler; +import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; +import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper; +import org.eclipse.mylyn.tasks.core.data.TaskData; +import org.eclipse.mylyn.tasks.core.data.TaskMapper; +import org.eclipse.mylyn.tasks.core.data.TaskOperation; /** * @author Steffen Pingel @@ -55,16 +54,13 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { private static final String CC_DELIMETER = ", "; - private final AbstractAttributeFactory attributeFactory = new TracAttributeFactory(); - private final TracRepositoryConnector connector; public TracTaskDataHandler(TracRepositoryConnector connector) { this.connector = connector; } - @Override - public RepositoryTaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor) + public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor) throws CoreException { monitor = Policy.monitorFor(monitor); try { @@ -75,7 +71,7 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { } } - public RepositoryTaskData downloadTaskData(TaskRepository repository, int taskId, IProgressMonitor monitor) + public TaskData downloadTaskData(TaskRepository repository, int taskId, IProgressMonitor monitor) throws CoreException { ITracClient client = connector.getClientManager().getTracClient(repository); TracTicket ticket; @@ -91,17 +87,19 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { return createTaskDataFromTicket(client, repository, ticket, monitor); } - public RepositoryTaskData createTaskDataFromTicket(ITracClient client, TaskRepository repository, - TracTicket ticket, IProgressMonitor monitor) throws CoreException { - RepositoryTaskData taskData = new RepositoryTaskData(attributeFactory, TracCorePlugin.REPOSITORY_KIND, + public TaskData createTaskDataFromTicket(ITracClient client, TaskRepository repository, TracTicket ticket, + IProgressMonitor monitor) throws CoreException { + TaskData taskData = new TaskData(getAttributeMapper(repository), TracCorePlugin.CONNECTOR_KIND, repository.getRepositoryUrl(), ticket.getId() + ""); try { if (!TracRepositoryConnector.hasRichEditor(repository)) { - updateTaskDataFromTicket(taskData, ticket, client); + createDefaultAttributes(taskData, client, true); + updateTaskData(repository, taskData, ticket); + //updateTaskDataFromTicket(taskData, ticket, client); taskData.setPartial(true); } else { - createDefaultAttributes(attributeFactory, taskData, client, true); - updateTaskData(repository, attributeFactory, taskData, ticket); + createDefaultAttributes(taskData, client, true); + updateTaskData(repository, taskData, ticket); } return taskData; } catch (OperationCanceledException e) { @@ -112,21 +110,10 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { } } - @Override - public AbstractAttributeFactory getAttributeFactory(String repositoryUrl, String repositoryKind, String taskKind) { - // we don't care about the repository information right now - return attributeFactory; - } - - @Override - public AbstractAttributeFactory getAttributeFactory(RepositoryTaskData taskData) { - return getAttributeFactory(taskData.getRepositoryUrl(), taskData.getConnectorKind(), taskData.getTaskKind()); - } - - public static void updateTaskData(TaskRepository repository, AbstractAttributeFactory factory, - RepositoryTaskData data, TracTicket ticket) { + public static void updateTaskData(TaskRepository repository, TaskData data, TracTicket ticket) { if (ticket.getCreated() != null) { - data.setAttributeValue(Attribute.TIME.getTracKey(), TracUtils.toTracTime(ticket.getCreated()) + ""); + data.getRoot().getAttribute(TracAttribute.TIME.getTracKey()).setValue( + TracUtils.toTracTime(ticket.getCreated()) + ""); } Date lastChanged = ticket.getLastChanged(); @@ -136,53 +123,53 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { if (Key.CC.getKey().equals(key)) { StringTokenizer t = new StringTokenizer(valueByKey.get(key), CC_DELIMETER); while (t.hasMoreTokens()) { - data.addAttributeValue(key, t.nextToken()); + data.getRoot().getAttribute(key).addValue(t.nextToken()); } } else { - data.setAttributeValue(key, valueByKey.get(key)); + data.getRoot().getAttribute(key).setValue(valueByKey.get(key)); } } TracComment[] comments = ticket.getComments(); if (comments != null) { + int count = 1; for (int i = 0; i < comments.length; i++) { if (!"comment".equals(comments[i].getField()) || "".equals(comments[i].getNewValue())) { continue; } - TaskComment taskComment = new TaskComment(factory, data.getComments().size() + 1); - taskComment.setAttributeValue(RepositoryTaskAttribute.COMMENT_AUTHOR, comments[i].getAuthor()); - taskComment.setAttributeValue(RepositoryTaskAttribute.COMMENT_DATE, comments[i].getCreated().toString()); - taskComment.setAttributeValue(RepositoryTaskAttribute.COMMENT_TEXT, comments[i].getNewValue()); - data.addComment(taskComment); + TaskCommentMapper mapper = new TaskCommentMapper(); + mapper.setAuthor(repository.createPerson(comments[i].getAuthor())); + mapper.setCreationDate(comments[i].getCreated()); + mapper.setText(comments[i].getNewValue()); + mapper.setNumber(count); + + TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_COMMENT + count); + mapper.applyTo(attribute); + count++; } } TracAttachment[] attachments = ticket.getAttachments(); if (attachments != null) { for (int i = 0; i < attachments.length; i++) { - RepositoryAttachment taskAttachment = new RepositoryAttachment(factory); - taskAttachment.setCreator(attachments[i].getAuthor()); - taskAttachment.setRepositoryKind(TracCorePlugin.REPOSITORY_KIND); - taskAttachment.setRepositoryUrl(repository.getRepositoryUrl()); - taskAttachment.setTaskId("" + ticket.getId()); - taskAttachment.setAttributeValue(Attribute.DESCRIPTION.getTracKey(), attachments[i].getDescription()); - taskAttachment.setAttributeValue(RepositoryTaskAttribute.ATTACHMENT_FILENAME, - attachments[i].getFilename()); - taskAttachment.setAttributeValue(RepositoryTaskAttribute.ATTACHMENT_SIZE, attachments[i].getSize() + ""); - taskAttachment.setAttributeValue(RepositoryTaskAttribute.USER_OWNER, attachments[i].getAuthor()); + TaskAttachmentMapper mapper = new TaskAttachmentMapper(); + mapper.setAuthor(repository.createPerson(attachments[i].getAuthor())); + mapper.setDescription(attachments[i].getDescription()); + mapper.setFileName(attachments[i].getFilename()); + mapper.setLength((long) attachments[i].getSize()); if (attachments[i].getCreated() != null) { if (lastChanged == null || attachments[i].getCreated().after(lastChanged)) { lastChanged = attachments[i].getCreated(); } - - taskAttachment.setAttributeValue(RepositoryTaskAttribute.ATTACHMENT_DATE, - attachments[i].getCreated().toString()); + mapper.setCreationDate(attachments[i].getCreated()); } - taskAttachment.setAttributeValue(RepositoryTaskAttribute.ATTACHMENT_URL, repository.getRepositoryUrl() - + ITracClient.TICKET_ATTACHMENT_URL + ticket.getId() + "/" + attachments[i].getFilename()); - taskAttachment.setAttributeValue(RepositoryTaskAttribute.ATTACHMENT_ID, i + ""); - data.addAttachment(taskAttachment); + mapper.setUrl(repository.getRepositoryUrl() + ITracClient.TICKET_ATTACHMENT_URL + ticket.getId() + "/" + + attachments[i].getFilename()); + mapper.setAttachmentId(i + ""); + + TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_ATTACHMENT + (i + 1)); + mapper.applyTo(attribute); } } @@ -193,82 +180,62 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { addOperation(repository, data, ticket, actionList, "leave"); addOperation(repository, data, ticket, actionList, "accept"); addOperation(repository, data, ticket, actionList, "resolve"); - addOperation(repository, data, ticket, actionList, "reassign"); addOperation(repository, data, ticket, actionList, "reopen"); } if (lastChanged != null) { - data.setAttributeValue(Attribute.CHANGE_TIME.getTracKey(), TracUtils.toTracTime(lastChanged) + ""); + data.getRoot().getAttribute(TracAttribute.CHANGE_TIME.getTracKey()).setValue( + TracUtils.toTracTime(lastChanged) + ""); } } // TODO Reuse Labels from BugzillaServerFacade - private static void addOperation(TaskRepository repository, RepositoryTaskData data, TracTicket ticket, - List<String> actions, String action) { + private static void addOperation(TaskRepository repository, TaskData data, TracTicket ticket, List<String> actions, + String action) { if (!actions.remove(action)) { return; } - RepositoryOperation operation = null; + String label = null; if ("leave".equals(action)) { - operation = new RepositoryOperation(action, "Leave as " + data.getStatus() + " " + data.getResolution()); - operation.setChecked(true); + // TODO + //label = "Leave as " + data.getStatus() + " " + data.getResolution(); + label = "Leave"; } else if ("accept".equals(action)) { - operation = new RepositoryOperation(action, "Accept"); + label = "Accept"; } else if ("resolve".equals(action)) { - operation = new RepositoryOperation(action, "Resolve as"); - operation.setUpOptions("resolution"); - for (String resolution : ticket.getResolutions()) { - operation.addOption(resolution, resolution); - } - } else if ("reassign".equals(action)) { - operation = new RepositoryOperation(action, "Reassign to"); - operation.setInputName("owner"); - operation.setInputValue(TracRepositoryConnector.getDisplayUsername(repository)); + label = "Resolve as"; } else if ("reopen".equals(action)) { - operation = new RepositoryOperation(action, "Reopen"); + label = "Reopen"; } - if (operation != null) { - data.addOperation(operation); + if (label != null) { + TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + action); + TaskOperation.applyTo(attribute, action, label); + if ("resolve".equals(action)) { + attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, + TracAttribute.RESOLUTION.getTracKey()); + } } } - public static void createDefaultAttributes(AbstractAttributeFactory factory, RepositoryTaskData data, - ITracClient client, boolean existingTask) { - TracTicketField[] fields = client.getTicketFields(); - - if (existingTask) { - createAttribute(factory, data, Attribute.STATUS, client.getTicketStatus()); - createAttribute(factory, data, Attribute.RESOLUTION, client.getTicketResolutions()); - } - - createAttribute(factory, data, Attribute.COMPONENT, client.getComponents()); - createAttribute(factory, data, Attribute.VERSION, client.getVersions(), true); - createAttribute(factory, data, Attribute.PRIORITY, client.getPriorities()); - createAttribute(factory, data, Attribute.SEVERITY, client.getSeverities()); - - createAttribute(factory, data, Attribute.TYPE, client.getTicketTypes()); - RepositoryTaskAttribute attribute = createAttribute(factory, data, Attribute.OWNER); - if (!existingTask) { - attribute.setReadOnly(false); - } - createAttribute(factory, data, Attribute.MILESTONE, client.getMilestones(), true); + public static void createDefaultAttributes(TaskData data, ITracClient client, boolean existingTask) { + createAttribute(data, TracAttribute.SUMMARY); + createAttribute(data, TracAttribute.DESCRIPTION); if (existingTask) { - createAttribute(factory, data, Attribute.REPORTER); + createAttribute(data, TracAttribute.TIME); + createAttribute(data, TracAttribute.CHANGE_TIME); + createAttribute(data, TracAttribute.STATUS, client.getTicketStatus()); + createAttribute(data, TracAttribute.RESOLUTION, client.getTicketResolutions()); } - - if (existingTask) { - createAttribute(factory, data, Attribute.NEW_CC); - } - createAttribute(factory, data, Attribute.CC); - createAttribute(factory, data, Attribute.KEYWORDS); - - if (!existingTask) { - createAttribute(factory, data, Attribute.SUMMARY); - createAttribute(factory, data, Attribute.DESCRIPTION); - } - + createAttribute(data, TracAttribute.COMPONENT, client.getComponents()); + createAttribute(data, TracAttribute.VERSION, client.getVersions(), true); + createAttribute(data, TracAttribute.PRIORITY, client.getPriorities()); + createAttribute(data, TracAttribute.SEVERITY, client.getSeverities()); + createAttribute(data, TracAttribute.MILESTONE, client.getMilestones(), true); + createAttribute(data, TracAttribute.TYPE, client.getTicketTypes()); + createAttribute(data, TracAttribute.KEYWORDS); + TracTicketField[] fields = client.getTicketFields(); if (fields != null) { for (TracTicketField field : fields) { if (field.isCustom()) { @@ -276,29 +243,46 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { } } } + // people + createAttribute(data, TracAttribute.OWNER); + if (existingTask) { + createAttribute(data, TracAttribute.REPORTER); + } + createAttribute(data, TracAttribute.CC); + if (existingTask) { + data.getRoot().createAttribute(TracAttributeMapper.NEW_CC).getMetaData().setType( + TaskAttribute.TYPE_SHORT_TEXT).setReadOnly(false); + data.getRoot().createAttribute(TracAttributeMapper.REMOVE_CC); + data.getRoot().createAttribute(TaskAttribute.COMMENT_NEW).getMetaData().setType( + TaskAttribute.TYPE_LONG_RICH_TEXT).setReadOnly(false); + } + // operations + data.getRoot().createAttribute(TaskAttribute.OPERATION).getMetaData().setType(TaskAttribute.TYPE_OPERATION); } - private static void createAttribute(RepositoryTaskData data, TracTicketField field) { - RepositoryTaskAttribute attr = new RepositoryTaskAttribute(field.getName(), field.getLabel(), false); + private static void createAttribute(TaskData data, TracTicketField field) { + TaskAttribute attr = data.getRoot().createAttribute(field.getName()); + attr.getMetaData().setLabel(field.getLabel()); + attr.getMetaData().setKind(TaskAttribute.KIND_DEFAULT); if (field.getType() == TracTicketField.Type.CHECKBOX) { // attr.addOption("True", "1"); // attr.addOption("False", "0"); - attr.addOption("1", "1"); - attr.addOption("0", "0"); - + attr.getMetaData().setType(TaskAttribute.TYPE_BOOLEAN); + attr.putOption("1", "1"); + attr.putOption("0", "0"); if (field.getDefaultValue() != null) { attr.setValue(field.getDefaultValue()); } } else if (field.getType() == TracTicketField.Type.SELECT || field.getType() == TracTicketField.Type.RADIO) { + attr.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT); String[] values = field.getOptions(); if (values != null && values.length > 0) { if (field.isOptional()) { - attr.addOption("", ""); + attr.putOption("", ""); } for (String value : values) { - attr.addOption(value, value); + attr.putOption(value, value); } - if (field.getDefaultValue() != null) { try { int index = Integer.parseInt(field.getDefaultValue()); @@ -320,51 +304,54 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { attr.setValue(field.getDefaultValue()); } } - data.addAttribute(attr.getId(), attr); } - private static RepositoryTaskAttribute createAttribute(AbstractAttributeFactory factory, RepositoryTaskData data, - Attribute attribute, Object[] values, boolean allowEmtpy) { - RepositoryTaskAttribute attr = factory.createAttribute(attribute.getTracKey()); + private static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute) { + TaskAttribute attr = data.getRoot().createAttribute(tracAttribute.getTracKey()); + attr.getMetaData().setType(tracAttribute.getType()); + attr.getMetaData().setKind(tracAttribute.getKind()); + attr.getMetaData().setLabel(tracAttribute.toString()); + attr.getMetaData().setReadOnly(tracAttribute.isReadOnly()); + return attr; + } + + private static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute, Object[] values, + boolean allowEmtpy) { + TaskAttribute attr = createAttribute(data, tracAttribute); if (values != null && values.length > 0) { if (allowEmtpy) { - attr.addOption("", ""); + attr.putOption("", ""); } for (Object value : values) { - attr.addOption(value.toString(), value.toString()); + attr.putOption(value.toString(), value.toString()); } } else { - attr.setHidden(true); - attr.setReadOnly(true); + attr.getMetaData().setReadOnly(true); } - data.addAttribute(attribute.getTracKey(), attr); - return attr; - } - - private static RepositoryTaskAttribute createAttribute(AbstractAttributeFactory factory, RepositoryTaskData data, - Attribute attribute) { - RepositoryTaskAttribute attr = factory.createAttribute(attribute.getTracKey()); - data.addAttribute(attribute.getTracKey(), attr); return attr; } - private static RepositoryTaskAttribute createAttribute(AbstractAttributeFactory factory, RepositoryTaskData data, - Attribute attribute, Object[] values) { - return createAttribute(factory, data, attribute, values, false); + private static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute, Object[] values) { + return createAttribute(data, tracAttribute, values, false); } @Override - public String postTaskData(TaskRepository repository, RepositoryTaskData taskData, IProgressMonitor monitor) - throws CoreException { + public RepositoryResponse postTaskData(TaskRepository repository, TaskData taskData, + Set<TaskAttribute> oldAttributes, IProgressMonitor monitor) throws CoreException { try { - TracTicket ticket = TracRepositoryConnector.getTracTicket(repository, taskData); + TracTicket ticket = TracTaskDataHandler.getTracTicket(repository, taskData); ITracClient server = connector.getClientManager().getTracClient(repository); if (taskData.isNew()) { int id = server.createTicket(ticket, monitor); - return id + ""; + return new RepositoryResponse(ResponseKind.TASK_CREATED, id + ""); } else { - server.updateTicket(ticket, taskData.getNewComment(), monitor); - return null; + String newComment = ""; + TaskAttribute newCommentAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW); + if (newCommentAttribute != null) { + newComment = newCommentAttribute.getValue(); + } + server.updateTicket(ticket, newComment, monitor); + return new RepositoryResponse(ResponseKind.TASK_UPDATED, ticket.getId() + ""); } } catch (OperationCanceledException e) { throw e; @@ -375,12 +362,12 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { } @Override - public boolean initializeTaskData(TaskRepository repository, RepositoryTaskData data, IProgressMonitor monitor) - throws CoreException { + public boolean initializeTaskData(TaskRepository repository, TaskData data, ITaskMapping initializationData, + IProgressMonitor monitor) throws CoreException { try { ITracClient client = connector.getClientManager().getTracClient(repository); client.updateAttributes(monitor, false); - createDefaultAttributes(attributeFactory, data, client, false); + createDefaultAttributes(data, client, false); return true; } catch (OperationCanceledException e) { throw e; @@ -391,77 +378,163 @@ public class TracTaskDataHandler extends AbstractTaskDataHandler { } @Override - public boolean initializeSubTaskData(TaskRepository repository, RepositoryTaskData taskData, - RepositoryTaskData parentTaskData, IProgressMonitor monitor) throws CoreException { - initializeTaskData(repository, taskData, monitor); - RepositoryTaskAttribute attribute = taskData.getAttribute(ATTRIBUTE_BLOCKING); + public boolean initializeSubTaskData(TaskRepository repository, TaskData taskData, TaskData parentTaskData, + IProgressMonitor monitor) throws CoreException { + initializeTaskData(repository, taskData, null, monitor); + TaskAttribute attribute = taskData.getRoot().getMappedAttribute(ATTRIBUTE_BLOCKING); if (attribute == null) { throw new CoreException(new RepositoryStatus(repository, IStatus.ERROR, TracCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY, "The repository does not support subtasks")); } - cloneTaskData(parentTaskData, taskData); - taskData.setDescription(""); - taskData.setSummary(""); + + TaskMapper mapper = new TaskMapper(taskData); + mapper.merge(new TaskMapper(parentTaskData)); + mapper.setDescription(""); + mapper.setSummary(""); attribute.setValue(parentTaskData.getTaskId()); return true; } @Override - public Set<String> getSubTaskIds(RepositoryTaskData taskData) { - RepositoryTaskAttribute attribute = taskData.getAttribute(ATTRIBUTE_BLOCKED_BY); - if (attribute != null) { - Set<String> result = new HashSet<String>(); - StringTokenizer t = new StringTokenizer(attribute.getValue(), ", "); - while (t.hasMoreTokens()) { - result.add(t.nextToken()); - } - return result; - } - return Collections.emptySet(); + public boolean canInitializeSubTaskData(TaskRepository taskRepository, ITask task) { + return Boolean.parseBoolean(task.getAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS)); } +// /** +// * Updates attributes of <code>taskData</code> from <code>ticket</code>. +// */ +// public void updateTaskDataFromTicket(TaskData taskData, TracTicket ticket, ITracClient client) { +// DefaultTaskSchema schema = new DefaultTaskSchema(taskData); +// if (ticket.getValue(Key.SUMMARY) != null) { +// schema.setSummary(ticket.getValue(Key.SUMMARY)); +// } +// +// if (TracRepositoryConnector.isCompleted(ticket.getValue(Key.STATUS))) { +// schema.setCompletionDate(ticket.getLastChanged()); +// } else { +// schema.setCompletionDate(null); +// } +// +// String priority = ticket.getValue(Key.PRIORITY); +// TracPriority[] tracPriorities = client.getPriorities(); +// schema.setPriority(TracRepositoryConnector.getTaskPriority(priority, tracPriorities)); +// +// if (ticket.getValue(Key.TYPE) != null) { +// TaskKind taskKind = TracRepositoryConnector.TaskKind.fromType(ticket.getValue(Key.TYPE)); +// schema.setTaskKind((taskKind != null) ? taskKind.toString() : ticket.getValue(Key.TYPE)); +// } +// +// if (ticket.getCreated() != null) { +// schema.setCreationDate(ticket.getCreated()); +// } +// +// if (ticket.getCustomValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING) != null) { +// taskData.addAttribute(ATTRIBUTE_BLOCKED_BY, new TaskAttribute(ATTRIBUTE_BLOCKED_BY, "Blocked by", true)); +// } +// } + @Override - public boolean canInitializeSubTaskData(ITask task, RepositoryTaskData parentTaskData) { - if (parentTaskData != null) { - return parentTaskData.getAttribute(ATTRIBUTE_BLOCKED_BY) != null; - } else if (task instanceof TracTask) { - return ((TracTask) task).getSupportsSubtasks(); - } - return false; + public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) { + return new TracAttributeMapper(taskRepository); } - /** - * Updates attributes of <code>taskData</code> from <code>ticket</code>. - */ - public void updateTaskDataFromTicket(RepositoryTaskData taskData, TracTicket ticket, ITracClient client) { - DefaultTaskSchema schema = new DefaultTaskSchema(taskData); - if (ticket.getValue(Key.SUMMARY) != null) { - schema.setSummary(ticket.getValue(Key.SUMMARY)); + public boolean supportsSubtasks(TaskData taskData) { + return taskData.getRoot().getAttribute(ATTRIBUTE_BLOCKING) != null; + } + + public static TracTicket getTracTicket(TaskRepository repository, TaskData data) throws InvalidTicketException, + CoreException { + TracTicket ticket = (data.isNew()) ? new TracTicket() : new TracTicket( + TracRepositoryConnector.getTicketId(data.getTaskId())); + + Collection<TaskAttribute> attributes = data.getRoot().getAttributes().values(); + for (TaskAttribute attribute : attributes) { + if (TracAttributeMapper.isInternalAttribute(attribute)) { + // ignore + } else if (!attribute.getMetaData().isReadOnly()) { + ticket.putValue(attribute.getId(), attribute.getValue()); + } } - if (TracTask.isCompleted(ticket.getValue(Key.STATUS))) { - schema.setCompletionDate(ticket.getLastChanged()); - } else { - schema.setCompletionDate(null); + // set cc value + StringBuilder sb = new StringBuilder(); + List<String> removeValues = TracRepositoryConnector.getAttributeValues(data, TracAttributeMapper.REMOVE_CC); + List<String> values = TracRepositoryConnector.getAttributeValues(data, TaskAttribute.USER_CC); + for (String user : values) { + if (!removeValues.contains(user)) { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(user); + } + } + if (TracRepositoryConnector.getAttributeValue(data, TracAttributeMapper.NEW_CC).length() > 0) { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(TracRepositoryConnector.getAttributeValue(data, TracAttributeMapper.NEW_CC)); + } + if (Boolean.TRUE.equals(TracRepositoryConnector.getAttributeValue(data, TaskAttribute.ADD_SELF_CC))) { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(repository.getUserName()); + } + ticket.putBuiltinValue(Key.CC, sb.toString()); + + ticket.putValue("owner", TracRepositoryConnector.getAttributeValue(data, TaskAttribute.USER_ASSIGNED)); + + TaskAttribute operationAttribute = data.getRoot().getMappedAttribute(TaskAttribute.OPERATION); + if (operationAttribute != null) { + TaskOperation operation = TaskOperation.createFrom(operationAttribute); + String action = operation.getOperationId(); + if (!"leave".equals(action)) { + if ("accept".equals(action)) { + ticket.putValue("status", TracRepositoryConnector.TaskStatus.ASSIGNED.toStatusString()); + } else if ("resolve".equals(action)) { + ticket.putValue("status", TracRepositoryConnector.TaskStatus.CLOSED.toStatusString()); + ticket.putValue("resolution", TracRepositoryConnector.getAttributeValue(data, + TaskAttribute.RESOLUTION)); + } else if ("reopen".equals(action)) { + ticket.putValue("status", TracRepositoryConnector.TaskStatus.REOPENED.toStatusString()); + ticket.putValue("resolution", ""); + } else if ("reassign".equals(action)) { + ticket.putValue("status", TracRepositoryConnector.TaskStatus.NEW.toStatusString()); + } + } } - String priority = ticket.getValue(Key.PRIORITY); - TracPriority[] tracPriorities = client.getPriorities(); - schema.setPriority(TracTask.getTaskPriority(priority, tracPriorities)); + return ticket; + } - if (ticket.getValue(Key.TYPE) != null) { - Kind kind = TracTask.Kind.fromType(ticket.getValue(Key.TYPE)); - schema.setTaskKind((kind != null) ? kind.toString() : ticket.getValue(Key.TYPE)); + @Override + public void migrateTaskData(TaskRepository taskRepository, TaskData taskData) { + int version = 0; + try { + version = Integer.parseInt(taskData.getVersion()); + } catch (NumberFormatException e) { + // ignore } - if (ticket.getCreated() != null) { - schema.setCreationDate(ticket.getCreated()); + if (version < 1) { + Map<String, TaskAttribute> attributes = taskData.getRoot().getAttributes(); + for (TaskAttribute attribute : attributes.values()) { + if (TaskAttribute.OPERATION.equals(attribute.getId())) { + attribute.getMetaData().setType(TaskAttribute.TYPE_OPERATION); + } else if (TracAttributeMapper.NEW_CC.equals(attribute.getId())) { + attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT).setReadOnly(false); + } else { + TracAttribute tracAttribute = TracAttribute.getByTracKey(attribute.getId()); + if (tracAttribute != null) { + attribute.getMetaData().setType(tracAttribute.getType()); + attribute.getMetaData().setKind(tracAttribute.getKind()); + attribute.getMetaData().setReadOnly(tracAttribute.isReadOnly()); + } + } + } } - if (ticket.getCustomValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING) != null) { - taskData.addAttribute(ATTRIBUTE_BLOCKED_BY, new RepositoryTaskAttribute(ATTRIBUTE_BLOCKED_BY, "Blocked by", - true)); - } + taskData.setVersion("1"); } } diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java index 55aa33015..327cadb13 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java @@ -11,7 +11,7 @@ package org.eclipse.mylyn.internal.trac.core.model; /** * @author Steffen Pingel */ -public class TracComponent extends TracAttribute { +public class TracComponent extends TracRepositoryAttribute { private static final long serialVersionUID = -6181067219323677076L; diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java index 0b1ba7065..978989f94 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java @@ -14,7 +14,7 @@ import java.util.Date; /** * @author Steffen Pingel */ -public class TracMilestone extends TracAttribute implements Serializable { +public class TracMilestone extends TracRepositoryAttribute implements Serializable { private static final long serialVersionUID = 6648558552508886484L; diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAttribute.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryAttribute.java index ed74bf8a7..a820d935d 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAttribute.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryAttribute.java @@ -10,16 +10,19 @@ package org.eclipse.mylyn.internal.trac.core.model; import java.io.Serializable; +import org.eclipse.core.runtime.Assert; + /** * @author Steffen Pingel */ -public class TracAttribute implements Serializable { +public class TracRepositoryAttribute implements Serializable { private static final long serialVersionUID = -4535033208999685315L; private String name; - public TracAttribute(String name) { + public TracRepositoryAttribute(String name) { + Assert.isNotNull(name); this.name = name; } @@ -33,7 +36,8 @@ public class TracAttribute implements Serializable { @Override public String toString() { - return name; + // FIXME serialization can restore null values here + return (name != null) ? name : ""; } } diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java index 0b4665fa1..5f5d5c2e3 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java @@ -13,7 +13,7 @@ import java.util.Date; /** * @author Steffen Pingel */ -public class TracVersion extends TracAttribute { +public class TracVersion extends TracRepositoryAttribute { private static final long serialVersionUID = 9018237956062697410L; diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtils.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtils.java index dfd105712..b4c9093e6 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtils.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtils.java @@ -10,6 +10,13 @@ package org.eclipse.mylyn.internal.trac.core.util; import java.util.Date; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.mylyn.internal.trac.core.ITracClient; +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; +import org.eclipse.mylyn.internal.trac.core.model.TracSearch; +import org.eclipse.mylyn.tasks.core.IRepositoryQuery; +import org.eclipse.mylyn.tasks.core.RepositoryStatus; + /** * Provides static helper methods. * @@ -17,6 +24,16 @@ import java.util.Date; */ public class TracUtils { + public static Date parseDate(String time) { + if (time != null) { + try { + return TracUtils.parseDate(Long.valueOf(time)); + } catch (NumberFormatException e) { + } + } + return null; + } + public static Date parseDate(long seconds) { return new Date(seconds * 1000l); // Calendar c = Calendar.getInstance(); @@ -33,4 +50,31 @@ public class TracUtils { return date.getTime() / 1000l; } + private static String getQueryParameter(IRepositoryQuery query) { + String url = query.getUrl(); + int i = url.indexOf(ITracClient.QUERY_URL); + if (i == -1) { + return null; + } + return url.substring(i + ITracClient.QUERY_URL.length()); + } + + /** + * Creates a <code>TracSearch</code> object from this query. + */ + public static TracSearch toTracSearch(IRepositoryQuery query) { + String url = getQueryParameter(query); + if (url != null) { + TracSearch search = new TracSearch(); + search.fromUrl(url); + return search; + } + return null; + } + + public static IStatus createPermissionDeniedError(String repositoryUrl, String pluginId) { + return new RepositoryStatus(repositoryUrl, IStatus.ERROR, TracCorePlugin.ID_PLUGIN, + RepositoryStatus.ERROR_PERMISSION_DENIED, "Permission denied."); + } + } diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilTest.java index 2e0d0ad4e..d39c8df13 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilTest.java @@ -23,7 +23,7 @@ public class TracHyperlinkUtilTest extends TestCase { protected void setUp() throws Exception { super.setUp(); - repository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, "http://localhost"); + repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, "http://localhost"); } public void testFindHyperlinksComment() { diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/RepositorySearchQueryTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/RepositorySearchQueryTest.java index 1d7acea74..6e63d88c1 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/RepositorySearchQueryTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/RepositorySearchQueryTest.java @@ -21,7 +21,6 @@ import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector; import org.eclipse.mylyn.internal.trac.core.ITracClient; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; import org.eclipse.mylyn.internal.trac.core.ITracClient.Version; import org.eclipse.mylyn.internal.trac.core.model.TracSearch; import org.eclipse.mylyn.tasks.core.ITask; @@ -59,7 +58,7 @@ public class RepositorySearchQueryTest extends TestCase { protected void init(String url, Version version) { Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER); - repository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, url); + repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, url); repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username, credentials.password), false); repository.setTimeZoneId(ITracClient.TIME_ZONE); diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracAttachmentHandlerTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracAttachmentHandlerTest.java index ed97ccc54..61e9e9b6b 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracAttachmentHandlerTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracAttachmentHandlerTest.java @@ -32,7 +32,6 @@ import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.trac.core.ITracClient; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.TracTask; import org.eclipse.mylyn.internal.trac.core.ITracClient.Version; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -69,7 +68,7 @@ public class TracAttachmentHandlerTest extends TestCase { } protected void init(String url, Version version) { - String kind = TracCorePlugin.REPOSITORY_KIND; + String kind = TracCorePlugin.CONNECTOR_KIND; Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER); repository = new TaskRepository(kind, url); @@ -84,7 +83,7 @@ public class TracAttachmentHandlerTest extends TestCase { AbstractRepositoryConnector abstractConnector = manager.getRepositoryConnector(kind); connector = (TracRepositoryConnector) abstractConnector; - attachmentHandler = connector.getAttachmentHandler(); + // FIXME attachmentHandler = connector.getAttachmentHandler(); } public void testDownloadAttachmentXmlRpc010() throws Exception { diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracClientManagerTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracClientManagerTest.java index 77641ec60..2712b3e1d 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracClientManagerTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracClientManagerTest.java @@ -29,7 +29,7 @@ import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory; public class TracClientManagerTest extends TestCase { public void testNullCache() throws Exception { - TaskRepository taskRepository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, + TaskRepository taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, TracTestConstants.TEST_TRAC_096_URL); taskRepository.setVersion(Version.TRAC_0_9.name()); @@ -42,7 +42,7 @@ public class TracClientManagerTest extends TestCase { } public void testReadCache() throws Exception { - TaskRepository taskRepository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, + TaskRepository taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, TracTestConstants.TEST_TRAC_096_URL); taskRepository.setVersion(Version.TRAC_0_9.name()); @@ -55,7 +55,7 @@ public class TracClientManagerTest extends TestCase { } public void testWriteCache() throws Exception { - TaskRepository taskRepository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, + TaskRepository taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, TracTestConstants.TEST_TRAC_096_URL); taskRepository.setVersion(Version.TRAC_0_9.name()); taskRepository.setCredentials(AuthenticationType.REPOSITORY, null, false); diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracQueryTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracQueryTest.java index 92a188f1d..aa8213a7d 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracQueryTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracQueryTest.java @@ -11,7 +11,6 @@ package org.eclipse.mylyn.trac.tests; import junit.framework.TestCase; 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; /** diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java index 0ab74215e..d0442d5ad 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java @@ -32,14 +32,11 @@ import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.core.deprecated.LegacyTaskDataCollector; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.tasks.ui.wizards.EditRepositoryWizard; import org.eclipse.mylyn.internal.trac.core.ITracClient; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; -import org.eclipse.mylyn.internal.trac.core.TracTask; import org.eclipse.mylyn.internal.trac.core.ITracClient.Version; import org.eclipse.mylyn.internal.trac.core.model.TracSearch; import org.eclipse.mylyn.internal.trac.core.model.TracVersion; @@ -87,7 +84,7 @@ public class TracRepositoryConnectorTest extends TestCase { } protected void init(String url, Version version) { - String kind = TracCorePlugin.REPOSITORY_KIND; + String kind = TracCorePlugin.CONNECTOR_KIND; Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER); repository = new TaskRepository(kind, url); @@ -270,27 +267,28 @@ public class TracRepositoryConnectorTest extends TestCase { assertEquals("2.0", versions[1].getName()); } - public void testContextXmlRpc010() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); - TracTask task = (TracTask) TasksUiInternal.createTask(repository, data.attachmentTicketId + "", null); - TasksUiInternal.synchronizeTask(connector, task, true, null); - - //int size = task.getTaskData().getAttachments().size(); - - File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier()); - sourceContextFile.createNewFile(); - sourceContextFile.deleteOnExit(); - - assertTrue(AttachmentUtil.attachContext(connector.getAttachmentHandler(), repository, task, "", - new NullProgressMonitor())); - - TasksUiInternal.synchronizeTask(connector, task, true, null); - // TODO attachment may have been overridden therefore size may not have changed - //assertEquals(size + 1, task.getTaskData().getAttachments().size()); - - //RepositoryAttachment attachment = task.getTaskData().getAttachments().get(size); - //assertTrue(connector.retrieveContext(repository, task, attachment, TasksUiPlugin.getDefault().getProxySettings(), TasksUiPlugin.getDefault().getDataDirectory())); - } + // FIXME +// public void testContextXmlRpc010() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); +// TracTask task = (TracTask) TasksUiInternal.createTask(repository, data.attachmentTicketId + "", null); +// TasksUiInternal.synchronizeTask(connector, task, true, null); +// +// //int size = task.getTaskData().getAttachments().size(); +// +// File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier()); +// sourceContextFile.createNewFile(); +// sourceContextFile.deleteOnExit(); +// +// assertTrue(AttachmentUtil.attachContext(connector.getAttachmentHandler(), repository, task, "", +// new NullProgressMonitor())); +// +// TasksUiInternal.synchronizeTask(connector, task, true, null); +// // TODO attachment may have been overridden therefore size may not have changed +// //assertEquals(size + 1, task.getTaskData().getAttachments().size()); +// +// //RepositoryAttachment attachment = task.getTaskData().getAttachments().get(size); +// //assertTrue(connector.retrieveContext(repository, task, attachment, TasksUiPlugin.getDefault().getProxySettings(), TasksUiPlugin.getDefault().getDataDirectory())); +// } public void testContextWeb096() throws Exception { init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9); @@ -300,12 +298,13 @@ public class TracRepositoryConnectorTest extends TestCase { sourceContextFile.createNewFile(); sourceContextFile.deleteOnExit(); - try { - AttachmentUtil.attachContext(connector.getAttachmentHandler(), repository, task, "", - new NullProgressMonitor()); - fail("expected CoreException"); // operation should not be supported - } catch (CoreException e) { - } +// try { + // FIXME +// AttachmentUtil.attachContext(connector.getAttachmentHandler(), repository, task, "", +// new NullProgressMonitor()); + fail("expected CoreException"); // operation should not be supported +// } catch (CoreException e) { +// } } }
\ No newline at end of file diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryQuery.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQuery.java index 5744bd599..3acfdb108 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryQuery.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryQuery.java @@ -6,14 +6,17 @@ * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.mylyn.internal.trac.core; +package org.eclipse.mylyn.trac.tests; import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; +import org.eclipse.mylyn.internal.trac.core.ITracClient; +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.model.TracSearch; /** * @author Steffen Pingel */ +@Deprecated public class TracRepositoryQuery extends RepositoryQuery { public TracRepositoryQuery(String repositoryUrl, String queryUrl, String description) { @@ -27,7 +30,7 @@ public class TracRepositoryQuery extends RepositoryQuery { @Override public String getConnectorKind() { - return TracCorePlugin.REPOSITORY_KIND; + return TracCorePlugin.CONNECTOR_KIND; } public String getQueryParameter() { 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 4f1bf42f9..b1f8104b4 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 @@ -19,8 +19,6 @@ import org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlOperation; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.trac.core.ITracClient; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; -import org.eclipse.mylyn.internal.trac.core.TracTask; import org.eclipse.mylyn.internal.trac.core.model.TracSearch; import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -34,7 +32,7 @@ public class TracRepositoryQueryTest extends TestCase { TaskRepositoryManager manager = TasksUiPlugin.getRepositoryManager(); manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath()); - TaskRepository repository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, + TaskRepository repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, TracTestConstants.TEST_TRAC_096_URL); manager.addRepository(repository); diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositorySettingsPageTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositorySettingsPageTest.java index 41086d15d..c33fbf648 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositorySettingsPageTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositorySettingsPageTest.java @@ -40,7 +40,7 @@ public class TracRepositorySettingsPageTest extends AbstractTracClientTest { protected void setUp() throws Exception { super.setUp(); - connector = (TracConnectorUi) TasksUiPlugin.getConnectorUi(TracCorePlugin.REPOSITORY_KIND); + connector = (TracConnectorUi) TasksUiPlugin.getConnectorUi(TracCorePlugin.CONNECTOR_KIND); page = new TracRepositorySettingsPage(null); Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTask.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTask.java new file mode 100644 index 000000000..d51f3d61f --- /dev/null +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTask.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * 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.trac.tests; + +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; +import org.eclipse.mylyn.internal.trac.core.ITracClient; +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; + +/** + * @author Steffen Pingel + */ +@Deprecated +public class TracTask extends AbstractTask { + private boolean supportsSubtasks = false; + + public TracTask(String repositoryUrl, String id, String label) { + super(repositoryUrl, id, label); + setUrl(repositoryUrl + ITracClient.TICKET_URL + id); + } + + @Override + public String getConnectorKind() { + return TracCorePlugin.CONNECTOR_KIND; + } + + @Override + public boolean isLocal() { + return false; + } + + public boolean getSupportsSubtasks() { + return supportsSubtasks; + } + + public void setSupportsSubtasks(boolean supportsSubtasks) { + this.supportsSubtasks = supportsSubtasks; + } + +} diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java index 426fd36f3..5f25ad37f 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java @@ -8,42 +8,29 @@ package org.eclipse.mylyn.trac.tests; -import java.util.Date; import java.util.HashSet; import java.util.Set; import junit.framework.TestCase; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.mylyn.commons.net.AuthenticationCredentials; import org.eclipse.mylyn.commons.net.AuthenticationType; import org.eclipse.mylyn.context.tests.support.TestUtil; import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials; import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel; -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.tasks.core.IdentityAttributeFactory; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttachmentHandler; -import org.eclipse.mylyn.internal.tasks.core.deprecated.DefaultTaskSchema; -import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskAttachment; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizationSession; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.trac.core.ITracClient; -import org.eclipse.mylyn.internal.trac.core.InvalidTicketException; -import org.eclipse.mylyn.internal.trac.core.TracAttributeFactory; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.TracTask; import org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler; import org.eclipse.mylyn.internal.trac.core.ITracClient.Version; import org.eclipse.mylyn.internal.trac.core.model.TracTicket; import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key; import org.eclipse.mylyn.tasks.core.ITask; -import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.trac.tests.support.TestFixture; import org.eclipse.mylyn.trac.tests.support.TracTestUtil; @@ -78,15 +65,15 @@ public class TracTaskDataHandlerTest extends TestCase { manager = TasksUiPlugin.getRepositoryManager(); manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath()); - connector = (TracRepositoryConnector) manager.getRepositoryConnector(TracCorePlugin.REPOSITORY_KIND); - - taskDataHandler = (TracTaskDataHandler) connector.getLegacyTaskDataHandler(); + connector = (TracRepositoryConnector) manager.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND); + // FIXME +// taskDataHandler = (TracTaskDataHandler) connector.getLegacyTaskDataHandler(); } protected void init(String url, Version version) { Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER); - repository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, url); + repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, url); repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username, credentials.password), false); repository.setTimeZoneId(ITracClient.TIME_ZONE); @@ -236,200 +223,199 @@ public class TracTaskDataHandlerTest extends TestCase { assertTrue(task.isStale()); } - public void testNonNumericTaskId() { - try { - connector.getLegacyTaskDataHandler().getTaskData(repository, "abc", new NullProgressMonitor()); - fail("Expected CoreException"); - } catch (CoreException e) { - } - } - - public void testAttachmentChangesLastModifiedDate010() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); - attachmentChangesLastModifiedDate(); - } - - public void testAttachmentChangesLastModifiedDate011() throws Exception { - init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC); - attachmentChangesLastModifiedDate(); - } - - private void attachmentChangesLastModifiedDate() throws Exception { - RepositoryTaskData taskData = taskDataHandler.getTaskData(repository, data.attachmentTicketId + "", - new NullProgressMonitor()); - TracTask task = new TracTask(repository.getRepositoryUrl(), data.attachmentTicketId + "", ""); - connector.updateTaskFromTaskData(repository, task, taskData); - Date lastModified = taskDataHandler.getAttributeFactory(taskData).getDateForAttributeType( - RepositoryTaskAttribute.DATE_MODIFIED, taskData.getLastModified()); - - AbstractAttachmentHandler attachmentHandler = connector.getAttachmentHandler(); - ITaskAttachment attachment = new MockAttachment("abc".getBytes()); - attachmentHandler.uploadAttachment(repository, task, attachment, null, new NullProgressMonitor()); - - taskData = taskDataHandler.getTaskData(repository, data.attachmentTicketId + "", new NullProgressMonitor()); - Date newLastModified = taskDataHandler.getAttributeFactory(taskData).getDateForAttributeType( - RepositoryTaskAttribute.DATE_MODIFIED, taskData.getLastModified()); - assertTrue("Expected " + newLastModified + " to be more recent than " + lastModified, - newLastModified.after(lastModified)); - } - - public void testPostTaskDataInvalidCredentials010() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); - postTaskDataInvalidCredentials(); - } - - public void testPostTaskDataInvalidCredentials011() throws Exception { - init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC); - postTaskDataInvalidCredentials(); - } - - private void postTaskDataInvalidCredentials() throws Exception { - TracTask task = (TracTask) TasksUiInternal.createTask(repository, data.offlineHandlerTicketId + "", null); - TasksUiInternal.synchronizeTask(connector, task, true, null); - RepositoryTaskData taskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(task.getRepositoryUrl(), - task.getTaskId()); - - taskData.setNewComment("new comment"); - repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("foo", "bar"), false); - try { - taskDataHandler.postTaskData(repository, taskData, new NullProgressMonitor()); - } catch (CoreException expected) { - assertEquals(RepositoryStatus.ERROR_REPOSITORY_LOGIN, expected.getStatus().getCode()); - } - assertEquals("new comment", taskData.getNewComment()); - } - - public void testCanInitializeTaskData() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); - - TracTask task = new TracTask("", "", ""); - assertFalse(taskDataHandler.canInitializeSubTaskData(task, null)); - task.setSupportsSubtasks(true); - assertTrue(taskDataHandler.canInitializeSubTaskData(task, null)); - - RepositoryTaskData taskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", - new NullProgressMonitor()); - assertFalse(taskDataHandler.canInitializeSubTaskData(null, taskData)); - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, ""); - assertTrue(taskDataHandler.canInitializeSubTaskData(null, taskData)); - - task.setSupportsSubtasks(false); - connector.updateTaskFromTaskData(repository, task, taskData); - assertTrue(taskDataHandler.canInitializeSubTaskData(task, null)); - } - - public void testInitializeSubTaskData() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); - - RepositoryTaskData parentTaskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", - new NullProgressMonitor()); - try { - taskDataHandler.initializeSubTaskData(repository, parentTaskData, parentTaskData, new NullProgressMonitor()); - fail("expected CoreException"); - } catch (CoreException expected) { - } - - parentTaskData.setSummary("abc"); - parentTaskData.setDescription("def"); - String component = parentTaskData.getAttribute(TracAttributeFactory.Attribute.COMPONENT.getTracKey()) - .getOptions() - .get(0); - parentTaskData.setAttributeValue(TracAttributeFactory.Attribute.COMPONENT.getTracKey(), component); - parentTaskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, ""); - RepositoryTaskData subTaskData = new RepositoryTaskData(parentTaskData.getAttributeFactory(), - TracCorePlugin.REPOSITORY_KIND, "", ""); - subTaskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING, ""); - taskDataHandler.initializeSubTaskData(repository, subTaskData, parentTaskData, new NullProgressMonitor()); - assertEquals("", subTaskData.getSummary()); - assertEquals("", subTaskData.getDescription()); - assertEquals(component, subTaskData.getAttributeValue(TracAttributeFactory.Attribute.COMPONENT.getTracKey())); - assertEquals(parentTaskData.getTaskId(), subTaskData.getAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING)); - assertEquals("", parentTaskData.getAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY)); - } - - public void testGetSubTaskIds() throws Exception { - RepositoryTaskData taskData = new RepositoryTaskData(new TracAttributeFactory(), - TracCorePlugin.REPOSITORY_KIND, "", ""); - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, "123 456"); - Set<String> subTaskIds = taskDataHandler.getSubTaskIds(taskData); - assertEquals(2, subTaskIds.size()); - assertTrue(subTaskIds.contains("123")); - assertTrue(subTaskIds.contains("456")); - - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, "7,8"); - subTaskIds = taskDataHandler.getSubTaskIds(taskData); - assertEquals(2, subTaskIds.size()); - assertTrue(subTaskIds.contains("7")); - assertTrue(subTaskIds.contains("8")); - - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, " 7 , 8, "); - subTaskIds = taskDataHandler.getSubTaskIds(taskData); - assertEquals(2, subTaskIds.size()); - assertTrue(subTaskIds.contains("7")); - assertTrue(subTaskIds.contains("8")); - - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, "7"); - subTaskIds = taskDataHandler.getSubTaskIds(taskData); - assertEquals(1, subTaskIds.size()); - assertTrue(subTaskIds.contains("7")); - - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, ""); - subTaskIds = taskDataHandler.getSubTaskIds(taskData); - assertEquals(0, subTaskIds.size()); - - taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, " "); - subTaskIds = taskDataHandler.getSubTaskIds(taskData); - assertEquals(0, subTaskIds.size()); - } - - public void testUpdateTaskDetails() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9); - - TracTicket ticket = new TracTicket(123); - ticket.putBuiltinValue(Key.DESCRIPTION, "mydescription"); - ticket.putBuiltinValue(Key.PRIORITY, "mypriority"); - ticket.putBuiltinValue(Key.SUMMARY, "mysummary"); - ticket.putBuiltinValue(Key.TYPE, "mytype"); - - ITracClient client = connector.getClientManager().getTracClient(repository); - RepositoryTaskData taskData = new RepositoryTaskData(IdentityAttributeFactory.getInstance(), - TracCorePlugin.REPOSITORY_KIND, repository.getRepositoryUrl(), ticket.getId() + ""); - taskDataHandler.updateTaskDataFromTicket(taskData, ticket, client); - - TracTask task = new TracTask(TracTestConstants.TEST_TRAC_010_URL, "" + 123, "desc"); - assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "123", task.getUrl()); - assertEquals("desc", task.getSummary()); - - DefaultTaskSchema schema = new DefaultTaskSchema(taskData); - schema.applyTo(task); - - assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "123", task.getUrl()); - assertEquals("123", task.getTaskKey()); - assertEquals("mysummary", task.getSummary()); - assertEquals("P3", task.getPriority()); - assertEquals("mytype", task.getTaskKind()); - } - - public void testUpdateTaskDetailsSummaryOnly() throws InvalidTicketException { - init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9); - - TracTicket ticket = new TracTicket(456); - ticket.putBuiltinValue(Key.SUMMARY, "mysummary"); - - TracTask task = new TracTask(TracTestConstants.TEST_TRAC_010_URL, "" + 456, "desc"); - - ITracClient client = connector.getClientManager().getTracClient(repository); - RepositoryTaskData taskData = new RepositoryTaskData(IdentityAttributeFactory.getInstance(), - TracCorePlugin.REPOSITORY_KIND, repository.getRepositoryUrl(), ticket.getId() + ""); - taskDataHandler.updateTaskDataFromTicket(taskData, ticket, client); - DefaultTaskSchema schema = new DefaultTaskSchema(taskData); - schema.applyTo(task); - - assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "456", task.getUrl()); - assertEquals("456", task.getTaskKey()); - assertEquals("mysummary", task.getSummary()); - assertEquals("P3", task.getPriority()); - assertEquals(AbstractTask.DEFAULT_TASK_KIND, task.getTaskKind()); - } + // FIXME +// public void testNonNumericTaskId() { +// try { +// connector.getLegacyTaskDataHandler().getTaskData(repository, "abc", new NullProgressMonitor()); +// fail("Expected CoreException"); +// } catch (CoreException e) { +// } +// } + +// public void testAttachmentChangesLastModifiedDate010() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); +// attachmentChangesLastModifiedDate(); +// } +// +// public void testAttachmentChangesLastModifiedDate011() throws Exception { +// init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC); +// attachmentChangesLastModifiedDate(); +// } + +// private void attachmentChangesLastModifiedDate() throws Exception { +// RepositoryTaskData taskData = taskDataHandler.getTaskData(repository, data.attachmentTicketId + "", +// new NullProgressMonitor()); +// TracTask task = new TracTask(repository.getRepositoryUrl(), data.attachmentTicketId + "", ""); +// connector.updateTaskFromTaskData(repository, task, taskData); +// Date lastModified = taskDataHandler.getAttributeFactory(taskData).getDateForAttributeType( +// RepositoryTaskAttribute.DATE_MODIFIED, taskData.getLastModified()); +// +// AbstractAttachmentHandler attachmentHandler = connector.getAttachmentHandler(); +// ITaskAttachment attachment = new MockAttachment("abc".getBytes()); +// attachmentHandler.uploadAttachment(repository, task, attachment, null, new NullProgressMonitor()); +// +// taskData = taskDataHandler.getTaskData(repository, data.attachmentTicketId + "", new NullProgressMonitor()); +// Date newLastModified = taskDataHandler.getAttributeFactory(taskData).getDateForAttributeType( +// RepositoryTaskAttribute.DATE_MODIFIED, taskData.getLastModified()); +// assertTrue("Expected " + newLastModified + " to be more recent than " + lastModified, +// newLastModified.after(lastModified)); +// } +// +// public void testPostTaskDataInvalidCredentials010() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); +// postTaskDataInvalidCredentials(); +// } +// +// public void testPostTaskDataInvalidCredentials011() throws Exception { +// init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC); +// postTaskDataInvalidCredentials(); +// } +// +// private void postTaskDataInvalidCredentials() throws Exception { +// TracTask task = (TracTask) TasksUiInternal.createTask(repository, data.offlineHandlerTicketId + "", null); +// TasksUiInternal.synchronizeTask(connector, task, true, null); +// RepositoryTaskData taskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(task.getRepositoryUrl(), +// task.getTaskId()); +// +// taskData.setNewComment("new comment"); +// repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("foo", "bar"), false); +// try { +// taskDataHandler.postTaskData(repository, taskData, new NullProgressMonitor()); +// } catch (CoreException expected) { +// assertEquals(RepositoryStatus.ERROR_REPOSITORY_LOGIN, expected.getStatus().getCode()); +// } +// assertEquals("new comment", taskData.getNewComment()); +// } +// +// public void testCanInitializeTaskData() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); +// +// TracTask task = new TracTask("", "", ""); +// assertFalse(taskDataHandler.canInitializeSubTaskData(task, null)); +// task.setSupportsSubtasks(true); +// assertTrue(taskDataHandler.canInitializeSubTaskData(task, null)); +// +// RepositoryTaskData taskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", +// new NullProgressMonitor()); +// assertFalse(taskDataHandler.canInitializeSubTaskData(null, taskData)); +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, ""); +// assertTrue(taskDataHandler.canInitializeSubTaskData(null, taskData)); +// +// task.setSupportsSubtasks(false); +// connector.updateTaskFromTaskData(repository, task, taskData); +// assertTrue(taskDataHandler.canInitializeSubTaskData(task, null)); +// } +// +// public void testInitializeSubTaskData() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); +// +// RepositoryTaskData parentTaskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", +// new NullProgressMonitor()); +// try { +// taskDataHandler.initializeSubTaskData(repository, parentTaskData, parentTaskData, new NullProgressMonitor()); +// fail("expected CoreException"); +// } catch (CoreException expected) { +// } +// +// parentTaskData.setSummary("abc"); +// parentTaskData.setDescription("def"); +// String component = parentTaskData.getAttribute(TracAttribute.COMPONENT.getTracKey()).getOptions().get(0); +// parentTaskData.setAttributeValue(TracAttribute.COMPONENT.getTracKey(), component); +// parentTaskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, ""); +// RepositoryTaskData subTaskData = new RepositoryTaskData(parentTaskData.getAttributeFactory(), +// TracCorePlugin.CONNECTOR_KIND, "", ""); +// subTaskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING, ""); +// taskDataHandler.initializeSubTaskData(repository, subTaskData, parentTaskData, new NullProgressMonitor()); +// assertEquals("", subTaskData.getSummary()); +// assertEquals("", subTaskData.getDescription()); +// assertEquals(component, subTaskData.getAttributeValue(TracAttribute.COMPONENT.getTracKey())); +// assertEquals(parentTaskData.getTaskId(), subTaskData.getAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING)); +// assertEquals("", parentTaskData.getAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY)); +// } +// +// public void testGetSubTaskIds() throws Exception { +// RepositoryTaskData taskData = new RepositoryTaskData(new TracAttributeMapper(), TracCorePlugin.CONNECTOR_KIND, +// "", ""); +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, "123 456"); +// Set<String> subTaskIds = taskDataHandler.getSubTaskIds(taskData); +// assertEquals(2, subTaskIds.size()); +// assertTrue(subTaskIds.contains("123")); +// assertTrue(subTaskIds.contains("456")); +// +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, "7,8"); +// subTaskIds = taskDataHandler.getSubTaskIds(taskData); +// assertEquals(2, subTaskIds.size()); +// assertTrue(subTaskIds.contains("7")); +// assertTrue(subTaskIds.contains("8")); +// +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, " 7 , 8, "); +// subTaskIds = taskDataHandler.getSubTaskIds(taskData); +// assertEquals(2, subTaskIds.size()); +// assertTrue(subTaskIds.contains("7")); +// assertTrue(subTaskIds.contains("8")); +// +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, "7"); +// subTaskIds = taskDataHandler.getSubTaskIds(taskData); +// assertEquals(1, subTaskIds.size()); +// assertTrue(subTaskIds.contains("7")); +// +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, ""); +// subTaskIds = taskDataHandler.getSubTaskIds(taskData); +// assertEquals(0, subTaskIds.size()); +// +// taskData.setAttributeValue(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY, " "); +// subTaskIds = taskDataHandler.getSubTaskIds(taskData); +// assertEquals(0, subTaskIds.size()); +// } +// +// public void testUpdateTaskDetails() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9); +// +// TracTicket ticket = new TracTicket(123); +// ticket.putBuiltinValue(Key.DESCRIPTION, "mydescription"); +// ticket.putBuiltinValue(Key.PRIORITY, "mypriority"); +// ticket.putBuiltinValue(Key.SUMMARY, "mysummary"); +// ticket.putBuiltinValue(Key.TYPE, "mytype"); +// +// ITracClient client = connector.getClientManager().getTracClient(repository); +// RepositoryTaskData taskData = new RepositoryTaskData(IdentityAttributeFactory.getInstance(), +// TracCorePlugin.CONNECTOR_KIND, repository.getRepositoryUrl(), ticket.getId() + ""); +// taskDataHandler.updateTaskDataFromTicket(taskData, ticket, client); +// +// TracTask task = new TracTask(TracTestConstants.TEST_TRAC_010_URL, "" + 123, "desc"); +// assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "123", task.getUrl()); +// assertEquals("desc", task.getSummary()); +// +// DefaultTaskSchema schema = new DefaultTaskSchema(taskData); +// schema.applyTo(task); +// +// assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "123", task.getUrl()); +// assertEquals("123", task.getTaskKey()); +// assertEquals("mysummary", task.getSummary()); +// assertEquals("P3", task.getPriority()); +// assertEquals("mytype", task.getTaskKind()); +// } +// +// public void testUpdateTaskDetailsSummaryOnly() throws InvalidTicketException { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9); +// +// TracTicket ticket = new TracTicket(456); +// ticket.putBuiltinValue(Key.SUMMARY, "mysummary"); +// +// TracTask task = new TracTask(TracTestConstants.TEST_TRAC_010_URL, "" + 456, "desc"); +// +// ITracClient client = connector.getClientManager().getTracClient(repository); +// RepositoryTaskData taskData = new RepositoryTaskData(IdentityAttributeFactory.getInstance(), +// TracCorePlugin.CONNECTOR_KIND, repository.getRepositoryUrl(), ticket.getId() + ""); +// taskDataHandler.updateTaskDataFromTicket(taskData, ticket, client); +// DefaultTaskSchema schema = new DefaultTaskSchema(taskData); +// schema.applyTo(task); +// +// assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "456", task.getUrl()); +// assertEquals("456", task.getTaskKey()); +// assertEquals("mysummary", task.getSummary()); +// assertEquals("P3", task.getPriority()); +// assertEquals(AbstractTask.DEFAULT_TASK_KIND, task.getTaskKind()); +// } } diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskEditorTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskEditorTest.java index 082d6d556..df482e883 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskEditorTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskEditorTest.java @@ -10,25 +10,10 @@ package org.eclipse.mylyn.trac.tests; import junit.framework.TestCase; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.mylyn.commons.net.AuthenticationCredentials; -import org.eclipse.mylyn.commons.net.AuthenticationType; -import org.eclipse.mylyn.context.tests.support.TestUtil; -import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials; -import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel; -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; -import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView; -import org.eclipse.mylyn.internal.trac.core.ITracClient; -import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.ITracClient.Version; import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.TasksUiUtil; /** * @author Steffen Pingel @@ -43,48 +28,49 @@ public class TracTaskEditorTest extends TestCase { private AbstractTaskDataHandler taskDataHandler; - @Override - protected void setUp() throws Exception { - super.setUp(); - - manager = TasksUiPlugin.getRepositoryManager(); - manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath()); - - connector = (TracRepositoryConnector) manager.getRepositoryConnector(TracCorePlugin.REPOSITORY_KIND); - - taskDataHandler = connector.getLegacyTaskDataHandler(); - } - - protected void init(String url, Version version) { - Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER); - - repository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, url); - repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username, - credentials.password), false); - repository.setTimeZoneId(ITracClient.TIME_ZONE); - repository.setCharacterEncoding(ITracClient.CHARSET); - repository.setVersion(version.name()); - - manager.addRepository(repository); - } - - public void testGetSelectedRepository() throws Exception { - init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); - - RepositoryTaskData taskData = taskDataHandler.getTaskData(repository, "1", new NullProgressMonitor()); - AbstractTask task = connector.createTask(repository.getRepositoryUrl(), taskData.getTaskId(), ""); - connector.updateTaskFromTaskData(repository, task, taskData); - TasksUiPlugin.getTaskList().addTask(task); - TasksUiUtil.openTask(task); - - TaskListView taskListView = TaskListView.getFromActivePerspective(); - // force refresh since automatic reresh is delayed - taskListView.getViewer().refresh(); - taskListView.getViewer().expandAll(); - taskListView.getViewer().setSelection(new StructuredSelection(task)); - - assertFalse(taskListView.getViewer().getSelection().isEmpty()); - assertEquals(repository, TasksUiUtil.getSelectedRepository(taskListView.getViewer())); - } + // FIXME +// @Override +// protected void setUp() throws Exception { +// super.setUp(); +// +// manager = TasksUiPlugin.getRepositoryManager(); +// manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath()); +// +// connector = (TracRepositoryConnector) manager.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND); +// +// taskDataHandler = connector.getLegacyTaskDataHandler(); +// } +// +// protected void init(String url, Version version) { +// Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER); +// +// repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, url); +// repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username, +// credentials.password), false); +// repository.setTimeZoneId(ITracClient.TIME_ZONE); +// repository.setCharacterEncoding(ITracClient.CHARSET); +// repository.setVersion(version.name()); +// +// manager.addRepository(repository); +// } +// +// public void testGetSelectedRepository() throws Exception { +// init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC); +// +// RepositoryTaskData taskData = taskDataHandler.getTaskData(repository, "1", new NullProgressMonitor()); +// AbstractTask task = connector.createTask(repository.getRepositoryUrl(), taskData.getTaskId(), ""); +// connector.updateTaskFromTaskData(repository, task, taskData); +// TasksUiPlugin.getTaskList().addTask(task); +// TasksUiUtil.openTask(task); +// +// TaskListView taskListView = TaskListView.getFromActivePerspective(); +// // force refresh since automatic reresh is delayed +// taskListView.getViewer().refresh(); +// taskListView.getViewer().expandAll(); +// taskListView.getViewer().setSelection(new StructuredSelection(task)); +// +// assertFalse(taskListView.getViewer().getSelection().isEmpty()); +// assertEquals(repository, TasksUiUtil.getSelectedRepository(taskListView.getViewer())); +// } } diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskTest.java index 511818533..3965a3b27 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskTest.java @@ -10,7 +10,7 @@ package org.eclipse.mylyn.trac.tests; import junit.framework.TestCase; -import org.eclipse.mylyn.internal.trac.core.TracTask; +import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; import org.eclipse.mylyn.internal.trac.core.model.TracPriority; /** @@ -19,25 +19,25 @@ import org.eclipse.mylyn.internal.trac.core.model.TracPriority; public class TracTaskTest extends TestCase { public void testIsCompleted() { - assertTrue(TracTask.isCompleted("closed")); - assertFalse(TracTask.isCompleted("Closed")); - assertFalse(TracTask.isCompleted("new")); - assertFalse(TracTask.isCompleted("assigned")); - assertFalse(TracTask.isCompleted("reopened")); - assertFalse(TracTask.isCompleted("foobar")); - assertFalse(TracTask.isCompleted("")); - assertFalse(TracTask.isCompleted(null)); + assertTrue(TracRepositoryConnector.isCompleted("closed")); + assertFalse(TracRepositoryConnector.isCompleted("Closed")); + assertFalse(TracRepositoryConnector.isCompleted("new")); + assertFalse(TracRepositoryConnector.isCompleted("assigned")); + assertFalse(TracRepositoryConnector.isCompleted("reopened")); + assertFalse(TracRepositoryConnector.isCompleted("foobar")); + assertFalse(TracRepositoryConnector.isCompleted("")); + assertFalse(TracRepositoryConnector.isCompleted(null)); } public void testGetTaskPriority() { - assertEquals("P1", TracTask.getTaskPriority("blocker").toString()); - assertEquals("P2", TracTask.getTaskPriority("critical").toString()); - assertEquals("P3", TracTask.getTaskPriority("major").toString()); - assertEquals("P3", TracTask.getTaskPriority(null).toString()); - assertEquals("P3", TracTask.getTaskPriority("").toString()); - assertEquals("P3", TracTask.getTaskPriority("foo bar").toString()); - assertEquals("P4", TracTask.getTaskPriority("minor").toString()); - assertEquals("P5", TracTask.getTaskPriority("trivial").toString()); + assertEquals("P1", TracRepositoryConnector.getTaskPriority("blocker").toString()); + assertEquals("P2", TracRepositoryConnector.getTaskPriority("critical").toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority("major").toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority(null).toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority("").toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority("foo bar").toString()); + assertEquals("P4", TracRepositoryConnector.getTaskPriority("minor").toString()); + assertEquals("P5", TracRepositoryConnector.getTaskPriority("trivial").toString()); } public void testGetTaskPriorityFromTracPriorities() { @@ -45,17 +45,17 @@ public class TracTaskTest extends TestCase { TracPriority p2 = new TracPriority("b", 2); TracPriority p3 = new TracPriority("c", 3); TracPriority[] priorities = new TracPriority[] { p1, p2, p3 }; - assertEquals("P1", TracTask.getTaskPriority("a", priorities).toString()); - assertEquals("P3", TracTask.getTaskPriority("b", priorities).toString()); - assertEquals("P5", TracTask.getTaskPriority("c", priorities).toString()); - assertEquals("P3", TracTask.getTaskPriority("foo", priorities).toString()); - assertEquals("P3", TracTask.getTaskPriority(null, priorities).toString()); + assertEquals("P1", TracRepositoryConnector.getTaskPriority("a", priorities).toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority("b", priorities).toString()); + assertEquals("P5", TracRepositoryConnector.getTaskPriority("c", priorities).toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority("foo", priorities).toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority(null, priorities).toString()); p1 = new TracPriority("a", 10); priorities = new TracPriority[] { p1 }; - assertEquals("P1", TracTask.getTaskPriority("a", priorities).toString()); - assertEquals("P3", TracTask.getTaskPriority("b", priorities).toString()); - assertEquals("P3", TracTask.getTaskPriority(null, priorities).toString()); + assertEquals("P1", TracRepositoryConnector.getTaskPriority("a", priorities).toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority("b", priorities).toString()); + assertEquals("P3", TracRepositoryConnector.getTaskPriority(null, priorities).toString()); p1 = new TracPriority("1", 10); p2 = new TracPriority("2", 20); @@ -64,12 +64,12 @@ public class TracTaskTest extends TestCase { TracPriority p5 = new TracPriority("5", 70); TracPriority p6 = new TracPriority("6", 100); priorities = new TracPriority[] { p1, p2, p3, p4, p5, p6 }; - assertEquals("P1", TracTask.getTaskPriority("1", priorities).toString()); - assertEquals("P1", TracTask.getTaskPriority("2", priorities).toString()); - assertEquals("P2", TracTask.getTaskPriority("3", priorities).toString()); - assertEquals("P2", TracTask.getTaskPriority("4", priorities).toString()); - assertEquals("P4", TracTask.getTaskPriority("5", priorities).toString()); - assertEquals("P5", TracTask.getTaskPriority("6", priorities).toString()); + assertEquals("P1", TracRepositoryConnector.getTaskPriority("1", priorities).toString()); + assertEquals("P1", TracRepositoryConnector.getTaskPriority("2", priorities).toString()); + assertEquals("P2", TracRepositoryConnector.getTaskPriority("3", priorities).toString()); + assertEquals("P2", TracRepositoryConnector.getTaskPriority("4", priorities).toString()); + assertEquals("P4", TracRepositoryConnector.getTaskPriority("5", priorities).toString()); + assertEquals("P5", TracRepositoryConnector.getTaskPriority("6", priorities).toString()); } } diff --git a/org.eclipse.mylyn.trac.ui/plugin.xml b/org.eclipse.mylyn.trac.ui/plugin.xml index a3d1beaa9..0fb189241 100644 --- a/org.eclipse.mylyn.trac.ui/plugin.xml +++ b/org.eclipse.mylyn.trac.ui/plugin.xml @@ -7,17 +7,17 @@ point="org.eclipse.mylyn.tasks.ui.repositories"> <connectorCore class="org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector" - id="org.eclipse.mylyn.trac.tasklist.repositories" - name="Trac Repository Connector"/> + id="trac" + name="Trac Connector Core"/> <connectorUi brandingIcon="icons/eview16/trac-icon.gif" class="org.eclipse.mylyn.internal.trac.ui.TracConnectorUi" - id="Trac Repository UI" + id="trac" + name="Trac Connector UI" overlayIcon="icons/eview16/overlay-trac.gif"/> - <taskListFactory - class="org.eclipse.mylyn.internal.trac.ui.TracTaskListFactory" - id="org.eclipse.mylyn.trac.tasklist.taskListFactory" - name="Trac Externalizer"/> + <taskListMigrator + class="org.eclipse.mylyn.internal.trac.ui.TracTaskListMigrator"> + </taskListMigrator> </extension> <extension point="org.eclipse.mylyn.tasks.core.templates"> @@ -31,7 +31,10 @@ </extension> <extension point="org.eclipse.mylyn.tasks.ui.editors"> - <editorFactory class="org.eclipse.mylyn.internal.trac.ui.editor.TracTaskEditorFactory"/> + <pageFactory + class="org.eclipse.mylyn.internal.trac.ui.editor.TracTaskEditorPageFactory" + id="org.eclipse.mylyn.trac.ui.pageFactory"> + </pageFactory> </extension> <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors"> diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java index af4e75053..a1bba5c70 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java @@ -18,22 +18,20 @@ import org.eclipse.jface.wizard.IWizard; import org.eclipse.mylyn.internal.trac.core.ITracClient; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; -import org.eclipse.mylyn.internal.trac.core.TracTask; -import org.eclipse.mylyn.internal.trac.core.TracTask.Kind; -import org.eclipse.mylyn.internal.trac.ui.wizard.EditTracQueryWizard; -import org.eclipse.mylyn.internal.trac.ui.wizard.NewTracQueryWizard; -import org.eclipse.mylyn.internal.trac.ui.wizard.TracCustomQueryPage; +import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.TaskKind; +import org.eclipse.mylyn.internal.trac.ui.wizard.TracQueryPage; import org.eclipse.mylyn.internal.trac.ui.wizard.TracRepositorySettingsPage; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; +import org.eclipse.mylyn.tasks.ui.LegendElement; import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage; import org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage; import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard; import org.eclipse.mylyn.tasks.ui.wizards.NewWebTaskWizard; +import org.eclipse.mylyn.tasks.ui.wizards.RepositoryQueryWizard; /** * @author Mik Kersten @@ -41,6 +39,11 @@ import org.eclipse.mylyn.tasks.ui.wizards.NewWebTaskWizard; */ public class TracConnectorUi extends AbstractRepositoryConnectorUi { + @SuppressWarnings("restriction") + public TracConnectorUi() { + org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getDefault().addSearchHandler(new TracSearchHandler()); + } + @Override public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int lineOffset, int regionOffset) { return TracHyperlinkUtil.findTicketHyperlinks(repository, text, lineOffset, regionOffset); @@ -58,7 +61,7 @@ public class TracConnectorUi extends AbstractRepositoryConnectorUi { @Override public ITaskSearchPage getSearchPage(TaskRepository repository, IStructuredSelection selection) { - return new TracCustomQueryPage(repository); + return new TracQueryPage(repository); } @Override @@ -78,47 +81,35 @@ public class TracConnectorUi extends AbstractRepositoryConnectorUi { @Override public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery query) { - if (query instanceof TracRepositoryQuery) { - return new EditTracQueryWizard(repository, query); - } else { - return new NewTracQueryWizard(repository); - } + RepositoryQueryWizard wizard = new RepositoryQueryWizard(repository); + wizard.addPage(new TracQueryPage(repository, query)); + return wizard; } @Override public String getConnectorKind() { - return TracCorePlugin.REPOSITORY_KIND; + return TracCorePlugin.CONNECTOR_KIND; } @Override public ImageDescriptor getTaskKindOverlay(ITask task) { - Kind kind = Kind.fromString(task.getTaskKind()); - if (kind == Kind.DEFECT) { + TaskKind taskKind = TaskKind.fromString(task.getTaskKind()); + if (taskKind == TaskKind.DEFECT) { return TracImages.OVERLAY_DEFECT; - } else if (kind == Kind.ENHANCEMENT) { + } else if (taskKind == TaskKind.ENHANCEMENT) { return TracImages.OVERLAY_ENHANCEMENT; - } else if (kind == Kind.TASK) { + } else if (taskKind == TaskKind.TASK) { return null; } return super.getTaskKindOverlay(task); } @Override - public List<ITask> getLegendItems() { - List<ITask> legendItems = new ArrayList<ITask>(); - - TracTask defect = new TracTask("", Kind.DEFECT.name(), Kind.DEFECT.toString()); - defect.setTaskKind(Kind.DEFECT.toString()); - legendItems.add(defect); - - TracTask enhancement = new TracTask("", Kind.ENHANCEMENT.name(), Kind.ENHANCEMENT.toString()); - enhancement.setTaskKind(Kind.ENHANCEMENT.toString()); - legendItems.add(enhancement); - - TracTask task = new TracTask("", Kind.TASK.name(), Kind.TASK.toString()); - task.setTaskKind(Kind.TASK.toString()); - legendItems.add(task); - + public List<LegendElement> getLegendElements() { + List<LegendElement> legendItems = new ArrayList<LegendElement>(); + legendItems.add(LegendElement.createTask(TaskKind.DEFECT.toString(), TracImages.OVERLAY_DEFECT)); + legendItems.add(LegendElement.createTask(TaskKind.ENHANCEMENT.toString(), TracImages.OVERLAY_ENHANCEMENT)); + legendItems.add(LegendElement.createTask(TaskKind.TASK.toString(), null)); return legendItems; } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java index f4d10a8f1..d6c9e2173 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java @@ -27,7 +27,7 @@ public class TracHyperlinkDetector extends AbstractHyperlinkDetector { public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { TaskRepository taskRepository = (TaskRepository) getAdapter(TaskRepository.class); - if (taskRepository != null && TracCorePlugin.REPOSITORY_KIND.equals(taskRepository.getConnectorKind())) { + if (taskRepository != null && TracCorePlugin.CONNECTOR_KIND.equals(taskRepository.getConnectorKind())) { IDocument document = textViewer.getDocument(); if (document == null) { return null; 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/TracSearchHandler.java index 660f34e2d..77b03270b 100644 --- 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/TracSearchHandler.java @@ -6,41 +6,45 @@ * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.mylyn.internal.trac.ui.editor; +package org.eclipse.mylyn.internal.trac.ui; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyDuplicateDetector; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; +import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler; import org.eclipse.mylyn.internal.trac.core.ITracClient; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; 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.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.TaskData; -public class TracDuplicateDetector extends AbstractLegacyDuplicateDetector { +@SuppressWarnings("restriction") +public class TracSearchHandler extends AbstractSearchHandler { @Override - public RepositoryQuery getDuplicatesQuery(TaskRepository repository, RepositoryTaskData taskData) { + public String getConnectorKind() { + return TracCorePlugin.CONNECTOR_KIND; + } + + @Override + public boolean queryForText(TaskRepository taskRepository, IRepositoryQuery query, TaskData taskData, + String searchString) { TracSearchFilter filter = new TracSearchFilter("description"); filter.setOperator(CompareOperator.CONTAINS); - - String searchString = AbstractLegacyDuplicateDetector.getStackTraceFromDescription(taskData.getDescription()); - filter.addValue(searchString); TracSearch search = new TracSearch(); search.addFilter(filter); - // TODO copied from TracCustomQueryPage.getQueryUrl() + // TODO copied from TracQueryPage.getQueryUrl() StringBuilder sb = new StringBuilder(); - sb.append(repository.getRepositoryUrl()); + sb.append(taskRepository.getRepositoryUrl()); sb.append(ITracClient.QUERY_URL); sb.append(search.toUrl()); - TracRepositoryQuery query = new TracRepositoryQuery(repository.getRepositoryUrl(), sb.toString(), - "<Duplicate Search>"); - return query; + query.setUrl(sb.toString()); + + return true; } } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListFactory.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListFactory.java deleted file mode 100644 index 9d8d51740..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListFactory.java +++ /dev/null @@ -1,80 +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.internal.trac.ui; - -import java.util.HashSet; -import java.util.Set; - -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery; -import org.eclipse.mylyn.internal.trac.core.TracTask; -import org.eclipse.mylyn.tasks.core.IRepositoryQuery; -import org.eclipse.mylyn.tasks.core.ITask; -import org.w3c.dom.Element; - -/** - * @author Steffen Pingel - * @author Mik Kersten - */ -public class TracTaskListFactory extends AbstractTaskListFactory { - - private static final String KEY_TRAC = "Trac"; - - private static final String KEY_TRAC_TASK = KEY_TRAC + AbstractTaskListFactory.KEY_TASK; - - private static final String KEY_TRAC_QUERY = KEY_TRAC + AbstractTaskListFactory.KEY_QUERY; - - private static final String KEY_SUPPORTS_SUBTASKS = "SupportsSubtasks"; - - @Override - public String getTaskElementName() { - return KEY_TRAC_TASK; - } - - @Override - public Set<String> getQueryElementNames() { - Set<String> names = new HashSet<String>(); - names.add(KEY_TRAC_QUERY); - return names; - } - - @Override - public boolean canCreate(ITask task) { - return task instanceof TracTask; - } - - @Override - public boolean canCreate(IRepositoryQuery category) { - return category instanceof TracRepositoryQuery; - } - - @Override - public String getQueryElementName(IRepositoryQuery query) { - return query instanceof TracRepositoryQuery ? KEY_TRAC_QUERY : ""; - } - - @Override - public AbstractTask createTask(String repositoryUrl, String taskId, String summary, Element element) { - boolean supportsSubtasks = false; - if (element.hasAttribute(KEY_SUPPORTS_SUBTASKS)) { - supportsSubtasks = Boolean.valueOf(element.getAttribute(KEY_SUPPORTS_SUBTASKS)); - } - - TracTask task = new TracTask(repositoryUrl, taskId, summary); - task.setSupportsSubtasks(supportsSubtasks); - return task; - } - - @Override - public RepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element) { - return new TracRepositoryQuery(repositoryUrl, queryString, label); - } -} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListMigrator.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListMigrator.java new file mode 100644 index 000000000..c34921414 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListMigrator.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * 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; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; +import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; +import org.eclipse.mylyn.internal.trac.core.util.TracUtils; +import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator; +import org.eclipse.mylyn.tasks.core.IRepositoryQuery; +import org.eclipse.mylyn.tasks.core.ITask; +import org.w3c.dom.Element; + +/** + * @author Steffen Pingel + */ +public class TracTaskListMigrator extends AbstractTaskListMigrator { + + private static final String KEY_TRAC = "Trac"; + + private static final String KEY_TRAC_TASK = KEY_TRAC + KEY_TASK; + + private static final String KEY_TRAC_QUERY = KEY_TRAC + KEY_QUERY; + + private static final String KEY_SUPPORTS_SUBTASKS = "SupportsSubtasks"; + + @Override + public String getConnectorKind() { + return TracCorePlugin.CONNECTOR_KIND; + } + + @Override + public String getTaskElementName() { + return KEY_TRAC_TASK; + } + + @Override + public Set<String> getQueryElementNames() { + Set<String> names = new HashSet<String>(); + names.add(KEY_TRAC_QUERY); + return names; + } + + @Override + public void migrateQuery(IRepositoryQuery query, Element element) { + // nothing to do + } + + @Override + public void migrateTask(ITask task, Element element) { + task.setModificationDate(TracUtils.parseDate(element.getAttribute(KEY_LAST_MOD_DATE))); + if (element.hasAttribute(KEY_SUPPORTS_SUBTASKS)) { + task.setAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS, Boolean.valueOf( + element.getAttribute(KEY_SUPPORTS_SUBTASKS)).toString()); + } + } + +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java index 6790a10d4..dc5f42f0f 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java @@ -21,10 +21,6 @@ public class TracUiPlugin extends AbstractUIPlugin { public static final String ID_PLUGIN = "org.eclipse.mylyn.trac.ui"; - public final static String TITLE_MESSAGE_DIALOG = "Mylyn Trac Client"; - - public static final String NEW_BUG_EDITOR_ID = ID_PLUGIN + ".newBugEditor"; - private static TracUiPlugin plugin; public TracUiPlugin() { @@ -42,8 +38,7 @@ public class TracUiPlugin extends AbstractUIPlugin { @Override public void stop(BundleContext context) throws Exception { - TasksUi.getRepositoryManager().removeListener( - TracCorePlugin.getDefault().getConnector().getClientManager()); + TasksUi.getRepositoryManager().removeListener(TracCorePlugin.getDefault().getConnector().getClientManager()); plugin = null; super.stop(context); 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 deleted file mode 100644 index 2c010b438..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java +++ /dev/null @@ -1,77 +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.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.tasks.core.deprecated.AbstractLegacyDuplicateDetector; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; -import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractNewRepositoryTaskEditor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter; -import org.eclipse.ui.forms.editor.FormEditor; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.Section; - -/** - * @author Steffen Pingel - */ -public class NewTracTaskEditor extends AbstractNewRepositoryTaskEditor { - - public NewTracTaskEditor(FormEditor editor) { - super(editor); - } - - @Override - public AbstractLegacyDuplicateDetector getDuplicateDetector(String name) { - return new TracDuplicateDetector(); - } - - @Override - protected void createPeopleLayout(Composite composite) { - FormToolkit toolkit = getManagedForm().getToolkit(); - Section peopleSection = createSection(composite, getSectionLabel(SECTION_NAME.PEOPLE_SECTION)); - GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(peopleSection); - Composite peopleComposite = toolkit.createComposite(peopleSection); - GridLayout layout = new GridLayout(2, false); - layout.marginRight = 5; - peopleComposite.setLayout(layout); - GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(peopleComposite); - - Label label = toolkit.createLabel(peopleComposite, "Assign to:"); - GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label); - Composite textFieldComposite = toolkit.createComposite(peopleComposite); - GridDataFactory.fillDefaults().grab(true, false).applyTo(textFieldComposite); - GridLayout textLayout = new GridLayout(); - textFieldComposite.setLayout(textLayout); - - RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED); - - Text textField = createTextField(textFieldComposite, attribute, SWT.FLAT); - toolkit.paintBordersFor(textFieldComposite); - GridDataFactory.fillDefaults().grab(true, false).applyTo(textField); - peopleSection.setClient(peopleComposite); - - ContentAssistCommandAdapter adapter = applyContentAssist(textField, createContentProposalProvider(attribute)); - - ILabelProvider propsalLabelProvider = createProposalLabelProvider(attribute); - if (propsalLabelProvider != null) { - adapter.setLabelProvider(propsalLabelProvider); - } - adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE); - - toolkit.paintBordersFor(peopleComposite); - } - -} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracCcAttributeEditor.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracCcAttributeEditor.java new file mode 100644 index 000000000..94a0f7bb2 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracCcAttributeEditor.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * 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.jface.layout.GridDataFactory; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.core.data.TaskDataModel; +import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; +import org.eclipse.mylyn.tasks.ui.editors.LayoutHint; +import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan; +import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.List; +import org.eclipse.ui.forms.widgets.FormToolkit; + +/** + * @author Rob Elves + */ +public class TracCcAttributeEditor extends AbstractAttributeEditor { + + private List list; + + private TaskAttribute attrRemoveCc; + + public TracCcAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) { + super(manager, taskAttribute); + setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.SINGLE)); + } + + @Override + public void createControl(Composite parent, FormToolkit toolkit) { + list = new List(parent, SWT.FLAT | SWT.MULTI | SWT.V_SCROLL); + toolkit.adapt(list, true, true); + list.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); + list.setFont(JFaceResources.getDefaultFont()); + GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(list); + + TaskAttribute attrUserCC = getTaskAttribute(); + if (attrUserCC != null) { + for (String value : attrUserCC.getValues()) { + list.add(value); + } + } + + attrRemoveCc = getModel().getTaskData().getRoot().getMappedAttribute(TracAttributeMapper.REMOVE_CC); + for (String item : attrRemoveCc.getValues()) { + int i = list.indexOf(item); + if (i != -1) { + list.select(i); + } + } + + list.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + for (String cc : list.getItems()) { + int index = list.indexOf(cc); + if (list.isSelected(index)) { + java.util.List<String> remove = attrRemoveCc.getValues(); + if (!remove.contains(cc)) { + attrRemoveCc.addValue(cc); + } + } else { + attrRemoveCc.removeValue(cc); + } + } + getModel().attributeChanged(attrRemoveCc); + } + }); + + list.showSelection(); + + setControl(list); + } +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracPeoplePart.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracPeoplePart.java new file mode 100644 index 000000000..491c0bfcc --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracPeoplePart.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * 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.jface.layout.GridDataFactory; +import org.eclipse.mylyn.internal.trac.core.TracAttribute; +import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; +import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.Section; + +/** + * @author Robert Elves + */ +public class TracPeoplePart extends AbstractTaskEditorPart { + + private static final int COLUMN_MARGIN = 5; + + public TracPeoplePart() { + setPartName("People"); + } + + private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute) { + AbstractAttributeEditor editor = createAttributeEditor(attribute); + if (editor != null) { + editor.createLabelControl(composite, toolkit); + GridDataFactory.defaultsFor(editor.getLabelControl()).indent(COLUMN_MARGIN, 0).applyTo( + editor.getLabelControl()); + editor.createControl(composite, toolkit); + getTaskEditorPage().getAttributeEditorToolkit().adapt(editor); + if (editor instanceof TracCcAttributeEditor) { + GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).hint(130, 95).applyTo( + editor.getControl()); + } else { + GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(editor.getControl()); + } + } + } + + @Override + public void createControl(Composite parent, FormToolkit toolkit) { + Section section = createSection(parent, toolkit, true); + Composite peopleComposite = toolkit.createComposite(section); + GridLayout layout = new GridLayout(2, false); + layout.marginWidth = 5; + peopleComposite.setLayout(layout); + + addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED)); + addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_REPORTER)); + addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TracAttributeMapper.NEW_CC)); + addSelfToCC(peopleComposite); + TaskAttribute cc = getTaskData().getRoot().getMappedAttribute(TracAttribute.CC.getTaskKey()); + TaskAttribute removeCc = getTaskData().getRoot().getMappedAttribute(TracAttributeMapper.REMOVE_CC); + if (cc != null && removeCc != null) { + addAttribute(peopleComposite, toolkit, cc); + toolkit.createLabel(peopleComposite, ""); + Label label = toolkit.createLabel(peopleComposite, "(Select to remove)"); + GridDataFactory.fillDefaults().indent(0, 5).align(SWT.CENTER, SWT.CENTER).applyTo(label); + } + + toolkit.paintBordersFor(peopleComposite); + section.setClient(peopleComposite); + setSection(toolkit, section); + } + + /** + * Creates a check box for adding the repository user to the cc list. Does nothing if the repository does not have a + * valid username, the repository user is the assignee, reporter or already on the the cc list. + */ + private void addSelfToCC(Composite composite) { + TaskRepository repository = this.getTaskEditorPage().getTaskRepository(); + if (repository.getUserName() == null) { + return; + } + + TaskAttribute root = getTaskData().getRoot(); + TaskAttribute owner = root.getMappedAttribute(TaskAttribute.USER_ASSIGNED); + if (owner != null && owner.getValue().indexOf(repository.getUserName()) != -1) { + return; + } + + TaskAttribute reporter = root.getMappedAttribute(TaskAttribute.USER_REPORTER); + if (reporter != null && reporter.getValue().indexOf(repository.getUserName()) != -1) { + return; + } + + TaskAttribute ccAttribute = root.getMappedAttribute(TaskAttribute.USER_CC); + if (ccAttribute != null && ccAttribute.getValues().contains(repository.getUserName())) { + return; + } + } + +}
\ No newline at end of file diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditor.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditor.java deleted file mode 100644 index b79d969f6..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditor.java +++ /dev/null @@ -1,54 +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.internal.trac.ui.editor; - -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute; -import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor; -import org.eclipse.mylyn.internal.trac.core.TracAttributeFactory; -import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine; -import org.eclipse.ui.forms.editor.FormEditor; - -/** - * @author Steffen Pingel - * @author Xiaoyang Guan (Wiki HTML preview) - */ -public class TracTaskEditor extends AbstractRepositoryTaskEditor { - - private final TracRenderingEngine renderingEngine = new TracRenderingEngine(); - - public TracTaskEditor(FormEditor editor) { - super(editor); - } - - @Override - protected void validateInput() { - } - - @Override - protected AbstractRenderingEngine getRenderingEngine() { - return renderingEngine; - } - - public TaskRepository getRepository() { - return repository; - } - - @Override - protected boolean hasContentAssist(RepositoryTaskAttribute attribute) { - return TracAttributeFactory.Attribute.NEW_CC.getTaskKey().equals(attribute.getId()); - } - - @Override - protected boolean hasContentAssist(RepositoryOperation repositoryOperation) { - return "owner".equals(repositoryOperation.getInputName()); - } - -} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorFactory.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorFactory.java deleted file mode 100644 index 3b8d899bf..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorFactory.java +++ /dev/null @@ -1,101 +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.internal.trac.ui.editor; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; -import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractTaskEditorFactory; -import org.eclipse.mylyn.internal.tasks.ui.deprecated.RepositoryTaskEditorInput; -import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.TracTask; -import org.eclipse.mylyn.tasks.core.ITask; -import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.TasksUi; -import org.eclipse.mylyn.tasks.ui.editors.BrowserFormPage; -import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; -import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; - -/** - * @author Steffen Pingel - */ -public class TracTaskEditorFactory extends AbstractTaskEditorFactory { - - private static final String TITLE = "Browser"; - - @Override - public boolean canCreateEditorFor(ITask task) { - return (task instanceof TracTask); - } - - @Override - public boolean canCreateEditorFor(IEditorInput input) { - if (input instanceof RepositoryTaskEditorInput) { - RepositoryTaskEditorInput taskInput = (RepositoryTaskEditorInput) input; - return taskInput.getTaskData() != null - && TracCorePlugin.REPOSITORY_KIND.equals(taskInput.getRepository().getConnectorKind()); - } else if (input instanceof TaskEditorInput) { - TaskEditorInput taskInput = (TaskEditorInput) input; - return taskInput.getTask() instanceof TracTask; - } - - return false; - } - - @Override - public IEditorPart createEditor(TaskEditor parentEditor, IEditorInput editorInput) { - if (editorInput instanceof RepositoryTaskEditorInput) { - RepositoryTaskEditorInput taskInput = (RepositoryTaskEditorInput) editorInput; - if (taskInput.getTaskData().isNew()) { - return new NewTracTaskEditor(parentEditor); - } else { - return new TracTaskEditor(parentEditor); - } - } else if (editorInput instanceof TaskEditorInput) { - TaskRepository repository = TasksUi.getRepositoryManager().getRepository(TracCorePlugin.REPOSITORY_KIND, - ((TaskEditorInput) editorInput).getTask().getRepositoryUrl()); - if (TracRepositoryConnector.hasRichEditor(repository)) { - // the editor is actually initialized with a RepositoryTaskEditorInput, see bug 193430 - return new TracTaskEditor(parentEditor); - } else { - return new BrowserFormPage(parentEditor, TITLE); - } - } - return null; - } - - @Override - public IEditorInput createEditorInput(ITask task) { - TracTask tracTask = (TracTask) task; - TaskRepository repository = TasksUi.getRepositoryManager().getRepository(TracCorePlugin.REPOSITORY_KIND, - tracTask.getRepositoryUrl()); - if (TracRepositoryConnector.hasRichEditor(repository)) { - return new RepositoryTaskEditorInput(repository, tracTask.getTaskId(), tracTask.getUrl()); - } else { - return new TaskEditorInput(repository, task) { - @Override - public ImageDescriptor getImageDescriptor() { - return CommonImages.BROWSER_SMALL; - } - }; - } - } - - @Override - public String getTitle() { - return "Trac"; - } - - @Override - public boolean providesOutline() { - return true; - } -} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPage.java new file mode 100644 index 000000000..30d8ecf0a --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPage.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * 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 java.util.Iterator; +import java.util.Set; + +import org.eclipse.mylyn.internal.trac.core.TracAttribute; +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; +import org.eclipse.mylyn.tasks.core.data.TaskAttribute; +import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor; +import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage; +import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart; +import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory; +import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; +import org.eclipse.mylyn.tasks.ui.editors.TaskEditorPartDescriptor; + +/** + * @author Steffen Pingel + */ +public class TracTaskEditorPage extends AbstractTaskEditorPage { + + private TracRenderingEngine renderingEngine; + + public TracTaskEditorPage(TaskEditor editor) { + super(editor, TracCorePlugin.CONNECTOR_KIND); + } + + @Override + protected Set<TaskEditorPartDescriptor> createPartDescriptors() { + Set<TaskEditorPartDescriptor> descriptors = super.createPartDescriptors(); + // remove unnecessary default editor parts + for (Iterator<TaskEditorPartDescriptor> it = descriptors.iterator(); it.hasNext();) { + TaskEditorPartDescriptor taskEditorPartDescriptor = it.next(); + if (taskEditorPartDescriptor.getId().equals(ID_PART_PEOPLE)) { + it.remove(); + } + } + descriptors.add(new TaskEditorPartDescriptor(ID_PART_PEOPLE) { + @Override + public AbstractTaskEditorPart createPart() { + return new TracPeoplePart(); + } + }.setPath(PATH_PEOPLE)); + return descriptors; + } + + @Override + protected void createParts() { + if (renderingEngine == null) { + renderingEngine = new TracRenderingEngine(); + } + getAttributeEditorToolkit().setRenderingEngine(renderingEngine); + super.createParts(); + } + + @Override + protected AttributeEditorFactory createAttributeEditorFactory() { + AttributeEditorFactory factory = new AttributeEditorFactory(getModel(), getTaskRepository()) { + @Override + public AbstractAttributeEditor createEditor(String type, TaskAttribute taskAttribute) { + if (TracAttribute.CC.getTracKey().equals(taskAttribute.getId())) { + return new TracCcAttributeEditor(getModel(), taskAttribute); + } + return super.createEditor(type, taskAttribute); + } + }; + return factory; + } + +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPageFactory.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPageFactory.java new file mode 100644 index 000000000..ca760f35b --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPageFactory.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * 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.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; +import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; +import org.eclipse.mylyn.tasks.ui.ITasksUiConstants; +import org.eclipse.mylyn.tasks.ui.TasksUiImages; +import org.eclipse.mylyn.tasks.ui.TasksUiUtil; +import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory; +import org.eclipse.mylyn.tasks.ui.editors.BrowserFormPage; +import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; +import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.forms.editor.FormPage; + +/** + * @author Steffen Pingel + */ +public class TracTaskEditorPageFactory extends AbstractTaskEditorPageFactory { + + @Override + public boolean canCreatePageFor(TaskEditorInput input) { + if (input.getTask().getConnectorKind().equals(TracCorePlugin.CONNECTOR_KIND)) { + return true; + } else if (TasksUiUtil.isOutgoingNewTask(input.getTask(), TracCorePlugin.CONNECTOR_KIND)) { + return true; + } + return false; + } + + @Override + public FormPage createPage(TaskEditor parentEditor) { + TaskEditorInput input = parentEditor.getTaskEditorInput(); + if (TasksUiUtil.isOutgoingNewTask(input.getTask(), TracCorePlugin.CONNECTOR_KIND)) { + return new TracTaskEditorPage(parentEditor); + } else if (TracRepositoryConnector.hasRichEditor(input.getTaskRepository())) { + return new TracTaskEditorPage(parentEditor); + } else { + return new BrowserFormPage(parentEditor, "Browser"); + } + } + + @Override + public String[] getConflictingIds(TaskEditorInput input) { + if (!input.getTask().getConnectorKind().equals(TracCorePlugin.CONNECTOR_KIND)) { + return new String[] { ITasksUiConstants.ID_PAGE_PLANNING }; + } + return null; + } + + @Override + public Image getPageImage() { + return CommonImages.getImage(TasksUiImages.REPOSITORY); + } + + @Override + public String getPageText() { + return "Trac"; + } + + @Override + public int getPriority() { + return PRIORITY_TASK; + } + +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/EditTracQueryWizard.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/EditTracQueryWizard.java deleted file mode 100644 index 7c39da879..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/EditTracQueryWizard.java +++ /dev/null @@ -1,58 +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.internal.trac.ui.wizard; - -import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryQueryWizard; -import org.eclipse.mylyn.tasks.core.IRepositoryQuery; -import org.eclipse.mylyn.tasks.core.TaskRepository; - -/** - * @author Steffen Pingel - */ -public class EditTracQueryWizard extends AbstractRepositoryQueryWizard { - -// private TracCustomQueryPage queryPage; - - public EditTracQueryWizard(TaskRepository repository, IRepositoryQuery query) { - super(repository, query); - } - - @Override - public void addPages() { - page = new TracCustomQueryPage(repository, query); - page.setWizard(this); - addPage(page); - } - - @Override - public boolean canFinish() { - if (page.getNextPage() == null) { - return page.isPageComplete(); - } - return page.getNextPage().isPageComplete(); - } - -// @Override -// public boolean performFinish() { -// AbstractRepositoryQuery q = queryPage.getQuery(); -// if (q != null) { -// TasksUiPlugin.getTaskList().deleteQuery(query); -// TasksUiPlugin.getTaskList().addQuery(q); -// -// AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector( -// repository.getKind()); -// if (connector != null) { -// TasksUiPlugin.getSynchronizationManager().synchronize(connector, q, null); -// } -// } -// -// return true; -// } - -}
\ No newline at end of file diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/NewTracQueryWizard.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/NewTracQueryWizard.java deleted file mode 100644 index 0702dfffc..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/NewTracQueryWizard.java +++ /dev/null @@ -1,64 +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.internal.trac.ui.wizard; - -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; -import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; -import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.TasksUi; -import org.eclipse.mylyn.tasks.ui.TasksUiImages; - -/** - * @author Steffen Pingel - */ -public class NewTracQueryWizard extends Wizard { - - private static final String TITLE = "New Trac Query"; - - private final TaskRepository repository; - - private TracCustomQueryPage queryPage; - - public NewTracQueryWizard(TaskRepository repository) { - this.repository = repository; - - setNeedsProgressMonitor(true); - setWindowTitle(TITLE); - setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY); - } - - @Override - public void addPages() { - queryPage = new TracCustomQueryPage(repository); - queryPage.setWizard(this); - addPage(queryPage); - } - - @Override - public boolean canFinish() { - return queryPage.isPageComplete(); - } - - @Override - public boolean performFinish() { - RepositoryQuery query = queryPage.getQuery(); - if (query != null) { - TasksUiInternal.getTaskList().addQuery(query); - AbstractLegacyRepositoryConnector connector = (AbstractLegacyRepositoryConnector) TasksUi.getRepositoryManager() - .getRepositoryConnector(repository.getConnectorKind()); - if (connector != null) { - TasksUiInternal.synchronizeQuery(connector, query, null, true); - } - } - return true; - } - -}
\ No newline at end of file diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/NewTracTaskPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/NewTracTaskPage.java deleted file mode 100644 index 5f44b670c..000000000 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/NewTracTaskPage.java +++ /dev/null @@ -1,139 +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.internal.trac.ui.wizard; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.mylyn.internal.tasks.core.AbstractTask; -import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory; -import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; -import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; -import org.eclipse.mylyn.internal.trac.core.ITracClient; -import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; -import org.eclipse.mylyn.internal.trac.core.TracException; -import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -import org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler; -import org.eclipse.mylyn.tasks.core.TaskRepository; -import org.eclipse.mylyn.tasks.ui.TasksUi; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Text; - -/** - * Wizard page for creating new Trac tickets through a rich editor. - * - * @author Steffen Pingel - */ -public class NewTracTaskPage extends WizardPage { - - // private boolean firstTime; - - private final TaskRepository taskRepository; - - private RepositoryTaskData taskData; - - public NewTracTaskPage(TaskRepository taskRepository) { - super("New Task"); - - setTitle("Create via Rich Editor"); - setDescription("This will open an editor that can be used to create a new task."); - - this.taskRepository = taskRepository; - } - - public void createControl(Composite parent) { - Text text = new Text(parent, SWT.WRAP); - text.setEditable(false); - setControl(text); - } - - @Override - public void setVisible(boolean visible) { - super.setVisible(visible); - - // if (visible && firstTime) { - // firstTime = false; - // if (!hasAttributes()) { - // // delay the execution so the dialog's progress bar is visible - // // when the attributes are updated - // Display.getDefault().asyncExec(new Runnable() { - // public void run() { - // if (getControl() != null && !getControl().isDisposed()) { - // updateAttributesFromRepository(); - // } - // } - // }); - // } - // } - updateAttributesFromRepository(); - } - - // private boolean hasAttributes() { - // TracRepositoryConnector connector = (TracRepositoryConnector) - // TasksUiPlugin.getRepositoryManager() - // .getRepositoryConnector(TracCorePlugin.REPOSITORY_KIND); - // try { - // ITracClient client = - // connector.getClientManager().getRepository(taskRepository); - // return client.hasAttributes(); - // } catch (MalformedURLException e) { - // return false; - // } - // } - - @Override - public boolean isPageComplete() { - return taskData != null; - } - - private void updateAttributesFromRepository() { - TracRepositoryConnector connector = (TracRepositoryConnector) TasksUi.getRepositoryManager() - .getRepositoryConnector(TracCorePlugin.REPOSITORY_KIND); - final ITracClient client = connector.getClientManager().getTracClient(taskRepository); - - if (!client.hasAttributes()) { - try { - IRunnableWithProgress runnable = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - client.updateAttributes(monitor, true); - } catch (TracException e) { - throw new InvocationTargetException(e); - } - } - }; - - getContainer().run(true, true, runnable); - } catch (InvocationTargetException e) { - TasksUiInternal.displayStatus("Error updating attributes", TracCorePlugin.toStatus(e.getCause(), - taskRepository)); - return; - } catch (InterruptedException e) { - return; - } - } - - TracTaskDataHandler offlineHandler = (TracTaskDataHandler) connector.getLegacyTaskDataHandler(); - AbstractAttributeFactory attributeFactory = offlineHandler.getAttributeFactory(taskRepository.getRepositoryUrl(), - taskRepository.getConnectorKind(), AbstractTask.DEFAULT_TASK_KIND); - this.taskData = new RepositoryTaskData(attributeFactory, TracCorePlugin.REPOSITORY_KIND, - taskRepository.getRepositoryUrl(), TasksUiPlugin.getDefault().getNextNewRepositoryTaskId()); - this.taskData.setNew(true); - TracTaskDataHandler.createDefaultAttributes(taskData.getAttributeFactory(), taskData, client, false); - } - - public RepositoryTaskData getRepositoryTaskData() { - return taskData; - } - -} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryWizardPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracFilterQueryPage.java index a26f938c4..a34059130 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryWizardPage.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracFilterQueryPage.java @@ -15,16 +15,16 @@ import java.util.Set; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -import org.eclipse.jface.wizard.WizardPage; import org.eclipse.mylyn.commons.core.StatusHandler; 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.internal.trac.core.util.TracUtils; import org.eclipse.mylyn.internal.trac.ui.TracUiPlugin; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.KeyEvent; @@ -44,7 +44,7 @@ import org.eclipse.swt.widgets.Text; /** * @author Steffen Pingel */ -public class TracQueryWizardPage extends WizardPage { +public class TracFilterQueryPage extends AbstractRepositoryQueryPage { private static final String TITLE = "New Trac Query"; @@ -52,10 +52,6 @@ public class TracQueryWizardPage extends WizardPage { private static final String TITLE_QUERY_TITLE = "Query Title"; - private final TaskRepository repository; - - private final TracRepositoryQuery query; - private Text titleText; private Composite scrollComposite; @@ -65,18 +61,16 @@ public class TracQueryWizardPage extends WizardPage { private List<SearchField> searchFields; - public TracQueryWizardPage(TaskRepository repository, IRepositoryQuery query) { - super(TITLE); - - this.repository = repository; - this.query = (TracRepositoryQuery) query; - + public TracFilterQueryPage(TaskRepository repository, IRepositoryQuery query) { + super(TITLE, repository, query); setTitle(TITLE); setDescription(DESCRIPTION); } - public TracQueryWizardPage(TaskRepository repository) { - this(repository, null); + @Override + public void applyTo(IRepositoryQuery query) { + query.setUrl(getQueryUrl(getTaskRepository().getRepositoryUrl())); + query.setSummary(getQueryTitle()); } public void createControl(Composite parent) { @@ -97,16 +91,23 @@ public class TracQueryWizardPage extends WizardPage { createAddFilterGroup(composite); - if (query != null) { - titleText.setText(query.getSummary()); - restoreSearchFilterFromQuery(query); + if (getQuery() != null) { + titleText.setText(getQuery().getSummary()); + TracSearch search = TracUtils.toTracSearch(getQuery()); + if (search != null) { + restoreWidgetValues(search); + } } setControl(composite); } - private void restoreSearchFilterFromQuery(TracRepositoryQuery query) { - TracSearch search = query.getTracSearch(); + @Override + public String getQueryTitle() { + return (titleText != null) ? titleText.getText() : null; + } + + private void restoreWidgetValues(TracSearch search) { List<TracSearchFilter> filters = search.getFilters(); for (TracSearchFilter filter : filters) { SearchField field = getSearchField(filter.getFieldName()); @@ -230,10 +231,6 @@ public class TracQueryWizardPage extends WizardPage { return sb.toString(); } - public TracRepositoryQuery getQuery() { - return new TracRepositoryQuery(repository.getRepositoryUrl(), getQueryUrl(repository.getRepositoryUrl()), titleText.getText()); - } - private void hideSearchField(SearchField field) { visibleSearchFields.remove(field); } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracCustomQueryPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryPage.java index 8c5d25ce8..d286ee1b6 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracCustomQueryPage.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryPage.java @@ -18,16 +18,14 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.mylyn.commons.core.StatusHandler; -import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; -import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.trac.core.ITracClient; import org.eclipse.mylyn.internal.trac.core.TracCorePlugin; import org.eclipse.mylyn.internal.trac.core.TracException; import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector; -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.internal.trac.core.util.TracUtils; import org.eclipse.mylyn.internal.trac.ui.TracUiPlugin; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.TaskRepository; @@ -57,7 +55,7 @@ import org.eclipse.ui.progress.IProgressService; * * @author Steffen Pingel */ -public class TracCustomQueryPage extends AbstractRepositoryQueryPage { +public class TracQueryPage extends AbstractRepositoryQueryPage { private static final String TITLE = "Enter query parameters"; @@ -65,8 +63,6 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { private static final String TITLE_QUERY_TITLE = "Query Title:"; - private final TracRepositoryQuery query; - private Text titleText; private static final int PRODUCT_HEIGHT = 60; @@ -113,14 +109,13 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { // // private UserSearchField ccField; - public TracCustomQueryPage(TaskRepository repository, IRepositoryQuery query) { - super(TITLE, repository); - this.query = (TracRepositoryQuery) query; + public TracQueryPage(TaskRepository repository, IRepositoryQuery query) { + super(TITLE, repository, query); setTitle(TITLE); setDescription(DESCRIPTION); } - public TracCustomQueryPage(TaskRepository repository) { + public TracQueryPage(TaskRepository repository) { this(repository, null); } @@ -150,9 +145,12 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { createUserGroup(control); - if (query != null) { - titleText.setText(query.getSummary()); - restoreWidgetValues(query.getTracSearch()); + if (getQuery() != null) { + titleText.setText(getQuery().getSummary()); + TracSearch search = TracUtils.toTracSearch(getQuery()); + if (search != null) { + restoreWidgetValues(search); + } } setControl(control); @@ -308,8 +306,8 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { if (getTaskRepository() != null) { updateAttributesFromRepository(true); } else { - MessageDialog.openInformation(Display.getCurrent().getActiveShell(), - TracUiPlugin.TITLE_MESSAGE_DIALOG, TaskRepositoryManager.MESSAGE_NO_REPOSITORY); + MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Update Attributes Failed", + "No repository available, please add one using the Task Repositories view."); } } }); @@ -348,7 +346,7 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { private void initializePage() { updateAttributesFromRepository(false); - boolean restored = (query != null); + boolean restored = (getQuery() != null); if (inSearchContainer()) { restored |= restoreWidgetValues(); } @@ -359,14 +357,14 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { private boolean hasAttributes() { TracRepositoryConnector connector = (TracRepositoryConnector) TasksUi.getRepositoryManager() - .getRepositoryConnector(TracCorePlugin.REPOSITORY_KIND); + .getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND); ITracClient client = connector.getClientManager().getTracClient(getTaskRepository()); return client.hasAttributes(); } private void updateAttributesFromRepository(final boolean force) { TracRepositoryConnector connector = (TracRepositoryConnector) TasksUi.getRepositoryManager() - .getRepositoryConnector(TracCorePlugin.REPOSITORY_KIND); + .getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND); final ITracClient client = connector.getClientManager().getTracClient(getTaskRepository()); if (!client.hasAttributes() || force) { @@ -390,8 +388,7 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { service.busyCursorWhile(runnable); } } catch (InvocationTargetException e) { - TasksUiInternal.displayStatus("Error updating attributes", TracCorePlugin.toStatus(e.getCause(), - getTaskRepository())); + setErrorMessage(TracCorePlugin.toStatus(e.getCause(), getTaskRepository()).getMessage()); return; } catch (InterruptedException e) { return; @@ -437,16 +434,6 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { return search; } - @Override - public TracRepositoryQuery getQuery() { - return new TracRepositoryQuery(getTaskRepository().getRepositoryUrl(), - getQueryUrl(getTaskRepository().getRepositoryUrl()), getTitleText()); - } - - private String getTitleText() { - return (titleText != null) ? titleText.getText() : "<search>"; - } - // public boolean performAction() { // // Proxy proxySettings = TasksUiPlugin.getDefault().getProxySettings(); @@ -764,7 +751,8 @@ public class TracCustomQueryPage extends AbstractRepositoryQueryPage { @Override public void applyTo(IRepositoryQuery query) { - throw new UnsupportedOperationException(); + query.setUrl(getQueryUrl(getTaskRepository().getRepositoryUrl())); + query.setSummary(getQueryTitle()); } } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java index 065a8f046..1bc3197bf 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java @@ -239,7 +239,7 @@ public class TracRepositorySettingsPage extends AbstractRepositorySettingsPage { @Override public String getConnectorKind() { - return TracCorePlugin.REPOSITORY_KIND; + return TracCorePlugin.CONNECTOR_KIND; } } |