Depend on Tika for media type detection

Unit tests are added for a couple of common formats.
See src/test/resources/README.txt for details, these
are all created by me, but on purpose
don't have the ASF license header.


Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/commit/646e24ca
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/tree/646e24ca
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/diff/646e24ca

Branch: refs/heads/master
Commit: 646e24ca8f69db399113c6b751e8aaf2f0948cf2
Parents: d3efff9
Author: Stian Soiland-Reyes <[email protected]>
Authored: Fri Aug 19 12:30:32 2016 +0100
Committer: Stian Soiland-Reyes <[email protected]>
Committed: Fri Oct 21 09:17:18 2016 +0200

----------------------------------------------------------------------
 .../taverna/renderers/MediaTypeDetector.java    |  50 ++++--
 taverna-renderers-impl/pom.xml                  |   6 +
 .../renderers/impl/MediaTypeDetectorImpl.java   |  63 +++++++-
 .../renderers/TestMediaTypeDetector.java        | 159 +++++++++++++++++++
 .../src/test/resources/README.txt               |  21 +++
 .../src/test/resources/test.csv                 |   3 +
 .../src/test/resources/test.docx                | Bin 0 -> 4069 bytes
 .../src/test/resources/test.html                |   9 ++
 .../src/test/resources/test.jpeg                | Bin 0 -> 3646 bytes
 .../src/test/resources/test.ods                 | Bin 0 -> 7597 bytes
 .../src/test/resources/test.odt                 | Bin 0 -> 8291 bytes
 .../src/test/resources/test.pdf                 | Bin 0 -> 9752 bytes
 .../src/test/resources/test.png                 | Bin 0 -> 2310 bytes
 .../src/test/resources/test.svg                 | 117 ++++++++++++++
 .../src/test/resources/test.txt                 |   3 +
 .../src/test/resources/test.xlsx                | Bin 0 -> 4826 bytes
 .../src/test/resources/test.xml                 |   4 +
 .../src/test/resources/test.zip                 | Bin 0 -> 1287 bytes
 18 files changed, 417 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-api/src/main/java/org/apache/taverna/renderers/MediaTypeDetector.java
----------------------------------------------------------------------
diff --git 
a/taverna-renderers-api/src/main/java/org/apache/taverna/renderers/MediaTypeDetector.java
 
b/taverna-renderers-api/src/main/java/org/apache/taverna/renderers/MediaTypeDetector.java
index 585d351..db3c100 100644
--- 
a/taverna-renderers-api/src/main/java/org/apache/taverna/renderers/MediaTypeDetector.java
+++ 
b/taverna-renderers-api/src/main/java/org/apache/taverna/renderers/MediaTypeDetector.java
@@ -21,6 +21,7 @@ package org.apache.taverna.renderers;
 import java.io.IOException;
 import java.net.URI;
 import java.nio.file.Path;
+import java.util.Collections;
 import java.util.List;
 
 public interface MediaTypeDetector {
@@ -44,7 +45,7 @@ public interface MediaTypeDetector {
        public List<String> guessMediaTypes(Path path) throws IOException ;
 
        /**
-        * Guess the media types of a given {@link String}.
+        * Guess the media types of a given {@link String} value.
         * <p>
         * The media types in the list are ordered by decreasing likelihood, 
e.g.
         * the first item in the list is the most likely (in many cases most
@@ -53,15 +54,15 @@ public interface MediaTypeDetector {
         * The returned list will never be empty, as it will always contain 
either
         * <code>text/plain</code>.
         * 
-        * @param path
-        *            A {@link Path} to be guessed. The file extension of the 
path
-        *            MAY be taken into consideration.
+        * @param String
+        *            A string to check, e.g. an XML document. Note that only 
the first
+        *            few lines of the string to test is required.
         * @return A list of guessed media types
         */     
        public List<String> guessMediaTypes(String string);
 
        /**
-        * Guess the media types of a given {@link Path}.
+        * Guess the media types of a given byte array.
         * <p>
         * The media types in the list are ordered by decreasing likelihood, 
e.g.
         * the first item in the list is the most likely (in many cases most
@@ -70,9 +71,9 @@ public interface MediaTypeDetector {
         * The returned list will never be empty, as it will always contain
         * <code>application/octet-stream</code>
         * 
-        * @param path
-        *            A {@link Path} to be guessed. The file extension of the 
path
-        *            MAY be taken into consideration.
+        * @param bytes
+        *            Bytes to check. Note that only the "first bits" of the
+        *            resource is required, e.g. the initial 8192 bytes.
         * @return A list of guessed media types
         */     
        public List<String> guessMediaTypes(byte[] bytes);
@@ -90,8 +91,8 @@ public interface MediaTypeDetector {
         * The returned list will never be empty, as it will always contain 
either
         * <code>text/plain</code> or <code>application/octet-stream</code>
         * 
-        * @param path
-        *            A {@link Path} to be guessed. Any file extension of the 
URL
+        * @param uri
+        *            A {@link URI} to be guessed. Any file extension of the URL
         *            MAY be taken into consideration.
         * @return A list of guessed media types
         * @throws IOException If the URL can't be accessed (e.g. a network 
issue)
@@ -99,4 +100,33 @@ public interface MediaTypeDetector {
        public List<String> guessMediaTypes(URI uri) throws IOException;
 
        
+       /**
+        * Dummy MediaTypeDetector implementation
+        * <p>
+        * This can be used for test purposes which don't want to use
+        * MediaTypeDetectorImpl.
+        * <p>
+        * This class always return "application/octet-stream" as the media 
type.
+        *
+        */
+       public static class Dummy implements MediaTypeDetector {
+               private static List<String> BINARY = 
Collections.singletonList("application/octet-stream"); 
+               @Override
+               public List<String> guessMediaTypes(Path path) throws 
IOException {
+                       return BINARY;
+               }
+               @Override
+               public List<String> guessMediaTypes(String string) {
+                       return BINARY;
+               }
+               @Override
+               public List<String> guessMediaTypes(byte[] bytes) {
+                       return BINARY;
+               }
+               @Override
+               public List<String> guessMediaTypes(URI uri) throws IOException 
{
+                       return BINARY;
+               }               
+       }
+       
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/pom.xml b/taverna-renderers-impl/pom.xml
index 059e141..49a9333 100644
--- a/taverna-renderers-impl/pom.xml
+++ b/taverna-renderers-impl/pom.xml
@@ -72,6 +72,12 @@
                        <artifactId>com.springsource.org.jdom</artifactId>
                        <version>${jdom.version}</version>
                </dependency>
+        <dependency>
+                <groupId>org.apache.tika</groupId>
+                <artifactId>tika-core</artifactId>
+                <version>1.13</version>
+        </dependency>
+
 
        </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/main/java/org/apache/taverna/renderers/impl/MediaTypeDetectorImpl.java
----------------------------------------------------------------------
diff --git 
a/taverna-renderers-impl/src/main/java/org/apache/taverna/renderers/impl/MediaTypeDetectorImpl.java
 
b/taverna-renderers-impl/src/main/java/org/apache/taverna/renderers/impl/MediaTypeDetectorImpl.java
index c8b6fb7..f5cc70c 100644
--- 
a/taverna-renderers-impl/src/main/java/org/apache/taverna/renderers/impl/MediaTypeDetectorImpl.java
+++ 
b/taverna-renderers-impl/src/main/java/org/apache/taverna/renderers/impl/MediaTypeDetectorImpl.java
@@ -20,10 +20,13 @@ package org.apache.taverna.renderers.impl;
 
 import java.io.IOException;
 import java.net.URI;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.taverna.renderers.MediaTypeDetector;
+import org.apache.tika.Tika;
 
 /**
  * Media Type detector that uses Apache Tika
@@ -31,28 +34,72 @@ import org.apache.taverna.renderers.MediaTypeDetector;
  */
 public class MediaTypeDetectorImpl implements MediaTypeDetector {
 
+       Tika tika = new Tika();
+       String BINARY = "application/octet-stream";
+       String TEXT_PLAIN = "text/plain";
+       
        @Override
        public List<String> guessMediaTypes(Path path) throws IOException {
-               // TODO Auto-generated method stub
-               return null;
+               List<String> mediaTypes = new ArrayList<>();
+               String detected = tika.detect(path);
+               if (detected != null) {                 
+                       // Note: Tika does not return null, but its javadoc 
does not
+                       // make such a promise
+                       mediaTypes.add(detected);
+               }
+               if (! mediaTypes.contains(BINARY) && ! 
mediaTypes.contains(TEXT_PLAIN)) {
+                       // This fallback will also make sure we never return an 
empty list
+                       mediaTypes.add(BINARY);
+               }
+               return mediaTypes;
        }
 
        @Override
        public List<String> guessMediaTypes(String string) {
-               // TODO Auto-generated method stub
-               return null;
+               List<String> mediaTypes = new ArrayList<>();
+               // We'll assume that as a String it can be detected from UTF_8 
bytes,
+               // which makes sense for XML, JSON, SVG, etc
+               String mediaType = 
tika.detect(string.getBytes(StandardCharsets.UTF_8));
+               if (mediaType != null) {
+                       mediaTypes.add(mediaType);
+               }
+
+               if (! mediaTypes.contains(BINARY) && ! 
mediaTypes.contains(TEXT_PLAIN)) {
+                       mediaTypes.add(TEXT_PLAIN);
+               }
+               return mediaTypes;
        }
 
        @Override
        public List<String> guessMediaTypes(byte[] bytes) {
-               // TODO Auto-generated method stub
-               return null;
+               List<String> mediaTypes = new ArrayList<>();
+               String detected = tika.detect(bytes);
+               if (detected != null) {                 
+                       // Note: Tika does not return null, but its javadoc 
does not
+                       // make such a promise
+                       mediaTypes.add(detected);
+               }
+               if (! mediaTypes.contains(BINARY) && ! 
mediaTypes.contains(TEXT_PLAIN)) {
+                       // This fallback will also make sure we never return an 
empty list
+                       mediaTypes.add(BINARY);
+               }
+               return mediaTypes;
        }
 
        @Override
        public List<String> guessMediaTypes(URI uri) throws IOException {
-               // TODO Auto-generated method stub
-               return null;
+               List<String> mediaTypes = new ArrayList<>();
+               String detected = tika.detect(uri.toURL());
+               if (detected != null) {                 
+                       // Note: Tika does not return null, but its javadoc 
does not
+                       // make such a promise
+                       mediaTypes.add(detected);
+               }
+               if (! mediaTypes.contains(BINARY) && ! 
mediaTypes.contains(TEXT_PLAIN)) {
+                       // This fallback will also make sure we never return an 
empty list
+                       mediaTypes.add(BINARY);
+               }
+               return mediaTypes;
        }
        
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/java/org/apache/taverna/renderers/TestMediaTypeDetector.java
----------------------------------------------------------------------
diff --git 
a/taverna-renderers-impl/src/test/java/org/apache/taverna/renderers/TestMediaTypeDetector.java
 
b/taverna-renderers-impl/src/test/java/org/apache/taverna/renderers/TestMediaTypeDetector.java
new file mode 100644
index 0000000..d5ad73b
--- /dev/null
+++ 
b/taverna-renderers-impl/src/test/java/org/apache/taverna/renderers/TestMediaTypeDetector.java
@@ -0,0 +1,159 @@
+/*
+ * 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.
+ */
+package org.apache.taverna.renderers;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.taverna.renderers.impl.MediaTypeDetectorImpl;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestMediaTypeDetector {
+
+       public MediaTypeDetector detector = new MediaTypeDetectorImpl();
+
+       @Parameters(name = "{0}")
+       public static List<Object[]> expectedMediaTypes() {
+               // extension -> mediaType
+               // Each test is represented as "test.$extension" from 
src/test/resources
+               return Arrays.asList(new Object[][] {
+                       // TODO: Re-enable ALL of the below and fix in Tika 
configuration
+                       // (or upstream) - some of these fail in 
guessByAnonymousPath 
+                       // when they can't check the file extension
+                       
+                       // mis-matched as text/plain
+                       //{ "csv", "text/csv" },
+                       // mis-matched as application/zip
+                       //{ "docx", 
"application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, 
+                       { "html", "text/html" }, 
+                       { "jpeg", "image/jpeg" },
+                       { "ods", 
"application/vnd.oasis.opendocument.spreadsheet" },
+                       { "odt", "application/vnd.oasis.opendocument.text" }, 
+                       { "pdf", "application/pdf" },
+                       { "png", "image/png" }, 
+                       // { "svg", "image/svg+xml" }, // Mis-matched as 
application/xml 
+                       { "txt", "text/plain" },
+                       // Mis-matched as application/zip
+                       // { "xlsx", 
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
+                       { "xml", "application/xml" }, 
+                       { "zip", "application/zip" } 
+               });
+       }
+
+       @Parameter(0)
+       public String extension;
+
+       @Parameter(1)
+       public String expectedMediaType;
+
+       private Path path;
+
+       private Path anonymousPath;
+
+       @Before
+       public void writePaths() throws IOException {
+               path = Files.createTempFile("test", "." + extension);
+               try (InputStream in = getClass().getResourceAsStream("/test." + 
extension)) {
+                       Files.copy(in, path, 
StandardCopyOption.REPLACE_EXISTING);
+               }               
+               anonymousPath = Files.createTempFile("test", "");               
+               Files.copy(path, anonymousPath, 
StandardCopyOption.REPLACE_EXISTING);           
+       }
+       
+       @After
+       public void deletePaths() throws IOException {
+               Files.deleteIfExists(path);
+               Files.deleteIfExists(anonymousPath);
+       }
+       
+       @Test
+       public void guessByPath() throws Exception {
+               List<String> guess = detector.guessMediaTypes(path);
+               assertEquals(expectedMediaType, guess.get(0));          
+       }
+       
+       
+       @Test
+       public void guessByAnonymousPath() throws Exception {
+               List<String> guess = detector.guessMediaTypes(anonymousPath);
+               assertEquals(expectedMediaType, guess.get(0));          
+       }
+       
+
+       @Test
+       public void guessByUrl() throws Exception {             
+               List<String> guess = detector.guessMediaTypes(path.toUri());
+               assertEquals(expectedMediaType, guess.get(0));          
+       }
+       
+       @Test
+       public void guessByAnonymousUrl() throws Exception {            
+               List<String> guess = 
detector.guessMediaTypes(anonymousPath.toUri());
+               assertEquals(expectedMediaType, guess.get(0));          
+       }
+       
+       @Test
+       public void guessByBytes() throws Exception {
+               // Our test-resources are deliberately small, so this won't
+               // consume too much memory. Normal use of the MediaTypeDetector
+               // would be to only read the first kilobytes of a file.
+               byte[] bytes = Files.readAllBytes(path);
+               List<String> guess = detector.guessMediaTypes(bytes);
+               assertEquals(expectedMediaType, guess.get(0));          
+       }
+
+       @Test
+       public void guessByString() {
+               List<String> strings;
+               try {
+                       strings = Files.readAllLines(path, 
StandardCharsets.UTF_8);
+               } catch (IOException e) {
+                       Assume.assumeNoException(e);
+                       return;
+               }
+               // NOTE: The below will join \r\n to \n
+               // We assume that any binary formats like PNG failed the above 
test, 
+               // and that the remaining text-based formats support both kinds 
of newlines
+               String joined = strings.stream().limit(5). // first 5 lines
+                               collect(Collectors.joining("\n"));      
+               List<String> guess = detector.guessMediaTypes(joined);
+               assertEquals(expectedMediaType, guess.get(0));          
+       }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/README.txt
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/README.txt 
b/taverna-renderers-impl/src/test/resources/README.txt
new file mode 100644
index 0000000..ff780ee
--- /dev/null
+++ b/taverna-renderers-impl/src/test/resources/README.txt
@@ -0,0 +1,21 @@
+   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.
+   
+Note that the test.* resources have all been created specifically for
+Apache Taverna (incubating), and the above Apache License text applies.   
+   
+Note that for simplicity and to to avoid confusing the 
+underlying media type detector, the above file header should NOT be 
+added to these test files, even where possible. 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.csv
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.csv 
b/taverna-renderers-impl/src/test/resources/test.csv
new file mode 100644
index 0000000..a1bfca8
--- /dev/null
+++ b/taverna-renderers-impl/src/test/resources/test.csv
@@ -0,0 +1,3 @@
+"Column A","Column B","Column C"
+"Hello","There","World"
+"Extra","Row","Just in case"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.docx
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.docx 
b/taverna-renderers-impl/src/test/resources/test.docx
new file mode 100644
index 0000000..8e5c1a6
Binary files /dev/null and 
b/taverna-renderers-impl/src/test/resources/test.docx differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.html
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.html 
b/taverna-renderers-impl/src/test/resources/test.html
new file mode 100644
index 0000000..ae0643c
--- /dev/null
+++ b/taverna-renderers-impl/src/test/resources/test.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>The title</title>
+  </head>
+  <body>
+    <h1>Hello there!</h1>
+  </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.jpeg
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.jpeg 
b/taverna-renderers-impl/src/test/resources/test.jpeg
new file mode 100644
index 0000000..99aaa6f
Binary files /dev/null and 
b/taverna-renderers-impl/src/test/resources/test.jpeg differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.ods
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.ods 
b/taverna-renderers-impl/src/test/resources/test.ods
new file mode 100644
index 0000000..33d9a7d
Binary files /dev/null and b/taverna-renderers-impl/src/test/resources/test.ods 
differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.odt
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.odt 
b/taverna-renderers-impl/src/test/resources/test.odt
new file mode 100644
index 0000000..80785ce
Binary files /dev/null and b/taverna-renderers-impl/src/test/resources/test.odt 
differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.pdf
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.pdf 
b/taverna-renderers-impl/src/test/resources/test.pdf
new file mode 100644
index 0000000..915d3f7
Binary files /dev/null and b/taverna-renderers-impl/src/test/resources/test.pdf 
differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.png
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.png 
b/taverna-renderers-impl/src/test/resources/test.png
new file mode 100644
index 0000000..6081152
Binary files /dev/null and b/taverna-renderers-impl/src/test/resources/test.png 
differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.svg
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.svg 
b/taverna-renderers-impl/src/test/resources/test.svg
new file mode 100644
index 0000000..9c61125
--- /dev/null
+++ b/taverna-renderers-impl/src/test/resources/test.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd";>
+<svg width="596" height="843">
+  <image id="image0" width="596" height="843" x="0" y="0"
+    
xlink:href="data:image/png;base64,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
+J1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5Q
+AXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXk
+CRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdU
+QJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5
+QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkV
+kCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECe
+UAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF
+5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAn
+VECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlAB
+eUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJ
+FZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RA
+nlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlC
+BeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQ
+J1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5Q
+AXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXk
+CRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdU
+QJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5
+QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkV
+kCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECe
+UAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF
+5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAn
+VECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlAB
+eUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJ
+FZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RA
+nlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlC
+BeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQ
+J1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5Q
+AXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXk
+CRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdU
+QJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5
+QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkV
+kCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECe
+UAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF
+5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAn
+VECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlAB
+eUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJ
+FZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RA
+nlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlC
+BeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQ
+J1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5Q
+AXlCBeQJFZAnVECeUAF5QgXkCRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeQJFZAnVECeUAF5QgXk
+CRWQJ1RAnlABeUIF5AkVkCdUQJ5QAXlCBeT99oJ9P//sDw/8f9hZfvYnAHiCSz8gT6iAPKEC8oQK
+yBMqIE+ogDyhAvKECsgTKiBPqIA8oQLyhArIEyogT6iAPKEC8oQKyBMqIE+ogDyhAvKECsgTKiBP
+qIA8oQLyhArIEyogT6iAPKEC8oQKyPsvMe3mGp+1f7MAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYt
+MDgtMTlUMTM6MDU6MDErMDE6MDCD0/d6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTE5VDEz
+OjA1OjAxKzAxOjAw8o5PxgAAACB0RVh0cGRmOkhpUmVzQm91bmRpbmdCb3gANTk2eDg0MyswKzA/
+8kApAAAAFHRFWHRwZGY6VmVyc2lvbgBQREYtMS40IBxHOngAAAAASUVORK5CYII=" />
+</svg>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.txt
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.txt 
b/taverna-renderers-impl/src/test/resources/test.txt
new file mode 100644
index 0000000..75a3747
--- /dev/null
+++ b/taverna-renderers-impl/src/test/resources/test.txt
@@ -0,0 +1,3 @@
+Hello there
+
+This is a text file
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.xlsx
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.xlsx 
b/taverna-renderers-impl/src/test/resources/test.xlsx
new file mode 100644
index 0000000..6fbc965
Binary files /dev/null and 
b/taverna-renderers-impl/src/test/resources/test.xlsx differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.xml
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.xml 
b/taverna-renderers-impl/src/test/resources/test.xml
new file mode 100644
index 0000000..f8a8e0b
--- /dev/null
+++ b/taverna-renderers-impl/src/test/resources/test.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<test>
+       <hello to="world" />
+</test>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/646e24ca/taverna-renderers-impl/src/test/resources/test.zip
----------------------------------------------------------------------
diff --git a/taverna-renderers-impl/src/test/resources/test.zip 
b/taverna-renderers-impl/src/test/resources/test.zip
new file mode 100644
index 0000000..31a659e
Binary files /dev/null and b/taverna-renderers-impl/src/test/resources/test.zip 
differ

Reply via email to