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