You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/23 11:05:34 UTC

[49/79] [partial] incubator-taverna-language git commit: Revert "temporarily empty repository"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestDataBundles.java
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestDataBundles.java b/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestDataBundles.java
new file mode 100644
index 0000000..c5d692d
--- /dev/null
+++ b/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestDataBundles.java
@@ -0,0 +1,815 @@
+package org.apache.taverna.databundle;
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.charset.Charset;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileAlreadyExistsException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.taverna.databundle.DataBundles;
+import org.apache.taverna.databundle.ErrorDocument;
+import org.apache.taverna.robundle.Bundle;
+import org.apache.taverna.scufl2.api.container.WorkflowBundle;
+import org.apache.taverna.scufl2.api.io.WorkflowBundleIO;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+//import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.databind.JsonNode;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+
+public class TestDataBundles {
+	private Bundle dataBundle;
+
+    protected void checkSignature(Path zip) throws IOException {
+		String MEDIATYPE = "application/vnd.wf4ever.robundle+zip";
+		/*
+		 * Check position 30++ according to RO Bundle specification
+		 * http://purl.org/wf4ever/ro-bundle#ucf
+		 */
+		byte[] expected = ("mimetype" + MEDIATYPE + "PK").getBytes("ASCII");
+
+		try (InputStream in = Files.newInputStream(zip)) {
+			byte[] signature = new byte[expected.length];
+			int MIME_OFFSET = 30;
+			assertEquals(MIME_OFFSET, in.skip(MIME_OFFSET));
+			assertEquals(expected.length, in.read(signature));
+			assertArrayEquals(expected, signature);
+		}
+	}
+	
+	@Before
+	public void createDataBundle() throws IOException {
+	    dataBundle = DataBundles.createBundle();
+	}
+	
+	@After
+	public void closeDataBundle() throws IOException {
+	    dataBundle.close();
+	}
+	
+	@Test
+    public void clear() throws Exception {        
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path file1 = inputs.resolve("file1");
+        Path file1Txt = inputs.resolve("file1.txt");
+        Path file1Png = inputs.resolve("file1.png");
+        Path file1Else = inputs.resolve("file1somethingelse.txt");
+        
+        Files.createFile(file1);
+        Files.createFile(file1Txt);
+        Files.createFile(file1Png);
+        Files.createFile(file1Else); 
+        
+        DataBundles.deleteAllExtensions(file1);
+        
+        assertFalse(Files.exists(file1));
+        assertFalse(Files.exists(file1Txt));
+        assertFalse(Files.exists(file1Png));
+        assertTrue(Files.exists(file1Else));
+	}
+
+	   
+    @Test
+    public void clearRecursive() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path file1 = inputs.resolve("file1");
+        Path file1Dir = inputs.resolve("file1.dir");
+        
+        Files.createDirectory(file1);
+        Files.createDirectory(file1Dir);
+        Path nested = file1Dir.resolve("nested");
+        Files.createDirectory(nested);
+        
+        
+        Path filePng = file1Dir.resolve("file.png");
+        Path fileTxt = nested.resolve("file1somethingelse.txt");
+        
+        Files.createFile(filePng);
+        Files.createFile(fileTxt); 
+        
+        DataBundles.deleteAllExtensions(file1);
+        
+        assertFalse(Files.exists(file1));
+        assertFalse(Files.exists(nested));
+        assertFalse(Files.exists(file1Dir));
+        assertFalse(Files.exists(filePng));
+        assertFalse(Files.exists(fileTxt));
+    }
+
+	
+	@Test
+	public void createList() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path list = DataBundles.getPort(inputs, "in1");
+		DataBundles.createList(list);
+		assertTrue(Files.isDirectory(list));
+	}
+	
+	@Test
+	public void getError() throws Exception {	
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		DataBundles.setError(portIn1, "Something did not work", "A very\n long\n error\n trace");		
+		
+		ErrorDocument error = DataBundles.getError(portIn1);
+		assertTrue(error.getCausedBy().isEmpty());
+		
+		assertEquals("Something did not work", error.getMessage());
+		// Notice that the lack of trailing \n is preserved 
+		assertEquals("A very\n long\n error\n trace", error.getTrace());	
+		
+		assertEquals(null, DataBundles.getError(null));
+	}
+
+	@Test
+	public void getErrorCause() throws Exception {		
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		Path cause1 = DataBundles.setError(portIn1, "Something did not work", "A very\n long\n error\n trace");
+		Path portIn2 = DataBundles.getPort(inputs, "in2");
+		Path cause2 = DataBundles.setError(portIn2, "Something else did not work", "Shorter trace");
+		
+		
+		Path outputs = DataBundles.getOutputs(dataBundle);
+		Path portOut1 = DataBundles.getPort(outputs, "out1");
+		DataBundles.setError(portOut1, "Errors in input", "", cause1, cause2);
+
+		ErrorDocument error = DataBundles.getError(portOut1);
+		assertEquals("Errors in input", error.getMessage());
+		assertEquals("", error.getTrace());
+		assertEquals(2, error.getCausedBy().size());
+		
+		assertTrue(Files.isSameFile(cause1, error.getCausedBy().get(0)));
+		assertTrue(Files.isSameFile(cause2, error.getCausedBy().get(1)));
+	}
+
+	@Test
+	public void getInputs() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		assertTrue(Files.isDirectory(inputs));
+		// Second time should not fail because it already exists
+		inputs = DataBundles.getInputs(dataBundle);
+		assertTrue(Files.isDirectory(inputs));
+		assertEquals(dataBundle.getRoot(), inputs.getParent());
+	}
+
+	@Test
+	public void getList() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path list = DataBundles.getPort(inputs, "in1");
+		DataBundles.createList(list);
+		for (int i = 0; i < 5; i++) {
+			Path item = DataBundles.newListItem(list);
+			DataBundles.setStringValue(item, "test" + i);
+		}
+		List<Path> paths = DataBundles.getList(list);
+		assertEquals(5, paths.size());
+		assertEquals("test0", DataBundles.getStringValue(paths.get(0)));
+		assertEquals("test4", DataBundles.getStringValue(paths.get(4)));
+		
+		assertEquals(null, DataBundles.getList(null));
+	}
+
+	@Test
+	public void getListItem() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path list = DataBundles.getPort(inputs, "in1");
+		DataBundles.createList(list);
+		for (int i = 0; i < 5; i++) {
+			Path item = DataBundles.newListItem(list);
+			DataBundles.setStringValue(item, "item " + i);
+		}
+		// set at next available position
+		Path item5 = DataBundles.getListItem(list, 5);
+		assertTrue(item5.getFileName().toString().contains("5"));
+		DataBundles.setStringValue(item5, "item 5");
+	
+		
+		// set somewhere later
+		Path item8 = DataBundles.getListItem(list, 8);
+		assertTrue(item8.getFileName().toString().contains("8"));
+		DataBundles.setStringValue(item8, "item 8");
+		
+		Path item7 = DataBundles.getListItem(list, 7);
+		assertFalse(Files.exists(item7));
+		assertFalse(DataBundles.isList(item7));
+		assertFalse(DataBundles.isError(item7));
+		assertFalse(DataBundles.isValue(item7));
+		// TODO: Is it really missing? item1337 is also missing..
+		assertTrue(DataBundles.isMissing(item7));
+		
+		
+		// overwrite #2
+		Path item2 = DataBundles.getListItem(list, 2);		
+		DataBundles.setStringValue(item2, "replaced");
+		
+		
+		List<Path> listItems = DataBundles.getList(list);
+		assertEquals(9, listItems.size());
+		assertEquals("item 0", DataBundles.getStringValue(listItems.get(0)));
+		assertEquals("item 1", DataBundles.getStringValue(listItems.get(1)));
+		assertEquals("replaced", DataBundles.getStringValue(listItems.get(2)));
+		assertEquals("item 3", DataBundles.getStringValue(listItems.get(3)));
+		assertEquals("item 4", DataBundles.getStringValue(listItems.get(4)));
+		assertEquals("item 5", DataBundles.getStringValue(listItems.get(5)));
+		assertNull(listItems.get(6));
+		assertNull(listItems.get(7));
+		assertEquals("item 8", DataBundles.getStringValue(listItems.get(8)));
+		
+	}
+
+    @Test
+    public void getListSize() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path list = DataBundles.getPort(inputs, "in1");
+        DataBundles.createList(list);
+        for (int i = 0; i < 5; i++) {
+            Path item = DataBundles.newListItem(list);
+            DataBundles.setStringValue(item, "item " + i);
+        }
+        assertEquals(5, DataBundles.getListSize(list));
+
+        // set at next available position
+        Path item5 = DataBundles.getListItem(list, 5);
+        assertTrue(item5.getFileName().toString().contains("5"));
+        DataBundles.setStringValue(item5, "item 5");
+        assertEquals(6, DataBundles.getListSize(list));
+
+        // set somewhere beyond the end
+        Path item8 = DataBundles.getListItem(list, 8);
+        assertTrue(item8.getFileName().toString().contains("8"));
+        DataBundles.setStringValue(item8, "item 8");
+        assertEquals(9, DataBundles.getListSize(list));
+        
+        // Evil test - very high number
+        long highNumber = 3l * Integer.MAX_VALUE;
+        Path itemHigh = DataBundles.getListItem(list, highNumber);
+        assertTrue(itemHigh.getFileName().toString().contains(Long.toString(highNumber)));
+        DataBundles.setStringValue(itemHigh, "item 6442450941");
+        assertEquals(highNumber+1l, DataBundles.getListSize(list));
+    }
+	
+	@Test
+    public void getListItemChecksExtension() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path portIn1 = DataBundles.getPort(inputs, "in1");
+        Path list = DataBundles.newListItem(portIn1);
+        
+        Path item = DataBundles.newListItem(list);
+        
+        Path ref = DataBundles.setReference(item, URI.create("http://example.com/"));
+        Path itemAgain = DataBundles.getListItem(list, 0);
+        assertEquals(ref, itemAgain);
+        assertFalse(itemAgain.equals(portIn1));
+        assertTrue(Files.exists(itemAgain));
+    }
+
+	@Test
+	public void getOutputs() throws Exception {
+		Path outputs = DataBundles.getOutputs(dataBundle);
+		assertTrue(Files.isDirectory(outputs));
+		// Second time should not fail because it already exists
+		outputs = DataBundles.getOutputs(dataBundle);
+		assertTrue(Files.isDirectory(outputs));
+		assertEquals(dataBundle.getRoot(), outputs.getParent());
+	}
+	
+	@Test
+	public void getPort() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		assertFalse(Files.exists(portIn1));
+		assertEquals(inputs, portIn1.getParent());
+	}
+
+	@Test
+    public void getPortChecksExtension() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path portIn1 = DataBundles.getPort(inputs, "in1");
+        assertFalse(Files.exists(portIn1));
+        Path ref = DataBundles.setReference(portIn1, URI.create("http://example.com/"));
+        Path portIn1Again = DataBundles.getPort(inputs, "in1");
+        assertEquals(ref, portIn1Again);
+        assertFalse(portIn1Again.equals(portIn1));
+        assertTrue(Files.exists(portIn1Again));
+    }
+
+	@Test
+	public void getPorts() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		DataBundles.createList(DataBundles.getPort(inputs, "in1"));
+		DataBundles.createList(DataBundles.getPort(inputs, "in2"));
+		DataBundles.setStringValue(DataBundles.getPort(inputs, "value"),
+				"A value");
+		Map<String, Path> ports = DataBundles.getPorts(DataBundles
+				.getInputs(dataBundle));
+		assertEquals(3, ports.size());
+//		System.out.println(ports);
+		assertTrue(ports.containsKey("in1"));
+		assertTrue(ports.containsKey("in2"));
+		assertTrue(ports.containsKey("value"));
+
+		assertEquals("A value", DataBundles.getStringValue(ports.get("value")));
+
+	}
+
+	@Test
+	public void hasInputs() throws Exception {
+		assertFalse(DataBundles.hasInputs(dataBundle));
+		DataBundles.getInputs(dataBundle); // create on demand
+		assertTrue(DataBundles.hasInputs(dataBundle));
+	}
+
+	@Test
+	public void hasOutputs() throws Exception {
+		assertFalse(DataBundles.hasOutputs(dataBundle));
+		DataBundles.getInputs(dataBundle); // independent
+		assertFalse(DataBundles.hasOutputs(dataBundle));
+		DataBundles.getOutputs(dataBundle); // create on demand
+		assertTrue(DataBundles.hasOutputs(dataBundle));
+	}
+
+	@Test
+	public void isError() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		DataBundles.setError(portIn1, "Something did not work", "A very\n long\n error\n trace");		
+		
+		assertFalse(DataBundles.isList(portIn1));		
+		assertFalse(DataBundles.isValue(portIn1));
+		assertFalse(DataBundles.isMissing(portIn1));
+		assertFalse(DataBundles.isReference(portIn1));
+		assertTrue(DataBundles.isError(portIn1));		
+	}
+
+	@Test
+	public void isList() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path list = DataBundles.getPort(inputs, "in1");
+		DataBundles.createList(list);
+		assertTrue(DataBundles.isList(list));
+		assertFalse(DataBundles.isValue(list));
+		assertFalse(DataBundles.isError(list));
+		assertFalse(DataBundles.isReference(list));
+		assertFalse(DataBundles.isMissing(list));
+	}
+	
+	@Test
+	public void isMissing() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		
+		assertFalse(DataBundles.isList(portIn1));		
+		assertFalse(DataBundles.isValue(portIn1));
+		assertFalse(DataBundles.isError(portIn1));
+		assertTrue(DataBundles.isMissing(portIn1));
+		assertFalse(DataBundles.isReference(portIn1));
+	}
+
+	@Test
+    public void isValueOnError() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        DataBundles.setError(DataBundles.getPort(inputs, "test"),
+                "error", "");
+        assertFalse(DataBundles.isValue(DataBundles.getPorts(inputs).get("test")));
+    }
+	
+	@Test
+    public void isValueOnReference() throws Exception {
+	    Path inputs = DataBundles.getInputs(dataBundle);
+	    DataBundles.setReference(DataBundles.getPort(inputs, "test"), URI.create("http://www.example.com/"));
+	    assertFalse(DataBundles.isValue(DataBundles.getPorts(inputs).get("test")));
+    }
+	
+	@Test
+	public void listOfLists() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path list = DataBundles.getPort(inputs, "in1");
+		DataBundles.createList(list);
+		Path sublist0 = DataBundles.newListItem(list);
+		DataBundles.createList(sublist0);
+		
+		Path sublist1 = DataBundles.newListItem(list);
+		DataBundles.createList(sublist1);
+		
+		assertEquals(Arrays.asList("0/", "1/"), ls(list));
+		
+		DataBundles.setStringValue(DataBundles.newListItem(sublist1), 
+				"Hello");
+		
+		assertEquals(Arrays.asList("0"), ls(sublist1));
+		
+		assertEquals("Hello",DataBundles.getStringValue( 
+				DataBundles.getListItem(DataBundles.getListItem(list, 1), 0)));
+	}
+
+	
+	
+	protected List<String> ls(Path path) throws IOException {
+		List<String> paths = new ArrayList<>();
+		try (DirectoryStream<Path> ds = Files.newDirectoryStream(path)) {
+			for (Path p : ds) {
+				paths.add(p.getFileName() + "");
+			}
+		}
+		Collections.sort(paths);
+		return paths;
+	}
+	
+	@Test(expected=FileAlreadyExistsException.class)
+    public void newListAlreadyExistsAsError() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path list = DataBundles.getPort(inputs, "in1");
+        Path err = DataBundles.setError(list, "a", "b");
+        assertFalse(Files.isRegularFile(list));
+        assertFalse(Files.isDirectory(list));
+        assertTrue(Files.isRegularFile(err));                
+        DataBundles.createList(list);
+    }
+	
+	@Test(expected=FileAlreadyExistsException.class)
+    public void newListAlreadyExistsAsFile() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path list = DataBundles.getPort(inputs, "in1");
+        DataBundles.setStringValue(list, "A string");
+        assertTrue(Files.isRegularFile(list));
+        assertFalse(Files.isDirectory(list));
+        DataBundles.createList(list);
+    }
+	
+
+    @Test(expected=FileAlreadyExistsException.class)
+    public void newListAlreadyExistsAsReference() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path list = DataBundles.getPort(inputs, "in1");
+        Path ref = DataBundles.setReference(list, URI.create("http://example.com/"));
+        assertFalse(Files.isRegularFile(list));
+        assertFalse(Files.isDirectory(list));
+        assertTrue(Files.isRegularFile(ref));                
+        DataBundles.createList(list);
+    }
+    
+    @Test
+	public void newListItem() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path list = DataBundles.getPort(inputs, "in1");
+		DataBundles.createList(list);
+		Path item0 = DataBundles.newListItem(list);
+		assertEquals(list, item0.getParent());
+		assertTrue(item0.getFileName().toString().contains("0"));
+		assertFalse(Files.exists(item0));
+		DataBundles.setStringValue(item0, "test");
+
+		Path item1 = DataBundles.newListItem(list);
+		assertTrue(item1.getFileName().toString().contains("1"));
+		// Because we've not actually created item1 yet
+		assertEquals(item1, DataBundles.newListItem(list));
+		DataBundles.setStringValue(item1, "test");
+
+		// Check that DataBundles.newListItem can deal with gaps
+		Files.delete(item0);
+		Path item2 = DataBundles.newListItem(list);
+		assertTrue(item2.getFileName().toString().contains("2"));
+
+		// Check that non-numbers don't interfere
+		Path nonumber = list.resolve("nonumber");
+		Files.createFile(nonumber);
+		item2 = DataBundles.newListItem(list);
+		assertTrue(item2.getFileName().toString().contains("2"));
+
+		// Check that extension is stripped
+		Path five = list.resolve("5.txt");
+		Files.createFile(five);
+		Path item6 = DataBundles.newListItem(list);
+		assertTrue(item6.getFileName().toString().contains("6"));
+	}
+    
+    @Test
+	public void setErrorArgs() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		Path errorPath = DataBundles.setError(portIn1, "Something did not work", "A very\n long\n error\n trace");		
+		assertEquals("in1.err", errorPath.getFileName().toString());
+
+		List<String> errLines = Files.readAllLines(errorPath, Charset.forName("UTF-8"));
+		assertEquals(6, errLines.size());
+		assertEquals("", errLines.get(0));
+		assertEquals("Something did not work", errLines.get(1));
+		assertEquals("A very", errLines.get(2));
+		assertEquals(" long", errLines.get(3));
+		assertEquals(" error", errLines.get(4));
+		assertEquals(" trace", errLines.get(5));
+	}
+
+    @Test
+	public void setErrorCause() throws Exception {		
+		Path inputs = DataBundles.getInputs(dataBundle);
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		Path cause1 = DataBundles.setError(portIn1, "Something did not work", "A very\n long\n error\n trace");
+		Path portIn2 = DataBundles.getPort(inputs, "in2");
+		Path cause2 = DataBundles.setError(portIn2, "Something else did not work", "Shorter trace");
+		
+		
+		Path outputs = DataBundles.getOutputs(dataBundle);
+		Path portOut1 = DataBundles.getPort(outputs, "out1");
+		Path errorPath = DataBundles.setError(portOut1, "Errors in input", "", cause1, cause2);
+		
+		List<String> errLines = Files.readAllLines(errorPath, Charset.forName("UTF-8"));
+		assertEquals("../inputs/in1.err", errLines.get(0));
+		assertEquals("../inputs/in2.err", errLines.get(1));
+		assertEquals("", errLines.get(2));
+	}
+
+    @Test
+    public void setErrorExistsAsError() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        Path err = DataBundles.setError(in1, "a", "b");
+        assertFalse(Files.exists(in1));
+        assertTrue(Files.isRegularFile(err));
+        DataBundles.setError(in1, "c", "d");
+        assertEquals("c", DataBundles.getError(in1).getMessage());
+    }
+
+    @Test(expected=FileAlreadyExistsException.class)
+    public void setErrorExistsAsList() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path list = DataBundles.getPort(inputs, "in1");
+        DataBundles.createList(list);
+        assertFalse(Files.isRegularFile(list));
+        assertTrue(Files.isDirectory(list));
+        DataBundles.setError(list, "a", "b");
+    }
+
+	@Test(expected=FileAlreadyExistsException.class)
+    public void setErrorExistsAsReference() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        Path ref = DataBundles.setReference(in1, URI.create("http://example.com/"));
+        assertFalse(Files.exists(in1));
+        assertTrue(Files.isRegularFile(ref));
+        DataBundles.setError(in1, "a", "b");
+    }
+	
+    @Test(expected=FileAlreadyExistsException.class)
+    public void setErrorExistsAsValue() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        DataBundles.setStringValue(in1, "test");
+        assertTrue(Files.isRegularFile(in1));
+        DataBundles.setError(in1, "a", "b");
+    }
+	
+	@Test
+	public void setErrorObj() throws Exception {
+		Path inputs = DataBundles.getInputs(dataBundle);
+
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+		Path cause1 = DataBundles.setError(portIn1, "a", "b");
+		Path portIn2 = DataBundles.getPort(inputs, "in2");
+		Path cause2 = DataBundles.setError(portIn2, "c", "d");
+		
+		
+		Path outputs = DataBundles.getOutputs(dataBundle);
+		Path portOut1 = DataBundles.getPort(outputs, "out1");
+
+		ErrorDocument error = new ErrorDocument();
+		error.getCausedBy().add(cause1);
+		error.getCausedBy().add(cause2);
+		
+		error.setMessage("Something did not work");
+		error.setTrace("Here\nis\nwhy\n");
+		
+		Path errorPath = DataBundles.setError(portOut1, error);		
+		assertEquals("out1.err", errorPath.getFileName().toString());
+
+		List<String> errLines = Files.readAllLines(errorPath, Charset.forName("UTF-8"));
+		assertEquals(8, errLines.size());
+		assertEquals("../inputs/in1.err", errLines.get(0));
+		assertEquals("../inputs/in2.err", errLines.get(1));
+		assertEquals("", errLines.get(2));
+		assertEquals("Something did not work", errLines.get(3));
+		assertEquals("Here", errLines.get(4));
+		assertEquals("is", errLines.get(5));
+		assertEquals("why", errLines.get(6));
+		assertEquals("", errLines.get(7));
+	}
+	
+    @Test(expected = FileAlreadyExistsException.class)
+    public void setReferenceExistsAsError() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        Path err = DataBundles.setError(in1, "a", "b");
+        assertFalse(Files.exists(in1));
+        assertTrue(Files.isRegularFile(err));
+        DataBundles.setReference(in1, URI.create("http://example.com/"));
+    }
+	
+    @Test(expected = FileAlreadyExistsException.class)
+    public void setReferenceExistsAsList() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        DataBundles.createList(in1);
+        assertTrue(Files.isDirectory(in1));
+        DataBundles.setReference(in1, URI.create("http://example.com/"));
+    }
+
+    @Test
+    public void setReferenceExistsAsReference() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        Path ref = DataBundles.setReference(in1, URI.create("http://example.com/"));
+        assertFalse(Files.exists(in1));
+        assertTrue(Files.isRegularFile(ref));
+        DataBundles.setReference(in1, URI.create("http://example.com/"));
+    }
+    
+
+    @Test(expected = FileAlreadyExistsException.class)
+    public void setReferenceExistsAsValue() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        DataBundles.setStringValue(in1, "Hello");
+        assertTrue(Files.isRegularFile(in1));
+        DataBundles.setReference(in1, URI.create("http://example.com/"));
+    }
+    
+    @Test(expected=FileAlreadyExistsException.class)
+    public void setStringExistsAsError() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        Path err = DataBundles.setError(in1, "x", "X");
+        assertFalse(Files.exists(in1));
+        assertTrue(Files.isRegularFile(err));
+        DataBundles.setStringValue(in1, "Hello");
+    }
+
+    
+    @Test(expected=FileAlreadyExistsException.class)
+    public void setStringExistsAsList() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        DataBundles.createList(in1);
+        assertTrue(Files.isDirectory(in1));
+        DataBundles.setStringValue(in1, "Hello");
+    }
+    
+    
+
+    @Test(expected=FileAlreadyExistsException.class)
+    public void setStringExistsAsReference() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        Path ref = DataBundles.setReference(in1, URI.create("http://example.com/"));
+        assertFalse(Files.exists(in1));
+        assertTrue(Files.isRegularFile(ref));
+        DataBundles.setStringValue(in1, "Hello");
+    }
+
+    @Test
+    public void setStringExistsAsString() throws Exception {
+        Path inputs = DataBundles.getInputs(dataBundle);
+        Path in1 = DataBundles.getPort(inputs, "in1");
+        DataBundles.setStringValue(in1, "A");
+        assertTrue(Files.isRegularFile(in1));
+        DataBundles.setStringValue(in1, "B");
+        assertEquals("B", DataBundles.getStringValue(in1));
+    }
+
+    @Test
+    public void getIntermediates() throws Exception {
+        Path intermediates = DataBundles.getIntermediates(dataBundle);
+        assertEquals("/intermediates", intermediates.toString());
+        assertTrue(Files.isDirectory(intermediates));
+    }
+
+    
+    @Test(expected=FileAlreadyExistsException.class)
+    public void getIntermediatesFails() throws Exception {
+        Path intermediates = DataBundles.getIntermediates(dataBundle);
+        Files.delete(intermediates);
+        Files.createFile(intermediates);
+        DataBundles.getIntermediates(dataBundle);
+    }
+    
+    @Test
+    public void getIntermediate() throws Exception {
+        UUID uuid = UUID.randomUUID();
+        Path inter = DataBundles.getIntermediate(dataBundle, uuid);
+        assertFalse(Files.exists(inter));
+        DataBundles.setStringValue(inter, "intermediate");
+        Path parent = inter.getParent();
+        assertEquals(dataBundle.getRoot().resolve("intermediates"), parent.getParent());
+        String parentName = parent.getFileName().toString();
+        assertEquals(2, parentName.length());
+        assertTrue(uuid.toString().startsWith(parentName));
+        // Filename is a valid string
+        String interFileName = inter.getFileName().toString();
+        assertTrue(interFileName.startsWith(parentName));
+        assertEquals(uuid, UUID.fromString(interFileName));
+    }
+    
+    @Test
+    public void getWorkflow() throws Exception {
+        Path wf = DataBundles.getWorkflow(dataBundle);
+        assertEquals("/workflow", wf.toString());
+    }
+
+    @Test
+    public void setWorkflowBundle() throws Exception {
+        WorkflowBundleIO wfBundleIO = new WorkflowBundleIO();
+        WorkflowBundle wfBundle = wfBundleIO.createBundle();
+        DataBundles.setWorkflowBundle(dataBundle, wfBundle);
+        
+        Path wf = DataBundles.getWorkflow(dataBundle);
+        assertEquals("/workflow.wfbundle", wf.toString());        
+        assertEquals("application/vnd.taverna.scufl2.workflow-bundle", 
+                Files.probeContentType(wf));
+    }
+
+    @Ignore
+    @Test
+    public void getWorkflowBundle() throws Exception {
+        WorkflowBundleIO wfBundleIO = new WorkflowBundleIO();
+        WorkflowBundle wfBundle = wfBundleIO.createBundle();
+        
+        String name = wfBundle.getName();
+        String wfName = wfBundle.getMainWorkflow().getName();
+        URI id = wfBundle.getIdentifier();
+        
+        DataBundles.setWorkflowBundle(dataBundle, wfBundle);
+
+        // Reload the bundle
+        wfBundle = DataBundles.getWorkflowBundle(dataBundle);        
+        assertEquals(name, wfBundle.getName());
+        assertEquals(wfName, wfBundle.getMainWorkflow().getName());        
+        assertEquals(id, wfBundle.getIdentifier());        
+    }
+
+    @Test
+    public void getWorkflowReport() throws Exception {
+        Path runReport = DataBundles.getWorkflowRunReport(dataBundle);
+        assertEquals("/workflowrun.json", runReport.toString());
+    }
+    
+    @Test
+    public void getWorkflowReportAsJson() throws Exception {        
+        Path runReport = DataBundles.getWorkflowRunReport(dataBundle);
+        DataBundles.setStringValue(runReport, "{ \"valid\": \"not really\", \"number\": 1337 }");
+        JsonNode json = DataBundles.getWorkflowRunReportAsJson(dataBundle);
+        assertEquals("not really", json.path("valid").asText());
+        assertEquals(1337, json.path("number").asInt());
+    }
+    
+    @Test
+    public void setWorkflowReport() throws Exception {
+        ObjectNode report = JsonNodeFactory.instance.objectNode();
+        report.put("number", 1337);
+        DataBundles.setWorkflowRunReport(dataBundle, report);
+        Path runReport = DataBundles.getWorkflowRunReport(dataBundle);
+        String json = DataBundles.getStringValue(runReport);
+        assertTrue(json.contains("number"));
+        assertTrue(json.contains("1337"));
+    }
+    
+
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestExample.java
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestExample.java b/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestExample.java
new file mode 100644
index 0000000..f300b8b
--- /dev/null
+++ b/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestExample.java
@@ -0,0 +1,174 @@
+package org.apache.taverna.databundle;
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.awt.Desktop;
+import java.io.OutputStream;
+import java.net.URI;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
+import java.util.List;
+import java.util.NavigableMap;
+
+import org.apache.taverna.databundle.DataBundles;
+import org.apache.taverna.databundle.ErrorDocument;
+import org.apache.taverna.robundle.Bundle;
+import org.junit.Test;
+
+public class TestExample {
+	@Test
+	public void example() throws Exception {
+		// Create a new (temporary) data bundle
+		Bundle dataBundle = DataBundles.createBundle();
+
+		// Get the inputs
+		Path inputs = DataBundles.getInputs(dataBundle);
+
+		// Get an input port:
+		Path portIn1 = DataBundles.getPort(inputs, "in1");
+
+		// Setting a string value for the input port:
+		DataBundles.setStringValue(portIn1, "Hello");
+
+		// And retrieving it
+		if (DataBundles.isValue(portIn1)) {
+			System.out.println(DataBundles.getStringValue(portIn1));
+		}
+
+		// Or just use the regular Files methods:
+		for (String line : Files
+				.readAllLines(portIn1, Charset.forName("UTF-8"))) {
+			System.out.println(line);
+		}
+
+		// Binaries and large files are done through the Files API
+		try (OutputStream out = Files.newOutputStream(portIn1,
+				StandardOpenOption.APPEND)) {
+			out.write(32);
+		}
+		// Or Java 7 style
+		Path localFile = Files.createTempFile("", ".txt");
+		Files.copy(portIn1, localFile, StandardCopyOption.REPLACE_EXISTING);
+		System.out.println("Written to: " + localFile);
+
+		// Either way works, of course
+		Path outputs = DataBundles.getOutputs(dataBundle);
+		Files.copy(localFile,
+				DataBundles.getPort(outputs, "out1"));
+
+
+		// When you get a port, it can become either a value or a list
+		Path port2 = DataBundles.getPort(inputs, "port2");
+		DataBundles.createList(port2); // empty list		
+		if (DataBundles.isList(port2)) {
+			List<Path> list = DataBundles.getList(port2);
+			assertTrue(list.isEmpty());
+		}
+
+		// Adding items sequentially
+		Path item0 = DataBundles.newListItem(port2);
+		DataBundles.setStringValue(item0, "item 0");
+		DataBundles.setStringValue(DataBundles.newListItem(port2), "item 1");
+		DataBundles.setStringValue(DataBundles.newListItem(port2), "item 2");
+		
+		
+		// Set and get by explicit position:
+		DataBundles.setStringValue(DataBundles.getListItem(port2, 12), "item 12");
+		System.out.println(DataBundles.getStringValue(DataBundles.getListItem(port2, 2)));
+		
+		// The list is sorted numerically (e.g. 2, 5, 10) and
+		// will contain nulls for empty slots
+		System.out.println(DataBundles.getList(port2));
+
+		// Ports can be browsed as a map by port name
+		NavigableMap<String, Path> ports = DataBundles.getPorts(inputs);
+		System.out.println(ports.keySet());
+
+		// Is there anything known about a port?
+		if (! DataBundles.isMissing(DataBundles.getPort(outputs, "out3"))) {
+			// DataBundles.getPorts(outputs).containsKey("out3")
+			
+		}
+		
+		// Representing errors		
+		Path out2 = DataBundles.getPort(outputs, "out2");		
+		DataBundles.setError(out2, "Something did not work", "A very\n long\n error\n trace");		
+
+		// Retrieving errors
+		if (DataBundles.isError(out2)) {
+			ErrorDocument error = DataBundles.getError(out2);
+			System.out.println("Error: " + error.getMessage());
+		}
+		
+		// Representing references
+		URI ref = URI.create("http://example.com/external.txt");
+		Path out3 = DataBundles.getPort(outputs, "out3");
+		System.out.println(DataBundles.setReference(out3, ref));
+		if (DataBundles.isReference(out3)) {
+			URI resolved = DataBundles.getReference(out3);
+			System.out.println(resolved);
+		}
+
+		
+		
+		
+		// Saving a data bundle:
+		Path zip = Files.createTempFile("databundle", ".zip");
+		DataBundles.closeAndSaveBundle(dataBundle, zip);
+		// NOTE: From now dataBundle and its Path's are CLOSED 
+		// and can no longer be accessed
+		
+		
+		System.out.println("Saved to " + zip);
+		if (Desktop.isDesktopSupported()) {
+			// Open ZIP file for browsing
+			Desktop.getDesktop().open(zip.toFile());
+		}
+		
+		// Loading a data bundle back from disk
+		try (Bundle dataBundle2 = DataBundles.openBundle(zip)) {
+			assertEquals(zip, dataBundle2.getSource());
+			Path loadedInputs = DataBundles.getInputs(dataBundle2);
+			
+			for (Path port : DataBundles.getPorts(loadedInputs).values()) {
+				if (DataBundles.isValue(port)) {
+					System.out.print("Value " + port + ": ");
+					System.out.println(DataBundles.getStringValue(port));
+				} else if (DataBundles.isList(port)) {
+					System.out.print("List " + port + ": ");
+					for (Path item : DataBundles.getList(port)) {
+						// We'll assume depth 1 here
+						System.out.print(DataBundles.getStringValue(item));
+						System.out.print(", ");
+					}
+					System.out.println();
+				}				
+			}			
+		}				
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestFullExample.java
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestFullExample.java b/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestFullExample.java
new file mode 100644
index 0000000..ca6e1e1
--- /dev/null
+++ b/taverna-databundle/src/test/java/org/apache/taverna/databundle/TestFullExample.java
@@ -0,0 +1,163 @@
+package org.apache.taverna.databundle;
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.taverna.databundle.DataBundles;
+import org.apache.taverna.robundle.Bundle;
+import org.apache.taverna.robundle.manifest.Manifest;
+import org.apache.taverna.scufl2.api.container.WorkflowBundle;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.io.WorkflowBundleIO;
+import org.junit.Test;
+
+
+public class TestFullExample {
+
+    private static String RUN = "/full-example/ebi-wfrun-2013-05-31/";
+
+    private static WorkflowBundleIO wfBundleIO = new WorkflowBundleIO();
+
+    @Test
+    public void writeExample() throws Exception {
+        // Create a new (temporary) data bundle
+        Bundle dataBundle = DataBundles.createBundle();
+
+        // The run as currently saved to a folder by prov-taverna 1.10
+        URL runResource = getClass().getResource(RUN);
+        Path runPath = Paths.get(runResource.toURI());
+
+        assertTrue(Files.isDirectory(runPath));
+
+        // In order to preserve existing file extensions we copy as files
+        // rather than using the higher-level methods like
+        // DataBundles.setStringValue()
+
+        // Inputs
+        Path inputs = DataBundles.getInputs(dataBundle);
+        for (String filename : Arrays.asList("email.txt", "sequence.txt")) {
+            Files.copy(runPath.resolve(filename), inputs.resolve(filename));
+        }
+
+        // Outputs
+        Path outputs = DataBundles.getOutputs(dataBundle);
+        for (String filename : Arrays.asList("getResult_3_output_output.xml",
+                "getResult_output_output.octet-stream", "Graphical_output.png",
+                "Workflow16_getStatus_output_status.txt")) {
+            Files.copy(runPath.resolve(filename), outputs.resolve(filename));
+        }
+
+        // Provenance
+        Files.copy(runPath.resolve("workflowrun.prov.ttl"),
+                DataBundles.getWorkflowRunProvenance(dataBundle));
+
+        // Workflow
+        WorkflowBundle wfBundle = wfBundleIO.readBundle(
+                runPath.resolveSibling(
+                        "ebi_interproscan_newservices_900329.t2flow").toFile(),
+                null);
+        DataBundles.setWorkflowBundle(dataBundle, wfBundle);
+
+        // Intermediate values
+        DataBundles.copyRecursively(runPath.resolve("intermediates"),
+                DataBundles.getIntermediates(dataBundle),
+                StandardCopyOption.REPLACE_EXISTING);
+
+        // Generate Manifest
+        // TODO: This should be done automatically on close/save
+        Manifest manifest = new Manifest(dataBundle);
+        manifest.populateFromBundle();
+        manifest.writeAsJsonLD();
+
+        // Saving a data bundle:
+        Path zip = Files.createTempFile("databundle", ".zip");
+        DataBundles.closeAndSaveBundle(dataBundle, zip);
+        // NOTE: From now dataBundle and its Path's are CLOSED
+        // and can no longer be accessed
+
+        //System.out.println("Saved to " + zip);
+
+        // Loading a data bundle back from disk
+        try (Bundle dataBundle2 = DataBundles.openBundle(zip)) {
+            assertEquals(zip, dataBundle2.getSource());
+
+			List<String> s = new ArrayList<>(DataBundles.getPorts(
+					DataBundles.getInputs(dataBundle2)).keySet());
+			Collections.sort(s);
+			assertEquals("[email, sequence]", s.toString());
+			assertEquals(
+					"soiland-reyes@cs.manchester.ac.uk",
+					DataBundles.getStringValue(DataBundles.getPort(
+							DataBundles.getInputs(dataBundle2), "email")));
+			s = new ArrayList<>(DataBundles.getPorts(
+					DataBundles.getOutputs(dataBundle2)).keySet());
+			Collections.sort(s);
+			assertEquals(
+					"[Graphical_output, Workflow16_getStatus_output_status, "
+					+ "getResult_3_output_output, getResult_output_output]",
+					s.toString());
+			assertEquals("FINISHED", DataBundles.getStringValue(DataBundles
+					.getPort(DataBundles.getOutputs(dataBundle2),
+							"Workflow16_getStatus_output_status")));
+            
+            UUID uuid = UUID.fromString("1f536bcf-ba43-44ec-a983-b30a45f2b739");
+            Path intermediate = DataBundles.getIntermediate(dataBundle2, uuid); 
+            String intermediateStr = DataBundles.getStringValue(intermediate);
+            assertTrue(intermediateStr.contains("<status>RUNNING</status>"));
+            
+            Path prov = DataBundles.getWorkflowRunProvenance(dataBundle2);
+            List<String> provLines = Files.readAllLines(prov, Charset.forName("UTF8"));
+            assertEquals("	prov:startedAtTime \"2013-05-31T11:23:10.463+01:00\"^^xsd:dateTime ;",
+            		provLines.get(15));
+            
+            WorkflowBundle wfb = DataBundles.getWorkflowBundle(dataBundle2);
+            assertEquals("EBI_InterproScan_NewServices", wfb.getName());
+            s=new ArrayList<>();
+            for (Workflow w : wfb.getWorkflows()) {
+                for (Processor p : w.getProcessors()) {
+                	s.add(p.getName());
+                }
+            }
+            Collections.sort(s);
+            assertEquals("[Status, getResult, getResult_graphic, getResult_graphic_input, "
+            		+ "getResult_graphic_output, getResult_input, getResult_output, getResult_xml, "
+            		+ "getResult_xml_input, getResult_xml_output, getStatus, getStatus_input, "
+            		+ "getStatus_output, run, run_input, run_input_2, run_output, text, visual_png, "
+            		+ "xml]", s.toString());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Graphical_output.png
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Graphical_output.png b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Graphical_output.png
new file mode 100644
index 0000000..39a1065
Binary files /dev/null and b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Graphical_output.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Workflow16_getStatus_output_status.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Workflow16_getStatus_output_status.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Workflow16_getStatus_output_status.txt
new file mode 100644
index 0000000..067b935
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/Workflow16_getStatus_output_status.txt
@@ -0,0 +1 @@
+FINISHED
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/email.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/email.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/email.txt
new file mode 100644
index 0000000..9fa7ae4
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/email.txt
@@ -0,0 +1 @@
+soiland-reyes@cs.manchester.ac.uk
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_3_output_output.xml
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_3_output_output.xml b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_3_output_output.xml
new file mode 100644
index 0000000..7c0d400
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_3_output_output.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<EBIInterProScanResults xmlns="http://www.ebi.ac.uk/Tools/common/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.ebi.ac.uk/Tools/common/schema/InterProScanResult.xsd">
+	<Header>
+		<program name="InterProScan" version="4.8" citation="PMID:11590104"/>
+		<parameters>
+			<sequences total="1"/>
+			<databases total="16">
+				<database number="1" name="PRODOM" type="sequences"/>
+				<database number="2" name="COIL" type="matrix"/>
+				<database number="3" name="PRINTS" type="matrix"/>
+				<database number="4" name="GENE3D" type="model"/>
+				<database number="5" name="HAMAP" type="strings"/>
+				<database number="6" name="PANTHER" type="model"/>
+				<database number="7" name="PFAM" type="model"/>
+				<database number="8" name="PIR" type="model"/>
+				<database number="9" name="SMART" type="model"/>
+				<database number="10" name="TIGRFAMs" type="model"/>
+				<database number="11" name="PROSITE" type="strings"/>
+				<database number="12" name="PROFILE" type="strings"/>
+				<database number="13" name="SEG" type="NA"/>
+				<database number="14" name="SIGNALP" type="model"/>
+				<database number="15" name="SUPERFAMILY" type="model"/>
+				<database number="16" name="TMHMM" type="model"/>
+			</databases>
+		</parameters>
+	</Header>
+<interpro_matches>
+
+   <protein id="TMM43_HUMAN" length="400" crc64="70FDDD4ED1AA11DF">
+	<interpro id="IPR012430" name="Transmembrane protein 43 family" type="Family">
+	  <match id="PTHR13416" name="UNCHARACTERIZED" dbname="PANTHER">
+	    <location start="1" end="400" score="2.8e-209" status="T" evidence="HMMPanther"/>
+	  </match>
+	  <match id="PF07787" name="DUF1625" dbname="PFAM">
+	    <location start="121" end="373" score="5.2e-82" status="T" evidence="HMMPfam"/>
+	  </match>
+	</interpro>
+	<interpro id="noIPR" name="unintegrated" type="unintegrated">
+	  <match id="PTHR13416:SF0" name="SUBFAMILY NOT NAMED" dbname="PANTHER">
+	    <location start="1" end="400" score="2.8e-209" status="T" evidence="HMMPanther"/>
+	  </match>
+	  <match id="tmhmm" name="transmembrane_regions" dbname="TMHMM">
+	    <location start="33" end="51" score="NA" status="?" evidence="TMHMM"/>
+	    <location start="313" end="331" score="NA" status="?" evidence="TMHMM"/>
+	    <location start="350" end="370" score="NA" status="?" evidence="TMHMM"/>
+	    <location start="375" end="395" score="NA" status="?" evidence="TMHMM"/>
+	  </match>
+	</interpro>
+   </protein>
+
+</interpro_matches>
+</EBIInterProScanResults>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_output_output.octet-stream
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_output_output.octet-stream b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_output_output.octet-stream
new file mode 100644
index 0000000..778c00d
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/getResult_output_output.octet-stream
@@ -0,0 +1,12 @@
+Sequence "TMM43_HUMAN" crc64 checksum: 70FDDD4ED1AA11DF length: 400 aa.
+
+InterPro       IPR012430      Transmembrane protein 43 family
+method         AccNumber      shortName                               location
+HMMPanther     PTHR13416      UNCHARACTERIZED                         T[1-400] 2.8e-209
+HMMPfam        PF07787        DUF1625                                 T[121-373] 5.2e-82
+
+InterPro       NULL           NULL
+method         AccNumber      shortName                               location
+HMMPanther     PTHR13416:SF0  SUBFAMILY NOT NAMED                     T[1-400] 2.8e-209
+TMHMM          tmhmm          transmembrane_regions                   ?[33-51] NA ?[313-331] NA ?[350-370] NA ?[375-395] NA
+

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/00/00548907-43e1-4484-9582-bfa8727d44ca.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/00/00548907-43e1-4484-9582-bfa8727d44ca.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/00/00548907-43e1-4484-9582-bfa8727d44ca.txt
new file mode 100644
index 0000000..0e5ea08
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/00/00548907-43e1-4484-9582-bfa8727d44ca.txt
@@ -0,0 +1 @@
+RUNNING
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/07/079d289b-796e-45cf-a759-82f91a0aa3d5.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/07/079d289b-796e-45cf-a759-82f91a0aa3d5.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/07/079d289b-796e-45cf-a759-82f91a0aa3d5.txt
new file mode 100644
index 0000000..0e5ea08
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/07/079d289b-796e-45cf-a759-82f91a0aa3d5.txt
@@ -0,0 +1 @@
+RUNNING
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0a/0a2b3aa2-5b11-433d-b48f-1009424bb486.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0a/0a2b3aa2-5b11-433d-b48f-1009424bb486.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0a/0a2b3aa2-5b11-433d-b48f-1009424bb486.txt
new file mode 100644
index 0000000..7da8010
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0a/0a2b3aa2-5b11-433d-b48f-1009424bb486.txt
@@ -0,0 +1 @@
+<parameters xmlns="http://soap.jdispatcher.ebi.ac.uk"><jobId xmlns="">iprscan-S20130531-112044-0159-59919420-oy</jobId></parameters>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0b/0bd05e27-46d6-4de5-b76b-0988638f9231.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0b/0bd05e27-46d6-4de5-b76b-0988638f9231.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0b/0bd05e27-46d6-4de5-b76b-0988638f9231.txt
new file mode 100644
index 0000000..6be3b40
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0b/0bd05e27-46d6-4de5-b76b-0988638f9231.txt
@@ -0,0 +1,8 @@
+<parameters xmlns="http://soap.jdispatcher.ebi.ac.uk"><email xmlns="">soiland-reyes@cs.manchester.ac.uk</email><parameters xmlns=""><sequence>&gt;sp|Q9BTV4|TMM43_HUMAN Transmembrane protein 43 OS=Homo sapiens GN=TMEM43 PE=1 SV=1
+MAANYSSTSTRREHVKVKTSSQPGFLERLSETSGGMFVGLMAFLLSFYLIFTNEGRALKT
+ATSLAEGLSLVVSPDSIHSVAPENEGRLVHIIGALRTSKLLSDPNYGVHLPAVKLRRHVE
+MYQWVETEESREYTEDGQVKKETRYSYNTEWRSEIINSKNFDREIGHKNPSAMAVESFMA
+TAPFVQIGRFFLSSGLIDKVDNFKSLSLSKLEDPHVDIIRRGDFFYHSENPKYPEVGDLR
+VSFSYAGLSGDDPDLGPAHVVTVIARQRGDQLVPFSTKSGDTLLLLHHGDFSAEEVFHRE
+LRSNSMKTWGLRAAGWMAMFMGLNLMTRILYTLVDWFPVFRDLVNIGLKAFAFCVATSLT
+LLTVAAGWLFYRPLWALLIAGLALVPILVARTRVPAKKLE</sequence></parameters></parameters>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0c/0c29c209-b442-49c5-bee2-5b5efdacad0e.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0c/0c29c209-b442-49c5-bee2-5b5efdacad0e.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0c/0c29c209-b442-49c5-bee2-5b5efdacad0e.txt
new file mode 100644
index 0000000..463be45
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0c/0c29c209-b442-49c5-bee2-5b5efdacad0e.txt
@@ -0,0 +1 @@
+<ns2:runResponse xmlns:ns2="http://soap.jdispatcher.ebi.ac.uk"><jobId>iprscan-S20130531-112044-0159-59919420-oy</jobId></ns2:runResponse>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0f/0f93d00f-131b-42ec-bbba-22b50582903e.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0f/0f93d00f-131b-42ec-bbba-22b50582903e.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0f/0f93d00f-131b-42ec-bbba-22b50582903e.txt
new file mode 100644
index 0000000..7da8010
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/0f/0f93d00f-131b-42ec-bbba-22b50582903e.txt
@@ -0,0 +1 @@
+<parameters xmlns="http://soap.jdispatcher.ebi.ac.uk"><jobId xmlns="">iprscan-S20130531-112044-0159-59919420-oy</jobId></parameters>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/11/111e5771-37b7-4ef8-9888-e50eadbc2a5c.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/11/111e5771-37b7-4ef8-9888-e50eadbc2a5c.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/11/111e5771-37b7-4ef8-9888-e50eadbc2a5c.txt
new file mode 100644
index 0000000..efe3c46
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/11/111e5771-37b7-4ef8-9888-e50eadbc2a5c.txt
@@ -0,0 +1 @@
+<ns2:getStatusResponse xmlns:ns2="http://soap.jdispatcher.ebi.ac.uk"><status>RUNNING</status></ns2:getStatusResponse>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/c08405cb/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/13/132a7e6c-1857-4ad6-8252-5f747f6f0feb.txt
----------------------------------------------------------------------
diff --git a/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/13/132a7e6c-1857-4ad6-8252-5f747f6f0feb.txt b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/13/132a7e6c-1857-4ad6-8252-5f747f6f0feb.txt
new file mode 100644
index 0000000..7da8010
--- /dev/null
+++ b/taverna-databundle/src/test/resources/full-example/ebi-wfrun-2013-05-31/intermediates/13/132a7e6c-1857-4ad6-8252-5f747f6f0feb.txt
@@ -0,0 +1 @@
+<parameters xmlns="http://soap.jdispatcher.ebi.ac.uk"><jobId xmlns="">iprscan-S20130531-112044-0159-59919420-oy</jobId></parameters>
\ No newline at end of file