Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryConnector.java16
-rw-r--r--org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasklist/tests/mockconnector/MockRepositoryConnector.java3
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AbstractAddExistingTaskWizard.java20
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/AddExistingTaskWizard.java5
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasklist/ui/wizards/ExistingTaskWizardPage.java7
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/provisional/tasklist/AbstractRepositoryConnector.java3
-rw-r--r--org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF1
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AbstractTracClientSearchTest.java42
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java81
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracXmlRpcTest.java4
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java59
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java32
-rw-r--r--org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF2
-rw-r--r--org.eclipse.mylyn.trac.ui/build.properties3
-rw-r--r--org.eclipse.mylyn.trac.ui/plugin.xml18
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracRepositoryConnector.java84
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTask.java142
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracTaskExternalizer.java76
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/ITracClient.java2
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java42
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/AddExistingTracTaskWizard.java25
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);
+ }
+
+}

Back to the top