diff options
21 files changed, 589 insertions, 78 deletions
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryConnector.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryConnector.java index 000e47e7e..2c69aea61 100644 --- a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryConnector.java +++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryConnector.java @@ -31,6 +31,7 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.IWizard; +import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.mylar.internal.bugzilla.core.AbstractReportFactory; import org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler; @@ -54,7 +55,6 @@ import org.eclipse.mylar.internal.tasklist.RepositoryTaskData; import org.eclipse.mylar.internal.tasklist.ui.views.TaskRepositoriesView; import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard; import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositorySettingsPage; -import org.eclipse.mylar.internal.tasklist.ui.wizards.ExistingTaskWizardPage; import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit; import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector; import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery; @@ -161,22 +161,10 @@ public class BugzillaRepositoryConnector extends AbstractRepositoryConnector { return new EditBugzillaQueryWizard(repository, (BugzillaRepositoryQuery) query); } - public IWizard getAddExistingTaskWizard(TaskRepository repository) { + public Wizard getAddExistingTaskWizard(TaskRepository repository) { // TODO create a propper subclass for Bugzilla return new AbstractAddExistingTaskWizard(repository) { - - private ExistingTaskWizardPage page; - - public void addPages() { - super.addPages(); - this.page = new ExistingTaskWizardPage(); - addPage(page); - } - - protected String getTaskId() { - return page.getTaskId(); - } }; } diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/mockconnector/MockRepositoryConnector.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/mockconnector/MockRepositoryConnector.java index 3b7b45daf..42dbe9635 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/mockconnector/MockRepositoryConnector.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/mockconnector/MockRepositoryConnector.java @@ -17,6 +17,7 @@ import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.jface.wizard.IWizard; +import org.eclipse.jface.wizard.Wizard; import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositorySettingsPage; import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit; import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector; @@ -54,7 +55,7 @@ public class MockRepositoryConnector extends AbstractRepositoryConnector { } @Override - public IWizard getAddExistingTaskWizard(TaskRepository repository) { + public Wizard getAddExistingTaskWizard(TaskRepository repository) { // ignore return null; } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java index 95d2c0626..f163288bb 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java @@ -24,11 +24,14 @@ import org.eclipse.ui.IWorkbench; /** * @author Brock Janiczak + * @author Mik Kersten */ public abstract class AbstractAddExistingTaskWizard extends Wizard { private final TaskRepository repository; + private ExistingTaskWizardPage page; + public AbstractAddExistingTaskWizard(TaskRepository repository) { this.repository = repository; setNeedsProgressMonitor(true); @@ -42,11 +45,12 @@ public abstract class AbstractAddExistingTaskWizard extends Wizard { ITask newTask = connector.createTaskFromExistingKey(repository, getTaskId()); if (newTask != null && TaskListView.getFromActivePerspective() != null) { - Object selectedObject = ((IStructuredSelection) TaskListView.getFromActivePerspective().getViewer().getSelection()) - .getFirstElement(); + Object selectedObject = ((IStructuredSelection) TaskListView.getFromActivePerspective().getViewer() + .getSelection()).getFirstElement(); if (selectedObject instanceof TaskCategory) { - MylarTaskListPlugin.getTaskListManager().getTaskList().moveToContainer(((TaskCategory) selectedObject), newTask); + MylarTaskListPlugin.getTaskListManager().getTaskList().moveToContainer(((TaskCategory) selectedObject), + newTask); } else { MylarTaskListPlugin.getTaskListManager().getTaskList().moveToRoot(newTask); } @@ -65,5 +69,13 @@ public abstract class AbstractAddExistingTaskWizard extends Wizard { super.setForcePreviousAndNextButtons(true); } - protected abstract String getTaskId(); + public void addPages() { + super.addPages(); + this.page = new ExistingTaskWizardPage(); + addPage(page); + } + + protected String getTaskId() { + return page.getTaskId(); + } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java index 6708d2f69..65e56422e 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java @@ -12,6 +12,7 @@ package org.eclipse.mylar.internal.tasklist.ui.wizards; import org.eclipse.jface.wizard.IWizard; +import org.eclipse.jface.wizard.Wizard; import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector; import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin; import org.eclipse.mylar.provisional.tasklist.TaskRepository; @@ -32,7 +33,9 @@ public class AddExistingTaskWizard extends MultiRepositoryAwareWizard { AbstractRepositoryConnector connector = MylarTaskListPlugin.getRepositoryManager().getRepositoryConnector( taskRepository.getKind()); if (connector.canCreateTaskFromKey()) { - return connector.getAddExistingTaskWizard(taskRepository); + Wizard wizard = connector.getAddExistingTaskWizard(taskRepository); + wizard.setWindowTitle(TITLE); + return wizard; } else { return null; } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java index 8e3aa470f..b5c0134c0 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java @@ -12,6 +12,7 @@ package org.eclipse.mylar.internal.tasklist.ui.wizards; import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.mylar.internal.tasklist.ui.TaskListImages; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; @@ -26,9 +27,10 @@ import org.eclipse.swt.widgets.Text; */ public class ExistingTaskWizardPage extends WizardPage { - private static final String TITLE = "Add Existing Task"; + private static final String TITLE = "Enter Task ID"; - private static final String DESCRIPTION = "Enter the identifier for the task, issue, or bug report."; + private static final String DESCRIPTION = "Provide the identifier for the task, issue, or bug report.\n" + + "The format is specific to the repository."; private Text taskIdText; @@ -36,6 +38,7 @@ public class ExistingTaskWizardPage extends WizardPage { super(TITLE); setTitle(TITLE); setDescription(DESCRIPTION); + setImageDescriptor(TaskListImages.BANNER_REPOSITORY); } public void createControl(Composite parent) { diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryConnector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryConnector.java index 70dfc34c9..88afc916b 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryConnector.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryConnector.java @@ -33,6 +33,7 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.IWizard; +import org.eclipse.jface.wizard.Wizard; import org.eclipse.mylar.internal.core.util.MylarStatusHandler; import org.eclipse.mylar.internal.core.util.ZipFileUtil; import org.eclipse.mylar.internal.tasklist.RepositoryAttachment; @@ -124,7 +125,7 @@ public abstract class AbstractRepositoryConnector { public abstract void openEditQueryDialog(AbstractRepositoryQuery query); - public abstract IWizard getAddExistingTaskWizard(TaskRepository repository); + public abstract Wizard getAddExistingTaskWizard(TaskRepository repository); public abstract IWizard getNewTaskWizard(TaskRepository taskRepository); diff --git a/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF index a0170f9ad..5a2a32b24 100644 --- a/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF @@ -6,5 +6,6 @@ Bundle-Version: 0.0.0 Bundle-Localization: plugin Require-Bundle: org.junit, org.apache.xmlrpc, + org.eclipse.mylar.tasklist, org.eclipse.mylar.trac Export-Package: org.eclipse.mylar.trac.tests diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AbstractTracClientSearchTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AbstractTracClientSearchTest.java index dbbefdae2..02d6d7a70 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AbstractTracClientSearchTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AbstractTracClientSearchTest.java @@ -23,7 +23,8 @@ import org.eclipse.mylar.internal.trac.model.TracSearch; import org.eclipse.mylar.internal.trac.model.TracTicket; import org.eclipse.mylar.internal.trac.model.TracTicket.Key; import org.eclipse.mylar.trac.tests.support.AbstractTracRepositoryFactory; -import org.eclipse.mylar.trac.tests.support.XmlRpcServer; +import org.eclipse.mylar.trac.tests.support.TestFixture; +import org.eclipse.mylar.trac.tests.support.XmlRpcServer.TestData; import org.eclipse.mylar.trac.tests.support.XmlRpcServer.Ticket; /** @@ -34,13 +35,9 @@ import org.eclipse.mylar.trac.tests.support.XmlRpcServer.Ticket; */ public abstract class AbstractTracClientSearchTest extends TestCase { - protected XmlRpcServer server; - protected AbstractTracRepositoryFactory factory; - protected static List<Ticket> tickets; - - private static boolean setupRun = false; + protected List<Ticket> tickets; public AbstractTracClientSearchTest(AbstractTracRepositoryFactory factory) { this.factory = factory; @@ -49,41 +46,16 @@ public abstract class AbstractTracClientSearchTest extends TestCase { protected void setUp() throws Exception { super.setUp(); - server = new XmlRpcServer(Constants.TEST_REPOSITORY1_URL, Constants.TEST_REPOSITORY1_ADMIN_USERNAME, - Constants.TEST_REPOSITORY1_ADMIN_PASSWORD); - - if (!setupRun) { - tickets = new ArrayList<Ticket>(); - - server.ticket().deleteAll(); - - server.ticketMilestone("m1").deleteAndCreate(); - Ticket ticket = add(server.ticket().create("summary1", "description1")); - ticket.update("comment", "milestone", "m1"); - - server.ticketMilestone("m2").deleteAndCreate(); - ticket = add(server.ticket().create("summary2", "description2")); - ticket.update("comment", "milestone", "m2"); - ticket = add(server.ticket().create("summary3", "description3")); - ticket.update("comment", "milestone", "m2"); - - ticket = add(server.ticket().create("summary4", "description4")); - - setupRun = true; - } + TestData data = TestFixture.initializeRepository1(); + tickets = data.tickets; factory.connectRepository1(); } protected void tearDown() throws Exception { super.tearDown(); - - // server.getFixture().cleanup(); - } - - protected Ticket add(Ticket ticket) { - tickets.add(ticket); - return ticket; + + // TestFixture.cleanupRepository1(); } protected void assertTicketEquals(Ticket ticket, TracTicket tracTicket) throws Exception { 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 bc5f8b288..1c079adea 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 @@ -11,15 +11,68 @@ package org.eclipse.mylar.trac.tests; -import org.eclipse.mylar.internal.trac.TracRepositoryConnector; - import junit.framework.TestCase; +import org.eclipse.mylar.internal.trac.MylarTracPlugin; +import org.eclipse.mylar.internal.trac.TracRepositoryConnector; +import org.eclipse.mylar.internal.trac.TracTask; +import org.eclipse.mylar.internal.trac.core.ITracClient; +import org.eclipse.mylar.internal.trac.core.ITracClient.Version; +import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector; +import org.eclipse.mylar.provisional.tasklist.ITask; +import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin; +import org.eclipse.mylar.provisional.tasklist.TaskRepository; +import org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager; +import org.eclipse.mylar.trac.tests.support.TestFixture; +import org.eclipse.mylar.trac.tests.support.XmlRpcServer.TestData; + /** * @author Steffen Pingel */ public class TracRepositoryConnectorTest extends TestCase { + private TestData data; + + private TaskRepository repository; + + private TaskRepositoryManager manager; + + private TracRepositoryConnector connector; + + protected void setUp() throws Exception { + super.setUp(); + + manager = MylarTaskListPlugin.getRepositoryManager(); + manager.clearRepositories(); + + data = TestFixture.initializeRepository1(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + + // TestFixture.cleanupRepository1(); + } + + protected void init(Version version) { + String kind = MylarTracPlugin.REPOSITORY_KIND; + + repository = new TaskRepository(kind, Constants.TEST_REPOSITORY1_URL); + repository.setAuthenticationCredentials(Constants.TEST_REPOSITORY1_USERNAME, + Constants.TEST_REPOSITORY1_USERNAME); + repository.setTimeZoneId(ITracClient.TIME_ZONE); + repository.setCharacterEncoding(ITracClient.CHARSET); + repository.setVersion(version.name()); + + manager.addRepository(repository); + + AbstractRepositoryConnector abstractConnector = manager.getRepositoryConnector(kind); + assertEquals(abstractConnector.getRepositoryType(), kind); + + connector = (TracRepositoryConnector) abstractConnector; + connector.setForceSyncExec(true); + } + public void testGetRepositoryUrlFromTaskUrl() { TracRepositoryConnector connector = new TracRepositoryConnector(); assertEquals("http://host/repo", connector.getRepositoryUrlFromTaskUrl("http://host/repo/ticket/1")); @@ -28,4 +81,28 @@ public class TracRepositoryConnectorTest extends TestCase { assertEquals(null, connector.getRepositoryUrlFromTaskUrl("http://host/repo/ticket-2342")); } + public void testCreateTaskFromExistingKeyXmlRpc() { + init(Version.XML_RPC); + createTaskFromExistingKey(); + } + + public void testCreateTaskFromExistingKeyTrac09() { + init(Version.TRAC_0_9); + createTaskFromExistingKey(); + } + + protected void createTaskFromExistingKey() { + String id = data.tickets.get(0).getId() + ""; + ITask task = connector.createTaskFromExistingKey(repository, id); + assertNotNull(task); + assertEquals(TracTask.class, task.getClass()); + assertTrue(task.getDescription().contains("summary1")); + assertEquals(repository.getUrl() + ITracClient.TICKET_URL + id, task.getUrl()); + + task = connector.createTaskFromExistingKey(repository, "does not exist"); + assertNull(task); + + task = connector.createTaskFromExistingKey(repository, Integer.MAX_VALUE + ""); + assertNull(task); + } } diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracXmlRpcTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracXmlRpcTest.java index e6a5ff405..49b8b2d1d 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracXmlRpcTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracXmlRpcTest.java @@ -246,13 +246,13 @@ public class TracXmlRpcTest extends TestCase { public void testGetTicketNonExistant() throws XmlRpcException, IOException { try { - call("ticket.delete", 1); + call("ticket.delete", Integer.MAX_VALUE); } catch (Exception e) { // ignore } try { - Vector ticket = (Vector) call("ticket.get", 1); + Vector ticket = (Vector) call("ticket.get", Integer.MAX_VALUE); fail("Expected XmlRpcException, got ticket instead: " + ticket); } catch (XmlRpcException e) { // ignore diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java new file mode 100644 index 000000000..8defafc79 --- /dev/null +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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 + * + * Contributors: + * Mylar project committers - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylar.trac.tests.support; + +import org.eclipse.mylar.trac.tests.Constants; +import org.eclipse.mylar.trac.tests.support.XmlRpcServer.Ticket; + +/** + * Initializes Trac repositories to a defined state. This is done once per test + * run, since cleaning and initializing the repository for each test method + * would take too long. + * + * @author Steffen Pingel + */ +public class TestFixture { + + public static XmlRpcServer.TestData data1; + + public static XmlRpcServer.TestData initializeRepository1() throws Exception { + if (data1 == null) { + XmlRpcServer server = new XmlRpcServer(Constants.TEST_REPOSITORY1_URL, + Constants.TEST_REPOSITORY1_ADMIN_USERNAME, Constants.TEST_REPOSITORY1_ADMIN_PASSWORD); + + server.ticket().deleteAll(); + + server.ticketMilestone("m1").deleteAndCreate(); + Ticket ticket = server.ticket().create("summary1", "description1"); + ticket.update("comment", "milestone", "m1"); + + server.ticketMilestone("m2").deleteAndCreate(); + ticket = server.ticket().create("summary2", "description2"); + ticket.update("comment", "milestone", "m2"); + ticket = server.ticket().create("summary3", "description3"); + ticket.update("comment", "milestone", "m2"); + + ticket = server.ticket().create("summary4", "description4"); + + data1 = server.getData(); + } + return data1; + } + + public static void cleanupRepository1() throws Exception { + if (data1 != null) { + data1.cleanup(); + data1 = null; + } + } + +} diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java index e72f273d2..43cce095b 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java @@ -35,11 +35,11 @@ public class XmlRpcServer { public abstract void delete() throws Exception; protected void itemCreated() { - fixture.items.add(this); + data.items.add(this); } protected void itemDeleted() { - fixture.items.remove(this); + data.items.remove(this); } } @@ -123,10 +123,14 @@ public class XmlRpcServer { /** * Records changes to the repository. */ - public class TestFixture { + public class TestData { + // all created items List<AbstractTracItem> items = new ArrayList<AbstractTracItem>(); - + + // all created tickets + public List<Ticket> tickets = new ArrayList<Ticket>(); + /** * Undo all changes. */ @@ -187,6 +191,18 @@ public class XmlRpcServer { return id; } + @Override + protected void itemCreated() { + super.itemCreated(); + data.tickets.add(this); + } + + @Override + protected void itemDeleted() { + super.itemDeleted(); + data.tickets.remove(this); + } + public Ticket update(String comment, String key, String value) throws Exception { Hashtable<String, Object> attrs = new Hashtable<String, Object>(); attrs.put(key, value); @@ -258,7 +274,7 @@ public class XmlRpcServer { private XmlRpcClient client; - private TestFixture fixture; + private TestData data; private String password; @@ -273,7 +289,7 @@ public class XmlRpcServer { this.username = username; this.password = password; - this.fixture = new TestFixture(); + this.data = new TestData(); this.repository = new TracXmlRpcClient(new URL(url), Version.XML_RPC, username, password); this.client = repository.getClient(); @@ -292,8 +308,8 @@ public class XmlRpcServer { return result; } - public TestFixture getFixture() { - return fixture; + public TestData getData() { + return data; } public String getPassword() { diff --git a/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF index 295953a09..3410a853f 100644 --- a/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Mylar Trac Plug-in -Bundle-SymbolicName: org.eclipse.mylar.trac +Bundle-SymbolicName: org.eclipse.mylar.trac;singleton:=true Bundle-Version: 0.5.3 Bundle-Activator: org.eclipse.mylar.internal.trac.MylarTracPlugin Bundle-Vendor: Eclipse.org diff --git a/org.eclipse.mylyn.trac.ui/build.properties b/org.eclipse.mylyn.trac.ui/build.properties index 34d2e4d2d..e9863e281 100644 --- a/org.eclipse.mylyn.trac.ui/build.properties +++ b/org.eclipse.mylyn.trac.ui/build.properties @@ -1,4 +1,5 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + plugin.xml diff --git a/org.eclipse.mylyn.trac.ui/plugin.xml b/org.eclipse.mylyn.trac.ui/plugin.xml new file mode 100644 index 000000000..7337a6262 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/plugin.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.2"?> +<plugin> + <extension + id="org.eclipse.mylar.trac.repository" + name="Trac Repository" + point="org.eclipse.mylar.tasklist.repositories"> + <repositoryType + class="org.eclipse.mylar.internal.trac.TracRepositoryConnector" + id="org.eclipse.mylar.trac.tasklist.repositories" + name="Trac Repository Client" + type="trac"/> + <externalizer + class="org.eclipse.mylar.internal.trac.TracTaskExternalizer" + id="org.eclipse.mylar.trac.tasklist.externalizer"/> + </extension> + +</plugin> diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracRepositoryConnector.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracRepositoryConnector.java index cc63e9e28..67a87c195 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracRepositoryConnector.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracRepositoryConnector.java @@ -19,9 +19,15 @@ import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.jface.wizard.IWizard; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.mylar.internal.core.util.MylarStatusHandler; import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositorySettingsPage; import org.eclipse.mylar.internal.trac.core.ITracClient; +import org.eclipse.mylar.internal.trac.core.TracClientManager; import org.eclipse.mylar.internal.trac.core.ITracClient.Version; +import org.eclipse.mylar.internal.trac.model.TracTicket; +import org.eclipse.mylar.internal.trac.model.TracTicket.Key; +import org.eclipse.mylar.internal.trac.ui.wizard.AddExistingTracTaskWizard; import org.eclipse.mylar.internal.trac.ui.wizard.TracRepositorySettingsPage; import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit; import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector; @@ -30,6 +36,7 @@ import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask; import org.eclipse.mylar.provisional.tasklist.IAttachmentHandler; import org.eclipse.mylar.provisional.tasklist.IOfflineTaskHandler; import org.eclipse.mylar.provisional.tasklist.ITask; +import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin; import org.eclipse.mylar.provisional.tasklist.TaskRepository; /** @@ -41,6 +48,8 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector { private List<String> supportedVersions; + private TracClientManager clientManager; + @Override public boolean canCreateNewTask() { return false; @@ -48,7 +57,7 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector { @Override public boolean canCreateTaskFromKey() { - return false; + return true; } @Override @@ -115,9 +124,8 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector { } @Override - public IWizard getAddExistingTaskWizard(TaskRepository repository) { - // TODO Auto-generated method stub - return null; + public Wizard getAddExistingTaskWizard(TaskRepository repository) { + return new AddExistingTracTaskWizard(repository); } @Override @@ -141,8 +149,74 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector { @Override public ITask createTaskFromExistingKey(TaskRepository repository, String id) { - // TODO Auto-generated method stub + try { + // TODO do this in a non-blocking way like + // BugzillaRepositoryConnector once IOfflineTaskHandler has been + // implemented + + ITracClient connection = getClientManager().getRepository(repository); + TracTicket ticket = connection.getTicket(Integer.parseInt(id)); + + String handleIdentifier = AbstractRepositoryTask.getHandle(repository.getUrl(), ticket.getId()); + TracTask task = createTask(ticket, handleIdentifier); + updateTaskDetails(repository.getUrl(), task, ticket); + + return task; + } catch (Exception e) { + MylarStatusHandler.log(e, "Error creating task from key " + id); + } return null; } + public synchronized TracClientManager getClientManager() { + if (clientManager == null) { + clientManager = new TracClientManager(); + } + return clientManager; + } + + public static TracTask createTask(TracTicket ticket, String handleIdentifier) { + TracTask task; + ITask existingTask = MylarTaskListPlugin.getTaskListManager().getTaskList().getTask(handleIdentifier); + if (existingTask instanceof TracTask) { + task = (TracTask) existingTask; + } else { + task = new TracTask(handleIdentifier, ticket.getValue(Key.SUMMARY), true); + MylarTaskListPlugin.getTaskListManager().getTaskList().addTask(task); + } + return task; + } + + /** + * Updates fields of <code>task</code> from <code>ticket</code>. + */ + public static void updateTaskDetails(String repositoryUrl, TracTask task, TracTicket ticket) { + if (ticket.isValid()) { + String url = repositoryUrl + ITracClient.TICKET_URL + ticket.getId(); + task.setUrl(url); + if (ticket.getValue(Key.SUMMARY) != null) { + task.setDescription("#" + ticket.getId() + ": " + ticket.getValue(Key.SUMMARY)); + } + } + if (ticket.getValue(Key.STATUS) != null) { + TracTask.Status status = TracTask.Status.fromStatus(ticket.getValue(Key.STATUS)); + task.setCompleted(status != null && status == TracTask.Status.CLOSED); + } else { + task.setCompleted(false); + } + if (ticket.getValue(Key.PRIORITY) != null) { + String translatedPriority = TracTask.PriorityLevel.fromPriority(ticket.getValue(Key.PRIORITY)).toString(); + task.setPriority(translatedPriority); + } + if (ticket.getValue(Key.TYPE) != null) { + String translatedKind = TracTask.Kind.fromType(ticket.getValue(Key.TYPE)).toString(); + task.setKind(translatedKind); + } + if (ticket.getCreated() != null) { + task.setCreationDate(ticket.getCreated()); + } + + MylarTaskListPlugin.getTaskListManager().getTaskList().notifyLocalInfoChanged(task); + } + } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTask.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTask.java new file mode 100644 index 000000000..60669e6c1 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTask.java @@ -0,0 +1,142 @@ +/******************************************************************************* + * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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 + * + * Contributors: + * Mylar project committers - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylar.internal.trac; + +import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask; + +/** + * @author Steffen Pingel + */ +public class TracTask extends AbstractRepositoryTask { + + public enum PriorityLevel { + BLOCKER, CRITICAL, MAJOR, MINOR, TRIVIAL; + + @Override + public String toString() { + switch (this) { + case BLOCKER: + return "P1"; + case CRITICAL: + return "P2"; + case MAJOR: + return "P3"; + case MINOR: + return "P4"; + case TRIVIAL: + return "P5"; + default: + return "P5"; + } + } + + public static PriorityLevel 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 enum Kind { + DEFECT, ENHANCEMENT, TASK; + + @Override + public String toString() { + switch (this) { + case DEFECT: + return "Defect"; + case ENHANCEMENT: + return "Enhancement"; + case TASK: + return "Task"; + default: + return ""; + } + } + + 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; + } + + } + + public enum Status { + NEW, ASSIGNED, CLOSED; + + @Override + public String toString() { + switch (this) { + case NEW: + return "New"; + case ASSIGNED: + return "Assigned"; + case CLOSED: + return "Closed"; + default: + return ""; + } + } + + 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("closed")) + return CLOSED; + return null; + } + + } + + public TracTask(String handle, String label, boolean newTask) { + super(handle, label, newTask); + } + + @Override + public String getRepositoryKind() { + return MylarTracPlugin.REPOSITORY_KIND; + } + + @Override + public boolean isDownloaded() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isPersistentInWorkspace() { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTaskExternalizer.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTaskExternalizer.java new file mode 100644 index 000000000..beff051a7 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTaskExternalizer.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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 + * + * Contributors: + * Mylar project committers - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylar.internal.trac; + +import org.eclipse.mylar.internal.tasklist.TaskExternalizationException; +import org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer; +import org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer; +import org.eclipse.mylar.provisional.tasklist.ITask; +import org.eclipse.mylar.provisional.tasklist.TaskList; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * @author Steffen Pingel + */ +public class TracTaskExternalizer extends DelegatingTaskExternalizer { + + private static final String KEY_TRAC = "Trac"; + + private static final String KEY_TRAC_CATEGORY = KEY_TRAC + KEY_CATEGORY; + + private static final String KEY_TRAC_TASK = KEY_TRAC + KEY_TASK; + + @Override + public boolean canCreateElementFor(ITask task) { + return task instanceof TracTask; + } + + @Override + public boolean canReadCategory(Node node) { + return node.getNodeName().equals(KEY_TRAC_CATEGORY); + } + + @Override + public String getCategoryTagName() { + return KEY_TRAC_CATEGORY; + } + + @Override + public String getTaskTagName() { + return KEY_TRAC_TASK; + } + + @Override + public ITask readTask(Node node, TaskList taskList, AbstractTaskContainer category, ITask parent) + throws TaskExternalizationException { + + Element element = (Element) node; + String handle; + String label; + if (element.hasAttribute(KEY_HANDLE)) { + handle = element.getAttribute(KEY_HANDLE); + } else { + throw new TaskExternalizationException("Handle not stored for task"); + } + if (element.hasAttribute(KEY_LABEL)) { + label = element.getAttribute(KEY_LABEL); + } else { + throw new TaskExternalizationException("Description not stored for task"); + } + + TracTask task = new TracTask(handle, label, false); + readTaskInfo(task, taskList, element, parent, category); + return task; + } + +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/ITracClient.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/ITracClient.java index d0cb0ca84..78c25f26a 100644 --- a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/ITracClient.java +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/ITracClient.java @@ -41,7 +41,7 @@ public interface ITracClient { case TRAC_0_9: return "Trac 0.9 and higher"; case XML_RPC: - return "XML-RPC Plugin (Rev. 826)"; + return "XML-RPC Plugin (Rev. 848)"; default: return null; } diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java new file mode 100644 index 000000000..085e2b039 --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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 + * + * Contributors: + * Mylar project committers - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylar.internal.trac.core; + +import java.net.MalformedURLException; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.mylar.internal.trac.core.ITracClient.Version; +import org.eclipse.mylar.provisional.tasklist.TaskRepository; + +/** + * Caches {@link ITracClient} objects. + * + * @author Steffen Pingel + */ +public class TracClientManager { + + Map<String, ITracClient> clientByUrl = new HashMap<String, ITracClient>(); + + public TracClientManager() { + } + + public ITracClient getRepository(TaskRepository taskRepository) throws MalformedURLException { + ITracClient repository = clientByUrl.get(taskRepository.getUrl()); + if (repository == null) { + repository = TracClientFactory.createClient(taskRepository.getUrl(), Version.fromVersion(taskRepository + .getVersion()), taskRepository.getUserName(), taskRepository.getPassword()); + clientByUrl.put(taskRepository.getUrl(), repository); + } + return repository; + } +} diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/AddExistingTracTaskWizard.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/AddExistingTracTaskWizard.java new file mode 100644 index 000000000..dcb9eacda --- /dev/null +++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/AddExistingTracTaskWizard.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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 + * + * Contributors: + * Mylar project committers - initial API and implementation + *******************************************************************************/ +package org.eclipse.mylar.internal.trac.ui.wizard; + +import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard; +import org.eclipse.mylar.provisional.tasklist.TaskRepository; + +/** + * @author Steffen Pingel + */ +public class AddExistingTracTaskWizard extends AbstractAddExistingTaskWizard { + + public AddExistingTracTaskWizard(TaskRepository repository) { + super(repository); + } + +} |