Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkersten2006-08-22 23:48:53 +0000
committermkersten2006-08-22 23:48:53 +0000
commit04a0d2895fad2f7645c213b8f7aa7e1df8add1ff (patch)
tree340593919e2e0c64ec40e68942bed8e3ab9ec2a7
parent6187d8c06648f429c8bba3ba7aeb2a5bb0997720 (diff)
downloadorg.eclipse.mylyn.tasks-04a0d2895fad2f7645c213b8f7aa7e1df8add1ff.tar.gz
org.eclipse.mylyn.tasks-04a0d2895fad2f7645c213b8f7aa7e1df8add1ff.tar.xz
org.eclipse.mylyn.tasks-04a0d2895fad2f7645c213b8f7aa7e1df8add1ff.zip
Progress on: 151900: Trac connector: implement attachment support
https://bugs.eclipse.org/bugs/show_bug.cgi?id=151900
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java1
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/Constants.java3
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracAttachmentHandlerTest.java131
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java33
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java5
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java4
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracAttachmentHandler.java113
-rw-r--r--org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracRepositoryConnector.java4
8 files changed, 291 insertions, 3 deletions
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java
index 4865f583b..d373eab6e 100644
--- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java
@@ -37,6 +37,7 @@ public class AllTracTests {
suite.addTestSuite(TracQueryTest.class);
suite.addTestSuite(TracRepositoryQueryTest.class);
suite.addTestSuite(TracClientManagerTest.class);
+ suite.addTestSuite(TracAttachmentHandlerTest.class);
// $JUnit-END$
return suite;
}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/Constants.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/Constants.java
index 012e540da..9b3d23f02 100644
--- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/Constants.java
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/Constants.java
@@ -23,6 +23,7 @@ public class Constants {
public static final String TEST_TRAC_010_SSL_URL = "https://mylar.eclipse.org/trac010";
public static final String TEST_TRAC_010_DIGEST_AUTH_URL = "http://mylar.eclipse.org/trac010digest";
-
+
+ public static final String TEST_TRAC_INVALID_URL = "http://mylar.eclipse.org/doesnotexist";
}
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
new file mode 100644
index 000000000..54dd656f6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracAttachmentHandlerTest.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * 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;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.net.Proxy;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylar.core.core.tests.support.MylarTestUtils;
+import org.eclipse.mylar.core.core.tests.support.MylarTestUtils.Credentials;
+import org.eclipse.mylar.core.core.tests.support.MylarTestUtils.PrivilegeLevel;
+import org.eclipse.mylar.internal.trac.TracRepositoryConnector;
+import org.eclipse.mylar.internal.trac.TracTask;
+import org.eclipse.mylar.internal.trac.TracUiPlugin;
+import org.eclipse.mylar.internal.trac.core.ITracClient;
+import org.eclipse.mylar.internal.trac.core.ITracClient.Version;
+import org.eclipse.mylar.tasks.core.IAttachmentHandler;
+import org.eclipse.mylar.tasks.core.TaskRepository;
+import org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector;
+import org.eclipse.mylar.tasks.ui.TaskRepositoryManager;
+import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylar.trac.tests.support.TestFixture;
+import org.eclipse.mylar.trac.tests.support.XmlRpcServer.TestData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracAttachmentHandlerTest extends TestCase {
+
+ private TaskRepository repository;
+
+ private TaskRepositoryManager manager;
+
+ private TracRepositoryConnector connector;
+
+ private IAttachmentHandler attachmentHandler;
+
+ private Proxy proxySettings;
+
+ private TestData data;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ manager = TasksUiPlugin.getRepositoryManager();
+ manager.clearRepositories();
+
+ proxySettings = TasksUiPlugin.getDefault().getProxySettings();
+
+ data = TestFixture.init010();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ protected void init(String url, Version version) {
+ String kind = TracUiPlugin.REPOSITORY_KIND;
+ Credentials credentials = MylarTestUtils.readCredentials(PrivilegeLevel.USER);
+
+ repository = new TaskRepository(kind, url);
+ repository.setAuthenticationCredentials(credentials.username, credentials.password);
+ repository.setTimeZoneId(ITracClient.TIME_ZONE);
+ repository.setCharacterEncoding(ITracClient.CHARSET);
+ repository.setVersion(version.name());
+
+ manager.addRepository(repository);
+
+ AbstractRepositoryConnector abstractConnector = manager.getRepositoryConnector(kind);
+ connector = (TracRepositoryConnector) abstractConnector;
+ connector.setForceSyncExec(true);
+
+ attachmentHandler = connector.getAttachmentHandler();
+ }
+
+ public void testDownloadAttachment() throws Exception {
+ // TODO needs RepositoryTaskData
+ }
+
+ public void testUploadAttachment() throws Exception {
+ init(Constants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TracTask task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+ File file = File.createTempFile("attachment", null);
+ OutputStream out = new FileOutputStream(file);
+ try {
+ out.write("Mylar".getBytes());
+ } finally {
+ out.close();
+ }
+ attachmentHandler.uploadAttachment(repository, task, "comment", "description", file, "", false, proxySettings);
+
+ ITracClient client = connector.getClientManager().getRepository(repository);
+ byte[] result = client.getAttachmentData(data.attachmentTicketId, file.getName());
+ assertEquals("Mylar", new String(result));
+ }
+
+ public void testCanUploadAttachment010() {
+ init(Constants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TracTask task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+ assertTrue(attachmentHandler.canUploadAttachment(repository, task));
+ }
+
+ public void testCanUploadAttachment096() {
+ init(Constants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ TracTask task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+ assertFalse(attachmentHandler.canUploadAttachment(repository, task));
+ }
+
+ public void testCanDownloadAttachment() throws Exception {
+ init(Constants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TracTask task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+ assertFalse(attachmentHandler.canDownloadAttachment(repository, task));
+
+ init(Constants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+ assertFalse(attachmentHandler.canDownloadAttachment(repository, task));
+ }
+
+}
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 2ed1fcaea..e189218a6 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,6 +11,7 @@
package org.eclipse.mylar.trac.tests;
+import java.io.File;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.Comparator;
@@ -18,10 +19,12 @@ import java.util.List;
import junit.framework.TestCase;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylar.context.core.ContextCorePlugin;
import org.eclipse.mylar.core.core.tests.support.MylarTestUtils;
import org.eclipse.mylar.core.core.tests.support.MylarTestUtils.Credentials;
import org.eclipse.mylar.core.core.tests.support.MylarTestUtils.PrivilegeLevel;
@@ -235,7 +238,7 @@ public class TracRepositoryConnectorTest extends TestCase {
protected void updateAttributes() throws Exception {
connector.updateAttributes(repository, new NullProgressMonitor());
-
+
ITracClient server = connector.getClientManager().getRepository(repository);
TracVersion[] versions = server.getVersions();
assertEquals(2, versions.length);
@@ -248,4 +251,32 @@ public class TracRepositoryConnectorTest extends TestCase {
assertEquals("2.0", versions[1].getName());
}
+ public void testContext010() throws Exception {
+ init(Constants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TracTask task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+
+ File sourceContextFile = ContextCorePlugin.getContextManager().getFileForContext(task.getHandleIdentifier());
+ sourceContextFile.createNewFile();
+ sourceContextFile.deleteOnExit();
+
+ assertTrue(connector.attachContext(repository, task, ""));
+ // TODO check if context was attached, requires RepositoryTaskData (bug
+ // #151899)
+ }
+
+ public void testContext096() throws Exception {
+ init(Constants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+ TracTask task = (TracTask) connector.createTaskFromExistingKey(repository, data.attachmentTicketId + "");
+
+ File sourceContextFile = ContextCorePlugin.getContextManager().getFileForContext(task.getHandleIdentifier());
+ sourceContextFile.createNewFile();
+ sourceContextFile.deleteOnExit();
+
+ try {
+ connector.attachContext(repository, task, "");
+ fail("expected CoreException"); // operation should not be supported
+ } catch (CoreException e) {
+ }
+ }
+
} \ No newline at end of file
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
index eb93310bc..d065e1720 100644
--- 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
@@ -44,6 +44,8 @@ public class TestFixture {
server.ticket(2).itemCreated();
server.ticket(3).itemCreated();
server.ticket(4).itemCreated();
+ server.ticket(5).itemCreated();
+ server.ticket(6).itemCreated();
}
// private static void initializeRepository(XmlRpcServer server) throws Exception {
@@ -65,6 +67,9 @@ public class TestFixture {
// ticket = server.ticket().create("summary3", "description3");
// ticket.update("comment", "milestone", "milestone2");
// ticket = server.ticket().create("summary4", "description4");
+//
+// Ticket ticket = server.ticket().create("attachment test", "");
+// // create attachment named attachment.txt that contains the text "Mylar"
// }
public static XmlRpcServer.TestData init010() throws Exception {
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 c6412d8a1..8ed9f516b 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
@@ -128,6 +128,10 @@ public class XmlRpcServer {
// all created tickets
public List<Ticket> tickets = new ArrayList<Ticket>();
+ public int attachmentTicketId = 5;
+
+ public int htmlEntitiesTicketId = 6;
+
/**
* Undo all changes.
*/
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracAttachmentHandler.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracAttachmentHandler.java
new file mode 100644
index 000000000..950cfa8da
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/TracAttachmentHandler.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.internal.trac;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Proxy;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylar.internal.trac.core.ITracClient;
+import org.eclipse.mylar.internal.trac.model.TracTicket;
+import org.eclipse.mylar.tasks.core.AbstractRepositoryTask;
+import org.eclipse.mylar.tasks.core.IAttachmentHandler;
+import org.eclipse.mylar.tasks.core.RepositoryAttachment;
+import org.eclipse.mylar.tasks.core.RepositoryTaskAttribute;
+import org.eclipse.mylar.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracAttachmentHandler implements IAttachmentHandler {
+
+ private TracRepositoryConnector connector;
+
+ public TracAttachmentHandler(TracRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ public void downloadAttachment(TaskRepository repository, AbstractRepositoryTask task, RepositoryAttachment attachment, File file, Proxy proxySettings) throws CoreException {
+ String filename = attachment.getAttributeValue(RepositoryTaskAttribute.ATTACHMENT_FILENAME);
+ if (filename == null) {
+ throw new CoreException(new Status(IStatus.ERROR, TracUiPlugin.PLUGIN_ID, IStatus.OK, "Attachment download from " + task.getRepositoryUrl() + " failed, missing attachment filename.", null));
+ }
+
+ try {
+ ITracClient client = connector.getClientManager().getRepository(repository);
+ int id = Integer.parseInt(AbstractRepositoryTask.getTaskId(task.getHandleIdentifier()));
+ byte[] data = client.getAttachmentData(id, filename);
+ writeData(file, data);
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, TracUiPlugin.PLUGIN_ID, 0, "Attachment download from " + task.getRepositoryUrl() + " failed, please see details.", e ));
+ }
+ }
+
+ private void writeData(File file, byte[] data) throws IOException {
+ OutputStream out = new FileOutputStream(file);
+ try {
+ out.write(data);
+ } finally {
+ out.close();
+ }
+ }
+
+ public void uploadAttachment(TaskRepository repository, AbstractRepositoryTask task, String comment, String description, File file, String contentType, boolean isPatch, Proxy proxySettings) throws CoreException {
+ if (!connector.hasAttachmentSupport(task)) {
+ throw new CoreException(new Status(IStatus.INFO, TracUiPlugin.PLUGIN_ID, IStatus.OK, "Attachments are not supported by this repository access type.", null));
+ }
+
+ try {
+ ITracClient client = connector.getClientManager().getRepository(repository);
+ int id = Integer.parseInt(AbstractRepositoryTask.getTaskId(task.getHandleIdentifier()));
+ byte[] data = readData(file);
+ client.putAttachmentData(id, file.getName(), description, data);
+ if (comment != null && comment.length() > 0) {
+ TracTicket ticket = new TracTicket(id);
+ client.updateTicket(ticket, comment);
+ }
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, TracUiPlugin.PLUGIN_ID, 0, "Attachment upload to " + task.getRepositoryUrl() + " failed, please see details.", e ));
+ }
+ }
+
+ private byte[] readData(File file) throws IOException {
+ if (file.length() > Integer.MAX_VALUE) {
+ throw new IOException("Can not upload files larger than " + Integer.MAX_VALUE + " bytes");
+ }
+
+ InputStream in = new FileInputStream(file);
+ try {
+ byte[] data = new byte[(int) file.length()];
+ in.read(data, 0, (int) file.length());
+ return data;
+ } finally {
+ in.close();
+ }
+ }
+
+ public boolean canDownloadAttachment(TaskRepository repository, AbstractRepositoryTask task) {
+ // requires RepositoryTaskData (bug #151899)
+ //return connector.hasAttachmentSupport(task);
+ return false;
+ }
+
+ public boolean canUploadAttachment(TaskRepository repository, AbstractRepositoryTask task) {
+ return connector.hasAttachmentSupport(task);
+ }
+
+}
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 8433dfac7..fa63b4276 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
@@ -62,6 +62,8 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector {
private TracClientManager clientManager;
+ private TracAttachmentHandler attachmentHandler = new TracAttachmentHandler(this);
+
public TracRepositoryConnector() {
TracUiPlugin.getDefault().setConnector(this);
}
@@ -118,7 +120,7 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector {
@Override
public IAttachmentHandler getAttachmentHandler() {
- return null;
+ return attachmentHandler;
}
@Override

Back to the top