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:23 UTC

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

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/Workflow.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/Workflow.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/Workflow.java
deleted file mode 100644
index 0b101c5..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/Workflow.java
+++ /dev/null
@@ -1,283 +0,0 @@
-package org.apache.taverna.scufl2.api.core;
-
-/*
- * 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 java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.taverna.scufl2.api.annotation.Revisioned;
-import org.apache.taverna.scufl2.api.common.AbstractRevisioned;
-import org.apache.taverna.scufl2.api.common.Child;
-import org.apache.taverna.scufl2.api.common.NamedSet;
-import org.apache.taverna.scufl2.api.common.Ported;
-import org.apache.taverna.scufl2.api.common.Visitor;
-import org.apache.taverna.scufl2.api.common.WorkflowBean;
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
-import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
-
-
-/**
- * A <code>Workflow</code> is a set of {@link Processor}s and {@link DataLink}s
- * between the <code>Processor</code>s. <code>Workflow</code>s may also have
- * input and output ports.
- * 
- * @author Alan R Williams
- * @author Stian Soiland-Reyes
- */
-public class Workflow extends AbstractRevisioned implements
-		Child<WorkflowBundle>, Ported, Revisioned {
-	public static final URI WORKFLOW_ROOT = URI
-			.create("http://ns.taverna.org.uk/2010/workflow/");
-
-	private final TreeSet<DataLink> dataLinks = new TreeSet<>();
-	private final TreeSet<ControlLink> controlLinks = new TreeSet<>();
-	private final NamedSet<InputWorkflowPort> inputPorts = new NamedSet<>();
-	private final NamedSet<OutputWorkflowPort> outputPorts = new NamedSet<>();
-	private final NamedSet<Processor> processors = new NamedSet<>();
-	private WorkflowBundle parent;
-
-	/**
-	 * Constructs a <code>Workflow</code> with a name based on a random UUID.
-	 */
-	public Workflow() {	
-	}
-
-	/**
-     * Constructs a <code>Workflow</code> with the specified name.
-     * 
-     * @param name
-     *            The name of the <code>Workflow</code>. <strong>Must
-     *            not</strong> be <code>null</code> or an empty String.
-     */
-    public Workflow(String name) {
-        super(name);
-    }
-	
-	@Override
-	public boolean accept(Visitor visitor) {
-		if (visitor.visitEnter(this)) {
-			List<WorkflowBean> children = new ArrayList<>();
-			children.addAll(getInputPorts());
-			children.addAll(getOutputPorts());
-			children.addAll(getProcessors());
-			children.addAll(getDataLinks());
-			children.addAll(getControlLinks());
-			children.add(getCurrentRevision());
-			for (WorkflowBean bean : children)
-				if (!bean.accept(visitor))
-					break;
-		}
-		return visitor.visitLeave(this);
-	}
-
-	/**
-	 * Returns the <code>ControlLink</code>s.
-	 * 
-	 * If there are no <code>ControlLink</code>s an empty set is returned.
-	 * 
-	 * @return the <code>ControlLink</code>s
-	 */
-	public Set<ControlLink> getControlLinks() {
-		return controlLinks;
-	}
-	
-	/**
-	 * Returns the <code>DataLink</code>s.
-	 * 
-	 * If there are no <code>DataLink</code>s an empty set is returned.
-	 * 
-	 * @return the <code>DataLink</code>s.
-	 */
-	public Set<DataLink> getDataLinks() {
-		return dataLinks;
-	}
-
-	/**
-	 * Returns the <code>InputWorkflowPort</code>s.
-	 * 
-	 * If there are no <code>InputWorkflowPort</code>s an empty set is returned.
-	 * 
-	 * @return the <code>InputWorkflowPort</code>s.
-	 */
-	@Override
-	public NamedSet<InputWorkflowPort> getInputPorts() {
-		return inputPorts;
-	}
-
-	/**
-	 * Returns the <code>OutputWorkflowPort</code>s.
-	 * 
-	 * If there are no <code>OutputWorkflowPort</code>s an empty set is
-	 * returned.
-	 * 
-	 * @return the <code>OutputWorkflowPort</code>s.
-	 */
-	@Override
-	public NamedSet<OutputWorkflowPort> getOutputPorts() {
-		return outputPorts;
-	}
-
-	@Override
-	public WorkflowBundle getParent() {
-		return parent;
-	}
-
-	/**
-	 * Returns the <code>Processor</code>s.
-	 * 
-	 * If there are no <code>Processor</code>s an empty set is returned.
-	 * 
-	 * @return the <code>Processor</code>s.
-	 */
-	public NamedSet<Processor> getProcessors() {
-		return processors;
-	}
-
-	/**
-	 * Set the <code>ControlLink</code>s to be the contents of the specified
-	 * set.
-	 * <p>
-	 * <code>ControlLink</code>s can be added by using
-	 * {@link #getControlLinks()}.add(controlLink).
-	 * 
-	 * @param controlLinks
-	 *            the <code>ControlLink</code>s. <strong>Must not</strong> be
-	 *            null
-	 */
-	public void setControlLinks(Set<ControlLink> controlLinks) {
-		this.controlLinks.clear();
-		this.controlLinks.addAll(controlLinks);
-	}
-	
-	/**
-	 * Set the <code>DataLink</code>s to be the contents of the specified set.
-	 * <p>
-	 * <code>DataLink</code>s can be added by using {@link #getDataLinks()}
-	 * .add(dataLink).
-	 * 
-	 * @param dataLinks
-	 *            the <code>DataLink</code>s. <strong>Must not</strong> be null
-	 */
-	public void setDataLinks(Set<DataLink> dataLinks) {
-		this.dataLinks.clear();
-		this.dataLinks.addAll(dataLinks);
-	}
-
-	/**
-	 * Set the <code>InputWorkflowPort</code>s to be the contents of the
-	 * specified set.
-	 * <p>
-	 * <code>InputWorkflowPort</code>s can be added by using
-	 * {@link #getInputWorkflowPorts()}.add(inputPort).
-	 * 
-	 * @param inputPorts
-	 *            the <code>InputWorkflowPort</code>s. <strong>Must not</strong>
-	 *            be null
-	 */
-	public void setInputPorts(Set<InputWorkflowPort> inputPorts) {
-		this.inputPorts.clear();
-		for (InputWorkflowPort inputPort : inputPorts)
-			inputPort.setParent(this);
-	}
-
-	/**
-	 * Set the <code>OutputWorkflowPort</code>s to be the contents of the
-	 * specified set.
-	 * <p>
-	 * <code>OutputWorkflowPort</code>s can be added by using
-	 * {@link #getOutputWorkflowPorts()}.add(outputPort).
-	 * 
-	 * @param outputPorts
-	 *            the <code>OutputWorkflowPort</code>s. <strong>Must
-	 *            not</strong> be null
-	 */
-	public void setOutputPorts(Set<OutputWorkflowPort> outputPorts) {
-		this.outputPorts.clear();
-		for (OutputWorkflowPort outputPort : outputPorts)
-			outputPort.setParent(this);
-	}
-
-	@Override
-	public void setParent(WorkflowBundle parent) {
-		if (this.parent != null && this.parent != parent)
-			this.parent.getWorkflows().remove(this);
-		this.parent = parent;
-		if (parent != null)
-			parent.getWorkflows().add(this);
-	}
-
-	/**
-	 * Set the <code>Processor</code>s to be the contents of the specified set.
-	 * <p>
-	 * <code>Processor</code>s can be added by using {@link #getProcessors()}
-	 * .add(processor).
-	 * 
-	 * @param processors
-	 *            the <code>Processor</code>s. <strong>Must not</strong> be null
-	 */
-	public void setProcessors(Set<Processor> processors) {
-		this.processors.clear();
-		for (Processor processor : processors)
-			processor.setParent(this);
-	}
-
-	/**
-	 * Updates the workflow identifier.
-	 * <p>
-	 * The {@link #getCurrentRevision()} will be replaced using using
-	 * {@link #newRevision()}.
-	 * 
-	 */
-	public void updateWorkflowIdentifier() {
-		newRevision();
-	}
-
-	@SuppressWarnings("unused")
-	private String toString(Collection<?> collection, int maxLen) {
-		StringBuilder builder = new StringBuilder("[");
-		String sep = "";
-		int i = 0;
-		for (Object o : collection) {
-			builder.append(sep).append(o);
-			sep = ", ";
-			if (++i >= maxLen)
-				break;
-		}
-		return builder.append("]").toString();
-	}
-
-	@Override
-	protected URI getIdentifierRoot() {
-		return WORKFLOW_ROOT;
-	}
-	
-	@Override
-	protected void cloneInto(WorkflowBean clone, Cloning cloning) {
-		super.cloneInto(clone, cloning);
-		Workflow cloneWorkflow = (Workflow)clone;
-		cloneWorkflow.setCurrentRevision(cloning.cloneIfNotInCache(getCurrentRevision()));		
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/package-info.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/package-info.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/package-info.java
deleted file mode 100644
index 5061365..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/core/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.apache.taverna.scufl2.api.core;
-
-/*
- * 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.
- */
-
-

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/IterableComparator.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/IterableComparator.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/IterableComparator.java
deleted file mode 100644
index d7b3972..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/IterableComparator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.apache.taverna.scufl2.api.impl;
-
-/*
- * 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.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-/**
- * A Comparator of Iterables of comparables.
- * <p>
- * This comparator compares two {@link Iterable}s by comparing their items.
- * Iterables are compared on the first items, then on the second items, etc. If
- * Iterable A is larger than Iterable B, but all the items of B compared 0
- * (equal) with the corresponding items in A, then the comparator will sort the
- * smaller Iterable before the bigger Iterable.
- * <p>
- * Obviously this comparator would not give predictable results for
- * {@link Iterable}s which don't have a predictable iteration order, like
- * {@link HashSet}, but should work well with {@link List}s,
- * {@link LinkedHashSet}, etc.
- * <p>
- * The two Iterables don't need to contain items of the same classes, as long as
- * their element's {@link Comparable#compareTo(Object)} allow comparison. (For
- * instance a Iterable&lt;String&gt; would not compare against
- * Iterable&lt;Integer&gt;). As according to
- * {@link Comparator#compare(Object, Object)} a {@link ClassCastException} would
- * be thrown in such cases.
- * <p>
- * Items in the Iterable are compared using {@link NullSafeComparator}, so this
- * comparator will handle Iterables containing <code>null</code> items
- * predictably. This comparator also allows <code>null</code> in the same way,
- * so comparison of a {@link Iterable} and <code>null</code> will sort
- * <code>null</code> before the Iterable.
- * <p>
- * If an item in the Iterable is a {@link Iterable} which is not itself
- * {@link Comparable}, and it is being compared with a different Iterable, it
- * will be recursively compared with the same instance of
- * {@link IterableComparator}. However, if such {@link Iterable}s are compared
- * with other {@link Comparable}s a {@link ClassCastException} would be thrown.
- * <p>
- * If an item in a Iterable is not {@link Comparable} <code>null</code> and
- * could not be recursively compared, a {@link ClassCastException} will be
- * thrown, as according to {@link Comparator#compare(Object, Object)}
- * 
- * @author Stian Soiland-Reyes
- */
-public class IterableComparator implements Comparator<Iterable<?>> {
-	@Override
-	public int compare(Iterable<?> a, Iterable<?> b) {
-		Integer nullCompare = compareNulls(a, b);
-		if (nullCompare != null)
-			return nullCompare;
-		
-		Iterator<?> aIt = a.iterator();
-		Iterator<?> bIt = b.iterator();
-		
-		while (aIt.hasNext() && bIt.hasNext()) {
-			int itemCompare = compareItems(aIt.next(), bIt.next());
-			if (itemCompare != 0)
-				return itemCompare;
-		}
-		// Puh, compared all corresponding items
-		
-		if (aIt.hasNext())
-			return 1; // a is bigger
-		if (bIt.hasNext())
-			return -1; // a is smaller
-		// Both finished? Then we are equal!
-		return 0;		
-	}
-
-	@SuppressWarnings("unchecked")
-	protected int compareItems(Object a, Object b) {
-		Integer nullCompare = compareNulls(a, b);
-		if (nullCompare != null)
-			return nullCompare;
-		if (a instanceof Comparable && b instanceof Comparable)
-			return ((Comparable<Object>) a).compareTo((Comparable<Object>) b);
-		if (a instanceof Iterable && b instanceof Iterable)
-			// Recurse
-			return compare((Iterable<?>) a, (Iterable<?>) b);
-		throw new ClassCastException(
-				"Compared items must be null, or both be Comparable or Iterables");
-	}
-
-	protected Integer compareNulls(Object a, Object b) {
-		if (a == null && b == null)
-			return 0;
-		if (a == null && b != null)
-			return -1;
-		if (a != null && b == null)
-			return 1;
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/LazyMap.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/LazyMap.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/LazyMap.java
deleted file mode 100644
index 4ec5ce7..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/LazyMap.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.apache.taverna.scufl2.api.impl;
-
-/*
- * 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.util.Comparator;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * A lazy TreeMap, inspired by org.apache.commons.collections.map.LazyMap
- * <p>
- * On {@link #get(Object)}, if a key is not found in the map,
- * {@link #getDefault(Object)} will be called to create the value for the given
- * key. This value is subsequently inserted into the map before being returned.
- * <p>
- * Call {@link #containsKey(Object)} to check if a key is in the map.
- * <p>
- * Implementations of this class must implement {@link #getDefault(Object)} to
- * specify the default value to create.
- * 
- * @author Stian Soiland-Reyes
- * 
- * @param <KeyType>
- *            Type of key
- * @param <ValueType>
- *            Type of value
- */
-public abstract class LazyMap<KeyType, ValueType> extends
-		TreeMap<KeyType, ValueType> implements Map<KeyType, ValueType> {
-	private static final long serialVersionUID = 3284689384208221667L;
-
-	public LazyMap() {
-		super();
-	}
-
-	public LazyMap(Comparator<? super KeyType> comparator) {
-		super(comparator);
-	}
-
-	public LazyMap(Map<? extends KeyType, ? extends ValueType> m) {
-		super(m);
-	}
-
-	public LazyMap(SortedMap<KeyType, ? extends ValueType> m) {
-		super(m);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public ValueType get(Object key) {
-		ValueType value = super.get(key);
-		if (value == null) {
-			value = getDefault((KeyType) key);
-			put((KeyType) key, value);
-		}
-		return value;
-	}
-
-	public abstract ValueType getDefault(KeyType key);
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/NullSafeComparator.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/NullSafeComparator.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/NullSafeComparator.java
deleted file mode 100644
index b8d39c3..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/impl/NullSafeComparator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.apache.taverna.scufl2.api.impl;
-
-/*
- * 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.util.Comparator;
-
-/**
- * A Comparator that is null-safe
- * <p>
- * This comparator performs {@link Comparable#compareTo(Object)} if both objects
- * are non-null, and sorts <code>null</code> to be -1 (before the non-null), and
- * compares two <code>null</code>s as equal.
- * </p>
- * <p>
- * The static method {@link #compareObjects(Object, Object)} can be used if such
- * a comparison is needed without having to instantiate this class, for instance
- * because it is used within a {@link Comparable#compareTo(Object)} or because
- * the two arguments are not of an agreeable subclass &lt<T&gt; of
- * {@link Comparable} (but still can be compared).
- * 
- * @author Stian Soiland-Reyes
- * @param <T>
- *            The common type of the objects to be compared.
- */
-public class NullSafeComparator<T extends Comparable<T>> implements
-		Comparator<T> {
-	/**
-	 * Compare two objects for <code>null</code>ity only.
-	 * <p>
-	 * If both parameters are <code>null</code>, return <code>0</code>. If only a
-	 * is <code>null</code>, return <code>-1</code>, if only b is
-	 * <code>null</code>, return <code>1</code>. If none are <code>null</code>,
-	 * return <code>null</code>.
-	 * </p>
-	 * The <code>null</code> return might sound counter-intuitive, but it
-	 * basically means that the objects could not be compared on nullity alone,
-	 * and must be further compared.
-	 * 
-	 * @param a
-	 *            First object to compare
-	 * @param b
-	 *            Second object to compare
-	 * @return 0 if both are null, -1 if a is null, 1 if b is null, otherwise
-	 *         <code>null</code>.
-	 */
-	public static Integer nullCompare(Object a, Object b) {
-		if (a == null && b == null)
-			return 0;
-		if (a == null && b != null)
-			return -1;
-		if (a != null && b == null)
-			return 1;
-		return null;
-	}
-
-	/**
-	 * Compare any two objects, null-safe.
-	 * <p>
-	 * If any of the parameters are <code>null</code>, results are returned as
-	 * for {@link #nullCompare(Object, Object)}. Otherwise,
-	 * {@link Comparable#compareTo(Object)} is called on the first parameter
-	 * against the second.
-	 * 
-	 * @param a
-	 *            First object to compare. Must be instance of
-	 *            {@link Comparable}.
-	 * @param b
-	 *            Second object to compare. Must be
-	 * @return 0 if both are null, -1 if a is null, 1 if b is null, otherwise
-	 *         the result of a.compareTo(b).
-	 * @throws ClassCastException
-	 *             if the specified object's type prevents it from being
-	 *             compared to this object.
-	 */
-	@SuppressWarnings("unchecked")
-	public static int compareObjects(Object a, Object b) {
-		Integer diff = nullCompare(a, b);
-		if (diff != null)
-			return diff;
-		return ((Comparable<Object>) a).compareTo(b);
-	}
-
-	@Override
-	public int compare(T a, T b) {
-		return compareObjects(a, b);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/ReaderException.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/ReaderException.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/ReaderException.java
deleted file mode 100644
index 553c0ff..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/ReaderException.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.apache.taverna.scufl2.api.io;
-
-/*
- * 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 org.apache.taverna.scufl2.api.container.WorkflowBundle;
-
-/**
- * Thrown when there is a problem reading a {@link WorkflowBundle}
- * 
- * @see WorkflowBundleIO#readBundle(java.io.File, String)
- * @see WorkflowBundleIO#readBundle(java.io.InputStream, String)
- * @see WorkflowBundleIO#readBundle(java.net.URL, String)
- * @see WorkflowBundleReader#readBundle(java.io.File, String)
- * @see WorkflowBundleReader#readBundle(java.io.InputStream, String)
- */
-@SuppressWarnings("serial")
-public class ReaderException extends Exception {
-	/**
-	 * Constructs an exception with no message or cause.
-	 */
-	public ReaderException() {
-	}
-
-	/**
-	 * Constructs an exception with the specified message and no cause.
-	 * 
-	 * @param message
-	 *            details about the exception. Can be <code>null</code>
-	 */
-	public ReaderException(String message) {
-		super(message);
-	}
-
-	/**
-	 * Constructs an exception with the specified message and cause.
-	 * 
-	 * @param message
-	 *            details about the exception. Can be <code>null</code>
-	 * @param cause
-	 *            the cause of the exception. Can be <code>null</code>
-	 */
-	public ReaderException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * Constructs an exception with the specified cause and and the same message
-	 * as the cause (if the cause is not null).
-	 * 
-	 * @param cause
-	 *            the cause of the exception. Can be <code>null</code>
-	 */
-	public ReaderException(Throwable cause) {
-		super(cause);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleIO.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleIO.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleIO.java
deleted file mode 100644
index d8cb24f..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleIO.java
+++ /dev/null
@@ -1,538 +0,0 @@
-package org.apache.taverna.scufl2.api.io;
-
-/*
- * 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.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ServiceLoader;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.logging.Logger;
-
-import org.apache.taverna.scufl2.api.annotation.Revisioned;
-import org.apache.taverna.scufl2.api.common.Scufl2Tools;
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-import org.apache.taverna.scufl2.api.core.Workflow;
-import org.apache.taverna.scufl2.api.profiles.Profile;
-
-
-/**
- * Utility class for reading and writing <code>WorkflowBundle</code>s.
- * <p>
- * This class depends on implemented {@link WorkflowBundleReader} and
- * {@link WorkflowBundleWriter} instances, which are discovered from the
- * classpath using {@link ServiceLoader} or set using {@link #setReaders(List)}
- * and {@link #setWriters(List)}. An OSGi service descriptors is provided for
- * instantiating this class as bean <code>workflowBundleIO</code>, while
- * non-OSGi uses can just instantiate this class where needed.
- * <p>
- * The methods {@link #readBundle(File, String)},
- * {@link #readBundle(InputStream, String)}, {@link #readBundle(URL, String)}
- * and {@link #writeBundle(WorkflowBundle, File, String)}/
- * {@link #writeBundle(WorkflowBundle, OutputStream, String)} take an argument
- * to indicate the media type of the format. The reader methods from file and
- * URL allow the parameter to be <code>null</code> in order to guess the format,
- * but the writer method requires the format to be specified explicitly.
- * <p>
- * Known supported formats (as of 2013-04-23):
- * <dl>
- * <dt>text/vnd.taverna.scufl2.structure</dt>
- * <dd>A textual tree-view, useful for debugging, but probably incomplete for
- * actual workflow execution. Reader and writer provided by scufl2-api (this
- * module).</dd>
- * <dt>application/vnd.taverna.scufl2.workflow-bundle</dt>
- * <dd>The <a href=
- * 'http://dev.mygrid.org.uk/wiki/display/developer/Taverna+Workflow+Bundle'>SCU
- * F L 2 workflow bundle</a> format, a ZIP container of RDF/XML files. Reader
- * and writer provided by the scufl2-rdfxml module.</dd>
- * <dt>application/vnd.taverna.t2flow+xml</dt>
- * <dd>The Taverna 2 workflow format t2flow. An XML format based on XMLBeans
- * serialization of T2 java objects. Reader provided by the scufl2-t2flow
- * module.
- * <dt>application/vnd.taverna.scufl+xml</dt>
- * <dd>The Taverna 1 workflow format SCUFL. An XML format made for the FreeFluo
- * workflow engine. Experimental reader provided by the scufl2-scufl module.
- * <dt>text/vnd.wf4ever.wfdesc+turtle</dt>
- * <dd>An abstract workflow structure format by the <a
- * href="http://www.wf4ever-project.org/">Wf4Ever project. RDF Turtle according
- * to the <a href="http://purl.org/wf4ever/model">wfdesc ontology</a>. Writer
- * provided by the third-party <a
- * href="https://github.com/wf4ever/scufl2-wfdesc">scufl2-wfdesc</a> module.
- * </dl>
- */
-public class WorkflowBundleIO {
-	private static Logger log = Logger.getLogger(WorkflowBundleIO.class
-			.getCanonicalName());
-
-	private static final Scufl2Tools scufl2Tools = new Scufl2Tools();
-	// delay initialising the ServiceLoaders
-	protected ServiceLoader<WorkflowBundleWriter> writersLoader;
-	protected ServiceLoader<WorkflowBundleReader> readersLoader;
-
-	private List<WorkflowBundleWriter> writers;
-
-	private List<WorkflowBundleReader> readers;
-
-	protected List<WorkflowBundleReader> discoverReaders() {
-		synchronized (this) {
-			if (readersLoader == null)
-				/*
-				 * FIXME: This uses Thread.currentThread.getContextClassLoader()
-				 * - depending on who gets synchronized-block first this can
-				 * vary - but as it's still local per instance of
-				 * WorkflowBundleIO it should be OK for now.
-				 */
-				readersLoader = ServiceLoader.load(WorkflowBundleReader.class);
-		}
-
-		List<WorkflowBundleReader> allReaders = new ArrayList<>();
-		for (WorkflowBundleReader reader : readersLoader)
-			allReaders.add(reader);
-		return allReaders;
-	}
-
-	protected List<WorkflowBundleWriter> discoverWriters() {
-		synchronized (this) {
-			if (writersLoader == null)
-				/*
-				 * FIXME: This uses Thread.currentThread.getContextClassLoader()
-				 * - depending on who gets synchronized-block first this can
-				 * vary - but as it's still local per instance of
-				 * WorkflowBundleIO it should be OK for now.
-				 */
-				writersLoader = ServiceLoader.load(WorkflowBundleWriter.class);
-		}
-		List<WorkflowBundleWriter> allWriters = new ArrayList<>();
-		for (WorkflowBundleWriter writer : writersLoader)
-			allWriters.add(writer);
-		return allWriters;
-	}
-
-	/**
-	 * Returns a <code>WorkflowBundleReader</code> for the specified media type.
-	 * 
-	 * If there is more than one <code>WorkflowBundleReader</code> for the
-	 * specified media type the first reader discovered is returned. Subsequent
-	 * calls to this method may return a different reader.
-	 * 
-	 * If there is no <code>WorkflowBundleReader</code> for the specified media
-	 * type <code>null</code> is returned.
-	 * 
-	 * @param mediaType
-	 *            the media type of the <code>WorkflowBundleReader</code>
-	 * @return a <code>WorkflowBundleReader</code> for the specified media type
-	 */
-	public WorkflowBundleReader getReaderForMediaType(String mediaType) {
-		for (WorkflowBundleReader reader : getReaders())
-			if (reader.getMediaTypes().contains(mediaType))
-				return reader;
-		return null;
-	}
-
-	/**
-	 * Returns all the available <code>WorkflowBundleReader</code>s.
-	 * 
-	 * @return all the available <code>WorkflowBundleReader</code>s
-	 */
-	public List<WorkflowBundleReader> getReaders() {
-		if (readers == null)
-			return discoverReaders();
-		return readers;
-	}
-
-	/**
-	 * Get the supported media types for reading.
-	 * <p>
-	 * Returned media types can be used with {@link #readBundle(File, String)},
-	 * {@link #readBundle(InputStream, String)} and/or
-	 * {@link #readBundle(URL, String)}.
-	 * 
-	 * @return A (usually sorted) set of media types
-	 */
-	public Set<String> getSupportedReaderMediaTypes() {
-		Set<String> mediaTypes = new TreeSet<>();
-		for (WorkflowBundleReader reader : getReaders())
-			mediaTypes.addAll(reader.getMediaTypes());
-		return mediaTypes;
-	}
-
-	/**
-	 * Get the supported media types for writing.
-	 * <p>
-	 * Returned media types can be used with
-	 * {@link #writeBundle(WorkflowBundle, File, String)} and/or
-	 * {@link #writeBundle(WorkflowBundle, OutputStream, String)}.
-	 * 
-	 * @return A (usually sorted) set of media types
-	 */
-	public Set<String> getSupportedWriterMediaTypes() {
-		Set<String> mediaTypes = new TreeSet<>();
-		for (WorkflowBundleWriter writer : getWriters())
-			mediaTypes.addAll(writer.getMediaTypes());
-		return mediaTypes;
-	}
-
-	/**
-	 * Returns a <code>WorkflowBundleWriter</code> for the specified media type.
-	 * 
-	 * If there is more than one <code>WorkflowBundleWriter</code> for the
-	 * specified media type the first writer discovered is returned. Subsequent
-	 * calls to this method may return a different writer.
-	 * 
-	 * If there is no <code>WorkflowBundleWriter</code> for the specified media
-	 * type <code>null</code> is returned.
-	 * 
-	 * @param mediaType
-	 *            the media type of the <code>WorkflowBundleWriter</code>
-	 * @return a <code>WorkflowBundleWriter</code> for the specified media type
-	 */
-	public WorkflowBundleWriter getWriterForMediaType(String mediaType) {
-		for (WorkflowBundleWriter writer : getWriters())
-			if (writer.getMediaTypes().contains(mediaType))
-				return writer;
-		return null;
-	}
-
-	/**
-	 * Returns all the available <code>WorkflowBundleWriter</code>s.
-	 * 
-	 * @return all the available <code>WorkflowBundleWriter</code>s
-	 */
-	public List<WorkflowBundleWriter> getWriters() {
-		if (writers == null)
-			return discoverWriters();
-		return writers;
-	}
-
-	/**
-	 * Attempt to guess the media type for a stream or file that starts with
-	 * these bytes.
-	 * <p>
-	 * All registered {@link #getReaders()} are consulted.
-	 * <p>
-	 * Return <code>null</code> if ambiguous (more than one possibility) or
-	 * unknown.
-	 * 
-	 * @param firstBytes
-	 *            The initial bytes, at least 512 bytes long unless the resource
-	 *            is smaller.
-	 * @return The recognised media type, or <code>null</code> if the bytes were
-	 *         ambiguous or unknown.
-	 */
-	public String guessMediaTypeForSignature(byte[] firstBytes) {
-		Set<String> mediaTypes = new HashSet<>();
-		for (WorkflowBundleReader reader : getReaders()) {
-			String guess = reader.guessMediaTypeForSignature(firstBytes);
-			if (guess != null)
-				mediaTypes.add(guess);
-		}
-		if (mediaTypes.isEmpty())
-			return null;
-		if (mediaTypes.size() > 1) {
-			log.warning("Multiple media types found: " + mediaTypes);
-			return null;
-		}
-		return mediaTypes.iterator().next();
-	}
-
-	/**
-	 * Reads a file containing a workflow bundle in the specified media type and
-	 * returns a <code>WorkflowBundle</code>.
-	 * 
-	 * @param bundleFile
-	 *            the file containing the workflow bundle
-	 * @param mediaType
-	 *            the media type of the workflow bundle. A
-	 *            <code>WorkflowBundleReader</code> must exist for this media
-	 *            type. If <code>null</code>, the media type will be guessed as
-	 *            with {@link #guessMediaTypeForSignature(byte[])}.
-	 * @return the <code>WorkflowBundle</code> read from the file
-	 * @throws ReaderException
-	 *             if there is an error parsing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error reading the file
-	 * @throws IllegalArgumentException
-	 *             if a <code>WorkflowBundleReader</code> cannot be found for
-	 *             the media type
-	 */
-	public WorkflowBundle readBundle(File bundleFile, String mediaType)
-			throws ReaderException, IOException {
-		if (mediaType == null) {
-			byte[] firstBytes = new byte[1024];
-			try (FileInputStream fileIn = new FileInputStream(bundleFile)) {
-				fileIn.read(firstBytes);
-			}
-			mediaType = guessMediaTypeForSignature(firstBytes);
-		}
-		WorkflowBundleReader reader = getReaderForMediaType(mediaType);
-		if (reader == null) {
-			if (mediaType == null)
-				throw new IllegalArgumentException(
-						"Could not guess media type for " + bundleFile);
-			throw new IllegalArgumentException(
-					"Could not find reader for media type " + mediaType);
-		}
-		return reader.readBundle(bundleFile, mediaType);
-	}
-
-	/**
-	 * Reads a stream containing a workflow bundle in the specified media type
-	 * and returns a <code>WorkflowBundle</code>.
-	 * 
-	 * @param inputStream
-	 *            the stream containing the workflow bundle
-	 * @param mediaType
-	 *            the media type of the workflow bundle. A
-	 *            <code>WorkflowBundleReader</code> must exist for this media
-	 *            type. If <code>null</code>, the media type will be guessed as
-	 *            with {@link #guessMediaTypeForSignature(byte[])}.
-	 * @return the <code>WorkflowBundle</code> read from the stream
-	 * @throws ReaderException
-	 *             if there is an error parsing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error reading from the stream
-	 * @throws IllegalArgumentException
-	 *             if a <code>WorkflowBundleReader</code> cannot be found for
-	 *             the media type
-	 */
-	public WorkflowBundle readBundle(InputStream inputStream, String mediaType)
-			throws ReaderException, IOException {
-		if (mediaType == null) {
-			byte[] firstBytes = new byte[1024];
-			inputStream = new BufferedInputStream(inputStream);
-			try {
-				inputStream.mark(firstBytes.length * 2);
-				inputStream.read(firstBytes);
-				mediaType = guessMediaTypeForSignature(firstBytes);
-			} finally {
-				inputStream.reset();
-				// Important = so readBundle can start from the beginning
-			}
-		}
-		WorkflowBundleReader reader = getReaderForMediaType(mediaType);
-		if (reader == null) {
-			if (mediaType == null)
-				throw new IllegalArgumentException(
-						"Could not guess media type for input stream");
-			throw new IllegalArgumentException(
-					"Could not find reader for media type " + mediaType);
-		}
-		return reader.readBundle(inputStream, mediaType);
-	}
-
-	/**
-	 * Reads a URL containing a workflow bundle in the specified media type and
-	 * returns a <code>WorkflowBundle</code>.
-	 * 
-	 * @param url
-	 *            the URL containing the workflow bundle
-	 * @param mediaType
-	 *            the media type of the workflow bundle. A
-	 *            <code>WorkflowBundleReader</code> must exist for this media
-	 *            type If <code>null</code>, the media type will be guessed as
-	 *            with {@link #guessMediaTypeForSignature(byte[])}.
-	 * @return the <code>WorkflowBundle</code> read from the URL
-	 * @throws ReaderException
-	 *             if there is an error parsing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error reading from the stream
-	 * @throws IllegalArgumentException
-	 *             if a <code>WorkflowBundleReader</code> cannot be found for
-	 *             the media type
-	 */
-	public WorkflowBundle readBundle(URL url, String mediaType)
-			throws ReaderException, IOException {
-		URLConnection connection = url.openConnection();
-		if (mediaType != null && !mediaType.isEmpty())
-			addAcceptHeaders(mediaType, connection);
-		else
-			for (String supportedType : getSupportedReaderMediaTypes()) {
-				addAcceptHeaders(supportedType, connection);
-				connection.addRequestProperty("Accept", "*/*;q=0.1");
-			}
-
-		try (InputStream inputStream = connection.getInputStream()) {
-			String contentType = connection.getContentType();
-			List<String> ignoreTypes = Arrays.asList("text/plain",
-					"application/octet-stream", "application/zip",
-					"application/x-zip-compressed", "text/xml",
-					"application/xml", "content/unknown");
-			if (contentType == null || contentType.isEmpty())
-				contentType = mediaType; // might still be null -> guess
-			else
-				for (String ignore : ignoreTypes)
-					if (contentType.toLowerCase().startsWith(ignore))
-						contentType = mediaType; // might still be null -> guess
-			// TODO: Pass URL to reader (as baseURI)
-			return readBundle(url.openStream(), contentType);
-		}
-	}
-
-	private void addAcceptHeaders(String mediaType, URLConnection connection) {
-		connection.addRequestProperty("Accept", mediaType);
-
-		if (mediaType.endsWith("+zip")
-				|| mediaType.equals("vnd.taverna.scufl2.workflow-bundle")) {
-			connection.addRequestProperty("Accept", "application/zip;q=0.5");
-			connection.addRequestProperty("Accept",
-					"application/x-zip-compressed;q=0.5");
-		} else if (mediaType.endsWith("+xml")) {
-			connection.setRequestProperty("Accept", "application/xml;q=0.6");
-			connection.setRequestProperty("Accept", "text/xml;q=0.5");
-		}
-	}
-
-	/**
-	 * Sets the <code>WorkflowBundleReader</code>s.
-	 * <p>
-	 * This method will normally be called by Spring when wiring beans.
-	 * 
-	 * @param readers
-	 *            the <code>WorkflowBundleReader</code>s
-	 */
-	public void setReaders(List<WorkflowBundleReader> readers) {
-		this.readers = readers;
-	}
-
-	/**
-	 * Sets the <code>WorkflowBundleWriter</code>s.
-	 * <p>
-	 * This method will normally be called by Spring when wiring beans.
-	 * 
-	 * @param readers
-	 *            the <code>WorkflowBundleWriter</code>s
-	 */
-	public void setWriters(List<WorkflowBundleWriter> writers) {
-		this.writers = writers;
-	}
-
-	/**
-	 * Write a <code>WorkflowBundle</code> to a file with specified media type.
-	 * <p>
-	 * {@link Scufl2Tools#setParents(WorkflowBundle)} will be called on the
-	 * bundle to ensure everything contained by the bundle has it as an
-	 * ancestor.
-	 * 
-	 * @param wfBundle
-	 *            the workflow bundle to write
-	 * @param destination
-	 *            the file to write the workflow bundle to
-	 * @param mediaType
-	 *            the media type to write workflow bundle in. A
-	 *            <code>WorkflowBundleWriter</code> must exist for this media
-	 *            type
-	 * @throws WriterException
-	 *             if there is an error writing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error writing the file
-	 * @throws IllegalArgumentException
-	 *             if a <code>WorkflowBundleWriter</code> cannot be found for
-	 *             the media type
-	 */
-	public void writeBundle(WorkflowBundle wfBundle, File destination,
-			String mediaType) throws WriterException, IOException {
-		WorkflowBundleWriter writer = getWriterForMediaType(mediaType);
-		if (writer == null)
-			throw new IllegalArgumentException(
-					"Could not find writer for media type " + mediaType);
-		scufl2Tools.setParents(wfBundle);
-		writer.writeBundle(wfBundle, destination, mediaType);
-	}
-
-	/**
-	 * Write a <code>WorkflowBundle</code> to a stream with specified media
-	 * type.
-	 * <p>
-	 * {@link Scufl2Tools#setParents(WorkflowBundle)} will be called on the
-	 * bundle to ensure everything contained by the bundle has it as an
-	 * ancestor.
-	 * 
-	 * @param wfBundle
-	 *            the workflow bundle to write
-	 * @param output
-	 *            the stream to write the workflow bundle to
-	 * @param mediaType
-	 *            the media type to write workflow bundle in. A
-	 *            <code>WorkflowBundleWriter</code> must exist for this media
-	 *            type
-	 * @throws WriterException
-	 *             if there is an error writing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error writing to the stream
-	 * @throws IllegalArgumentException
-	 *             if a <code>WorkflowBundleWriter</code> cannot be found for
-	 *             the media type
-	 */
-	public void writeBundle(WorkflowBundle wfBundle, OutputStream output,
-			String mediaType) throws WriterException, IOException {
-		WorkflowBundleWriter writer = getWriterForMediaType(mediaType);
-		if (writer == null)
-			throw new IllegalArgumentException(
-					"Could not find writer for media type " + mediaType);
-		scufl2Tools.setParents(wfBundle);
-		writer.writeBundle(wfBundle, output, mediaType);
-	}
-
-	/**
-	 * Create a new WorkflowBundle with a default workflow and profile.
-	 * <p>
-	 * Unlike the {@link WorkflowBundle} constructor, this method will also make
-	 * a {@link WorkflowBundle#getMainWorkflow()} and
-	 * {@link WorkflowBundle#getMainProfile()}, simplifying construction of
-	 * workflow bundles from scratch.
-	 * <p>
-	 * Each of the bundle, workflow and profile will also have a revision set
-	 * using {@link Revisioned#newRevision()} and their names set to short
-	 * default values.
-	 * 
-	 * @return A template {@link WorkflowBundle} which has a main workflow and
-	 *         main profile
-	 */
-	public WorkflowBundle createBundle() {
-		WorkflowBundle wb = new WorkflowBundle();
-		wb.setName("bundle1");
-
-		Workflow workflow = new Workflow();
-		workflow.setName("workflow1");
-		workflow.setParent(wb);
-		workflow.newRevision();
-
-		Profile profile = new Profile();
-		profile.setName("profile1");
-		profile.setParent(wb);
-		profile.newRevision();
-
-		wb.setMainWorkflow(workflow);
-		wb.setMainProfile(profile);
-		wb.newRevision();
-		return wb;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleReader.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleReader.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleReader.java
deleted file mode 100644
index 889ca43..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleReader.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.apache.taverna.scufl2.api.io;
-
-/*
- * 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.io.InputStream;
-import java.util.Set;
-
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-
-
-/**
- * A reader for {@link WorkflowBundle}s.
- * 
- * Implementations specify workflow bundle formats (media types/mime types) that
- * they can read.
- */
-public interface WorkflowBundleReader {
-	/**
-	 * Return the media types that this reader can read.
-	 * <p>
-	 * Returned media types are must be valid <code>mediaType</code> arguments
-	 * to {@link #readBundle(File, String)} and/or
-	 * {@link #readBundle(InputStream, String)} for this reader.
-	 * <p>
-	 * It is recommended, but not required, that the reader can also recognise
-	 * those media types from {@link #guessMediaTypeForSignature(byte[])}.
-	 * <p>
-	 * If the returned set is empty, the reader should should be able to
-	 * Recognise at least one media type from
-	 * {@link #guessMediaTypeForSignature(byte[])}.
-	 * 
-	 * @return the media types that this reader can read, or an empty set if
-	 *         this reader can't read any bundle formats.
-	 */
-	Set<String> getMediaTypes();
-
-	/**
-	 * Read a file containing a workflow bundle in the specified media type and
-	 * return a <code>WorkflowBundle</code>.
-	 * 
-	 * @param bundleFile
-	 *            the file containing the workflow bundle
-	 * @param mediaType
-	 *            the media type of the workflow bundle
-	 * @return the <code>WorkflowBundle</code> read from the file
-	 * @throws ReaderException
-	 *             if there is an error parsing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error reading the file
-	 */
-	WorkflowBundle readBundle(File bundleFile, String mediaType)
-			throws ReaderException, IOException;
-
-	/**
-	 * Read a stream containing a workflow bundle in the specified media type
-	 * and return a <code>WorkflowBundle</code>.
-	 * 
-	 * @param inputStream
-	 *            the stream containing the workflow bundle
-	 * @param mediaType
-	 *            the media type of the workflow bundle
-	 * @return the <code>WorkflowBundle</code> read from the stream
-	 * @throws ReaderException
-	 *             if there is an error parsing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error reading from the stream
-	 */
-	WorkflowBundle readBundle(InputStream inputStream, String mediaType)
-			throws ReaderException, IOException;
-
-	/**
-	 * Attempt to guess the media type for a stream or file that starts with
-	 * these bytes.
-	 * <p>
-	 * Return <code>null</code> if ambiguous (more than one possibility) or
-	 * unknown.
-	 * <p>
-	 * Typically a WorkflowBundleReader should be able to recognise the same
-	 * types as those listed in {@link #getMediaTypes()}, but this is no
-	 * requirement. A WorkflowBundleReader could also recognise types not listed
-	 * in its {@link #getMediaTypes()}.
-	 * 
-	 * @param firstBytes
-	 *            The initial bytes, at least 512 bytes long unless the resource
-	 *            is smaller.
-	 * @return The recognised media type, or <code>null</code> if the bytes were
-	 *         ambiguous or unknown.
-	 */
-	String guessMediaTypeForSignature(byte[] firstBytes);
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleWriter.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleWriter.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleWriter.java
deleted file mode 100644
index a74127f..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WorkflowBundleWriter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.apache.taverna.scufl2.api.io;
-
-/*
- * 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.io.OutputStream;
-import java.util.Set;
-
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-
-
-/**
- * A writer for {@link WorkflowBundle}s.
- * 
- * Implementations specify workflow bundle formats (media types) that they can
- * write.
- */
-public interface WorkflowBundleWriter {
-	/**
-	 * Returns the media types that this writer can handle.
-	 * 
-	 * @return the media types that this writer can handle
-	 */
-	Set<String> getMediaTypes();
-
-	/**
-	 * Writes a <code>WorkflowBundle</code> to a file with specified media type.
-	 * 
-	 * @param wfBundle
-	 *            the workflow bundle to write
-	 * @param destination
-	 *            the file to write the workflow bundle to
-	 * @param mediaType
-	 *            the media type to write workflow bundle in
-	 * @throws WriterException
-	 *             if there is an error writing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error writing the file
-	 */
-	void writeBundle(WorkflowBundle wfBundle, File destination, String mediaType)
-			throws WriterException, IOException;
-
-	/**
-	 * Writes a <code>WorkflowBundle</code> to a stream with specified media
-	 * type.
-	 * 
-	 * @param wfBundle
-	 *            the workflow bundle to write
-	 * @param output
-	 *            the stream to write the workflow bundle to
-	 * @param mediaType
-	 *            the media type to write workflow bundle in
-	 * @throws WriterException
-	 *             if there is an error writing the workflow bundle
-	 * @throws IOException
-	 *             if there is an error writing to the stream
-	 */
-	void writeBundle(WorkflowBundle wfBundle, OutputStream output,
-			String mediaType) throws WriterException, IOException;
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WriterException.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WriterException.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WriterException.java
deleted file mode 100644
index f316a43..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/WriterException.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.apache.taverna.scufl2.api.io;
-
-/*
- * 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 org.apache.taverna.scufl2.api.container.WorkflowBundle;
-
-/**
- * Thrown when there is a problem writing a {@link WorkflowBundle}
- * 
- * @see WorkflowBundleIO#writeBundle(WorkflowBundle, java.io.File, String)
- * @see WorkflowBundleIO#writeBundle(WorkflowBundle, java.io.OutputStream,
- *      String)
- * @see WorkflowBundleWriter#writeBundle(WorkflowBundle, java.io.File, String)
- * @see WorkflowBundleWriter#writeBundle(WorkflowBundle, java.io.OutputStream,
- *      String)
- */
-@SuppressWarnings("serial")
-public class WriterException extends Exception {
-
-	/**
-	 * Constructs an exception with no message or cause.
-	 */
-	public WriterException() {
-	}
-
-	/**
-	 * Constructs an exception with the specified message and no cause.
-	 * 
-	 * @param message
-	 *            details about the exception. Can be <code>null</code>
-	 */
-	public WriterException(String message) {
-		super(message);
-	}
-
-	/**
-	 * Constructs an exception with the specified message and cause.
-	 * 
-	 * @param message
-	 *            details about the exception. Can be <code>null</code>
-	 * @param cause
-	 *            the cause of the exception. Can be <code>null</code>
-	 */
-	public WriterException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * Constructs an exception with the specified cause and and the same message
-	 * as the cause (if the cause is not null).
-	 * 
-	 * @param cause
-	 *            the cause of the exception. Can be <code>null</code>
-	 */
-	public WriterException(Throwable cause) {
-		super(cause);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureReader.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureReader.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureReader.java
deleted file mode 100644
index c19444b..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureReader.java
+++ /dev/null
@@ -1,452 +0,0 @@
-package org.apache.taverna.scufl2.api.io.structure;
-
-/*
- * 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.lang.System.arraycopy;
-import static java.util.Collections.singleton;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URI;
-import java.nio.charset.Charset;
-import java.util.Scanner;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.taverna.scufl2.api.activity.Activity;
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-import org.apache.taverna.scufl2.api.core.BlockingControlLink;
-import org.apache.taverna.scufl2.api.core.DataLink;
-import org.apache.taverna.scufl2.api.core.Processor;
-import org.apache.taverna.scufl2.api.core.Workflow;
-import org.apache.taverna.scufl2.api.io.ReaderException;
-import org.apache.taverna.scufl2.api.io.WorkflowBundleReader;
-import org.apache.taverna.scufl2.api.port.InputActivityPort;
-import org.apache.taverna.scufl2.api.port.InputProcessorPort;
-import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
-import org.apache.taverna.scufl2.api.port.OutputActivityPort;
-import org.apache.taverna.scufl2.api.port.OutputProcessorPort;
-import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
-import org.apache.taverna.scufl2.api.port.ReceiverPort;
-import org.apache.taverna.scufl2.api.port.SenderPort;
-import org.apache.taverna.scufl2.api.profiles.ProcessorBinding;
-import org.apache.taverna.scufl2.api.profiles.ProcessorInputPortBinding;
-import org.apache.taverna.scufl2.api.profiles.ProcessorOutputPortBinding;
-import org.apache.taverna.scufl2.api.profiles.Profile;
-
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/**
- * A <code>WorkflowBundleReader</code> that reads a {@link WorkflowBundle} in
- * Scufl2 Structure format.
- */
-public class StructureReader implements WorkflowBundleReader {
-	public enum Level {
-		WorkflowBundle, Workflow, Processor, Activity, Links, Profile, Configuration, ProcessorBinding, OutputPortBindings, InputPortBindings, JSON, Controls
-	}
-
-	private static final String ACTIVITY_SLASH = "activity/";
-	public static final String TEXT_VND_TAVERNA_SCUFL2_STRUCTURE = "text/vnd.taverna.scufl2.structure";
-
-	private WorkflowBundle wb;
-	private Level level;
-	private String mainWorkflow;
-	private Workflow workflow;
-	private Processor processor;
-	private Activity activity;
-	Pattern linkPattern = Pattern
-			.compile("'(.*[^\\\\])'\\s->\\s'(.*[^\\\\\\\\])'");
-	Pattern blockPattern = Pattern
-			.compile("\\s*block\\s+'(.*[^\\\\])'\\s+until\\s+'(.*[^\\\\\\\\])'\\s+finish");
-	private String mainProfile;
-	private Profile profile;
-	private Configuration configuration;
-	private ProcessorBinding processorBinding;
-    protected Scanner scanner;
-
-	@Override
-	public Set<String> getMediaTypes() {
-		return singleton(TEXT_VND_TAVERNA_SCUFL2_STRUCTURE);
-	}
-
-	// synchronized because we share wb/scanner fields across the instance
-	protected synchronized WorkflowBundle parse(InputStream is)
-			throws ReaderException {
-		scanner = new Scanner(is);
-		try {
-			wb = new WorkflowBundle();
-			while (scanner.hasNextLine())
-				parseLine(scanner.nextLine());
-			return wb;
-		} finally {
-			scanner.close();
-		}
-	}
-
-	protected void parseLine(final String nextLine) throws ReaderException {
-		try (Scanner scanner = new Scanner(nextLine.trim())) {
-			// In case it is the last line
-			if (!scanner.hasNext())
-				return;
-			// allow any whitespace
-			String next = scanner.next();
-
-			if (next.isEmpty())
-				return;
-			switch (next) {
-			case "WorkflowBundle":
-				parseWorkflowBundle(scanner);
-				return;
-			case "MainWorkflow":
-				mainWorkflow = parseName(scanner);
-				return;
-			case "Workflow":
-				parseWorkflow(scanner);
-				return;
-			case "In":
-			case "Out":
-				parsePort(scanner, next);
-				return;
-			case "Links":
-				level = Level.Links;
-				processor = null;
-				return;
-			case "Controls":
-				level = Level.Controls;
-				return;
-			case "MainProfile":
-				mainProfile = parseName(scanner);
-				return;
-			case "Profile":
-				parseProfile(scanner);
-				return;
-			case "Type":
-				parseType(nextLine);
-				return;
-			case "ProcessorBinding":
-				parseProcessorBinding(scanner);
-				return;
-			case "InputPortBindings":
-				level = Level.InputPortBindings;
-				return;
-			case "OutputPortBindings":
-				level = Level.OutputPortBindings;
-				return;
-			case "Configuration":
-				parseConfiguration(scanner);
-				return;
-			case "Configures":
-				parseConfigures(scanner);
-				return;
-			case "Activity":
-				switch (level) {
-				case Profile:
-				case Activity:
-					level = Level.Activity;
-					activity = new Activity();
-					activity.setName(parseName(scanner));
-					profile.getActivities().add(activity);
-					return;
-				case ProcessorBinding:
-					Activity boundActivity = profile.getActivities().getByName(
-							parseName(scanner));
-					processorBinding.setBoundActivity(boundActivity);
-					return;
-				default:
-					break;
-				}
-				break;
-			case "Processor":
-				switch (level) {
-				case Workflow:
-				case Processor:
-					level = Level.Processor;
-					processor = new Processor();
-					processor.setName(parseName(scanner));
-					processor.setParent(workflow);
-					workflow.getProcessors().add(processor);
-					return;
-				case ProcessorBinding:
-					String[] wfProcName = parseName(scanner).split(":");
-					Workflow wf = wb.getWorkflows().getByName(wfProcName[0]);
-					Processor boundProcessor = wf.getProcessors().getByName(
-							wfProcName[1]);
-					processorBinding.setBoundProcessor(boundProcessor);
-					return;
-				default:
-					break;
-				}
-				break;
-			}
-
-			if (next.equals("block")) {
-				Matcher blockMatcher = blockPattern.matcher(nextLine);
-				blockMatcher.find();
-				String block = blockMatcher.group(1);
-				String untilFinish = blockMatcher.group(2);
-
-				Processor blockProc = workflow.getProcessors().getByName(block);
-				Processor untilFinishedProc = workflow.getProcessors()
-						.getByName(untilFinish);
-				new BlockingControlLink(blockProc, untilFinishedProc);
-			}
-			if (next.startsWith("'") && level.equals(Level.Links)) {
-				Matcher linkMatcher = linkPattern.matcher(nextLine);
-				linkMatcher.find();
-				String firstLink = linkMatcher.group(1);
-				String secondLink = linkMatcher.group(2);
-
-				SenderPort senderPort;
-				if (firstLink.contains(":")) {
-					String[] procPort = firstLink.split(":");
-					Processor proc = workflow.getProcessors().getByName(
-							procPort[0]);
-					senderPort = proc.getOutputPorts().getByName(procPort[1]);
-				} else
-					senderPort = workflow.getInputPorts().getByName(firstLink);
-
-				ReceiverPort receiverPort;
-				if (secondLink.contains(":")) {
-					String[] procPort = secondLink.split(":");
-					Processor proc = workflow.getProcessors().getByName(
-							procPort[0]);
-					receiverPort = proc.getInputPorts().getByName(procPort[1]);
-				} else
-					receiverPort = workflow.getOutputPorts().getByName(
-							secondLink);
-
-				new DataLink(workflow, senderPort, receiverPort);
-				return;
-			}
-
-			if (next.startsWith("'")
-					&& (level == Level.InputPortBindings || level == Level.OutputPortBindings)) {
-				Matcher linkMatcher = linkPattern.matcher(nextLine);
-				linkMatcher.find();
-				String firstLink = linkMatcher.group(1);
-				String secondLink = linkMatcher.group(2);
-				if (level == Level.InputPortBindings) {
-					InputProcessorPort processorPort = processorBinding
-							.getBoundProcessor().getInputPorts()
-							.getByName(firstLink);
-					InputActivityPort activityPort = processorBinding
-							.getBoundActivity().getInputPorts()
-							.getByName(secondLink);
-					new ProcessorInputPortBinding(processorBinding,
-							processorPort, activityPort);
-				} else {
-					OutputActivityPort activityPort = processorBinding
-							.getBoundActivity().getOutputPorts()
-							.getByName(firstLink);
-					OutputProcessorPort processorPort = processorBinding
-							.getBoundProcessor().getOutputPorts()
-							.getByName(secondLink);
-					new ProcessorOutputPortBinding(processorBinding,
-							activityPort, processorPort);
-				}
-				return;
-			}
-			if (level == Level.JSON) {
-				/*
-				 * A silly reader that feeds (no more than) a single line at a
-				 * time from our parent scanner, starting with the current line
-				 */
-				Reader reader = new Reader() {
-					char[] line = nextLine.toCharArray();
-					int pos = 0;
-
-					@Override
-					public int read(char[] cbuf, int off, int len)
-							throws IOException {
-						if (pos >= line.length) {
-							// Need to read next line to fill buffer
-							if (!StructureReader.this.scanner.hasNextLine())
-								return -1;
-							String newLine = StructureReader.this.scanner
-									.nextLine();
-							pos = 0;
-							line = newLine.toCharArray();
-							// System.out.println("Read new line: " + newLine);
-						}
-						int length = Math.min(len, line.length - pos);
-						if (length <= 0)
-							return 0;
-						arraycopy(line, pos, cbuf, off, length);
-						pos += length;
-						return length;
-					}
-
-					@Override
-					public void close() throws IOException {
-						line = null;
-					}
-				};            
-
-				ObjectMapper mapper = new ObjectMapper();
-				try {
-					JsonParser parser = mapper.getFactory()
-							.createParser(reader);
-					JsonNode jsonNode = parser.readValueAs(JsonNode.class);
-					// System.out.println("Parsed " + jsonNode);
-					configuration.setJson(jsonNode);
-				} catch (IOException e) {
-					throw new ReaderException("Can't parse json", e);
-				}
-				level = Level.Configuration;
-				return;
-			}
-		}
-    }
-
-	private void parseWorkflowBundle(Scanner scanner) {
-		level = Level.WorkflowBundle;
-		String name = parseName(scanner);
-		wb.setName(name);
-	}
-
-	private void parseWorkflow(Scanner scanner) {
-		level = Level.Workflow;
-		workflow = new Workflow();
-		String workflowName = parseName(scanner);
-		workflow.setName(workflowName);
-		wb.getWorkflows().add(workflow);
-		if (workflowName.equals(mainWorkflow))
-			wb.setMainWorkflow(workflow);
-	}
-
-	private void parsePort(Scanner scanner, String next) throws ReaderException {
-		boolean in = next.equals("In");
-		String portName = parseName(scanner);
-		switch (level) {
-		case Workflow:
-			if (in)
-				new InputWorkflowPort(workflow, portName);
-			else
-				new OutputWorkflowPort(workflow, portName);
-			break;
-		case Processor:
-			if (in)
-				new InputProcessorPort(processor, portName);
-			else
-				new OutputProcessorPort(processor, portName);
-			break;
-		case Activity:
-			if (in)
-				new InputActivityPort(activity, portName);
-			else
-				new OutputActivityPort(activity, portName);
-			break;
-		default:
-			throw new ReaderException("Unexpected " + next + " at level "
-					+ level);
-		}
-	}
-
-	private void parseProfile(Scanner scanner) {
-		level = Level.Profile;
-		profile = new Profile();
-		String profileName = parseName(scanner);
-		profile.setName(profileName);
-		wb.getProfiles().add(profile);
-		if (profileName.equals(mainProfile))
-			wb.setMainProfile(profile);
-	}
-
-	private void parseType(String nextLine) {
-		URI uri = URI.create(nextLine.split("[<>]")[1]);
-		switch (level) {
-		case Activity:
-			activity.setType(uri);
-			break;
-		case Configuration:
-			configuration.setType(uri);
-			break;
-		default:
-			break;
-		}
-	}
-
-	private void parseProcessorBinding(Scanner scanner) {
-		level = Level.ProcessorBinding;
-		processorBinding = new ProcessorBinding();
-		String bindingName = parseName(scanner);
-		processorBinding.setName(bindingName);
-		profile.getProcessorBindings().add(processorBinding);
-	}
-
-	private void parseConfiguration(Scanner scanner) {
-		level = Level.Configuration;
-		configuration = new Configuration();
-		String configName = parseName(scanner);
-		configuration.setName(configName);
-		profile.getConfigurations().add(configuration);
-	}
-
-	private void parseConfigures(Scanner scanner) {
-		String configures = parseName(scanner);
-		if (!configures.startsWith(ACTIVITY_SLASH))
-			throw new UnsupportedOperationException("Unknown Configures "
-					+ configures);
-		activity = profile.getActivities().getByName(
-				configures.substring(ACTIVITY_SLASH.length(),
-						configures.length()));
-		configuration.setConfigures(activity);
-		level = Level.JSON;
-	}
-
-
-	private String parseName(Scanner scanner) {
-		String name = scanner.findInLine("'(.*[^\\\\])'");
-		return name.substring(1, name.length() - 1);
-	}
-
-	@Override
-	public WorkflowBundle readBundle(File bundleFile, String mediaType)
-			throws IOException, ReaderException {
-		try (BufferedInputStream is = new BufferedInputStream(
-				new FileInputStream(bundleFile))) {
-			return parse(is);
-		}
-	}
-
-	@Override
-	public WorkflowBundle readBundle(InputStream inputStream, String mediaType)
-			throws IOException, ReaderException {
-		return parse(inputStream);
-	}
-
-	@Override
-	public String guessMediaTypeForSignature(byte[] firstBytes) {
-		if (new String(firstBytes, Charset.forName("ISO-8859-1"))
-				.contains("WorkflowBundle '"))
-			return TEXT_VND_TAVERNA_SCUFL2_STRUCTURE;
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureWriter.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureWriter.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureWriter.java
deleted file mode 100644
index 50610b0..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureWriter.java
+++ /dev/null
@@ -1,314 +0,0 @@
-package org.apache.taverna.scufl2.api.io.structure;
-
-/*
- * 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.apache.taverna.scufl2.api.io.structure.StructureReader.TEXT_VND_TAVERNA_SCUFL2_STRUCTURE;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.taverna.scufl2.api.activity.Activity;
-import org.apache.taverna.scufl2.api.common.Named;
-import org.apache.taverna.scufl2.api.common.NamedSet;
-import org.apache.taverna.scufl2.api.common.Ported;
-import org.apache.taverna.scufl2.api.common.URITools;
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-import org.apache.taverna.scufl2.api.core.BlockingControlLink;
-import org.apache.taverna.scufl2.api.core.ControlLink;
-import org.apache.taverna.scufl2.api.core.DataLink;
-import org.apache.taverna.scufl2.api.core.Processor;
-import org.apache.taverna.scufl2.api.core.Workflow;
-import org.apache.taverna.scufl2.api.io.WorkflowBundleWriter;
-import org.apache.taverna.scufl2.api.port.Port;
-import org.apache.taverna.scufl2.api.port.ProcessorPort;
-import org.apache.taverna.scufl2.api.profiles.ProcessorBinding;
-import org.apache.taverna.scufl2.api.profiles.ProcessorInputPortBinding;
-import org.apache.taverna.scufl2.api.profiles.ProcessorOutputPortBinding;
-import org.apache.taverna.scufl2.api.profiles.Profile;
-
-
-/**
- * A <code>WorkflowBundleWriter</code> that writes a {@link WorkflowBundle} in Scufl2 Structure
- * format.
- */
-public class StructureWriter implements WorkflowBundleWriter {
-	private StringBuilder sb;
-	private URITools uriTools = new URITools();
-
-	private void append(Named named) {
-		append(" '");
-		append(escapeName(named.getName()));
-		append("'");
-	}
-
-	private void append(String string) {
-		sb.append(string);
-	}
-
-	private void append(URI uri) {
-		sb.append(" <");
-		sb.append(uri.toASCIIString());
-		sb.append(">");
-	}
-
-	private void appendPorts(int indent, Ported wf) {
-		for (Port in : sorted(wf.getInputPorts())) {
-			newLine(indent);
-			append("In");
-			append(in);
-		}
-		for (Port out : sorted(wf.getOutputPorts())) {
-			newLine(indent);
-			append("Out");
-			append(out);
-		}
-	}
-
-	/**
-	 * Create a string representation of a workflow bundle. Note that this
-	 * method is not thread-safe; call only via the public methods which have
-	 * the right locking.
-	 */
-	@SuppressWarnings("unchecked")
-	protected String bundleString(WorkflowBundle wb) {
-		sb = new StringBuilder();
-		append("WorkflowBundle");
-		append(wb);
-
-		if (wb.getMainWorkflow() != null) {
-			newLine(1);
-			append("MainWorkflow");
-			append(wb.getMainWorkflow());
-		}
-		for (Workflow wf : sorted(wb.getWorkflows())) {
-			newLine(1);
-			append("Workflow");
-			append(wf);
-			appendPorts(2, wf);
-			for (Processor p : sorted(wf.getProcessors())) {
-				newLine(2);
-				append("Processor");
-				append(p);
-				appendPorts(3, p);
-			}
-
-			// LINKS
-			// We'll need to sort them afterwards
-			List<String> links = new ArrayList<>();
-			for (DataLink dl : wf.getDataLinks())
-				links.add(datalink(dl.getReceivesFrom()) + " -> " + datalink(dl.getSendsTo()));
-			Collections.sort(links);
-			if (!links.isEmpty()) {
-				newLine(2);
-				append("Links");
-			}
-			for (String link : links) {
-				newLine(3);
-				append(link);
-			}
-
-			if (!wf.getControlLinks().isEmpty()) {
-				newLine(2);
-				append("Controls");
-				List<ControlLink> controlLinks = new ArrayList<>(wf.getControlLinks());
-				Collections.sort(controlLinks);
-				for (ControlLink controlLink : controlLinks) {
-					if (!(controlLink instanceof BlockingControlLink))
-						// TODO
-						continue;
-					BlockingControlLink blockingControlLink = (BlockingControlLink) controlLink;
-					newLine(3);
-					append("block");
-					append(blockingControlLink.getBlock());
-					append(" until");
-					append(blockingControlLink.getUntilFinished());
-					append(" finish");
-				}
-			}
-		}
-
-		if (wb.getMainProfile() != null) {
-			newLine(1);
-			append("MainProfile");
-			append(wb.getMainProfile());
-		}
-
-		for (Profile p : sorted(wb.getProfiles())) {
-			newLine(1);
-			append("Profile");
-			append(p);
-			for (Activity a : sorted(p.getActivities())) {
-				newLine(2);
-				append("Activity");
-				append(a);
-				newLine(3);
-				append("Type");
-				append(a.getType());
-				appendPorts(3, a);
-			}
-			for (ProcessorBinding pb : p.getProcessorBindings()) {
-				newLine(2);
-				append("ProcessorBinding");
-				append(pb);
-				newLine(3);
-				append("Activity");
-				append(pb.getBoundActivity());
-				newLine(3);
-				append("Processor");
-				String name = " '" + escapeName(pb.getBoundProcessor().getParent().getName());
-				name = name + ":" + escapeName(pb.getBoundProcessor().getName()) + "'";
-				append(name);
-
-				List<String> links = new ArrayList<String>();
-				for (ProcessorInputPortBinding ip : pb.getInputPortBindings())
-					links.add("'" + escapeName(ip.getBoundProcessorPort().getName()) + "' -> '"
-							+ escapeName(ip.getBoundActivityPort().getName()) + "'");
-				Collections.sort(links);
-				if (!links.isEmpty()) {
-					newLine(3);
-					append("InputPortBindings");
-				}
-				for (String link : links) {
-					newLine(4);
-					append(link);
-				}
-
-				links.clear();
-				for (ProcessorOutputPortBinding ip : pb.getOutputPortBindings())
-					// Note: opposite direction as for ProcessorInputPortBinding
-					links.add("'" + escapeName(ip.getBoundActivityPort().getName()) + "' -> '"
-							+ escapeName(ip.getBoundProcessorPort().getName()) + "'");
-				Collections.sort(links);
-				if (!links.isEmpty()) {
-					newLine(3);
-					append("OutputPortBindings");
-				}
-				for (String link : links) {
-					newLine(4);
-					append(link);
-				}
-			}
-
-			for (Configuration config : p.getConfigurations()) {
-				newLine(2);
-				append("Configuration");
-				append(config);
-
-				newLine(3);
-				if (config.getType() != null) {
-					append("Type");
-					append(config.getType());
-				}
-				newLine(3);
-				append("Configures");
-				if (config.getConfigures() instanceof Named) {				
-					Named c = (Named) config.getConfigures();					
-					String cName = "'" + escapeName(c.getClass().getSimpleName().toLowerCase());
-					cName = cName + "/" + escapeName(c.getName()) + "'";
-					append(" " + cName);
-				} else {
-					URI configuredURI = uriTools.relativeUriForBean(config.getConfigures(), p);
-					append(" '" + configuredURI.toASCIIString() + "'");
-				}
-
-				newLine(4);
-				append(config.getJson().toString());
-			}
-
-		}
-		append("\n");
-		//System.out.println(sb);
-		return sb.toString();
-	}
-
-	private String datalink(Port port) {
-		StringBuilder s = new StringBuilder();
-		s.append("'");
-		if (port instanceof ProcessorPort) {
-			ProcessorPort processorPort = (ProcessorPort) port;
-			s.append(escapeName(processorPort.getParent().getName()));
-			s.append(":");
-		}
-		s.append(escapeName(port.getName()));
-		s.append("'");
-		return s.toString();
-	}
-
-	private String escapeName(String name) {
-		return name.replace("\\", "\\\\").replace("'", "\\'")
-				.replace(":", "\\:").replace("/", "\\/");
-	}
-
-	@Override
-	public Set<String> getMediaTypes() {
-		return Collections.singleton(TEXT_VND_TAVERNA_SCUFL2_STRUCTURE);
-	}
-
-	private void newLine(int indentLevel) {
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++)
-			sb.append("  ");
-	}
-
-	private <T extends Named> List<T> sorted(NamedSet<T> namedSet) {
-		List<T> sorted = new ArrayList<>();
-		sorted.addAll(namedSet);
-		Collections.sort(sorted, new Comparator<T>() {
-			@Override
-			public int compare(T o1, T o2) {
-				return o1.getName().compareTo(o2.getName());
-			}
-		});
-		return sorted;
-	}
-
-	@Override
-	public synchronized void writeBundle(WorkflowBundle wb, File destination,
-			String mediaType) throws IOException {
-		destination.createNewFile();
-		try (BufferedOutputStream outputStream = new BufferedOutputStream(
-				new FileOutputStream(destination))) {
-			writeBundle(wb, outputStream, mediaType);
-		}
-	}
-
-	@Override
-	public void writeBundle(WorkflowBundle wfBundle, OutputStream output,
-			String mediaType) throws IOException {
-		OutputStreamWriter writer = new OutputStreamWriter(output, "utf-8");
-		try {
-			writer.write(bundleString(wfBundle));
-		} finally {
-			writer.close();
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/316e4a8a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/iterationstrategy/CrossProduct.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/iterationstrategy/CrossProduct.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/iterationstrategy/CrossProduct.java
deleted file mode 100644
index 58895f0..0000000
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/iterationstrategy/CrossProduct.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.apache.taverna.scufl2.api.iterationstrategy;
-
-/*
- * 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.util.ArrayList;
-import java.util.List;
-
-import org.apache.taverna.scufl2.api.common.AbstractCloneable;
-import org.apache.taverna.scufl2.api.common.Visitor;
-import org.apache.taverna.scufl2.api.common.WorkflowBean;
-
-
-/**
- * @author Stian Soiland-Reyes
- */
-@SuppressWarnings("serial")
-public class CrossProduct extends ArrayList<IterationStrategyNode> implements
-		IterationStrategyTopNode {
-	private IterationStrategyParent parent;
-
-	@Override
-	public boolean accept(Visitor visitor) {
-		if (visitor.visitEnter(this))
-			for (IterationStrategyNode strategy : this)
-				if (!strategy.accept(visitor))
-					break;
-		return visitor.visitLeave(this);
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		return o instanceof CrossProduct && super.equals(o);
-	}
-
-	@Override
-	public IterationStrategyParent getParent() {
-		return parent;
-	}
-
-	@Override
-	public void setParent(IterationStrategyParent newParent) {
-		if (parent == newParent)
-			return;
-
-		if (parent != null) {
-			// Remove from old parent
-			if (parent instanceof IterationStrategyStack) {
-				IterationStrategyStack stack = (IterationStrategyStack) parent;
-				stack.remove(this);
-			} else if (parent instanceof DotProduct
-					|| parent instanceof CrossProduct) {
-				@SuppressWarnings("unchecked")
-				List<IterationStrategyNode> parentList = (List<IterationStrategyNode>) parent;
-				parentList.remove(this);
-			} else
-				throw new IllegalArgumentException(
-						"Old parent must be a IterationStrategy, DotProduct or CrossProduct: "
-								+ parent);
-		}
-
-		parent = newParent;
-
-		if (parent instanceof IterationStrategyStack) {
-			IterationStrategyStack stack = (IterationStrategyStack) parent;
-			if (!stack.contains(this))
-				stack.add(this);
-		} else if (parent instanceof DotProduct
-				|| parent instanceof CrossProduct) {
-			@SuppressWarnings("unchecked")
-			List<IterationStrategyNode> parentList = (List<IterationStrategyNode>) parent;
-			if (!parentList.contains(this))
-				parentList.add(this);
-		} else
-			throw new IllegalArgumentException(
-					"Parent must be a IterationStrategy, DotProduct or CrossProduct: "
-							+ parent);
-	}
-
-	@Override
-	public WorkflowBean clone() {
-		return AbstractCloneable.cloneWorkflowBean(this);
-	}
-
-	@Override
-	public String toString() {
-		return getClass().getSimpleName() + super.toString();
-	}
-}