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/07/02 16:48:58 UTC

[03/25] incubator-taverna-language git commit: cloning and stream handling

cloning and stream handling

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

Branch: refs/heads/ucfpackage-robundle
Commit: d3c571e5f1a7d8c5cafed65fb126c04248db7b04
Parents: 041a9f3
Author: Stian Soiland-Reyes <st...@soiland-reyes.com>
Authored: Wed Dec 11 16:40:05 2013 +0000
Committer: Stian Soiland-Reyes <so...@cs.manchester.ac.uk>
Committed: Thu Jul 2 15:05:41 2015 +0100

----------------------------------------------------------------------
 .../taverna/scufl2/ucfpackage/UCFPackage.java   | 112 +++++++++++++------
 1 file changed, 76 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/d3c571e5/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java
index fcfc55f..a1e32d3 100644
--- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java
+++ b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java
@@ -61,10 +61,12 @@ import org.purl.wf4ever.robundle.Bundles;
 import org.purl.wf4ever.robundle.manifest.Manifest;
 import org.purl.wf4ever.robundle.manifest.PathMetadata;
 import org.purl.wf4ever.robundle.utils.RecursiveDeleteVisitor;
+import org.purl.wf4ever.robundle.utils.TemporaryFiles;
 import org.w3c.dom.Document;
 
 public class UCFPackage implements Cloneable {
 	private static Logger logger = Logger.getLogger(UCFPackage.class.getName());
+	private static final URI VERSION_BASE = URI.create("http://ns.taverna.org.uk/2010/scufl2/");
 	private static final String CONTAINER_XML = "META-INF/container.xml";
 	private static final Charset UTF_8 = Charset.forName("utf-8");
 	public static final String MIME_BINARY = "application/octet-stream";
@@ -75,7 +77,7 @@ public class UCFPackage implements Cloneable {
 	public static final String MIME_WORKFLOW_BUNDLE = "application/vnd.taverna.workflow-bundle";
 
 	private static Charset ASCII = Charset.forName("ascii");
-	private OdfPackage odfPackage;
+//	private OdfPackage odfPackage;
 	private static JAXBContext jaxbContext;
 	private JAXBElement<Container> containerXml;
 	private boolean createdContainerXml = false;
@@ -85,7 +87,7 @@ public class UCFPackage implements Cloneable {
 	public UCFPackage() throws IOException {
 		try {
 		    bundle = Bundles.createBundle();
-			odfPackage = OdfPackage.create();
+			//odfPackage = OdfPackage.create();
 			parseContainerXML();
 		} catch (IOException e) {
 			throw e;
@@ -101,23 +103,24 @@ public class UCFPackage implements Cloneable {
 
 	protected void open(File containerFile) throws IOException {
 	    bundle = Bundles.openBundleReadOnly(containerFile.toPath());
-//
-//		BufferedInputStream stream = new BufferedInputStream(
-//				new FileInputStream(containerFile));
-//		try {
-//			open(stream);
-//		} finally {
-//			stream.close();
-//		}
+	    parseContainerXML();
 	}
 
 	public UCFPackage(InputStream inputStream) throws IOException {
 		open(inputStream);
 	}
 
-	protected void open(InputStream inputStream) throws IOException {
+	protected UCFPackage(Bundle bundle) {
+	    this.bundle = bundle;
+    }
+
+    protected void open(InputStream inputStream) throws IOException {
 		try {
-//			odfPackage = OdfPackage.loadPackage(inputStream);
+		    Path bundlePath = TemporaryFiles.temporaryBundle();
+		    Files.copy(inputStream, bundlePath);
+		    bundle = Bundles.openBundle(bundlePath);
+		    bundle.setDeleteOnClose(true);
+
 			parseContainerXML();
 		} catch (IOException e) {
 			throw e;
@@ -215,13 +218,16 @@ public class UCFPackage implements Cloneable {
 			// "http://www.w3.org/2000/09/xmldsig#");
 			// xmlStreamWriter.setPrefix("xmlenc",
 			// "http://www.w3.org/2001/04/xmlenc#");
-			try (OutputStream outStream = odfPackage
-					.insertOutputStream(CONTAINER_XML)) {
-				// FIXME: Set namespace prefixes and default namespace
-				marshaller.setProperty("jaxb.formatted.output", true);
-				// TODO: Ensure using default namespace
-				marshaller.marshal(containerXml, outStream);
-			}
+			outStream = Files.newOutputStream(bundle.getRoot().resolve(CONTAINER_XML));
+			//outStream = odfPackage.insertOutputStream(CONTAINER_XML);
+
+			// FIXME: Set namespace prefixes and default namespace
+
+			marshaller.setProperty("jaxb.formatted.output", true);
+
+			// TODO: Ensure using default namespace
+			marshaller.marshal(containerXml, outStream);
+
 		} catch (IOException e) {
 			throw e;
 		} catch (Exception e) {
@@ -343,6 +349,7 @@ public class UCFPackage implements Cloneable {
 	}
 
 	public class ResourceEntry {
+
         private Path path;
 
 		public ResourceEntry(Path path) {
@@ -411,8 +418,7 @@ public class UCFPackage implements Cloneable {
                 throw new RuntimeException("Can't look up version for " + path, e);
             }
             if (conformsTo != null) {
-                URI scufl2Release = URI.create("http://ns.taverna.org.uk/2010/scufl2/");
-                URI version = scufl2Release.relativize(conformsTo);
+                URI version = VERSION_BASE.relativize(conformsTo);
                 if (!version.isAbsolute()) {
                     return version.toString();
                 }
@@ -435,7 +441,19 @@ public class UCFPackage implements Cloneable {
 		ResourceEntry rootFile = getResourceEntry(path);
 		if (rootFile == null)
 			throw new IllegalArgumentException("Unknown resource: " + path);
-		odfPackage.getManifestEntries().get(path).setVersion(version);
+		}
+
+		URI conformsTo = null;
+		if (version != null) {
+		    conformsTo = VERSION_BASE.resolve(version);
+		    PathMetadata aggregation;
+            try {
+                aggregation = bundle.getManifest().getAggregation(rootFile.path);
+            } catch (IOException e) {
+                throw new RuntimeException("Can't get root file aggregation for " + path, e);
+            }
+		    aggregation.setConformsTo(conformsTo);
+		}
 
 		Container container = containerXml.getValue();
 
@@ -570,25 +588,47 @@ public class UCFPackage implements Cloneable {
 			// as we need to parse it after insertion, this must fail
 			throw new IllegalArgumentException("Can't add " + CONTAINER_XML
 					+ " using OutputStream");
-		try {
-			return odfPackage.insertOutputStream(path, mediaType);
-		} catch (IOException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new IOException("Could not add " + path, e);
+			// as we need to parse it after insertion
 		}
+		Path bundlePath = bundle.getRoot().resolve(path);
+	    return Files.newOutputStream(bundlePath);
 	}
 
 	@Override
 	public UCFPackage clone() {
-		final PipedOutputStream outputStream = new PipedOutputStream();
-		try {
-			try (PipedInputStream inputStream = copyToOutputStream(outputStream)) {
-				return new UCFPackage(inputStream);
-			}
-		} catch (IOException e) {
-			throw new RuntimeException("Could not clone UCFPackage", e);
-		}
+
+	        try {
+                prepareContainerXML();
+            } catch (IOException e) {
+                throw new RuntimeException("Could not prepare " + CONTAINER_XML, e);
+            }
+
+	        Path source = bundle.getSource();
+	        boolean deleteOnClose = bundle.isDeleteOnClose();
+	        bundle.setDeleteOnClose(false);
+	        try {
+                Bundles.closeBundle(bundle);
+            } catch (IOException e) {
+                throw new RuntimeException("Could not save bundle to " + source, e);
+            }
+
+	        Bundle clonedBundle;
+            try {
+                clonedBundle = Bundles.openBundleReadOnly(source);
+            } catch (IOException e) {
+                throw new RuntimeException("Could not copy bundle from " + source, e);
+            }
+
+	        // Re-open the original source (usually a tmpfile)
+	        try {
+                bundle = Bundles.openBundle(source);
+            } catch (IOException e) {
+                throw new RuntimeException("Could not re-open from " + source, e);
+            }
+	        bundle.setDeleteOnClose(deleteOnClose);
+
+	        return new UCFPackage(clonedBundle);
+
 	}
 
 	private PipedInputStream copyToOutputStream(