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/17 21:40:35 UTC

[44/51] [partial] incubator-taverna-language git commit: temporarily empty repository

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/README.md
----------------------------------------------------------------------
diff --git a/taverna-robundle/README.md b/taverna-robundle/README.md
deleted file mode 100644
index d29b3c7..0000000
--- a/taverna-robundle/README.md
+++ /dev/null
@@ -1,180 +0,0 @@
-RO bundle API
-=============
-
-
-[![Build Status](https://travis-ci.org/wf4ever/robundle.svg)](https://travis-ci.org/wf4ever/robundle)
-[![DOI](https://zenodo.org/badge/doi/10.5072/zenodo.12703.png)](http://dx.doi.org/10.5072/zenodo.12703)
-
-
- 
-
-
-API for building researchobject.org RO bundles. 
-
-Complies with [RO bundle specification](https://w3id.org/bundle) version [1.0](https://w3id.org/bundle/2014-11-05/).
-
-This API is built on the Java 7 NIO Files and uses the 
-[Java 7 ZIP file provider](http://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html) to generate the RO Bundle.
-
-The class 
-[org.apache.taverna.robundle.Bundles](src/main/java/org/purl/wf4ever/robundle/Bundles.java) complements the 
-Java 7 [java.nio.Files](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html) API 
-with more specific helper methods to work with RO Bundles.
-
-This API is the basis for the [Taverna Data Bundles API](https://github.com/myGrid/databundles).
-
-
-Slides
-------
-
-[![Slides](http://image.slidesharecdn.com/2014-04-24-robundles-140424044958-phpapp01/95/slide-1-638.jpg?cb=1398333951)](http://www.slideshare.net/soilandreyes/diving-into-research-objects)
-
-[Slides 2014-04-24](https://onedrive.live.com/view.aspx?cid=37935FEEE4DF1087&resid=37935FEEE4DF1087%21679&app=PowerPoint&authkey=%21AI6c4YT_419J3zY&wdo=1)
-
-
-Usage
------
-
-If you use [Maven 3](http://maven.apache.org/), then add to your `pom.xml`:
-
-```xml
-<dependencies>
-    <dependency>
-       	<groupId>org.apache.taverna.robundle</groupId>
-        <artifactId>robundle</artifactId>
-        <version>0.5.0</version>
-    </dependency>
-</dependencies>
-<repositories>
-    <repository>
-        <id>mygrid-repository</id>
-        <name>myGrid Repository</name>
-        <url>http://www.mygrid.org.uk/maven/repository</url>
-        <releases />
-        <snapshots>
-            <enabled>false</enabled>
-        </snapshots>
-    </repository>
-</repositories>
-```
-
-To find the latest `<version>` (in case the above has not been updated), see the
-list of [robundle releases](https://github.com/wf4ever/robundle/releases). To download a precompiled
-binary JAR, see the [myGrid's Maven repository](http://www.mygrid.org.uk/maven/repository/org/purl/wf4ever/robundle/robundle/).
-
-Building
---------
-If you are building from source (this repository), then:
-
-```mvn clean install```
-
-should normally work, given a recent version of [Maven 3](http://maven.apache.org/download.cgi) and 
-[Java 7 SDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html).
-
-[myGrid's Jenkins installation](http://build.mygrid.org.uk/ci/) has automated builds of
-[robundle](http://build.mygrid.org.uk/ci/job/robundle/), which are deployed 
-to [myGrid's snapshot Maven repository](http://www.mygrid.org.uk/maven/snapshot-repository/org/purl/wf4ever/robundle/robundle/).
-
-To use a snapshot build, add this repository to `pom.xml`:
-
-```xml
-<repository>
-    <id>mygrid-snapshot-repository</id>
-    <name>myGrid Snapshot Repository</name>
-    <url>http://www.mygrid.org.uk/maven/snapshot-repository</url>
-    <releases>
-        <enabled>false</enabled>
-    </releases>
-    <snapshots />
-</repository>
-```
-
-Then change your `<dependency>` to match the `-SNAPSHOT` version in this project's [pom.xml](pom.xml).
-
-
-Supported bundle formats
-------------------------
-
-* [RO bundle specification](https://w3id.org/bundle).
-* [Adobe UFC](https://wikidocs.adobe.com/wiki/display/PDFNAV/UCF+overview)
-* [ePub OCF](http://www.idpf.org/epub3/latest/ocf)
-* [Open Document package (ODF)](http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.html#__RefHeading__752807_826425813)
-* [COMBINE Archive (OMEX)](http://co.mbine.org/documents/archive)
-* [ZIP](http://www.pkware.com/documents/casestudies/APPNOTE.TXT)
-
-The `Bundles` API will load a bundle in any of the formats above, converging 
-them to a [Research Object Bundle](https://w3id.org/bundle), 
-while still maintaining the manifests of the other formats,
-if they exist within the bundle.
-
-Thus, if you open say a [COMBINE Archive](http://co.mbine.org/documents/archive) and add a couple of resources,
-indicating their mediatype using `bundle.getManifest().getAggregation(path).setMediaType("a/b")`, then 
-when closing this bundle, the API will generate both an RO Bundle manifest and a COMBINE manifest
-that reflect this.
-
-
-
-
-Example of use
---------------
-
-Example in full is at [org.apache.taverna.robundle.TestExample](src/test/java/org/purl/wf4ever/robundle/TestExample.java)
-
-```java
-		// Create a new (temporary) RO bundle
-		Bundle bundle = Bundles.createBundle();
-
-		// Get the inputs
-		Path inputs = bundle.getRoot().resolve("inputs");
-		Files.createDirectory(inputs);
-
-		// Get an input port:
-		Path in1 = inputs.resolve("in1");
-
-		// Setting a string value for the input port:
-		Bundles.setStringValue(in1, "Hello");
-
-		// And retrieving it
-		if (Bundles.isValue(in1)) {
-			System.out.println(Bundles.getStringValue(in1));
-		}
-
-		// Or just use the regular Files methods:
-		for (String line : Files.readAllLines(in1, Charset.forName("UTF-8"))) {
-			System.out.println(line);
-		}
-
-		// Binaries and large files are done through the Files API
-		try (OutputStream out = Files.newOutputStream(in1,
-				StandardOpenOption.APPEND)) {
-			out.write(32);
-		}
-		// Or Java 7 style
-		Path localFile = Files.createTempFile("", ".txt");
-		Files.copy(in1, localFile, StandardCopyOption.REPLACE_EXISTING);
-		System.out.println("Written to: " + localFile);
-
-		Files.copy(localFile, bundle.getRoot().resolve("out1"));
-
-		// Representing references
-		URI ref = URI.create("http://example.com/external.txt");
-		Path out3 = bundle.getRoot().resolve("out3");
-		System.out.println(Bundles.setReference(out3, ref));
-		if (Bundles.isReference(out3)) {
-			URI resolved = Bundles.getReference(out3);
-			System.out.println(resolved);
-		}
-
-		// Saving a bundle:
-		Path zip = Files.createTempFile("bundle", ".zip");
-		Bundles.closeAndSaveBundle(bundle, zip);
-		// NOTE: From now "bundle" and its Path's are CLOSED
-		// and can no longer be accessed
-
-		System.out.println("Saved to " + zip);
-
-		// Loading a bundle back from disk
-		try (Bundle bundle2 = Bundles.openBundle(zip)) {
-			assertEquals(zip, bundle2.getSource());
-		}
- ```

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-robundle/pom.xml b/taverna-robundle/pom.xml
deleted file mode 100644
index a1cfa7b..0000000
--- a/taverna-robundle/pom.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<packaging>bundle</packaging>
-	<parent>
-		<groupId>org.apache.taverna.language</groupId>
-		<artifactId>taverna-language</artifactId>
-		<version>0.16.1-incubating-SNAPSHOT</version>
-	</parent>
-	<artifactId>taverna-robundle</artifactId>
-	<name>Apache Taverna RO Bundle API</name>
-	<description>API for dealing with RO Bundles</description>
-	<dependencies>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-annotations</artifactId>
-			<version>${jackson.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-databind</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.jsonld-java</groupId>
-			<artifactId>jsonld-java</artifactId>
-			<version>${jsonld.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>commons-configuration</groupId>
-			<artifactId>commons-configuration</artifactId>
-			<version>1.9</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.jena</groupId>
-			<artifactId>jena-arq</artifactId>
-			<version>${jena.version}</version>
-			<exclusions>
-				<exclusion>
-					<artifactId>httpclient</artifactId>
-					<groupId>org.apache.httpcomponents</groupId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-<!--
-		<dependency>
-			<groupId>com.sun.xml.bind</groupId>
-			<artifactId>jaxb-impl</artifactId>
-			<version>2.2.7</version>
-		</dependency>
--->
-		<dependency>
-			<groupId>com.sun.xml.bind</groupId>
-			<artifactId>jaxb-osgi</artifactId>
-			<version>${jaxb.version}</version>
-		</dependency>
-<!-- for UUIDv5 SHA named
-		<dependency>
-			<groupId>com.fasterxml.uuid</groupId>
-			<artifactId>java-uuid-generator</artifactId>
-			<version>3.1.3</version>
-			<type>bundle</type>
-		</dependency>
--->
-	</dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.felix</groupId>
-				<artifactId>maven-bundle-plugin</artifactId>
-				<extensions>true</extensions>
-				<configuration>
-					<instructions>
-						<Embed-Dependency>*;groupId=com.github.jsonld-java</Embed-Dependency>
-						<Embed-Transitive>true</Embed-Transitive>
-					</instructions>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>jaxb2-maven-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>jaxb-xsd</id>
-						<phase>generate-sources</phase>
-						<goals>
-							<goal>xjc</goal>
-						</goals>
-						<configuration>
-							<!-- <packageName>oasis.names.tc.opendocument.xmlns.manifest</packageName>-->
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.rat</groupId>
-				<artifactId>apache-rat-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundle.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundle.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundle.java
deleted file mode 100644
index df2d28a..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundle.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.apache.taverna.robundle;
-
-/*
- * 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 java.nio.file.Files.deleteIfExists;
-import static java.nio.file.Files.exists;
-import static java.nio.file.Files.newInputStream;
-import static org.apache.taverna.robundle.Bundles.getManifestPath;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.FileSystem;
-import java.nio.file.Path;
-
-import org.apache.taverna.robundle.fs.BundleFileSystem;
-import org.apache.taverna.robundle.manifest.Manifest;
-import org.apache.taverna.robundle.manifest.RDFToManifest;
-import org.apache.taverna.robundle.manifest.combine.CombineManifest;
-import org.apache.taverna.robundle.manifest.odf.ODFManifest;
-
-public class Bundle implements Closeable {
-	private boolean deleteOnClose;
-	private Manifest manifest;
-	private final Path root;
-
-	public Bundle(Path root, boolean deleteOnClose) {
-		this.root = root;
-		this.setDeleteOnClose(deleteOnClose);
-	}
-
-	@Override
-	public void close() throws IOException {
-		close(isDeleteOnClose());
-	}
-
-	protected void close(boolean deleteOnClose) throws IOException {
-		if (!getFileSystem().isOpen())
-			return;
-
-		if (!deleteOnClose) {
-			// update manifest
-			getManifest().populateFromBundle();
-			getManifest().writeAsJsonLD();
-			if (ODFManifest.containsManifest(this))
-				getManifest().writeAsODFManifest();
-			if (CombineManifest.containsManifest(this))
-				getManifest().writeAsCombineManifest();
-		} else {
-			/*
-			 * FIXME: Enable this if closing temporary bundles is slow doing
-			 * closing (as those files are being compressed):
-			 * RecursiveDeleteVisitor.deleteRecursively(getRoot());
-			 */
-		}
-		getFileSystem().close();
-		if (deleteOnClose)
-			deleteIfExists(getSource());
-	}
-
-	public FileSystem getFileSystem() {
-		return getRoot().getFileSystem();
-	}
-
-	public Manifest getManifest() throws IOException {
-		if (manifest == null)
-			synchronized (this) {
-				if (manifest == null)
-					manifest = readOrPopulateManifest();
-			}
-		return manifest;
-	}
-
-	public Path getPath(String path) {
-		return getRoot().resolve(path);
-	}
-
-	public Path getRoot() {
-		return root;
-	}
-
-	public Path getSource() {
-		BundleFileSystem fs = (BundleFileSystem) getFileSystem();
-		return fs.getSource();
-	}
-
-	public boolean isDeleteOnClose() {
-		return deleteOnClose;
-	}
-
-	protected Manifest readOrPopulateManifest() throws IOException {
-		Manifest newManifest = new Manifest(this);
-		Path manifestPath = getManifestPath(this);
-		if (exists(manifestPath)) {
-			try (InputStream manifestStream = newInputStream(manifestPath)) {
-				new RDFToManifest().readTo(manifestStream, newManifest,
-						manifestPath.toUri());
-			}
-			// TODO: Also support reading manifest.rdf?
-		} else if (ODFManifest.containsManifest(this)) {
-			new ODFManifest(newManifest).readManifestXML();
-		} else if (CombineManifest.containsManifest(this)) {
-			new CombineManifest(newManifest).readCombineArchive();
-		} else {
-			// Fallback (might be a fresh or 3rd party bundle), populate from
-			// zip content
-			newManifest.populateFromBundle();
-		}
-		return newManifest;
-	}
-
-	public void setDeleteOnClose(boolean deleteOnClose) {
-		this.deleteOnClose = deleteOnClose;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundles.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundles.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundles.java
deleted file mode 100644
index eaf0359..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/Bundles.java
+++ /dev/null
@@ -1,401 +0,0 @@
-package org.apache.taverna.robundle;
-
-/*
- * 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 java.nio.file.Files.copy;
-import static java.nio.file.Files.createDirectories;
-import static java.nio.file.Files.createTempFile;
-import static java.nio.file.Files.deleteIfExists;
-import static java.nio.file.Files.exists;
-import static java.nio.file.Files.isDirectory;
-import static java.nio.file.Files.isRegularFile;
-import static java.nio.file.Files.move;
-import static java.nio.file.Files.newBufferedReader;
-import static java.nio.file.Files.newBufferedWriter;
-import static java.nio.file.Files.newDirectoryStream;
-import static java.nio.file.Files.readAllBytes;
-import static java.nio.file.Files.write;
-import static java.nio.file.StandardCopyOption.ATOMIC_MOVE;
-import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
-import static java.nio.file.StandardOpenOption.CREATE;
-import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
-import static org.apache.taverna.robundle.fs.BundleFileSystemProvider.APPLICATION_VND_WF4EVER_ROBUNDLE_ZIP;
-import static org.apache.taverna.robundle.fs.BundleFileSystemProvider.MIMETYPE_FILE;
-import static org.apache.taverna.robundle.fs.BundleFileSystemProvider.newFileSystemFromExisting;
-import static org.apache.taverna.robundle.fs.BundleFileSystemProvider.newFileSystemFromNew;
-import static org.apache.taverna.robundle.fs.BundleFileSystemProvider.newFileSystemFromTemporary;
-import static org.apache.taverna.robundle.utils.PathHelper.relativizeFromBase;
-import static org.apache.taverna.robundle.utils.TemporaryFiles.temporaryBundle;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.nio.file.AtomicMoveNotSupportedException;
-import java.nio.file.CopyOption;
-import java.nio.file.DirectoryNotEmptyException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.MessageFormat;
-
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.HierarchicalINIConfiguration;
-import org.apache.taverna.robundle.fs.BundleFileSystem;
-import org.apache.taverna.robundle.utils.RecursiveCopyFileVisitor;
-import org.apache.taverna.robundle.utils.RecursiveDeleteVisitor;
-
-/**
- * Utility functions for dealing with RO bundles.
- * <p>
- * The style of using this class is similar to that of {@link Files}. In fact, a
- * RO bundle is implemented as a set of {@link Path}s.
- * 
- * @author Stian Soiland-Reyes
- */
-public class Bundles {
-	private static final String ANNOTATIONS = "annotations";
-	private static final Charset ASCII = Charset.forName("ASCII");
-	private static final String DOT_RO = ".ro";
-
-	protected static final String DOT_URL = ".url";
-
-	private static final String INI_INTERNET_SHORTCUT = "InternetShortcut";
-	private static final String INI_URL = "URL";
-	private static final Charset LATIN1 = Charset.forName("Latin1");
-	private static final String MANIFEST_JSON = "manifest.json";
-	private static final Charset UTF8 = Charset.forName("UTF-8");
-
-	public static void closeAndSaveBundle(Bundle bundle, Path destination)
-			throws IOException {
-		Path zipPath = closeBundle(bundle);
-		if (bundle.isDeleteOnClose()) {
-			safeMove(zipPath, destination);
-		} else {
-			safeCopy(zipPath, destination);
-		}
-	}
-
-	public static Path closeBundle(Bundle bundle) throws IOException {
-		Path path = bundle.getSource();
-		bundle.close(false);
-		return path;
-	}
-
-	public static void copyRecursively(final Path source,
-			final Path destination, final CopyOption... copyOptions)
-			throws IOException {
-		RecursiveCopyFileVisitor.copyRecursively(source, destination,
-				copyOptions);
-	}
-
-	public static Bundle createBundle() throws IOException {
-		BundleFileSystem fs = newFileSystemFromTemporary();
-		return new Bundle(fs.getRootDirectory(), true);
-	}
-
-	public static Bundle createBundle(Path path) throws IOException {
-		BundleFileSystem fs = newFileSystemFromNew(path);
-		return new Bundle(fs.getRootDirectory(), false);
-	}
-
-	public static void deleteRecursively(Path p) throws IOException {
-		RecursiveDeleteVisitor.deleteRecursively(p);
-	}
-
-	protected static String filenameWithoutExtension(Path entry) {
-		String fileName = entry.getFileName().toString();
-		int lastDot = fileName.lastIndexOf(".");
-		if (lastDot < 0)
-			// return fileName;
-			return fileName.replace("/", "");
-		return fileName.substring(0, lastDot);
-	}
-
-	public static Path getAnnotations(Bundle bundle) throws IOException {
-		Path dir = bundle.getFileSystem().getPath(DOT_RO, ANNOTATIONS);
-		createDirectories(dir);
-		return dir;
-	}
-
-	public static Path getManifestPath(Bundle bundle) {
-		return bundle.getRoot().resolve(DOT_RO).resolve(MANIFEST_JSON);
-	}
-
-	public static String getMimeType(Bundle bundle) throws IOException {
-		Path mimetypePath = bundle.getRoot().resolve(MIMETYPE_FILE);
-		String mimetype = getStringValue(mimetypePath);
-		if (mimetype == null || mimetype.isEmpty())
-			return APPLICATION_VND_WF4EVER_ROBUNDLE_ZIP;
-		return mimetype.trim();
-	}
-
-	public static URI getReference(Path path) throws IOException {
-		if (path == null || isMissing(path))
-			return null;
-		if (!isReference(path))
-			throw new IllegalArgumentException("Not a reference: " + path);
-		// Note: Latin1 is chosen here because it would not bail out on
-		// "strange" characters. We actually parse the URL as ASCII
-		path = withExtension(path, DOT_URL);
-		try (BufferedReader r = newBufferedReader(path, LATIN1)) {
-			HierarchicalINIConfiguration ini = new HierarchicalINIConfiguration();
-			ini.load(r);
-
-			String urlStr = ini.getSection(INI_INTERNET_SHORTCUT).getString(
-					INI_URL);
-
-			// String urlStr = ini.get(INI_INTERNET_SHORTCUT, INI_URL);
-			if (urlStr == null)
-				throw new IOException("Invalid/unsupported URL format: " + path);
-			return URI.create(urlStr);
-		} catch (ConfigurationException e) {
-			throw new IOException("Can't parse reference: " + path, e);
-		}
-	}
-
-	public static String getStringValue(Path path) throws IOException {
-		if (path == null || isMissing(path))
-			return null;
-		if (!isValue(path))
-			throw new IllegalArgumentException("Not a value: " + path);
-		return new String(readAllBytes(path), UTF8);
-	}
-
-	public static boolean isMissing(Path item) {
-		return !exists(item) && !isReference(item);
-	}
-
-	public static boolean isReference(Path path) {
-		return isRegularFile(withExtension(path, DOT_URL));
-	}
-
-	public static boolean isValue(Path path) {
-		return !isReference(path) && isRegularFile(path);
-	}
-
-	public static Bundle openBundle(InputStream in) throws IOException {
-		Path path = temporaryBundle();
-		copy(in, path);
-		Bundle bundle = openBundle(path);
-		bundle.setDeleteOnClose(true);
-		return bundle;
-	}
-
-	public static Bundle openBundle(Path zip) throws IOException {
-		BundleFileSystem fs = newFileSystemFromExisting(zip);
-		return new Bundle(fs.getRootDirectory(), false);
-	}
-
-	public static Bundle openBundle(URL url) throws IOException {
-		try {
-			if ("file".equals(url.getProtocol()))
-				return openBundle(Paths.get(url.toURI()));
-			else
-				try (InputStream in = url.openStream()) {
-					return openBundle(in);
-				}
-		} catch (URISyntaxException e) {
-			throw new IllegalArgumentException("Invalid URL " + url, e);
-		}
-	}
-
-	public static Bundle openBundleReadOnly(Path zip) throws IOException {
-		Path tmpBundle = temporaryBundle();
-		// BundleFileSystemProvider requires write-access, so we'll have to copy
-		// it
-		copy(zip, tmpBundle);
-		BundleFileSystem fs = newFileSystemFromExisting(tmpBundle);
-		// And this temporary file will be deleted afterwards
-		return new Bundle(fs.getRootDirectory(), true);
-	}
-
-	public static void safeCopy(Path source, Path destination)
-			throws IOException {
-		safeMoveOrCopy(source, destination, false);
-	}
-
-	public static void safeMove(Path source, Path destination)
-			throws IOException {
-		safeMoveOrCopy(source, destination, true);
-	}
-
-	protected static void safeMoveOrCopy(Path source, Path destination,
-			boolean move) throws IOException {
-		// First just try to do an atomic move with overwrite
-		try {
-			if (move
-					&& source.getFileSystem().provider()
-							.equals(destination.getFileSystem().provider())) {
-				move(source, destination, ATOMIC_MOVE, REPLACE_EXISTING);
-				return;
-			}
-		} catch (AtomicMoveNotSupportedException ex) {
-			// Do the fallback by temporary files below
-		}
-
-		destination = destination.toAbsolutePath();
-
-		String tmpName = destination.getFileName().toString();
-		Path tmpDestination = createTempFile(destination.getParent(), tmpName,
-				".tmp");
-		Path backup = null;
-		try {
-			if (move) {
-				/*
-				 * This might do a copy if filestores differ .. hence to avoid
-				 * an incomplete (and partially overwritten) destination, we do
-				 * it first to a temporary file
-				 */
-				move(source, tmpDestination, REPLACE_EXISTING);
-			} else {
-				copy(source, tmpDestination, REPLACE_EXISTING);
-			}
-
-			if (exists(destination)) {
-				if (isDirectory(destination))
-					// ensure it is empty
-					try (DirectoryStream<Path> ds = newDirectoryStream(destination)) {
-						if (ds.iterator().hasNext())
-							throw new DirectoryNotEmptyException(
-									destination.toString());
-					}
-				// Keep the files for roll-back in case it goes bad
-				backup = createTempFile(destination.getParent(), tmpName,
-						".orig");
-				move(destination, backup, REPLACE_EXISTING);
-			}
-			// OK ; let's swap over
-			try {
-				// prefer ATOMIC_MOVE
-				move(tmpDestination, destination, REPLACE_EXISTING, ATOMIC_MOVE);
-			} catch (AtomicMoveNotSupportedException ex) {
-				/*
-				 * possibly a network file system as src/dest should be in same
-				 * folder
-				 */
-				move(tmpDestination, destination, REPLACE_EXISTING);
-			} finally {
-				if (!exists(destination) && backup != null)
-					// Restore the backup
-					move(backup, destination);
-			}
-			// It went well, tidy up
-			if (backup != null)
-				deleteIfExists(backup);
-		} finally {
-			deleteIfExists(tmpDestination);
-		}
-	}
-
-	public static void setMimeType(Bundle bundle, String mimetype)
-			throws IOException {
-		if (!ASCII.newEncoder().canEncode(mimetype))
-			throw new IllegalArgumentException("mimetype must be ASCII, not "
-					+ mimetype);
-		if (mimetype.contains("\n") || mimetype.contains("\r"))
-			throw new IllegalArgumentException(
-					"mimetype can't contain newlines");
-		if (!mimetype.contains("/"))
-			throw new IllegalArgumentException("Invalid mimetype: " + mimetype);
-
-		Path root = bundle.getRoot();
-		Path mimetypePath = root.resolve(MIMETYPE_FILE);
-		if (!isRegularFile(mimetypePath)) {
-			/*
-			 * It would require low-level zip-modification to properly add
-			 * 'mimetype' now
-			 */
-			throw new IOException("Special file '" + MIMETYPE_FILE
-					+ "' missing from bundle, can't set mimetype");
-		}
-		setStringValue(mimetypePath, mimetype);
-	}
-
-	public static Path setReference(Path path, URI ref) throws IOException {
-		path = withExtension(path, DOT_URL);
-
-		// We'll save a IE-like .url "Internet shortcut" in INI format.
-
-		// HierarchicalINIConfiguration ini = new
-		// HierarchicalINIConfiguration();
-		// ini.getSection(INI_INTERNET_SHORTCUT).addProperty(INI_URL,
-		// ref.toASCIIString());
-
-		// Ini ini = new Wini();
-		// ini.getConfig().setLineSeparator("\r\n");
-		// ini.put(INI_INTERNET_SHORTCUT, INI_URL, ref.toASCIIString());
-
-		/*
-		 * Neither of the above create a .url that is compatible with Safari on
-		 * Mac OS (which expects "URL=" rather than "URL = ", so instead we make
-		 * it manually with MessageFormat.format:
-		 */
-
-		// Includes a terminating double line-feed -- which Safari might also
-		// need
-		String iniTmpl = "[{0}]\r\n{1}={2}\r\n\r\n";
-		String ini = MessageFormat.format(iniTmpl, INI_INTERNET_SHORTCUT,
-				INI_URL, ref.toASCIIString());
-
-		// NOTE: We use Latin1 here, but because of
-		try (BufferedWriter w = newBufferedWriter(path, ASCII,
-				TRUNCATE_EXISTING, CREATE)) {
-			// ini.save(w);
-			// ini.store(w);
-			w.write(ini);
-			// } catch (ConfigurationException e) {
-			// throw new IOException("Can't write shortcut to " + path, e);
-		}
-		return path;
-	}
-
-	public static void setStringValue(Path path, String string)
-			throws IOException {
-		write(path, string.getBytes(UTF8), TRUNCATE_EXISTING, CREATE);
-	}
-
-	public static Path uriToBundlePath(Bundle bundle, URI uri) {
-		URI rootUri = bundle.getRoot().toUri();
-		uri = relativizeFromBase(uri, rootUri);
-		if (uri.isAbsolute() || uri.getFragment() != null)
-			return null;
-		return bundle.getFileSystem().provider().getPath(rootUri.resolve(uri));
-	}
-
-	protected static Path withExtension(Path path, String extension) {
-		if (!extension.isEmpty() && !extension.startsWith("."))
-			throw new IllegalArgumentException(
-					"Extension must be empty or start with .");
-		String p = path.getFileName().toString();
-		if (!extension.isEmpty()
-				&& p.toLowerCase().endsWith(extension.toLowerCase()))
-			return path;
-		// Everything after the last . - or just the end
-		String newP = p.replaceFirst("(\\.[^.]*)?$", extension);
-		return path.resolveSibling(newP);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileStore.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileStore.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileStore.java
deleted file mode 100644
index 208f979..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileStore.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.apache.taverna.robundle.fs;
-
-/*
- * 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 java.io.IOException;
-import java.nio.file.FileStore;
-import java.nio.file.attribute.FileAttributeView;
-import java.nio.file.attribute.FileStoreAttributeView;
-
-public class BundleFileStore extends FileStore {
-
-	// private final BundleFileSystem fs;
-	private final FileStore origFileStore;
-
-	protected BundleFileStore(BundleFileSystem fs, FileStore origFileStore) {
-		if (fs == null || origFileStore == null) {
-			throw new NullPointerException();
-		}
-		// this.fs = fs;
-		this.origFileStore = origFileStore;
-	}
-
-	@Override
-	public Object getAttribute(String attribute) throws IOException {
-		return origFileStore.getAttribute(attribute);
-	}
-
-	@Override
-	public <V extends FileStoreAttributeView> V getFileStoreAttributeView(
-			Class<V> type) {
-		return origFileStore.getFileStoreAttributeView(type);
-	}
-
-	@Override
-	public long getTotalSpace() throws IOException {
-		return origFileStore.getTotalSpace();
-	}
-
-	@Override
-	public long getUnallocatedSpace() throws IOException {
-		return origFileStore.getUnallocatedSpace();
-	}
-
-	@Override
-	public long getUsableSpace() throws IOException {
-		return origFileStore.getUsableSpace();
-	}
-
-	@Override
-	public boolean isReadOnly() {
-		return origFileStore.isReadOnly();
-	}
-
-	@Override
-	public String name() {
-		return origFileStore.name();
-	}
-
-	@Override
-	public boolean supportsFileAttributeView(
-			Class<? extends FileAttributeView> type) {
-		return origFileStore.supportsFileAttributeView(type);
-	}
-
-	@Override
-	public boolean supportsFileAttributeView(String name) {
-		return origFileStore.supportsFileAttributeView(name);
-	}
-
-	@Override
-	public String toString() {
-		return origFileStore.toString();
-	}
-
-	@Override
-	public String type() {
-		return "bundle";
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystem.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystem.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystem.java
deleted file mode 100644
index 363b8cf..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystem.java
+++ /dev/null
@@ -1,223 +0,0 @@
-package org.apache.taverna.robundle.fs;
-
-/*
- * 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 java.io.IOException;
-import java.net.URI;
-import java.nio.file.ClosedFileSystemException;
-import java.nio.file.FileStore;
-import java.nio.file.FileSystem;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
-import java.nio.file.Paths;
-import java.nio.file.WatchService;
-import java.nio.file.attribute.UserPrincipalLookupService;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-public class BundleFileSystem extends FileSystem {
-
-	protected final URI baseURI;
-	private FileSystem origFS;
-	private final String separator;
-	private final Path source;
-
-	protected BundleFileSystem(FileSystem origFS, URI baseURI) {
-		if (origFS == null || baseURI == null) {
-			throw new NullPointerException();
-		}
-		this.origFS = origFS;
-		this.baseURI = baseURI;
-		this.separator = origFS.getSeparator();
-		this.source = findSource();
-
-	}
-
-	@Override
-	public void close() throws IOException {
-		if (origFS == null) {
-			return;
-		}
-		origFS.close();
-		// De-reference the original ZIP file system so it can be
-		// garbage collected
-		origFS = null;
-	}
-
-	protected Path findSource() {
-		Path zipRoot = getRootDirectory().getZipPath();
-		URI uri = zipRoot.toUri();
-		String schemeSpecific;
-		if (provider().getJarDoubleEscaping()) {
-			schemeSpecific = uri.getSchemeSpecificPart();
-		} else {
-			// http://dev.mygrid.org.uk/issues/browse/T3-954
-			schemeSpecific = uri.getRawSchemeSpecificPart();
-		}
-		if (!schemeSpecific.endsWith("!/")) { // sanity check
-			throw new IllegalStateException("Can't parse JAR URI: " + uri);
-		}
-		URI zip = URI.create(schemeSpecific.substring(0,
-				schemeSpecific.length() - 2));
-		return Paths.get(zip); // Look up our path
-	}
-
-	public URI getBaseURI() {
-		return baseURI;
-	}
-
-	protected BundleFileStore getFileStore() {
-		// We assume there's only one file store, as is true for ZipProvider
-		return new BundleFileStore(this, getOrigFS().getFileStores().iterator()
-				.next());
-	}
-
-	@Override
-	public Iterable<FileStore> getFileStores() {
-		return Collections.<FileStore> singleton(getFileStore());
-	}
-
-	/**
-	 * Thread-safe ClosedFileSystemException test
-	 * 
-	 * @return
-	 */
-	protected FileSystem getOrigFS() {
-		FileSystem orig = origFS;
-		if (orig == null || !orig.isOpen()) {
-			throw new ClosedFileSystemException();
-		}
-		return orig;
-	}
-
-	@Override
-	public Path getPath(String first, String... more) {
-		Path zipPath = getOrigFS().getPath(first, more);
-		return wrap(zipPath);
-	}
-
-	@Override
-	public PathMatcher getPathMatcher(String syntaxAndPattern) {
-		final PathMatcher zipMatcher = getOrigFS().getPathMatcher(
-				syntaxAndPattern);
-		return new PathMatcher() {
-			@Override
-			public boolean matches(Path path) {
-				return zipMatcher.matches(unwrap(path));
-			}
-		};
-	}
-
-	@Override
-	public Iterable<Path> getRootDirectories() {
-		return Collections.<Path> singleton(getRootDirectory());
-	}
-
-	public BundlePath getRootDirectory() {
-		return wrap(getOrigFS().getRootDirectories().iterator().next());
-	}
-
-	@Override
-	public String getSeparator() {
-		return separator;
-	}
-
-	public Path getSource() {
-		return source;
-	}
-
-	@Override
-	public UserPrincipalLookupService getUserPrincipalLookupService() {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public boolean isOpen() {
-		if (origFS == null) {
-			return false;
-		}
-		return origFS.isOpen();
-	}
-
-	@Override
-	public boolean isReadOnly() {
-		return getOrigFS().isReadOnly();
-	}
-
-	@Override
-	public WatchService newWatchService() throws IOException {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public BundleFileSystemProvider provider() {
-		return BundleFileSystemProvider.getInstance();
-	}
-
-	@Override
-	public Set<String> supportedFileAttributeViews() {
-		if (origFS == null) {
-			throw new ClosedFileSystemException();
-		}
-		return origFS.supportedFileAttributeViews();
-	}
-
-	protected Path unwrap(Path bundlePath) {
-		if (!(bundlePath instanceof BundlePath)) {
-			// assume it's already unwrapped for some reason (for instance being
-			// null)
-			return bundlePath;
-		}
-		return ((BundlePath) bundlePath).getZipPath();
-	}
-
-	protected BundlePath wrap(Path zipPath) {
-		if (zipPath == null) {
-			return null;
-		}
-		if (zipPath instanceof BundlePath) {
-			throw new IllegalArgumentException("Did not expect BundlePath: "
-					+ zipPath);
-		}
-		return new BundlePath(this, zipPath);
-	}
-
-	protected Iterator<Path> wrapIterator(final Iterator<Path> iterator) {
-		return new Iterator<Path>() {
-			@Override
-			public boolean hasNext() {
-				return iterator.hasNext();
-			}
-
-			@Override
-			public Path next() {
-				return wrap(iterator.next());
-			}
-
-			@Override
-			public void remove() {
-				iterator.remove();
-			}
-		};
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystemProvider.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystemProvider.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystemProvider.java
deleted file mode 100644
index 807c9fd..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileSystemProvider.java
+++ /dev/null
@@ -1,695 +0,0 @@
-package org.apache.taverna.robundle.fs;
-
-/*
- * 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 java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.ref.WeakReference;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.nio.channels.ReadableByteChannel;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.channels.WritableByteChannel;
-import java.nio.charset.Charset;
-import java.nio.file.AccessMode;
-import java.nio.file.CopyOption;
-import java.nio.file.DirectoryStream;
-import java.nio.file.DirectoryStream.Filter;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.FileStore;
-import java.nio.file.FileSystem;
-import java.nio.file.FileSystemAlreadyExistsException;
-import java.nio.file.FileSystemNotFoundException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.LinkOption;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.OpenOption;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileAttribute;
-import java.nio.file.attribute.FileAttributeView;
-import java.nio.file.spi.FileSystemProvider;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.zip.CRC32;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.apache.taverna.robundle.utils.TemporaryFiles;
-
-public class BundleFileSystemProvider extends FileSystemProvider {
-	public class BundleFileChannel extends FileChannel {
-
-		@SuppressWarnings("unused")
-		private FileAttribute<?>[] attrs;
-		private FileChannel fc;
-		@SuppressWarnings("unused")
-		private Set<? extends OpenOption> options;
-		@SuppressWarnings("unused")
-		private Path path;
-
-		public BundleFileChannel(FileChannel fc, Path path,
-				Set<? extends OpenOption> options, FileAttribute<?>[] attrs) {
-			this.fc = fc;
-			this.path = path;
-			this.options = options;
-			this.attrs = attrs;
-		}
-
-		@Override
-		public void force(boolean metaData) throws IOException {
-			fc.force(metaData);
-		}
-
-		@Override
-		protected void implCloseChannel() throws IOException {
-			fc.close();
-			// TODO: Update manifest
-		}
-
-		@Override
-		public FileLock lock(long position, long size, boolean shared)
-				throws IOException {
-			return fc.lock(position, size, shared);
-		}
-
-		@Override
-		public MappedByteBuffer map(MapMode mode, long position, long size)
-				throws IOException {
-			return fc.map(mode, position, size);
-		}
-
-		@Override
-		public long position() throws IOException {
-			return fc.position();
-		}
-
-		@Override
-		public FileChannel position(long newPosition) throws IOException {
-			return fc.position(newPosition);
-		}
-
-		@Override
-		public int read(ByteBuffer dst) throws IOException {
-			return fc.read(dst);
-		}
-
-		@Override
-		public int read(ByteBuffer dst, long position) throws IOException {
-			return fc.read(dst, position);
-		}
-
-		@Override
-		public long read(ByteBuffer[] dsts, int offset, int length)
-				throws IOException {
-			return fc.read(dsts, offset, length);
-		}
-
-		@Override
-		public long size() throws IOException {
-			return fc.size();
-		}
-
-		@Override
-		public long transferFrom(ReadableByteChannel src, long position,
-				long count) throws IOException {
-			return fc.transferFrom(src, position, count);
-		}
-
-		@Override
-		public long transferTo(long position, long count,
-				WritableByteChannel target) throws IOException {
-			return fc.transferTo(position, count, target);
-		}
-
-		@Override
-		public FileChannel truncate(long size) throws IOException {
-			return fc.truncate(size);
-		}
-
-		@Override
-		public FileLock tryLock(long position, long size, boolean shared)
-				throws IOException {
-			return fc.tryLock(position, size, shared);
-		}
-
-		@Override
-		public int write(ByteBuffer src) throws IOException {
-			return fc.write(src);
-		}
-
-		@Override
-		public int write(ByteBuffer src, long position) throws IOException {
-			return fc.write(src, position);
-		}
-
-		@Override
-		public long write(ByteBuffer[] srcs, int offset, int length)
-				throws IOException {
-			return fc.write(srcs, offset, length);
-		}
-
-	}
-
-	private static class Singleton {
-		// Fallback for OSGi environments
-		private static final BundleFileSystemProvider INSTANCE = new BundleFileSystemProvider();
-	}
-
-	private static final String APP = "app";
-
-	public static final String APPLICATION_VND_WF4EVER_ROBUNDLE_ZIP = "application/vnd.wf4ever.robundle+zip";
-	public static final String MIMETYPE_FILE = "mimetype";
-
-	/**
-	 * The list of open file systems. This is static so that it is shared across
-	 * eventual multiple instances of this provider (such as when running in an
-	 * OSGi environment). Access to this map should be synchronized to avoid
-	 * opening a file system that is not in the map.
-	 */
-	protected static Map<URI, WeakReference<BundleFileSystem>> openFilesystems = new HashMap<>();
-
-	private static final Charset UTF8 = Charset.forName("UTF-8");
-
-	protected static void addMimeTypeToZip(ZipOutputStream out, String mimetype)
-			throws IOException {
-		if (mimetype == null) {
-			mimetype = APPLICATION_VND_WF4EVER_ROBUNDLE_ZIP;
-		}
-		// FIXME: Make the mediatype a parameter
-		byte[] bytes = mimetype.getBytes(UTF8);
-
-		// We'll have to do the mimetype file quite low-level
-		// in order to ensure it is STORED and not COMPRESSED
-
-		ZipEntry entry = new ZipEntry(MIMETYPE_FILE);
-		entry.setMethod(ZipEntry.STORED);
-		entry.setSize(bytes.length);
-		CRC32 crc = new CRC32();
-		crc.update(bytes);
-		entry.setCrc(crc.getValue());
-
-		out.putNextEntry(entry);
-		out.write(bytes);
-		out.closeEntry();
-	}
-
-	protected static void createBundleAsZip(Path bundle, String mimetype)
-			throws FileNotFoundException, IOException {
-		// Create ZIP file as
-		// http://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html
-		try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(
-				bundle, StandardOpenOption.CREATE,
-				StandardOpenOption.TRUNCATE_EXISTING))) {
-			addMimeTypeToZip(out, mimetype);
-		}
-	}
-
-	public static BundleFileSystemProvider getInstance() {
-		for (FileSystemProvider provider : FileSystemProvider
-				.installedProviders()) {
-			if (provider instanceof BundleFileSystemProvider) {
-				return (BundleFileSystemProvider) provider;
-			}
-		}
-		// Not installed!
-		// Fallback for OSGi environments
-		return Singleton.INSTANCE;
-	}
-
-	public static BundleFileSystem newFileSystemFromExisting(Path bundle)
-			throws FileNotFoundException, IOException {
-		URI w;
-		try {
-			w = new URI(APP, bundle.toUri().toASCIIString(), null);
-		} catch (URISyntaxException e) {
-			throw new IllegalArgumentException("Can't create app: URI for "
-					+ bundle);
-		}
-
-		Map<String, Object> options = new HashMap<>();
-
-		// useTempFile not needed as we override
-		// newByteChannel to use newFileChannel() - which don't
-		// consume memory
-		// options.put("useTempFile", true);
-
-		FileSystem fs = FileSystems.newFileSystem(w, options,
-				BundleFileSystemProvider.class.getClassLoader());
-		return (BundleFileSystem) fs;
-
-		// To avoid multiple instances of this provider in an OSGi environment,
-		// the above official API calls could be replaced with:
-
-		// return getInstance().newFileSystem(w, Collections.<String, Object>
-		// emptyMap());
-
-		// which would fall back to Singleton.INSTANCE if there is no provider.
-	}
-
-	public static BundleFileSystem newFileSystemFromNew(Path bundle)
-			throws FileNotFoundException, IOException {
-		return newFileSystemFromNew(bundle,
-				APPLICATION_VND_WF4EVER_ROBUNDLE_ZIP);
-	}
-
-	public static BundleFileSystem newFileSystemFromNew(Path bundle,
-			String mimetype) throws FileNotFoundException, IOException {
-		createBundleAsZip(bundle, mimetype);
-		return newFileSystemFromExisting(bundle);
-	}
-
-	public static BundleFileSystem newFileSystemFromTemporary()
-			throws IOException {
-		Path bundle = TemporaryFiles.temporaryBundle();
-		BundleFileSystem fs = BundleFileSystemProvider.newFileSystemFromNew(
-				bundle, null);
-		return fs;
-	}
-
-	private Boolean jarDoubleEscaping;
-
-	/**
-	 * Public constructor provided for FileSystemProvider.installedProviders().
-	 * Use #getInstance() instead.
-	 * 
-	 * @deprecated
-	 */
-	@Deprecated
-	public BundleFileSystemProvider() {
-	}
-
-	private boolean asBoolean(Object object, boolean defaultValue) {
-		if (object instanceof Boolean) {
-			return (Boolean) object;
-		}
-		if (object instanceof String) {
-			return Boolean.valueOf((String) object);
-		}
-		return defaultValue;
-	}
-
-	protected URI baseURIFor(URI uri) {
-		if (!(uri.getScheme().equals(APP))) {
-			throw new IllegalArgumentException("Unsupported scheme in: " + uri);
-		}
-		if (!uri.isOpaque()) {
-			return uri.resolve("/");
-		}
-		Path localPath = localPathFor(uri);
-		Path realPath;
-		try {
-			realPath = localPath.toRealPath();
-		} catch (IOException ex) {
-			realPath = localPath.toAbsolutePath();
-		}
-		// Generate a UUID from the MD5 of the URI of the real path (!)
-		UUID uuid = UUID.nameUUIDFromBytes(realPath.toUri().toASCIIString()
-				.getBytes(UTF8));
-		try {
-			return new URI(APP, uuid.toString(), "/", null);
-		} catch (URISyntaxException e) {
-			throw new IllegalStateException("Can't create app:// URI for: "
-					+ uuid);
-		}
-	}
-
-	@Override
-	public void checkAccess(Path path, AccessMode... modes) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		origProvider(path).checkAccess(fs.unwrap(path), modes);
-	}
-
-	@Override
-	public void copy(Path source, Path target, CopyOption... options)
-			throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) source.getFileSystem();
-		origProvider(source)
-				.copy(fs.unwrap(source), fs.unwrap(target), options);
-	}
-
-	@Override
-	public void createDirectory(Path dir, FileAttribute<?>... attrs)
-			throws IOException {
-		// Workaround http://stackoverflow.com/questions/16588321/
-		if (Files.exists(dir)) {
-			throw new FileAlreadyExistsException(dir.toString());
-		}
-		BundleFileSystem fs = (BundleFileSystem) dir.getFileSystem();
-		origProvider(dir).createDirectory(fs.unwrap(dir), attrs);
-	}
-
-	@Override
-	public void delete(Path path) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		origProvider(path).delete(fs.unwrap(path));
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		return getClass() == obj.getClass();
-	}
-
-	@Override
-	public <V extends FileAttributeView> V getFileAttributeView(Path path,
-			Class<V> type, LinkOption... options) {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		if (path.toAbsolutePath().equals(fs.getRootDirectory())) {
-			// Bug in ZipFS, it will fall over as there is no entry for /
-			//
-			// Instead we'll just give a view of the source (e.g. the zipfile
-			// itself).
-			// Modifying its times is a bit futile since they are likely to be
-			// overriden when closing, but this avoids a NullPointerException
-			// in Files.setTimes().
-			return Files.getFileAttributeView(fs.getSource(), type, options);
-		}
-		return origProvider(path).getFileAttributeView(fs.unwrap(path), type,
-				options);
-	}
-
-	@Override
-	public FileStore getFileStore(Path path) throws IOException {
-		BundlePath bpath = (BundlePath) path;
-		return bpath.getFileSystem().getFileStore();
-	}
-
-	@Override
-	public BundleFileSystem getFileSystem(URI uri) {
-		synchronized (openFilesystems) {
-			URI baseURI = baseURIFor(uri);
-			WeakReference<BundleFileSystem> ref = openFilesystems.get(baseURI);
-			if (ref == null) {
-				throw new FileSystemNotFoundException(uri.toString());
-			}
-			BundleFileSystem fs = ref.get();
-			if (fs == null) {
-				openFilesystems.remove(baseURI);
-				throw new FileSystemNotFoundException(uri.toString());
-			}
-			return fs;
-		}
-	}
-
-	protected boolean getJarDoubleEscaping() {
-		if (jarDoubleEscaping != null) {
-			return jarDoubleEscaping;
-		}
-		// https://bugs.openjdk.java.net/browse/JDK-8001178 introduced an
-		// inconsistent
-		// URI syntax. Before 7u40, jar: URIs to ZipFileSystemProvided had to
-		// have
-		// double-escaped the URI for the ZIP file, after 7u40 it is only
-		// escaped once.
-		// E.g.
-		// to open before 7u40 you needed
-		// jar:file:///file%2520with%2520spaces.zip, now you need
-		// jar:file:///file%20with%20spaces.zip
-		//
-		// The new format is now consistent with URL.openStream() and
-		// URLClassLoader's traditional jar: syntax, but somehow
-		// zippath.toUri() still returns the double-escaped one, which
-		// should only affects BundleFileSystem.findSource(). To help
-		// findSource()
-		// if this new bug is later fixed, we here detect which escaping style
-		// is used.
-
-		String name = "jar test";
-		try {
-			Path tmp = Files.createTempFile(name, ".zip");
-			if (!tmp.toUri().toASCIIString().contains("jar%20test")) {
-				// Hmm.. spaces not allowed in tmp? As we don't know, we'll
-				// assume Java 7 behaviour
-				jarDoubleEscaping = false;
-				return jarDoubleEscaping;
-			}
-			createBundleAsZip(tmp, null);
-			try (FileSystem fs = FileSystems.newFileSystem(tmp, null)) {
-				URI root = fs.getRootDirectories().iterator().next().toUri();
-				if (root.toASCIIString().contains("jar%2520test")) {
-					jarDoubleEscaping = true;
-				} else {
-					jarDoubleEscaping = false;
-				}
-			}
-			Files.delete(tmp);
-		} catch (IOException e) {
-			// Unknown error.. we'll assume Java 7 behaviour
-			jarDoubleEscaping = true;
-		}
-		return jarDoubleEscaping;
-
-	}
-
-	@Override
-	public Path getPath(URI uri) {
-		BundleFileSystem fs = getFileSystem(uri);
-		Path r = fs.getRootDirectory();
-		if (uri.isOpaque()) {
-			return r;
-		} else {
-			return r.resolve(uri.getPath());
-		}
-	}
-
-	@Override
-	public String getScheme() {
-		return APP;
-	}
-
-	@Override
-	public int hashCode() {
-		return getClass().hashCode();
-	}
-
-	@Override
-	public boolean isHidden(Path path) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		return origProvider(path).isHidden(fs.unwrap(path));
-	}
-
-	@Override
-	public boolean isSameFile(Path path, Path path2) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		return origProvider(path).isSameFile(fs.unwrap(path), fs.unwrap(path2));
-	}
-
-	private Path localPathFor(URI uri) {
-		URI localUri = URI.create(uri.getSchemeSpecificPart());
-		return Paths.get(localUri);
-	}
-
-	@Override
-	public void move(Path source, Path target, CopyOption... options)
-			throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) source.getFileSystem();
-		origProvider(source)
-				.copy(fs.unwrap(source), fs.unwrap(target), options);
-	}
-
-	@Override
-	public SeekableByteChannel newByteChannel(Path path,
-			Set<? extends OpenOption> options, FileAttribute<?>... attrs)
-			throws IOException {
-		final BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		Path zipPath = fs.unwrap(path);
-		if (options.contains(StandardOpenOption.WRITE)
-				|| options.contains(StandardOpenOption.APPEND)) {
-
-			if (Files.isDirectory(zipPath)) {
-				// Workaround for ZIPFS allowing dir and folder to somewhat
-				// co-exist
-				throw new FileAlreadyExistsException("Directory <"
-						+ zipPath.toString() + "> exists");
-			}
-			Path parent = zipPath.getParent();
-
-			if (parent != null && !Files.isDirectory(parent)) {
-				throw new NoSuchFileException(zipPath.toString(),
-						parent.toString(), "Parent of file is not a directory");
-			}
-			if (options.contains(StandardOpenOption.CREATE_NEW)) {
-			} else if (options.contains(StandardOpenOption.CREATE)
-					&& !Files.exists(zipPath)) {
-				// Workaround for bug in ZIPFS in Java 7 -
-				// it only creates new files on
-				// StandardOpenOption.CREATE_NEW
-				//
-				// We'll fake it and just create file first using the legacy
-				// newByteChannel()
-				// - we can't inject CREATE_NEW option as it
-				// could be that there are two concurrent calls to CREATE
-				// the very same file,
-				// with CREATE_NEW the second thread would then fail.
-
-				EnumSet<StandardOpenOption> opts = EnumSet
-						.of(StandardOpenOption.WRITE,
-								StandardOpenOption.CREATE_NEW);
-				origProvider(path).newFileChannel(zipPath, opts, attrs).close();
-
-			}
-		}
-
-		// Implement by newFileChannel to avoid memory leaks and
-		// allow manifest to be updated
-		return newFileChannel(path, options, attrs);
-	}
-
-	@Override
-	public DirectoryStream<Path> newDirectoryStream(Path dir,
-			final Filter<? super Path> filter) throws IOException {
-		final BundleFileSystem fs = (BundleFileSystem) dir.getFileSystem();
-		final DirectoryStream<Path> stream = origProvider(dir)
-				.newDirectoryStream(fs.unwrap(dir), new Filter<Path>() {
-					@Override
-					public boolean accept(Path entry) throws IOException {
-						return filter.accept(fs.wrap(entry));
-					}
-				});
-		return new DirectoryStream<Path>() {
-			@Override
-			public void close() throws IOException {
-				stream.close();
-			}
-
-			@Override
-			public Iterator<Path> iterator() {
-				return fs.wrapIterator(stream.iterator());
-			}
-		};
-	}
-
-	@Override
-	public FileChannel newFileChannel(Path path,
-			Set<? extends OpenOption> options, FileAttribute<?>... attrs)
-			throws IOException {
-		final BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		FileChannel fc = origProvider(path).newFileChannel(fs.unwrap(path),
-				options, attrs);
-		return new BundleFileChannel(fc, path, options, attrs);
-	}
-
-	@Override
-	public FileSystem newFileSystem(Path path, Map<String, ?> env)
-			throws IOException {
-		URI uri;
-		try {
-			uri = new URI(APP, path.toUri().toASCIIString(), null);
-		} catch (URISyntaxException e) {
-			throw new IllegalArgumentException("Can't create app: URI for "
-					+ path);
-		}
-		return newFileSystem(uri, env);
-	}
-
-	@Override
-	public BundleFileSystem newFileSystem(URI uri, Map<String, ?> env)
-			throws IOException {
-
-		Path localPath = localPathFor(uri);
-		URI baseURI = baseURIFor(uri);
-
-		if (asBoolean(env.get("create"), false)) {
-			createBundleAsZip(localPath, (String) env.get("mimetype"));
-		}
-
-		BundleFileSystem fs;
-		synchronized (openFilesystems) {
-			WeakReference<BundleFileSystem> existingRef = openFilesystems
-					.get(baseURI);
-			if (existingRef != null) {
-				BundleFileSystem existing = existingRef.get();
-				if (existing != null && existing.isOpen()) {
-					throw new FileSystemAlreadyExistsException(
-							baseURI.toASCIIString());
-				}
-			}
-			FileSystem origFs = FileSystems.newFileSystem(localPath, null);
-			fs = new BundleFileSystem(origFs, baseURI);
-			openFilesystems.put(baseURI,
-					new WeakReference<BundleFileSystem>(fs));
-		}
-		return fs;
-	}
-
-	@Override
-	public InputStream newInputStream(Path path, OpenOption... options)
-			throws IOException {
-		// Avoid copying out to a file, like newByteChannel / newFileChannel
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		return origProvider(path).newInputStream(fs.unwrap(path), options);
-	}
-
-	@Override
-	public OutputStream newOutputStream(Path path, OpenOption... options)
-			throws IOException {
-		BundleFileSystem fileSystem = (BundleFileSystem) path.getFileSystem();
-		if (fileSystem.getRootDirectory().resolve(path)
-				.equals(fileSystem.getRootDirectory().resolve(MIMETYPE_FILE))) {
-			// Special case to avoid compression
-			return origProvider(path).newOutputStream(fileSystem.unwrap(path),
-					options);
-		}
-		return super.newOutputStream(path, options);
-	}
-
-	private FileSystemProvider origProvider(Path path) {
-		return ((BundlePath) path).getFileSystem().getOrigFS().provider();
-	}
-
-	@Override
-	public <A extends BasicFileAttributes> A readAttributes(Path path,
-			Class<A> type, LinkOption... options) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		return origProvider(path)
-				.readAttributes(fs.unwrap(path), type, options);
-	}
-
-	@Override
-	public Map<String, Object> readAttributes(Path path, String attributes,
-			LinkOption... options) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		return origProvider(path).readAttributes(fs.unwrap(path), attributes,
-				options);
-	}
-
-	@Override
-	public void setAttribute(Path path, String attribute, Object value,
-			LinkOption... options) throws IOException {
-		BundleFileSystem fs = (BundleFileSystem) path.getFileSystem();
-		origProvider(path).setAttribute(fs.unwrap(path), attribute, value,
-				options);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileTypeDetector.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileTypeDetector.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileTypeDetector.java
deleted file mode 100644
index 03f8272..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundleFileTypeDetector.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.apache.taverna.robundle.fs;
-
-/*
- * 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 java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
-import java.nio.file.spi.FileTypeDetector;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipError;
-import java.util.zip.ZipException;
-import java.util.zip.ZipInputStream;
-
-public class BundleFileTypeDetector extends FileTypeDetector {
-
-	private static final String APPLICATION_ZIP = "application/zip";
-	private static final Charset ASCII = Charset.forName("ASCII");
-	private static final Charset LATIN1 = Charset.forName("ISO-8859-1");
-	private static final String MIMETYPE = "mimetype";
-
-	@Override
-	public String probeContentType(Path path) throws IOException {
-
-		ByteBuffer buf = ByteBuffer.allocate(256);
-		try (SeekableByteChannel byteChannel = Files.newByteChannel(path,
-				StandardOpenOption.READ)) {
-			int read = byteChannel.read(buf);
-			if (read < 38) {
-				return null;
-			}
-			;
-		}
-		buf.flip();
-
-		// Look for PK
-
-		byte[] firstBytes = buf.array();
-		String pk = new String(firstBytes, 0, 2, LATIN1);
-		if (!(pk.equals("PK") && firstBytes[2] == 3 && firstBytes[3] == 4)) {
-			// Did not match magic numbers of ZIP as specified in ePub OCF
-			// http://www.idpf.org/epub/30/spec/epub30-ocf.html#app-media-type
-			return null;
-		}
-
-		String mimetype = new String(firstBytes, 30, 8, LATIN1);
-		if (!mimetype.equals(MIMETYPE)) {
-			return APPLICATION_ZIP;
-		}
-		// Read the 'mimetype' file.
-		try (ZipInputStream is = new ZipInputStream(new ByteArrayInputStream(
-				firstBytes))) {
-			ZipEntry entry = is.getNextEntry();
-			if (!MIMETYPE.equals(entry.getName())) {
-				return APPLICATION_ZIP;
-			}
-			byte[] mediaTypeBuffer = new byte[256];
-			int size = is.read(mediaTypeBuffer);
-			if (size < 1) {
-				return APPLICATION_ZIP;
-			}
-			return new String(mediaTypeBuffer, 0, size, ASCII);
-		} catch (ZipException | ZipError e) {
-			return null;
-		}
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundlePath.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundlePath.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundlePath.java
deleted file mode 100644
index 93da6c0..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/fs/BundlePath.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package org.apache.taverna.robundle.fs;
-
-/*
- * 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 java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.LinkOption;
-import java.nio.file.Path;
-import java.nio.file.WatchEvent.Kind;
-import java.nio.file.WatchEvent.Modifier;
-import java.nio.file.WatchKey;
-import java.nio.file.WatchService;
-import java.util.Iterator;
-
-public class BundlePath implements Path {
-
-	private final BundleFileSystem fs;
-
-	private final Path zipPath;
-
-	protected BundlePath(BundleFileSystem fs, Path zipPath) {
-		if (fs == null || zipPath == null) {
-			throw new NullPointerException();
-		}
-		this.fs = fs;
-		this.zipPath = zipPath;
-	}
-
-	@Override
-	public int compareTo(Path other) {
-		return zipPath.compareTo(fs.unwrap(other));
-	}
-
-	@Override
-	public boolean endsWith(Path other) {
-		return zipPath.endsWith(fs.unwrap(other));
-	}
-
-	@Override
-	public boolean endsWith(String other) {
-		return zipPath.endsWith(other);
-	}
-
-	@Override
-	public boolean equals(Object other) {
-		if (!(other instanceof BundlePath)) {
-			return false;
-		}
-		BundlePath bundlePath = (BundlePath) other;
-		return zipPath.equals(fs.unwrap(bundlePath));
-	}
-
-	@Override
-	public BundlePath getFileName() {
-		return fs.wrap(zipPath.getFileName());
-	}
-
-	@Override
-	public BundleFileSystem getFileSystem() {
-		return fs;
-	}
-
-	@Override
-	public BundlePath getName(int index) {
-		return fs.wrap(zipPath.getName(index));
-	}
-
-	@Override
-	public int getNameCount() {
-		return zipPath.getNameCount();
-	}
-
-	@Override
-	public BundlePath getParent() {
-		return fs.wrap(zipPath.getParent());
-	}
-
-	@Override
-	public BundlePath getRoot() {
-		return fs.wrap(zipPath.getRoot());
-	}
-
-	protected Path getZipPath() {
-		return zipPath;
-	}
-
-	@Override
-	public int hashCode() {
-		return zipPath.hashCode();
-	}
-
-	@Override
-	public boolean isAbsolute() {
-		return zipPath.isAbsolute();
-	}
-
-	@Override
-	public Iterator<Path> iterator() {
-		return fs.wrapIterator(zipPath.iterator());
-	}
-
-	@Override
-	public BundlePath normalize() {
-		return fs.wrap(zipPath.normalize());
-	}
-
-	@Override
-	public WatchKey register(WatchService watcher, Kind<?>... events)
-			throws IOException {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public WatchKey register(WatchService watcher, Kind<?>[] events,
-			Modifier... modifiers) throws IOException {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public BundlePath relativize(Path other) {
-		return fs.wrap(zipPath.relativize(fs.unwrap(other)));
-	}
-
-	@Override
-	public BundlePath resolve(Path other) {
-		return fs.wrap(zipPath.resolve(fs.unwrap(other)));
-	}
-
-	@Override
-	public BundlePath resolve(String other) {
-		return fs.wrap(zipPath.resolve(other));
-	}
-
-	@Override
-	public BundlePath resolveSibling(Path other) {
-		return fs.wrap(zipPath.resolveSibling(fs.unwrap(other)));
-	}
-
-	@Override
-	public BundlePath resolveSibling(String other) {
-		return fs.wrap(zipPath.resolveSibling(other));
-	}
-
-	@Override
-	public boolean startsWith(Path other) {
-		return zipPath.startsWith(fs.unwrap(other));
-	}
-
-	@Override
-	public boolean startsWith(String other) {
-		return zipPath.startsWith(other);
-	}
-
-	@Override
-	public BundlePath subpath(int beginIndex, int endIndex) {
-		return fs.wrap(zipPath.subpath(beginIndex, endIndex));
-	}
-
-	@Override
-	public BundlePath toAbsolutePath() {
-		return fs.wrap(zipPath.toAbsolutePath());
-	}
-
-	@Override
-	public File toFile() {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public BundlePath toRealPath(LinkOption... options) throws IOException {
-		return fs.wrap(zipPath.toRealPath(options));
-	}
-
-	/**
-	 * Note: This method is used by JSON serialization and should return a valid
-	 * relative path from .ro/ or /
-	 */
-	@Override
-	public String toString() {
-		if (zipPath.isAbsolute() && zipPath.startsWith("/.ro/")) {
-			Path base = fs.getRootDirectory().zipPath.resolve(".ro");
-			return base.relativize(zipPath).toString();
-		} else {
-			return zipPath.toString();
-		}
-	}
-
-	@Override
-	public URI toUri() {
-		Path abs = zipPath.toAbsolutePath();
-		URI pathRel;
-		try {
-			pathRel = new URI(null, null, abs.toString(), null);
-		} catch (URISyntaxException e) {
-			throw new IllegalStateException("Can't create URL for " + zipPath,
-					e);
-		}
-		return fs.getBaseURI().resolve(pathRel);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Agent.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Agent.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Agent.java
deleted file mode 100644
index 17a7c42..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Agent.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.apache.taverna.robundle.manifest;
-
-/*
- * 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 java.net.URI;
-
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-
-@JsonPropertyOrder(value = { "uri", "orcid", "name" })
-public class Agent {
-	private String name;
-	private URI orcid;
-	private URI uri;
-
-	public Agent() {
-	}
-
-	public Agent(String name) {
-		setName(name);
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public URI getOrcid() {
-		return orcid;
-	}
-
-	public URI getUri() {
-		return uri;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setOrcid(URI orcid) {
-		this.orcid = orcid;
-	}
-
-	public void setUri(URI uri) {
-		this.uri = uri;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Manifest.java
----------------------------------------------------------------------
diff --git a/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Manifest.java b/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Manifest.java
deleted file mode 100644
index e8a6394..0000000
--- a/taverna-robundle/src/main/java/org/apache/taverna/robundle/manifest/Manifest.java
+++ /dev/null
@@ -1,450 +0,0 @@
-package org.apache.taverna.robundle.manifest;
-
-/*
- * 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 com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS;
-import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
-import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_EMPTY_JSON_ARRAYS;
-import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_NULL_MAP_VALUES;
-import static java.nio.file.FileVisitResult.CONTINUE;
-import static java.nio.file.FileVisitResult.SKIP_SUBTREE;
-import static java.nio.file.Files.createDirectories;
-import static java.nio.file.Files.getLastModifiedTime;
-import static java.nio.file.Files.isDirectory;
-import static java.nio.file.Files.newBufferedWriter;
-import static java.nio.file.Files.walkFileTree;
-import static java.nio.file.StandardOpenOption.CREATE;
-import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
-import static java.nio.file.StandardOpenOption.WRITE;
-import static java.nio.file.attribute.FileTime.fromMillis;
-import static org.apache.taverna.robundle.Bundles.uriToBundlePath;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.net.URI;
-import java.nio.charset.Charset;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileTime;
-import java.util.ArrayList;
-import java.util.GregorianCalendar;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import org.apache.taverna.robundle.Bundle;
-import org.apache.taverna.robundle.manifest.combine.CombineManifest;
-import org.apache.taverna.robundle.manifest.odf.ODFManifest;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.annotation.JsonValue;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-@JsonPropertyOrder(value = { "@context", "id", "manifest", "createdOn",
-		"createdBy", "createdOn", "authoredOn", "authoredBy", "history",
-		"aggregates", "annotations", "@graph" })
-public class Manifest {
-	public abstract class FileTimeMixin {
-		@Override
-		@JsonValue
-		public abstract String toString();
-	}
-
-	public abstract class PathMixin {
-		@Override
-		@JsonValue
-		public abstract String toString();
-	}
-
-	private static Logger logger = Logger.getLogger(Manifest.class
-			.getCanonicalName());
-
-	private static final String MANIFEST_JSON = "manifest.json";
-
-	private static final String META_INF = "/META-INF";
-
-	private static final String MIMETYPE = "/mimetype";
-	private static final String RO = "/.ro";
-	private static URI ROOT = URI.create("/");
-
-	public static FileTime now() {
-		return fromMillis(new GregorianCalendar().getTimeInMillis());
-	}
-
-	protected static Path withSlash(Path dir) {
-		if (dir == null)
-			return null;
-		if (isDirectory(dir)) {
-			Path fname = dir.getFileName();
-			if (fname == null)
-				return dir;
-			String fnameStr = fname.toString();
-			if (fnameStr.endsWith("/"))
-				return dir;
-			return dir.resolveSibling(fnameStr + "/");
-		}
-		return dir;
-	}
-
-	private Map<URI, PathMetadata> aggregates = new LinkedHashMap<>();
-	private List<PathAnnotation> annotations = new ArrayList<>();
-	private List<Agent> authoredBy = new ArrayList<>();
-	private FileTime authoredOn;
-	private Bundle bundle;
-	private Agent createdBy = null;
-	private FileTime createdOn = now();
-	private List<String> graph;
-	private List<Path> history = new ArrayList<>();
-	private URI id = URI.create("/");
-	private List<Path> manifest = new ArrayList<>();
-
-	public Manifest(Bundle bundle) {
-		this.bundle = bundle;
-	}
-
-	public List<PathMetadata> getAggregates() {
-		return new ArrayList<>(aggregates.values());
-	}
-
-	public PathMetadata getAggregation(Path file) {
-		URI fileUri = file.toUri();
-		return getAggregation(fileUri);
-	}
-
-	public PathMetadata getAggregation(URI uri) {
-		uri = relativeToBundleRoot(uri);
-		PathMetadata metadata = aggregates.get(uri);
-		if (metadata == null) {
-			metadata = new PathMetadata();
-			if (!uri.isAbsolute() && uri.getFragment() == null) {
-				Path path = uriToBundlePath(bundle, uri);
-				metadata.setFile(path);
-				metadata.setMediatype(guessMediaType(path));
-			} else {
-				metadata.setUri(uri);
-			}
-			aggregates.put(uri, metadata);
-		}
-		return metadata;
-	}
-
-	public List<PathAnnotation> getAnnotations() {
-		return annotations;
-	}
-
-	public List<Agent> getAuthoredBy() {
-		return authoredBy;
-	}
-
-	public FileTime getAuthoredOn() {
-		return authoredOn;
-	}
-
-	@JsonIgnore
-	public URI getBaseURI() {
-		return getBundle().getRoot().toUri();
-	}
-
-	@JsonIgnore
-	public Bundle getBundle() {
-		return bundle;
-	}
-
-	@JsonProperty(value = "@context")
-	public List<Object> getContext() {
-		ArrayList<Object> context = new ArrayList<>();
-		// HashMap<Object, Object> map = new HashMap<>();
-		// map.put("@base", getBaseURI());
-		// context.add(map);
-		context.add(URI.create("https://w3id.org/bundle/context"));
-		return context;
-	}
-
-	public Agent getCreatedBy() {
-		return createdBy;
-	}
-
-	public FileTime getCreatedOn() {
-		return createdOn;
-	}
-
-	public List<String> getGraph() {
-		return graph;
-	}
-
-	public List<Path> getHistory() {
-		return history;
-	}
-
-	public URI getId() {
-		return id;
-	}
-
-	public List<Path> getManifest() {
-		return manifest;
-	}
-
-	/**
-	 * Guess media type based on extension
-	 * 
-	 * @see http://wf4ever.github.io/ro/bundle/#media-types
-	 * 
-	 * @param file
-	 *            A Path to a file
-	 * @return media-type, e.g. <code>application/xml</code> or
-	 *         <code>text/plain; charset="utf-8"</code>
-	 */
-	public String guessMediaType(Path file) {
-		if (file.getFileName() == null)
-			return null;
-		String filename = file.getFileName().toString()
-				.toLowerCase(Locale.ENGLISH);
-		if (filename.endsWith(".txt"))
-			return "text/plain; charset=\"utf-8\"";
-		if (filename.endsWith(".ttl"))
-			return "text/turtle; charset=\"utf-8\"";
-		if (filename.endsWith(".rdf") || filename.endsWith(".owl"))
-			return "application/rdf+xml";
-		if (filename.endsWith(".json"))
-			return "application/json";
-		if (filename.endsWith(".jsonld"))
-			return "application/ld+json";
-		if (filename.endsWith(".xml"))
-			return "application/xml";
-
-		// A few extra, common ones
-
-		if (filename.endsWith(".png"))
-			return "image/png";
-		if (filename.endsWith(".svg"))
-			return "image/svg+xml";
-		if (filename.endsWith(".jpg") || filename.endsWith(".jpeg"))
-			return "image/jpeg";
-		if (filename.endsWith(".pdf"))
-			return "application/pdf";
-		return "application/octet-stream";
-	}
-
-	public void populateFromBundle() throws IOException {
-		final Set<Path> potentiallyEmptyFolders = new LinkedHashSet<>();
-
-		final Set<URI> existingAggregationsToPrune = new HashSet<>(
-				aggregates.keySet());
-
-		walkFileTree(bundle.getRoot(), new SimpleFileVisitor<Path>() {
-			@SuppressWarnings("deprecation")
-			@Override
-			public FileVisitResult postVisitDirectory(Path dir, IOException exc)
-					throws IOException {
-				super.postVisitDirectory(dir, exc);
-				if (potentiallyEmptyFolders.remove(dir)) {
-					URI uri = relativeToBundleRoot(dir.toUri());
-					existingAggregationsToPrune.remove(uri);
-					PathMetadata metadata = aggregates.get(uri);
-					if (metadata == null) {
-						metadata = new PathMetadata();
-						aggregates.put(uri, metadata);
-					}
-					metadata.setFile(withSlash(dir));
-					metadata.setFolder(withSlash(dir.getParent()));
-					metadata.setProxy();
-					metadata.setCreatedOn(getLastModifiedTime(dir));
-					potentiallyEmptyFolders.remove(withSlash(dir.getParent()));
-					return CONTINUE;
-				}
-				return CONTINUE;
-			}
-
-			@Override
-			public FileVisitResult preVisitDirectory(Path dir,
-					BasicFileAttributes attrs) throws IOException {
-				if (dir.startsWith(RO) || dir.startsWith(META_INF))
-					return SKIP_SUBTREE;
-				potentiallyEmptyFolders.add(withSlash(dir));
-				potentiallyEmptyFolders.remove(withSlash(dir.getParent()));
-				return CONTINUE;
-			}
-
-			@SuppressWarnings("deprecation")
-			@Override
-			public FileVisitResult visitFile(Path file,
-					BasicFileAttributes attrs) throws IOException {
-				potentiallyEmptyFolders.remove(withSlash(file.getParent()));
-				if (file.startsWith(MIMETYPE))
-					return CONTINUE;
-				if (manifest.contains(file))
-					// Don't aggregate the manifests
-					return CONTINUE;
-
-				// super.visitFile(file, attrs);
-				URI uri = relativeToBundleRoot(file.toUri());
-				existingAggregationsToPrune.remove(uri);
-				PathMetadata metadata = aggregates.get(uri);
-				if (metadata == null) {
-					metadata = new PathMetadata();
-					aggregates.put(uri, metadata);
-				}
-				metadata.setFile(file);
-				if (metadata.getMediatype() == null)
-					// Don't override if already set
-					metadata.setMediatype(guessMediaType(file));
-				metadata.setFolder(withSlash(file.getParent()));
-				metadata.setProxy();
-				metadata.setCreatedOn(getLastModifiedTime(file));
-				potentiallyEmptyFolders.remove(file.getParent());
-				return CONTINUE;
-			}
-		});
-		for (URI preExisting : existingAggregationsToPrune) {
-			PathMetadata meta = aggregates.get(preExisting);
-			if (meta.getFile() != null)
-				/*
-				 * Don't remove 'virtual' resources, only aggregations that went
-				 * to files
-				 */
-				aggregates.remove(preExisting);
-		}
-	}
-
-	public URI relativeToBundleRoot(URI uri) {
-		uri = ROOT.resolve(bundle.getRoot().toUri().relativize(uri));
-		return uri;
-	}
-
-	@SuppressWarnings("deprecation")
-	public void setAggregates(List<PathMetadata> aggregates) {
-		this.aggregates.clear();
-
-		for (PathMetadata meta : aggregates) {
-			URI uri = null;
-			if (meta.getFile() != null) {
-				uri = relativeToBundleRoot(meta.getFile().toUri());
-			} else if (meta.getUri() != null) {
-				uri = relativeToBundleRoot(meta.getUri());
-			} else {
-				uri = relativeToBundleRoot(meta.getProxy());
-			}
-			if (uri == null) {
-				logger.warning("Unknown URI for aggregation " + meta);
-				continue;
-			}
-			this.aggregates.put(uri, meta);
-		}
-	}
-
-	public void setAnnotations(List<PathAnnotation> annotations) {
-		this.annotations = annotations;
-	}
-
-	public void setAuthoredBy(List<Agent> authoredBy) {
-		if (authoredBy == null)
-			throw new NullPointerException("authoredBy can't be null");
-		this.authoredBy = authoredBy;
-	}
-
-	public void setAuthoredOn(FileTime authoredOn) {
-		this.authoredOn = authoredOn;
-	}
-
-	public void setBundle(Bundle bundle) {
-		this.bundle = bundle;
-	}
-
-	public void setCreatedBy(Agent createdBy) {
-		this.createdBy = createdBy;
-	}
-
-	public void setCreatedOn(FileTime createdOn) {
-		this.createdOn = createdOn;
-	}
-
-	public void setGraph(List<String> graph) {
-		this.graph = graph;
-	}
-
-	public void setHistory(List<Path> history) {
-		if (history == null)
-			throw new NullPointerException("history can't be null");
-		this.history = history;
-	}
-
-	public void setId(URI id) {
-		this.id = id;
-	}
-
-	public void setManifest(List<Path> manifest) {
-		this.manifest = manifest;
-	}
-
-	public void writeAsCombineManifest() throws IOException {
-		new CombineManifest(this).createManifestXML();
-	}
-
-	/**
-	 * Write as an RO Bundle JSON-LD manifest
-	 * 
-	 * @return The path of the written manifest (e.g. ".ro/manifest.json")
-	 * @throws IOException
-	 */
-	public Path writeAsJsonLD() throws IOException {
-		Path jsonld = bundle.getFileSystem().getPath(RO, MANIFEST_JSON);
-		createDirectories(jsonld.getParent());
-		// Files.createFile(jsonld);
-		if (!getManifest().contains(jsonld))
-			getManifest().add(0, jsonld);
-		ObjectMapper om = new ObjectMapper();
-		om.addMixInAnnotations(Path.class, PathMixin.class);
-		om.addMixInAnnotations(FileTime.class, FileTimeMixin.class);
-		om.enable(INDENT_OUTPUT);
-		om.disable(WRITE_EMPTY_JSON_ARRAYS);
-		om.disable(FAIL_ON_EMPTY_BEANS);
-		om.disable(WRITE_NULL_MAP_VALUES);
-
-		om.setSerializationInclusion(Include.NON_NULL);
-		try (Writer w = newBufferedWriter(jsonld, Charset.forName("UTF-8"),
-				WRITE, TRUNCATE_EXISTING, CREATE)) {
-			om.writeValue(w, this);
-		}
-		return jsonld;
-	}
-
-	/**
-	 * Write as a ODF manifest.xml
-	 * 
-	 * @see http
-	 *      ://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.
-	 *      html#__RefHeading__752807_826425813
-	 * @return The path of the written manifest (e.g. "META-INF/manifest.xml")
-	 * @throws IOException
-	 */
-	public Path writeAsODFManifest() throws IOException {
-		return new ODFManifest(this).createManifestXML();
-	}
-}