diff --git a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java
index ca896f5..27fdbe4 100644
--- a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java
+++ b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java
@@ -625,7 +625,7 @@
 			try {
 				getPw().addProcessorBinding(procBinding);
 			} catch (SQLException e) {
-				logger.info("WARNING: provenance has duplicate processor binding -- due to workflow nesting?", e);
+				logger.debug("provenance has duplicate processor binding -- skipping the insertion"); //, e);
 			}
 		} else if (provenanceItem.getEventType().equals(SharedVocabulary.END_WORKFLOW_EVENT_TYPE)) {
 
@@ -1122,9 +1122,6 @@
 		vb.setCollIDRef(collIdRef);
 		vb.setPositionInColl(positionInCollection);
 
-		logger.debug("new input VB with wfNameRef="+currentWorkflowID+" processorId="+processorId+
-				" valueType="+valueType+" portName="+portName+" collIdRef="+collIdRef+" position="+positionInCollection+" itvector="+iterationVector);
-		
 		newBindings.add(vb);
 		
 		if (valueType.equals("literal")) {
@@ -1136,6 +1133,11 @@
 				vb.setIterationVector(iterationVector);
 				vb.setValue(valueEl.getAttributeValue("id"));
 
+				logger.debug("new input VB with wfNameRef="+currentWorkflowID+" processorId="+processorId+
+						" valueType="+valueType+" portName="+portName+" collIdRef="+collIdRef+
+						" position="+positionInCollection+" itvector="+iterationVector+
+						" value="+vb.getValue());
+
 //				logger.info("calling addVarBinding on "+vb.getPNameRef()+" : "+vb.getVarNameRef()); 
 				getPw().addVarBinding(vb);
 
@@ -1149,16 +1151,26 @@
 			vb.setValue(valueEl.getAttributeValue("id"));
 			vb.setRef(valueEl.getChildText("reference"));
 
+			logger.debug("new input VB with wfNameRef="+currentWorkflowID+" processorId="+processorId+
+					" valueType="+valueType+" portName="+portName+" collIdRef="+collIdRef+
+					" position="+positionInCollection+" itvector="+iterationVector+
+					" value="+vb.getValue());
+
 			try {
 //				logger.debug("calling addVarBinding on "+vb.getPNameRef()+" : "+vb.getVarNameRef()+" with it "+vb.getIteration()); 
 				getPw().addVarBinding(vb);
 			} catch (SQLException e) {
-				logger.warn("Problem processing var binding", e);
+				logger.debug("Problem processing var binding -- performing update instead of insert", e); //, e);
+				// try to update the existing record instead using the current collection info
+				
+				getPw().updateVarBinding(vb);
+//				logger.warn("VarBinding update successful");
+				
 			}
 
 		} else if (valueType.equals("list")) {
 
-//			logger.warn("input of type list");
+			logger.debug("input of type list");
 
 			// add entries to the Collection and to the VarBinding tables
 			// list id --> Collection.collId
diff --git a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java
index eafe89e..da26f7b 100644
--- a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java
+++ b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java
@@ -498,6 +498,8 @@
 			q = q + " and '"+conds.get(0)+"'"; 
 			conds.remove(0); 
 		}
+		
+		q = q + " ORDER BY timestamp desc ";
 
 		try {
 			connection = getConnection();
@@ -2355,7 +2357,11 @@
 
 
 
-
+/**
+ * returns a Workflow record from the DB given the workflow internal ID
+ * @param dataflowID
+ * @return
+ */
 	public Workflow getWorkflow(String dataflowID) {
 
 		PreparedStatement ps = null;
diff --git a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java
index 76df3a8..c61f7f0 100644
--- a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java
+++ b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java
@@ -341,7 +341,11 @@
 			logger.warn("Error inserting record for Processor binding", e1);
 		} finally {
 			if (connection != null) {
-				connection.close();
+				try {
+					connection.close();
+				} catch (SQLException e) {
+					logger.warn("Can't close connection", e);
+				}
 			}
 		}
 
@@ -475,8 +479,8 @@
 			logger.warn("Error inserting record for a varBinding", e1);
 		} catch (ClassNotFoundException e1) {
 			logger.warn("Error inserting record for a varBinding", e1);
-		} catch (SQLException e) {
-			logger.warn("Var binding insert failed", e);
+//		} catch (SQLException e) {
+//			logger.warn("Var binding insert failed", e);
 		} finally {
 			if (connection != null) {
 				connection.close();
@@ -552,13 +556,13 @@
 			cnt++;
 
 		} catch (SQLException e) {
-			logger.info("****  insert failed due to [" + e.getMessage() + "]");
+			logger.warn("****  insert failed for query ", e);
 		} catch (InstantiationException e) {
-			logger.info("****  insert failed due to [" + e.getMessage() + "]");
+			logger.warn("****  insert failed ", e);
 		} catch (IllegalAccessException e) {
-			logger.info("****  insert failed due to [" + e.getMessage() + "]");
+			logger.warn("****  insert failed ", e);
 		} catch (ClassNotFoundException e) {
-			logger.info("****  insert failed due to [" + e.getMessage() + "]");
+			logger.warn("****  insert failed ", e);
 		} finally {
 			if (connection != null) {
 				try {
diff --git a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java
index e7e0455..72913fa 100644
--- a/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java
+++ b/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java
@@ -21,10 +21,12 @@
  * this class manages the outputs from a workflow, as they come along through WorkflowData events
  */
 public class WorkflowDataProcessor {
-	
+
 	private static Logger logger = Logger.getLogger(WorkflowDataProcessor.class);
 
 	// set of trees (impl as lists), one for each varname
+	// PM varname not enough must use the WFID as context as well, because the same output varname 
+	// may occur in multiple nested workflows 
 	Map<String, List<WorkflowDataNode>> workflowDataTrees = new HashMap<String, List<WorkflowDataNode>>();  
 
 	ProvenanceQuery pq=null;
@@ -43,6 +45,7 @@
 		int[] index = ((WorkflowDataProvenanceItem)provenanceItem).getIndex();
 		String iterationToString = ProvenanceUtils.iterationToString(index);
 		wdn.setIndex(iterationToString);
+		wdn.setWorkflowID(((WorkflowDataProvenanceItem)provenanceItem).getWorkflowId());
 
 		if (wdn.getValue().contains("list")) wdn.setList(true);  // HACK
 		else wdn.setList(false);
@@ -58,7 +61,7 @@
 			for (WorkflowDataNode aNode: aTree) {
 				if (isParent(wdn.getIndex(), aNode.getIndex())) {
 					aNode.setParent(wdn);
-					
+
 					// set position in collection as the last index in the vector
 					aNode.setRelativePosition(getPosition(aNode));
 				}
@@ -85,54 +88,60 @@
 			String varName = entry.getKey();
 			List<WorkflowDataNode> tree = entry.getValue();
 
-			try {
+			VarBinding vb = null;
 
-				logger.debug("storing tree for var "+varName);
+			try {
+				logger.debug("storing tree for var "+varName+" in workflow with ID "+dataflowID+" and instance "+wfInstanceRef);
 				for (WorkflowDataNode node:tree) {
+
+					if (!node.getWorkflowID().equals(dataflowID)) continue;
+
 					if (node.isList) {
 
 						logger.debug("creating collection entry for "+
 								node.value+" with index "+
 								node.index);
-						
+
 						if (node.getParent()!=null) {
 							logger.debug(" and parent "+node.parent.index);
-						// write a collection record to DB
-						getPw().addCollection(dataflowID, 
-								              node.getValue(), 
-								              node.getParent().getValue(), 
-								              node.getIndex(), 
-								              varName, 
-								              wfInstanceRef);
+							// write a collection record to DB
+							getPw().addCollection(dataflowID, 
+									node.getValue(), 
+									node.getParent().getValue(), 
+									node.getIndex(), 
+									varName, 
+									wfInstanceRef);
 						} else {
 							getPw().addCollection(dataflowID, 
-						              node.getValue(), 
-						              null, 
-						              node.getIndex(), 
-						              varName, 
-						              wfInstanceRef);							
+									node.getValue(), 
+									null, 
+									node.getIndex(), 
+									varName, 
+									wfInstanceRef);							
 						}
 
 					} else {
 						logger.debug("creating VarBinding for "+node.value+" with index "+node.index);
-						
-						VarBinding vb = new VarBinding();
+
+						vb = new VarBinding();
 
 						vb.setWfNameRef(dataflowID);
 						vb.setWfInstanceRef(wfInstanceRef);
-						vb.setPNameRef(dataflowID);
+						
+						vb.setPNameRef(pq.getWorkflow(dataflowID).getExternalName());
+						
 						// vb.setValueType(); // TODO not sure what to set this to
 						vb.setVarNameRef(varName);
 						vb.setIterationVector(node.getIndex());
 						vb.setValue(node.getValue());
-						
+
 						if (node.getParent()!=null) {
 							logger.debug(" in collection "+node.getParent().value+
 									" with index "+node.getParent().getIndex());
-							
+
 							vb.setCollIDRef(node.getParent().getValue());
 							vb.setPositionInColl(node.getRelativePosition());
-							
+
 						} else {
 							vb.setPositionInColl(1);  // default							
 						}						
@@ -140,24 +149,26 @@
 					}
 				}
 			} catch (SQLException e) {
-				logger.error("Problem processing trees for workflow: " +dataflowID + " instance: " + wfInstanceRef + " : ", e);
+				logger.debug("Problem processing trees for workflow: " +dataflowID + " instance: " + wfInstanceRef + " : "+
+						" updating instead of inserting");
+				getPw().updateVarBinding(vb);
 			}
 
 		}
 
 	}
 
-	
+
 
 	/**
 	 * @param node
 	 * @return the last digit in the index 
 	 */
 	private int getPosition(WorkflowDataNode node) {
-		
+
 		String[] vector = node.getIndex().substring(1, node.getIndex().length()-1).split(",");
 		//TODO need some logic  here to avoid trying to parse "" as integer, this is my try
-		
+
 		//logger.debug("Vector length is " + vector.length);
 		//logger.debug("get position is " + vector[vector.length-1]);
 		if ((vector[vector.length-1]).equals("")) {
@@ -196,6 +207,7 @@
 		String varName;
 		String value;
 		String index;
+		String workflowID;
 		int  relativePosition;
 		boolean isList;
 		WorkflowDataNode parent;
@@ -273,6 +285,18 @@
 		public void setRelativePosition(int relativePosition) {
 			this.relativePosition = relativePosition;
 		}
+		/**
+		 * @return the workflowID
+		 */
+		public String getWorkflowID() {
+			return workflowID;
+		}
+		/**
+		 * @param workflowID the workflowID to set
+		 */
+		public void setWorkflowID(String workflowID) {
+			this.workflowID = workflowID;
+		}
 
 	}
 
diff --git a/trunk/checkstyle.xml b/trunk/checkstyle.xml
deleted file mode 100644
index f0c64bb..0000000
--- a/trunk/checkstyle.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" ?>
-
-<!DOCTYPE module PUBLIC
-  "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
-  "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
-
-<module name="Checker">
-	<module name="TreeWalker">
-		<module name="LineLength">
-			<property name="max" value="200" />
-			<property name="severity" value="warning"/>
-		</module>
-		<module name="JavadocMethod">
-   			<property name="scope" value="public"/>
-   			<property name="allowUndeclaredRTE" value="true"/>
-   			<property name="severity" value="error"/>
-   			<property name="allowMissingParamTags" value="true"/>
-   			<property name="allowMissingThrowsTags" value="true"/>
-   			<property name="allowMissingReturnTag" value="true"/>
-   			<property name="allowMissingPropertyJavadoc" value="true"/>
-		</module>
-		<module name="JavadocType">
-   			<property name="scope" value="public"/>
-		</module>
- 		<module name="ReturnCount">
- 			<property name="severity" value="warning"/>
- 		</module>
-	</module>
-	<module name="PackageHtml"/>
-</module>
diff --git a/trunk/pom.xml b/trunk/pom.xml
deleted file mode 100644
index 9eae277..0000000
--- a/trunk/pom.xml
+++ /dev/null
@@ -1,289 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>parent</artifactId>
-		<groupId>net.sf.taverna</groupId>
-		<version>0.1.2009-02-12</version>
-	</parent>
-
-	<groupId>net.sf.taverna.t2</groupId>
-	<artifactId>core</artifactId>
-	<version>0.9</version>
-	<packaging>pom</packaging>
-
-	<name>Taverna 2 Core</name>
-	<build>
-		<plugins>
-<plugin>
-        <artifactId>maven-release-plugin</artifactId>
-        <version>2.0-beta-9</version>
-      </plugin>
-
-			<plugin>
-				<artifactId>maven-clover-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>pre-site</phase>
-						<goals>
-							<goal>instrument</goal>
-							<goal>aggregate</goal>
-						</goals>
-					</execution>
-				</executions>
-				<configuration>
-					<jdk>1.5</jdk>
-					<targetPercentage>50%</targetPercentage>
-					<failOnViolation>false</failOnViolation>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-	
-	<properties>
-		<t2.infrastructure.version>1.12</t2.infrastructure.version>
-		<t2.lang.version>0.6</t2.lang.version>
-	</properties>
-	
-	<modules>
-		<module>reference-api</module>
-	   	<module>reference-impl</module>
-	   	<module>reference-testhelpers</module>
-		<module>workflowmodel-api</module>
-		<module>workflowmodel-impl</module>   
-		<module>provenanceconnector</module>		
-	</modules>
-	<repositories>
-		<repository>
-			<releases />
-			<snapshots>
-				<enabled>false</enabled>
-			</snapshots>
-			<id>mygrid-repository</id>
-			<name>myGrid Repository</name>
-			<url>http://www.mygrid.org.uk/maven/repository</url>
-		</repository>
-	</repositories>
-	<reporting>
-		<plugins>
-			<plugin>
-				<artifactId>maven-checkstyle-plugin</artifactId>
-				<configuration>
-					<configLocation>
-						${basedir}/../checkstyle.xml
-					</configLocation>
-				</configuration>
-			</plugin>
-			<plugin>
-				<artifactId>maven-clover-plugin</artifactId>
-				<configuration>
-					<generatePdf>true</generatePdf>
-					<generateXml>true</generateXml>
-				</configuration>
-			</plugin>
-			<plugin>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<minmemory>128m</minmemory>
-					<maxmemory>512</maxmemory>
-					<aggregate>true</aggregate>
-					<links>
-						<link>
-							http://www.mygrid.org.uk/taverna/api/
-						</link>
-						<link>
-							http://java.sun.com/j2se/1.5.0/docs/api/
-						</link>
-					</links>
-				</configuration>
-			</plugin>
-			<plugin>
-				<artifactId>maven-surefire-plugin</artifactId>
-			</plugin>
-			<plugin>
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>jxr-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</reporting>
-	<scm>
-		<connection>scm:svn:http://taverna.googlecode.com/svn/taverna/engine/net.sf.taverna.t2.core/trunk/</connection>
-		<developerConnection>scm:svn:https://taverna.googlecode.com/svn/taverna/engine/net.sf.taverna.t2.core/trunk/</developerConnection>
-		<url>http://code.google.com/p/taverna/source/browse/#svn/taverna/engine/net.sf.taverna.t2.core/trunk</url>
-	</scm>
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>junit</groupId>
-				<artifactId>junit</artifactId>
-				<version>4.4</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>log4j</groupId>
-				<artifactId>log4j</artifactId>
-				<version>1.2.13</version>
-			</dependency>
-			<dependency>
-				<groupId>commons-io</groupId>
-				<artifactId>commons-io</artifactId>
-				<version>1.3</version>
-			</dependency>
-			<dependency>
-				<groupId>commons-httpclient</groupId>
-				<artifactId>commons-httpclient</artifactId>
-				<version>3.1</version>
-			</dependency>
-			<dependency>
-				<groupId>commons-lang</groupId>
-				<artifactId>commons-lang</artifactId>
-				<version>2.2</version>
-			</dependency>
-			<dependency>
-				<groupId>commons-cli</groupId>
-				<artifactId>commons-cli</artifactId>
-				<version>1.0</version>
-			</dependency>
-			<dependency>
-				<groupId>jdom</groupId>
-				<artifactId>jdom</artifactId>
-				<version>1.0</version>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.processors
-				</groupId>
-				<artifactId>taverna-beanshell-processor
-				</artifactId>
-				<version>${taverna.version}</version>
-				<scope>test</scope>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.processors
-				</groupId>
-				<artifactId>taverna-biomart-processor
-				</artifactId>
-				<version>${taverna.version}</version>
-				<scope>test</scope>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.processors
-				</groupId>
-				<artifactId>taverna-soaplab-processor
-				</artifactId>
-				<version>${taverna.version}</version>
-				<scope>test</scope>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.processors
-				</groupId>
-				<artifactId>taverna-localworkers</artifactId>
-				<version>${taverna.version}</version>
-				<scope>test</scope>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.scufl
-				</groupId>
-				<artifactId>scufl-model</artifactId>
-				<version>${taverna.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.processors
-				</groupId>
-				<artifactId>taverna-stringconstant-processor
-				</artifactId>
-				<version>${taverna.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-			<dependency>
-				<groupId>uk.org.mygrid.taverna.processors
-				</groupId>
-				<artifactId>taverna-java-processor</artifactId>
-				<version>${taverna.version}</version>
-				<exclusions>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven</artifactId>
-					</exclusion>
-					<exclusion>
-						<groupId>uk.org.mygrid.taverna.raven
-						</groupId>
-						<artifactId>raven-log4j</artifactId>
-					</exclusion>
-				</exclusions>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
-</project>
diff --git a/trunk/provenanceconnector/javadoc.xml b/trunk/provenanceconnector/javadoc.xml
deleted file mode 100644
index 3d863c6..0000000
--- a/trunk/provenanceconnector/javadoc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project default="javadoc">
-<target name="javadoc">
-<javadoc access="public" author="true" classpath="/Users/paolo/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/core/reference-api/0.9-SNAPSHOT/reference-api-0.9-SNAPSHOT.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/infrastructure/launcher-api/1.12-SNAPSHOT/launcher-api-1.12-SNAPSHOT.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/infrastructure/raven/1.12-SNAPSHOT/raven-1.12-SNAPSHOT.jar:/Users/paolo/.m2/repository/geronimo-spec/geronimo-spec-jta/1.0-M1/geronimo-spec-jta-1.0-M1.jar:/Users/paolo/.m2/repository/org/aspectj/aspectjweaver/1.6.0/aspectjweaver-1.6.0.jar:/Users/paolo/.m2/repository/org/springframework/spring-orm/2.5.4/spring-orm-2.5.4.jar:/Users/paolo/.m2/repository/org/jvnet/jaxb2_commons/runtime/0.2.RC1/runtime-0.2.RC1.jar:/Users/paolo/.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar:/Users/paolo/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/infrastructure/raven-log4j/1.12-SNAPSHOT/raven-log4j-1.12-SNAPSHOT.jar:/Users/paolo/.m2/repository/org/springframework/spring-aop/2.5.4/spring-aop-2.5.4.jar:/Users/paolo/.m2/repository/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar:/Users/paolo/.m2/repository/org/openprovenance/tupelo/1.0.3/tupelo-1.0.3.jar:/Users/paolo/.m2/repository/org/springframework/spring-tx/2.5.4/spring-tx-2.5.4.jar:/Users/paolo/.m2/repository/commons-codec/commons-codec/1.2/commons-codec-1.2.jar:/Users/paolo/.m2/repository/org/openprovenance/opm/1.0.3/opm-1.0.3.jar:/Users/paolo/.m2/repository/junit/junit/4.4/junit-4.4.jar:/Users/paolo/.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar:/Users/paolo/.m2/repository/org/springframework/spring-beans/2.5.4/spring-beans-2.5.4.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/core/reference-core-extensions/0.7-SNAPSHOT/reference-core-extensions-0.7-SNAPSHOT.jar:/Users/paolo/.m2/repository/log4j/log4j/1.2.13/log4j-1.2.13.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/infrastructure/spi-discovery-api/1.12-SNAPSHOT/spi-discovery-api-1.12-SNAPSHOT.jar:/Users/paolo/.m2/repository/commons-lang/commons-lang/2.2/commons-lang-2.2.jar:/Users/paolo/.m2/repository/org/openprovenance/toolbox/1.0.3/toolbox-1.0.3.jar:/Users/paolo/.m2/repository/commons-jxpath/commons-jxpath/1.2/commons-jxpath-1.2.jar:/Users/paolo/.m2/repository/org/tupeloproject/tupelo-kernel/2.4.3/tupelo-kernel-2.4.3.jar:target/test-classes:/Users/paolo/.m2/repository/commons-collections/commons-collections/2.1.1/commons-collections-2.1.1.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/core/workflowmodel-api/0.9-SNAPSHOT/workflowmodel-api-0.9-SNAPSHOT.jar:/Users/paolo/.m2/repository/commons-io/commons-io/1.3/commons-io-1.3.jar:/Users/paolo/.m2/repository/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar:/Users/paolo/.m2/repository/org/aspectj/aspectjrt/1.6.0/aspectjrt-1.6.0.jar:/Users/paolo/.m2/repository/org/tupeloproject/tupelo-cet/2.4.3/tupelo-cet-2.4.3.jar:/Users/paolo/.m2/repository/org/tupeloproject/tupelo-util/2.4.3/tupelo-util-2.4.3.jar:/Users/paolo/.m2/repository/org/hibernate/hibernate/3.2.5.ga.raven/hibernate-3.2.5.ga.raven.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/infrastructure/appconfig/1.12-SNAPSHOT/appconfig-1.12-SNAPSHOT.jar:/Users/paolo/.m2/repository/commons-pool/commons-pool/1.3/commons-pool-1.3.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/infrastructure/prelauncher/1.12-SNAPSHOT/prelauncher-1.12-SNAPSHOT.jar:/Users/paolo/.m2/repository/commons-beanutils/commons-beanutils/1.4/commons-beanutils-1.4.jar:/Users/paolo/.m2/repository/jdom/jdom/1.0/jdom-1.0.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/core/reference-impl/0.9-SNAPSHOT/reference-impl-0.9-SNAPSHOT.jar:/Users/paolo/.m2/repository/net/sf/taverna/t2/lang/observer/0.6-SNAPSHOT/observer-0.6-SNAPSHOT.jar:/Users/paolo/.m2/repository/simple-jndi/simple-jndi/0.11.1/simple-jndi-0.11.1.jar:/Users/paolo/.m2/repository/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar:/Users/paolo/.m2/repository/com/sun/xml/bind/jaxb-impl/2.1.3/jaxb-impl-2.1.3.jar:/Users/paolo/.m2/repository/commons-dbcp/commons-dbcp/1.2.2/commons-dbcp-1.2.2.jar:/Users/paolo/.m2/repository/org/springframework/spring-core/2.5.4/spring-core-2.5.4.jar:/Users/paolo/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar:/Users/paolo/.m2/repository/org/springframework/spring-context/2.5.4/spring-context-2.5.4.jar:/Users/paolo/.m2/repository/org/springframework/spring-jdbc/2.5.4/spring-jdbc-2.5.4.jar:/Users/paolo/.m2/repository/javax/activation/activation/1.1/activation-1.1.jar:/Users/paolo/.m2/repository/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar" destdir="doc" doctitle="ProvenanceConnector and Provenance Access API" nodeprecated="false" nodeprecatedlist="false" noindex="false" nonavbar="false" notree="false" source="1.5" sourcefiles="src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorRegistry.java,src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactory.java,src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactoryRegistry.java" sourcepath="src/main/java:src/test/java:src/main/resources" splitindex="true" use="true" version="true"/>
-</target>
-</project>
diff --git a/trunk/provenanceconnector/pom.xml b/trunk/provenanceconnector/pom.xml
deleted file mode 100644
index e527bdb..0000000
--- a/trunk/provenanceconnector/pom.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>net.sf.taverna.t2</groupId>
-        <artifactId>core</artifactId>
-        <version>0.9</version>
-    </parent>
-    <groupId>net.sf.taverna.t2.core</groupId>
-    <artifactId>provenanceconnector</artifactId>
-    <name>Database storage and analysis of provenance info</name>
-    <url>http://maven.apache.org</url>
-    <properties>
-        <t2.ui.components.version>0.10</t2.ui.components.version>
-    </properties>
-    <repositories>
-        <repository>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-            <id>tupelo2</id>
-            <name>tupelo2</name>
-            <url>http://dlt-dev.ncsa.uiuc.edu/m2</url>
-        </repository>
-        <repository>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-            <id>opm</id>
-            <name>opm</name>
-            <url>http://openprovenance.org/java/maven-releases</url>
-        </repository>
-    </repositories>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-		
-        <dependency>
-            <groupId>net.sf.taverna.t2.core</groupId>
-            <artifactId>workflowmodel-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-                
-        <dependency>
-            <groupId>jdom</groupId>
-            <artifactId>jdom</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>net.sf.taverna.t2.infrastructure</groupId>
-            <artifactId>spi-discovery-api</artifactId>
-            <version>${t2.infrastructure.version}</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>net.sf.taverna.t2.core</groupId>
-            <artifactId>reference-impl</artifactId>
-            <version>0.9</version>
-        </dependency>
-
-        <dependency>
-            <groupId>net.sf.taverna.t2.core</groupId>
-            <artifactId>reference-core-extensions</artifactId>
-            <version>0.7</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.tupeloproject</groupId>
-            <artifactId>tupelo-cet</artifactId>
-            <version>2.4.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.openprovenance</groupId>
-            <artifactId>opm</artifactId>
-            <version>1.0.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.openprovenance</groupId>
-            <artifactId>toolbox</artifactId>
-            <version>1.0.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>simple-jndi</groupId>
-            <artifactId>simple-jndi</artifactId>
-            <version>0.11.1</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-dbcp</groupId>
-                    <artifactId>commons-dbcp</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-pool</groupId>
-                    <artifactId>commons-pool</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-dbcp</groupId>
-            <artifactId>commons-dbcp</artifactId>
-            <version>1.2.2</version>
-        </dependency>
-        
-        
-    </dependencies>
-    
-</project>
-
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactory.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactory.java
deleted file mode 100644
index 6166a4b..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactory.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.sf.taverna.t2.provenance;
-
-import net.sf.taverna.t2.provenance.connector.ProvenanceConnector;
-
-public interface ProvenanceConnectorFactory {
-	
-	public ProvenanceConnector getProvenanceConnector();
-	public String getConnectorType();
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactoryRegistry.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactoryRegistry.java
deleted file mode 100644
index fe4b6e9..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorFactoryRegistry.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance;
-
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-/**
- * Get all the instances of {@link ProvenanceConnectorFactory} that are available using
- * this SPI Registry. Loads instances by looking at all files in
- * META-INF/services/net.sf.taverna.t2.provenance.ProvenanceConnectorFactory
- * 
- * @author Ian Dunlop
- * 
- */
-public class ProvenanceConnectorFactoryRegistry extends
-		SPIRegistry<ProvenanceConnectorFactory> {
-
-	private static ProvenanceConnectorFactoryRegistry instance;
-
-	protected ProvenanceConnectorFactoryRegistry() {
-		super(ProvenanceConnectorFactory.class);
-	}
-
-	/**
-	 * Get an instance of the registry that you can then get all the available
-	 * {@link ProvenanceConnector} instances from
-	 * 
-	 * @return
-	 */
-	public static synchronized ProvenanceConnectorFactoryRegistry getInstance() {
-
-		if (instance == null) {
-			instance = new ProvenanceConnectorFactoryRegistry();
-		}
-		return instance;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorRegistry.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorRegistry.java
deleted file mode 100644
index ba41dab..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/ProvenanceConnectorRegistry.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance;
-
-import net.sf.taverna.t2.provenance.connector.ProvenanceConnector;
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-/**
- * Get all the instances of {@link ProvenanceConnector} that are available using
- * this SPI Registry. Loads instances by looking at all files in
- * META-INF/services/net.sf.taverna.t2.provenance.connector.ProvenanceConnector
- * 
- * @author Ian Dunlop
- * 
- */
-public class ProvenanceConnectorRegistry extends
-		SPIRegistry<ProvenanceConnector> {
-
-	private static ProvenanceConnectorRegistry instance;
-
-	protected ProvenanceConnectorRegistry() {
-		super(ProvenanceConnector.class);
-	}
-
-	/**
-	 * Get an instance of the registry that you can then get all the available
-	 * {@link ProvenanceConnector} instances from
-	 * 
-	 * @return
-	 */
-	public static synchronized ProvenanceConnectorRegistry getInstance() {
-
-		if (instance == null) {
-			instance = new ProvenanceConnectorRegistry();
-		}
-		return instance;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/NativeAnswer.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/NativeAnswer.java
deleted file mode 100644
index 14659ca..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/NativeAnswer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.api;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.provenance.lineageservice.Dependencies;
-import net.sf.taverna.t2.provenance.lineageservice.utils.QueryVar;
-
-/**
- * @author Paolo Missier<br/>
- * Java bean used to encapsulate the results of a provenance query
- *
- */
-public class NativeAnswer {
-	
-	Map<QueryVar, Map<String, List<Dependencies>>>  answer;
-
-	/**
-	 * @return a Map of the form: {@link QueryVar}  --> ( &lt;path> --> [ {@link Dependencies} ]) where
-	 * <ul>
-	 * <li>  {@link QueryVar}  denotes one of the ports in the &lt;select> element of the input query
-	 * <li>  &lt;path>  is the index within the value associated to the port, for instance [1,2,3] or []. 
-	 * Multiple paths may appear if the query asked for the provenance of specific elements within a collection value, for example
-	 * <li> [{@link Dependencies}] is a list of {@link Dependencies}, each associated with one target processor and port as requested
-	 * in the input query.  
-	 */
-	public Map<QueryVar, Map<String, List<Dependencies>>> getAnswer() { return answer; }
-
-	/**
-	 * @param sets the query answer, in the format described in {@link #getAnswer()}
-	 */
-	public void setAnswer(Map<QueryVar, Map<String, List<Dependencies>>> answer) { this.answer = answer; }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceAccess.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceAccess.java
deleted file mode 100644
index 0361cc1..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceAccess.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- *  
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.api;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import net.sf.taverna.platform.spring.RavenAwareClassPathXmlApplicationContext;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.provenance.ProvenanceConnectorFactory;
-import net.sf.taverna.t2.provenance.ProvenanceConnectorFactoryRegistry;
-import net.sf.taverna.t2.provenance.connector.ProvenanceConnector;
-import net.sf.taverna.t2.provenance.lineageservice.Dependencies;
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceAnalysis;
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceQuery;
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceWriter;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceProcessor;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Workflow;
-import net.sf.taverna.t2.provenance.lineageservice.utils.WorkflowInstance;
-import net.sf.taverna.t2.provenance.reporter.ProvenanceReporter;
-import net.sf.taverna.t2.reference.ReferenceService;
-
-import org.apache.commons.dbcp.BasicDataSource;
-import org.apache.log4j.Logger;
-import org.springframework.context.ApplicationContext;
-
-/**
- * @author Paolo Missier
- * @author Stuart Owen
- * <p/>This API is the single access point into the Taverna provenance database. Its main functionality is to 
- * let clients query the content of the DB, either using dedicated methods that retrieve specific entity values from the 
- * DB, or through a more general XML-based query language. Examples of XML provenance queries can be found in the external package 
- * {@link net.sf.taverna.t2.provenance.apic.client.resources}. Class {@link net.sf.taverna.t2.provenance.api.client.ProvenanceAPISampleClient} 
- * provides an example of API client that third parties would use to interact with this API.<br/>
- * The XML schema for the XML query language is {@code pquery.xsd} in {@link net.sf.taverna.t2.provenance.apic.client.resources}
- */
-public class ProvenanceAccess {
-
-	private static Logger logger = Logger.getLogger(ProvenanceAccess.class);
-	ProvenanceConnector provenanceConnector = null;
-	ProvenanceAnalysis pa = null;
-	ProvenanceQuery pq;
-	ProvenanceWriter pw;
-	Query q = null;
-	private String connectorType;
-	private boolean computeOPMGraph;
-
-	public ProvenanceAccess(String connectorType) {
-		this.connectorType = connectorType;
-		init();
-	}
-
-	/**
-	 * The recommended data source intitialisation method, where only a driver name and jdbc url are required.<br/>
-	 * If the driver supports multiple connections, 
-	 * then a pool will be created of 10 min idle, 50 max idle, and 50 max active connections.
-	 *
-	 * @param driverClassName
-	 * @param jdbcUrl
-	 */
-	public static void initDataSource(String driverClassName,String jdbcUrl) {
-		initDataSource(driverClassName,jdbcUrl,null,null,10,50,50);
-	}
-
-	/**
-	 * Initialises a named JNDI DataSource if not already set up externally.
-	 * The DataSource is named jdbc/taverna
-	 *
-	 * @param driverClassName - the classname for the driver to be used.
-	 * @param jdbcUrl - the jdbc connection url
-	 * @param username - the username, if required (otherwise null)
-	 * @param password - the password, if required (oteherwise null)
-	 * @param minIdle - if the driver supports multiple connections, then the minumum number of idle connections in the pool
-	 * @param maxIdle - if the driver supports multiple connections, then the maximum number of idle connections in the pool
-	 * @param maxActive - if the driver supports multiple connections, then the minumum number of connections in the pool
-	 */
-	public static void initDataSource(String driverClassName, String jdbcUrl, String username, String password, int minIdle, int maxIdle, int maxActive) {
-		System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
-		"org.osjava.sj.memory.MemoryContextFactory");
-		System.setProperty("org.osjava.sj.jndi.shared", "true");
-
-		BasicDataSource ds = new BasicDataSource();
-		ds.setDriverClassName(driverClassName);
-		ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
-		ds.setMaxActive(maxActive);
-		ds.setMinIdle(minIdle);
-		ds.setMaxIdle(maxIdle);
-		ds.setDefaultAutoCommit(true);
-		if (username != null) {
-			ds.setUsername(username);
-		}
-		if (password != null) {
-			ds.setPassword(password);
-		}
-
-		ds.setUrl(jdbcUrl);
-
-		InitialContext context;
-		try {
-			context = new InitialContext();
-			context.rebind("jdbc/taverna", ds);
-		} catch (NamingException ex) {
-			logger.error("Problem rebinding the jdbc context: " + ex);
-		}
-
-	}
-
-	/**
-	 * Initialises a default Reference Service for storing data and their associated references.
-	 * This creates a reference service using the named JNDI Data Source 'jdbc/taverna'.<br/>
-	 * the new Reference Service is associated to the {@link ProvenanceConnector}, enabling data references to be resolved
-	 */
-	public InvocationContext initDefaultReferenceService() {
-		return initReferenceService("hibernateReferenceServiceContext.xml");
-	}
-
-	/**
-	 * Initialises the Reference Service for a given hibernate context definition.
-	 * This mapping file must be available in the root of the classpath.
-	 * @see #initDefaultReferenceService()
-	 * @param hibernateContext
-	 */
-	public InvocationContext initReferenceService(String hibernateContext) {
-		ApplicationContext appContext = new RavenAwareClassPathXmlApplicationContext(hibernateContext);
-
-		final ReferenceService referenceService = (ReferenceService) appContext
-		.getBean("t2reference.service.referenceService");
-
-		InvocationContext context =  new InvocationContext() {
-
-			public ReferenceService getReferenceService() {
-				return referenceService;
-			}
-
-			public ProvenanceReporter getProvenanceReporter() {
-				return provenanceConnector;
-			}
-
-			public <T> List<? extends T> getEntities(Class<T> entityType) {
-				// TODO Auto-generated method stub
-				return null;
-			}
-		};
-
-		return context;
-
-	}
-
-
-	public void init() {
-
-		for (ProvenanceConnectorFactory factory : ProvenanceConnectorFactoryRegistry.getInstance().getInstances()) {
-			if (connectorType.equalsIgnoreCase(factory.getConnectorType())) {
-				provenanceConnector = factory.getProvenanceConnector();
-			}
-		}
-		logger.info("Provenance being captured using: " + provenanceConnector);
-
-		//slight change, the init is outside but it also means that the init call has to ensure that the dbURL
-		//is set correctly
-		provenanceConnector.init();
-
-		InvocationContext context = initDefaultReferenceService();
-		provenanceConnector.setReferenceService(context.getReferenceService()); // CHECK context.getReferenceService());
-		provenanceConnector.setInvocationContext(context);
-
-		pa = provenanceConnector.getProvenanceAnalysis();
-		pq = provenanceConnector.getQuery();
-		pw = provenanceConnector.getWriter();
-	}
-
-
-/////////
-//	/  main provenance query methods
-
-
-
-	/**
-	 * Executes a provenance query. Please see separate doc. for the XML query language schema.
-	 * @throws SQLException
-	 */
-	public QueryAnswer executeQuery (Query pq) throws SQLException {
-
-		return pa.lineageQuery(pq.getTargetVars(), pq.getRunIDList().get(0), pq.getSelectedProcessors());
-	}
-
-
-	/**
-	 * Returns individal records from the provenance DB in response to a query that specifies
-	 * specific elements within values associated with a processor port, in the context of a specific run of a workflow.
-	 * <br/>This is used in the workbench to retrieve the "intermediate results" at various points during workflow execution, 
-	 * as opposed to a set of dependencies in response to a full-fledged provenance query.
-	 * @param wfInstance lineage scope -- a specific instance
-	 * @param pname for a specific processor [required]
-	 * @param a specific (input or output) variable [optional]
-	 * @param iteration and a specific iteration [optional]
-	 * @return a list of {@ LineageQueryResultRecord}, encapsulated in a {@link Dependencies} object
-	 * @throws SQLException
-	 */
-	public Dependencies fetchPortData(
-			String wfInstance,
-			String workflowId,
-			String pname,
-			String port,
-			String iteration) {
-
-		logger.info("running fetchPortData on instance "+wfInstance+
-				" workflow "+workflowId+
-				" processor "+pname+
-				" port "+port+
-				" iteration "+iteration);
-		// TODO add context workflowID to query
-		try {
-			return pa.fetchIntermediateResult(wfInstance, workflowId, pname, port, iteration);
-		} catch (SQLException e) {
-			logger.error("Problem with fetching intermediate results: " + e);
-		}
-		return null;
-	}
-
-//	/ manage instances
-
-
-	/**
-	 * @param workflowId defines the scope of the query - if null then the query runs on all available workflows
-	 * @param conditions additional conditions to be defined. This is a placeholder as conditions are currently ignored
-	 * @return a list of wfInstanceID, each representing one run of the input workflowID
-	 */
-	public List<WorkflowInstance> listRuns(String workflowId, Map<String, String> conditions) {
-
-		try {
-			return pq.getRuns(workflowId, conditions);
-		} catch (SQLException e) {
-			logger.error("Problem with listing runs: " + e);
-			return null;
-		}
-	}
-
-
-	/**
-	 * Removes all records that pertain to a specific run (but not the static specification of the workflow run)
-	 * @param runID the internal ID of a run. This can be obtained using {@link #listRuns(String, Map)}
-	 * @return the set of data references that pertain to the deleted run. This can be used by the Data Manager to ensure that
-	 * no dangling references are left in the main Taverna data repositorry
-	 */
-	public Set<String> removeRun(String runID) {
-
-		Set<String> danglingDataRefs = null;
-
-		// implement using clearDynamic() method or a variation. Collect references and forward
-		try {
-			danglingDataRefs = pw.clearDBDynamic(runID);
-
-			logger.debug("references collected during removeRun:");
-			for (String s:danglingDataRefs) {
-				logger.debug(s);
-			}
-
-			// TODO send the list of dangling refs to the Data manager for removal of the corresponding data values
-		} catch (SQLException e) {
-			logger.error("Problem while removing run : " + runID + " : "+ e.getMessage());
-		}
-		return danglingDataRefs; 
-	}
-
-
-	/**
-	 * removes all records pertaining to the static structure of a workflow.
-	 * 
-	 * @param wfName the ID (not the external name) of the workflow whose static structure is to be deleted from the DB 
-	 */
-	public void removeWorkflow(String wfName) {
-
-		try {
-			pw.clearDBStatic(wfName);
-		} catch (SQLException e) {
-			logger.error("Problem with removing static workflow: " + wfName+ " : "+ e.getMessage());
-		}
-	}
-
-
-	/**
-	 * returns a set of workflowIDs for a given runID. The set is a singleton if the workflow has no nesting,
-	 * but in general the list contains one workflowID for each nested workflow involved in the run
-	 * @param runID the internal ID for a specific workflow run
-	 * @return a list of workflow IDs, one for each nested workflow involved in the input run
-	 */
-	public List<String> getWorkflowID(String runID) {
-
-		try {
-			return pq.getWfNames(runID);
-		} catch (SQLException e) {
-			logger.error("Problem getting workflow ID: " + runID + " : " + e);
-		}
-		return null;
-	}
-
-
-	/**
-	 * @param runID the internal ID for a specific workflow run
-	 * @return the ID of the top-level workflow that executed during the input run
-	 */
-	public String getTopLevelWorkflowID(String runID) {
-
-		try {
-			return pq.getTopLevelWfName(runID);
-		} catch (SQLException e) {
-			logger.error("Problem getting top level workflow: " + runID + " : " + e);
-		}
-		return null;
-	}
-
-
-	/**
-	 * 
-	 * @return a list of {@link WorkflowInstance} beans, each representing the complete description of a workflow run (note that this is 
-	 * not just the ID of the run)
-	 */
-	public List<WorkflowInstance> getAllWorkflowIDs() {
-		try {
-			return pq.getRuns(null, null);
-		} catch (SQLException e) {
-			logger.error("Problem getting all workflow IDs: " + e);
-			return null;
-		}
-
-	}
-
-	
-//	/ access static workflow structure
-
-
-	/**
-	 * @param a workflow processor name
-	 * @return the IDs of all workflows that contain a processor named pname
-	 */
-	public List<Workflow> getContainingWorkflowsForProcessor(String pname) {
-		return pq.getContainingWorkflowsForProcessor(pname);
-	}
-
-
-
-	/**
-	 *
-	 * @param workflowID
-	 * @return a Map: workflowID -> [ {@ link ProvenanceProcessor} ]
-	 * Each entry in the list pertains to one composing sub-workflow 
-	 * (if no nesting then this contains only one workflow, namely the top level one)
-	 */
-	public Map<String, List<ProvenanceProcessor>> getProcessorsInWorkflow(String workflowID) {
-		return pq.getProcessorsDeep(null, workflowID);
-	}
-
-
-
-
-	/**
-	 * lists all ports for a processor
-	 * @param workflowID
-	 * @return a list of {@link Var} beans, each representing an input or output port for the workflow 
-	 */
-	public List<Var> getPortsForDataflow(String workflowID) {
-
-		Workflow w = pq.getWorkflow(workflowID);
-
-		Map<String, String> queryConstraints = new HashMap<String, String>();
-		queryConstraints.put("wfInstanceRef", workflowID);
-		queryConstraints.put("pnameRef", w.getExternalName());
-
-		try {
-			return pq.getVars(queryConstraints);
-		} catch (SQLException e) {
-			logger.error("Problem getting ports for dataflow: " + workflowID + " : " + e);
-		}
-		return null;
-	}
-
-
-
-	/**
-	 * list all ports for a specific processor within a workflow 
-	 * @param workflowID
-	 * @param processorName
-	 * @return a list of {@link Var} beans, each representing an input or output port for the input processor
-	 */
-	public List<Var> getPortsForProcessor(String workflowID, String processorName) {
-
-		Map<String, String> queryConstraints = new HashMap<String, String>();
-		queryConstraints.put("wfInstanceRef", workflowID);
-		queryConstraints.put("pnameRef", processorName);
-
-		try {
-			return pq.getVars(queryConstraints);
-		} catch (SQLException e) {
-			logger.error("Problem getting ports for processor: " + processorName + " worflow: " + workflowID + " : " + e);
-		}
-		return null;
-	}
-
-
-//	public List<ProvenanceProcessor> getSuccessors(String workflowID, String processorName, String portName) {
-//		return null; // TODO
-//	}
-//
-//	public List<String>   getActivities(String workflowID, String processorName) {
-//		return null; // TODO
-//	}
-
-
-
-
-//	/ configure provenance query functionality
-
-
-
-	/**
-	 * include valus of output ports in the query result? input port values are always included<br>
-	 * default is FALSE
-	 */
-	public void toggleIncludeProcessorOutputs(boolean active) {
-		return; // TODO
-	}
-
-
-	public boolean isIncludeProcessorOutputs() {
-		return false; // TODO
-	}
-
-
-	/**
-	 * @return an instance of {@link InvocationContext} that can be used by a client to deref a Taverna data reference
-	 */
-	public InvocationContext getInvocationContext() { return getProvenanceConnector().getInvocationContext(); }
-	
-//	/ OPM management
-
-
-	/**
-	 * should an OPM graph be generated in response to a query?<br>
-	 * default is TRUE
-	 */
-	public void toggleOPMGeneration(boolean active) { pa.setGenerateOPMGraph(active); }
-
-	/**
-	 * 
-	 * @return true if OPM is set to be generated in response to a query
-	 */
-	public boolean isOPMGenerationActive() {  return pa.isGenerateOPMGraph(); }
-
-	
-	/**
-	 * should actual artifact values be attached to OPM artifact nodes?<br>
-	 * default is FALSE<br/>
-	 * THIS IS CURRENTLY UNSUPPORTED -- DEFAULTS TO FALSE
-	 * @param active
-	 */
-	public  void toggleAttachOPMArtifactValues(boolean active) {
-		return; // TODO
-	}
-
-
-/**
- * 
- * @return true if the OPM graph artifacts are annotated with actual values
- */	public  boolean isAttachOPMArtifactValues() {
-		return false; // TODO
-	}
-
-
-	public String getWorkflowIDForExternalName(String workflowName) {
-		return pq.getWfNameForDataflow(workflowName);
-	}
-
-	public String getProcessorNameForWorkflowID(String workflowID) {
-		return pq.getProcessorForWorkflow(workflowID);
-	}
-
-
-	
-	/**
-	 * @return the singleton {@link ProvenanceConnector} used by the API to operate on the DB. Currently we support
-	 * MySQL {@link MySQLProvenanceConnector}  and Derby {@link  DerbyProvenanceConnector} connectors. 
-	 * The set of supported connectors is extensible. The available connectors are discovered automatically by the API 
-	 * upon startup, and it includes all the connectors that are mentioned in the &lt;dependencies> section of pom.xml 
-	 * for Maven module {@code net.sf.taverna.t2.core.provenanceconnector}  
-	 */
-	public ProvenanceConnector getProvenanceConnector() { return provenanceConnector; }
-
-
-	/**
-	 * @param a specific provenanceConnector used by the API
-	 */
-	public void setProvenanceConnector(ProvenanceConnector provenanceConnector) {
-		this.provenanceConnector = provenanceConnector;
-	}
-
-
-	/**
-	 * @return 
-	 */
-	public ProvenanceAnalysis getPa() {
-		return pa;
-	}
-
-
-	/**
-	 * @param pa the pa to set
-	 */
-	public void setPa(ProvenanceAnalysis pa) {
-		this.pa = pa;
-	}
-
-
-	/**
-	 * @return the pq
-	 */
-	public ProvenanceQuery getPq() {
-		return pq;
-	}
-
-
-	/**
-	 * @param pq the pq to set
-	 */
-	public void setPq(ProvenanceQuery pq) {
-		this.pq = pq;
-	}
-
-
-}
\ No newline at end of file
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceConnectorType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceConnectorType.java
deleted file mode 100644
index ccbda63..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceConnectorType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package net.sf.taverna.t2.provenance.api;
-
-
-/**
- * Defines names for the common Provenance Connector types
- *
- * @author Stuart Owen
- */
-public class ProvenanceConnectorType {
-    public static String MYSQL="mysql";
-    public static String DERBY="derby";
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceQueryParser.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceQueryParser.java
deleted file mode 100644
index 638c7b0..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ProvenanceQueryParser.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.api;
-
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceProcessor;
-import net.sf.taverna.t2.provenance.lineageservice.utils.QueryVar;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.WorkflowInstance;
-
-import org.apache.log4j.Logger;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.Namespace;
-import org.jdom.input.SAXBuilder;
-
-/**
- * @author paolo
- *
- */
-public class ProvenanceQueryParser {
-
-	private static Logger logger = Logger.getLogger(ProvenanceQueryParser.class);
-
-
-	private static final String SCOPE_EL = "scope";
-	private static final String QUERY_SCOPE_ATTR = "workflow";
-	private static final String PQUERY_EL = "pquery";
-	private static final String RUNS_EL = "runs";
-	private static final String RUN_ID = "id";
-	private static final Object RUN_EL = "run";
-	private static final Object RANGE_EL = "range";
-	private static final String RANGE_FROM = "from";
-	private static final String RANGE_TO = "to";
-
-	private static final String PORT_SELECTION_EL = "select";
-	private static final String WORKFLOW_NAME_ATTR = "name";
-	private static final String PORT_EL = "outputPort";
-	private static final String WORKFLOW_EL = "workflow";
-	private static final String PROCESSOR_EL = "processor";
-	private static final String PORT_NAME_ATTR = "name";
-	private static final String PROC_NAME_ATTR = "name";
-	private static final String PORT_NAME_EL = "name";
-
-	private static final String PROC_FOCUS_EL = "focus";
-
-	private static final String INDEX_ATTR = "index";
-
-	private static final String PQUERY_NS = "http://taverna.org.uk/2009/provenance/pquery/";
-
-
-	private static Namespace ns = Namespace.getNamespace(PQUERY_NS);
-
-	private ProvenanceAccess pAccess;
-
-	private String mainWorkflowExternalName = null;
-	private String mainWorkflowID = null;
-
-	/**
-	 * 
-	 * @param XMLQuerySpec A string representation of the XML provenace query
-	 * @return
-	 */
-	@SuppressWarnings("unchecked")
-	public Query parseProvenanceQuery(String XMLQuerySpecFilename) {
-
-		Query q = new Query();
-
-		Document d=null; 
-
-		// parse the XML using JDOM
-		SAXBuilder  b = new SAXBuilder();
-
-		try {
-			d = b.build (new FileReader((XMLQuerySpecFilename)));
-		} catch (Exception e) {
-			logger.error("Problem parsing provenance query: " + e);
-			return null;
-		}
-
-		q.setRunIDList(parseWorkflowAndRuns(d));  // sets the set of runs 
-		q.setWorkflowName(mainWorkflowExternalName);
-		q.setTargetVars(parsePortSelection(d));
-		q.setSelectedProcessors(parseProcessorFocus(d));
-
-		return q;
-	}
-
-
-	/**
-	 * processor the <processorFocus> section of the query spec
-	 * @param d
-	 * @return
-	 */
-	@SuppressWarnings("unchecked")
-	private List<ProvenanceProcessor> parseProcessorFocus(Document d) {
-
-		List<ProvenanceProcessor> selectedProcessors = new ArrayList<ProvenanceProcessor>();
-
-		Element root = d.getRootElement();
-
-		if (!root.getName().equals(PQUERY_EL)) {
-			logger.fatal("input XML query is invalid");
-			return null;
-		}
-
-		Element processorFocusEl = root.getChild(PROC_FOCUS_EL, ns);
-
-		if (processorFocusEl == null) {  // completely implicit: set to output ports of topLevelWorkflowID
-			return processProcessorFocus(mainWorkflowID, mainWorkflowExternalName, null);
-		}
-
-		logger.debug("setting explicit processor focus");
-
-		// expect a sequence of a mix of PROCESSOR or WORKFLOW elements
-		List<Element> children = processorFocusEl.getChildren();
-		for (Element childEl: children) {
-
-			logger.debug("processing element "+childEl.getName());
-
-			if (childEl.getName().equals(WORKFLOW_EL)) { // 
-				logger.debug("processorFocus>workflow");  // set new workflow scope
-				selectedProcessors.addAll(processWorkflowFocus(childEl));
-
-			} else if (childEl.getName().equals(PROCESSOR_EL)) { // ports within this processor
-				logger.debug("processorFocus>processor");  // set new workflow scope		
-				String procName = childEl.getAttributeValue(PROC_NAME_ATTR);
-				if (procName == null) {
-					logger.warn("processor name not found in processorFocus > processor element");
-					continue;
-				}
-				selectedProcessors.addAll(processProcessorFocus(mainWorkflowID, procName, childEl));
-			}
-
-		}
-		return selectedProcessors;
-	}
-
-
-
-	/**
-	 * here we are processing <processor> within <workflow> within <processorFocus>
-	 * @param procScope 
-	 * @param procScope 
-	 */
-	private List<ProvenanceProcessor> processProcessorFocus(String workflowID, String procScope, Element childEl) {
-
-//		String processorNameScope = childEl.getAttributeValue(PROC_NAME_ATTR);
-//		if (processorNameScope == null) {
-//		logger.warn("no processor name found in <processor> tag");
-//		return null;
-//		}
-
-		// get the ProvenanceProcessor object within the current scope
-
-		// this gets a map workflowId -> [ProvenanceProcessor] for all workflows nested within the top workflowID
-		Map<String, List<ProvenanceProcessor>> allProcessors = pAccess.getProcessorsInWorkflow(workflowID);
-
-		List<ProvenanceProcessor> myProcs = allProcessors.get(workflowID);  // processors for this specific workflow
-		for (ProvenanceProcessor pp:myProcs) {
-			if (procScope.equals(pp.getPname())) {
-				List<ProvenanceProcessor> ppList = new ArrayList<ProvenanceProcessor>();
-				ppList.add(pp);
-				return ppList;
-			}
-		}
-		return null;
-	}
-
-
-	/**
-	 * here we are parsing <workflow> inside <processorFocus>
-	 * @param childEl a <workflow> element
-	 * @return
-	 */
-	private Collection<? extends ProvenanceProcessor> processWorkflowFocus(
-			Element childEl) {
-
-		List<ProvenanceProcessor> processors = new ArrayList<ProvenanceProcessor>();
-
-		String workflowNameScope = childEl.getAttributeValue(WORKFLOW_NAME_ATTR);
-		if (workflowNameScope == null) {
-			logger.warn("no workflow name found in <workflow> tag");
-			return null;
-		}
-		String workflowIDScope = pAccess.getWorkflowIDForExternalName(workflowNameScope);
-
-		List<Element> children = childEl.getChildren();  // expect <processor> elements, or nothing
-		if (children.size()==0) {  // add all processors within this workflow	
-
-			// does a deep traversal of nesting hierarchy collecting all processors along the way
-			Map<String, List<ProvenanceProcessor>> allProcs = pAccess.getProcessorsInWorkflow(workflowIDScope);
-			for (Map.Entry<String, List<ProvenanceProcessor>> procList:allProcs.entrySet()) {
-				processors.addAll(procList.getValue());				
-			}
-			return processors;		
-		}
-		for (Element processorEl:children) {
-			String procScope = processorEl.getAttributeValue(PROC_NAME_ATTR);
-
-			if (!processorEl.getName().equals(PROCESSOR_EL) || procScope == null) {
-				logger.debug("no processorFocus > workflow > processor element or "+
-						" no attribute "+PROC_NAME_ATTR+" in element processorFocus > workflow > processor");
-				continue;
-			}
-			processors.addAll(processProcessorFocus(workflowIDScope, procScope, childEl));
-		}
-		return processors;		
-	}
-
-
-
-	@SuppressWarnings("unchecked")
-	private List<QueryVar> parsePorts(String workflowID, String procName, Element childEl) {
-
-		List<QueryVar>  queryVars = new ArrayList<QueryVar>();
-		List<String> portNames = new ArrayList<String>();
-
-		List<Var> ports = pAccess.getPortsForProcessor(workflowID, procName);
-
-		List<Element> children = childEl.getChildren();
-		if (children.size() == 0) {  
-			// add all output ports 
-			for (Var p:ports) {
-				if (!p.isInput()) {
-					QueryVar qv = new QueryVar();
-					qv.setWfName(p.getWfInstanceRef());
-					qv.setPname(p.getPName());
-					qv.setVname(p.getVName());
-					qv.setPath("ALL");
-					queryVars.add(qv);	
-				}
-			}
-		} else {
-			Map<String, String> portToIndex = new HashMap<String, String>();
-			for (Element portEl:children) {
-				if (portEl.getName().equals(PORT_EL))  {
-					String portName = portEl.getAttributeValue(PORT_NAME_ATTR);
-					String index    = portEl.getAttributeValue(INDEX_ATTR);
-					portNames.add(portName);
-					if (index == null) portToIndex.put(portName, "ALL");
-					else portToIndex.put(portName, index);
-				}
-			}
-
-			Set<String> availableOutPortNames = new HashSet<String>();
-			for (Var p:ports) if (!p.isInput()) { availableOutPortNames.add(p.getVName()); }
-
-			for (String portName:portNames) {
-
-				boolean found = false;
-				for (Var p1:ports) {				
-					if (portName.equals(p1.getVName())) {
-						QueryVar qv = new QueryVar();
-						qv.setWfName(p1.getWfInstanceRef());
-						qv.setPname(p1.getPName());
-						qv.setVname(p1.getVName());
-						String index = portToIndex.get(p1.getVName());
-						if (index != null) qv.setPath(portToIndex.get(p1.getVName()));
-						else qv.setPath("ALL");
-						queryVars.add(qv);	
-						found = true;
-						logger.debug("adding port "+p1.getPName()+":"+p1.getVName()+" to targetVars");
-						break;
-					}
-				} if (!found)  {
-					logger.warn("output port "+portNames+" not found while processing <select>");
-				}
-			}
-		}
-		return queryVars;
-	}
-
-
-	private List<QueryVar> parseProcessor(String workflowID, Element childEl) {
-		String procName = childEl.getAttributeValue(PROC_NAME_ATTR);
-		logger.debug("portSelection>processor");
-
-		return parsePorts(workflowID, procName, childEl);  		// parse all ports within this processor		
-	}
-
-
-	@SuppressWarnings("unchecked")
-	private List<QueryVar> parseWorkflow(Element workflowEl) {
-
-		List<QueryVar>  queryVars = new ArrayList<QueryVar>();
-
-		String workflowNameScope = workflowEl.getAttributeValue(WORKFLOW_NAME_ATTR);
-		String workflowIDScope = pAccess.getWorkflowIDForExternalName(workflowNameScope);
-		//String defaultProcName = pAccess.getProcessorNameForWorkflowID(workflowIDScope);
-
-		// expect nested processor elements
-		List<Element> children = workflowEl.getChildren();
-		for (Element childEl:children) {
-			if (childEl.getName().equals(PROCESSOR_EL)) {
-				queryVars.addAll(parseProcessor(workflowIDScope, childEl));
-			} else if (childEl.getName().equals(PORT_EL)) {   // pport with implicit processor scope = workflow scope 
-				queryVars.addAll(parsePorts(workflowIDScope, workflowNameScope, workflowEl));  // pass the parent's element
-			}
-		}
-		return queryVars;
-	}
-
-
-
-	/**
-	 * the scope for a query can be partially specified. Please see doc elsewhere
-	 * @param d
-	 * @return
-	 */
-	@SuppressWarnings("unchecked")
-	private List<QueryVar> parsePortSelection(Document d) {
-
-		List<QueryVar>  queryVars = new ArrayList<QueryVar>();
-		Element root = d.getRootElement();
-
-		if (!root.getName().equals(PQUERY_EL)) {
-			logger.fatal("input XML query is invalid");
-			return null;
-		}
-
-		Element portSelection = root.getChild(PORT_SELECTION_EL, ns);
-
-		if (portSelection == null) {  // completely implicit: set to output ports of topLevelWorkflowID
-			return parsePorts(mainWorkflowID, mainWorkflowExternalName, null);
-		}
-
-		logger.debug("setting explicit port selections");
-
-		// expect a sequence of a mix of PORT elements or PROCESSOR or WORKFLOW elements
-		List<Element> children = portSelection.getChildren();
-		for (Element childEl: children) {
-			logger.debug("processing element "+childEl.getName());
-
-			if (childEl.getName().equals(WORKFLOW_EL)) { // 
-				logger.debug("portSelection>workflow");  // set new workflow scope
-				queryVars.addAll(parseWorkflow(childEl));
-			} else if (childEl.getName().equals(PROCESSOR_EL)) { // ports within this processor
-				queryVars.addAll(parseProcessor(mainWorkflowID, childEl));
-			} else if (childEl.getName().equals(PORT_EL)) { // ports within this processor
-				queryVars.addAll(parsePorts(mainWorkflowID, mainWorkflowExternalName, portSelection));
-			}
-		}
-		return queryVars;
-	}
-
-
-
-	/**
-	 * process runs scope, with the constraint that all the runs refer to the same (top level) workflow: queries over multiple workflows 
-	 * are not supported.
-	 * @param d the XML Document describing the query 
-	 * @return
-	 */	
-	@SuppressWarnings("unchecked")
-	private List<String> parseWorkflowAndRuns(Document d) {
-
-		List<String> runsScope = new ArrayList<String>();  // list of run IDs
-		List<WorkflowInstance> feasibleWfInstances = new ArrayList<WorkflowInstance>();
-		List<String> feasibleRuns = new ArrayList<String>();
-
-		Element root = d.getRootElement();  // this should be a <pquery>
-
-		if (!root.getName().equals(PQUERY_EL)) {
-			logger.fatal("input XML query is invalid");
-			return null;
-		}
-
-		Element queryScopeEl = root.getChild(SCOPE_EL, ns);
-
-		// expect workflow ID 
-
-		if (queryScopeEl != null) {
-			mainWorkflowExternalName = queryScopeEl.getAttributeValue(QUERY_SCOPE_ATTR);
-
-			if (mainWorkflowExternalName == null) {
-				logger.debug("no external name specified in workflow - giving up");
-				return null;
-			}
-
-			//  validate this workflowID
-			List<WorkflowInstance>  allWfInstances = pAccess.listRuns(null, null); // returns all available runs ordered by timestamp
-			// is this workflow in one of the instances?
-
-			for (WorkflowInstance i:allWfInstances) {
-				if (mainWorkflowExternalName.equals(i.getWorkflowExternalName())) {
-					mainWorkflowID = i.getWorkflowIdentifier();
-					logger.debug("workflow name found corresponding to ID "+mainWorkflowID);
-					feasibleWfInstances.add(i);
-					feasibleRuns.add(i.getInstanceID());
-				}
-			}
-			if (mainWorkflowID == null) {
-				logger.fatal("workflow name "+mainWorkflowExternalName+" not in DB, terminating query");
-				return null;
-			}
-		} else {
-			logger.fatal("no <scope> tag found, giving up");
-			return null;
-		}
-		if (feasibleWfInstances.size() == 0) {
-			logger.debug("workflow "+mainWorkflowExternalName+" not found -- giving up");
-			return null;
-		}
-
-		// get into the element and set the runs scope.
-		Element runs = queryScopeEl.getChild(RUNS_EL, ns);
-		if (runs != null) {
-			logger.debug("setting explicit runs scope");
-
-			// expect a sequence of run elements and/ or a single <range> element
-			List<Element> runElList = runs.getChildren();
-			for (Element runEl:runElList) {
-
-				// explicit runID given
-				if (runEl.getName().equals(RUN_EL)) {
-					String runID = runEl.getAttributeValue(RUN_ID);
-					if (runID!=null) {
-						if (feasibleRuns.contains(runID)) {
-							logger.debug("adding runID "+runID+" to runs scope");
-							runsScope.add(runID);
-						} else {
-							logger.debug("selected runID "+runID+" not in provenance DB -- ignored");
-						}
-					} else {
-						logger.warn("<run> element with no ID");
-					}					
-
-					// time range given 
-				} else if (runEl.getName().equals(RANGE_EL)) {
-					String from = runEl.getAttributeValue(RANGE_FROM,ns);
-					String to   = runEl.getAttributeValue(RANGE_TO,ns);
-
-					logger.debug("processing runs range from "+from+" to "+to);
-
-					for (WorkflowInstance i:feasibleWfInstances) {
-
-						Date fromInstanceDate = null;
-						Date toInstanceDate = null;
-						DateFormat f = new SimpleDateFormat();
-						Date fromDate=null, toDate=null;
-
-						if (from != null) {
-							try {
-								fromDate = f.parse(from);
-								fromInstanceDate = f.parse(i.getTimestamp());
-							} catch (ParseException e) {
-								logger.warn(from+" cannot be parsed as a date -- ignored");
-							}
-						}
-
-						if (to != null) {
-							try {
-								toDate = f.parse(to);
-								toInstanceDate = f.parse(i.getTimestamp());
-							} catch (ParseException e) {
-								logger.warn(to+" cannot be parsed as a date -- ignored");
-							}
-						}
-						if (fromDate == null || (fromDate != null && fromDate.before(fromInstanceDate))) {
-							if (toDate == null || (toDate != null && toInstanceDate.before(toDate)));
-							runsScope.add(i.getInstanceID());
-						}
-					}
-				}
-			}
-		} else {
-			// no explicit run:  using latest from feasible
-			logger.debug("null runs scope: using latest run");
-			if (feasibleWfInstances != null) runsScope.add(feasibleWfInstances.get(0).getInstanceID());
-		}
-
-		logger.debug("runs scope:");
-		for (String r:runsScope) logger.debug(r);
-
-		return runsScope;
-	}
-
-
-	/**
-	 * @return the provenance Access object
-	 */
-	public ProvenanceAccess getPAccess() {
-		return pAccess;
-	}
-
-	/**
-	 * @param access the pAccess to set
-	 */
-	public void setPAccess(ProvenanceAccess access) {
-		pAccess = access;
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/Query.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/Query.java
deleted file mode 100644
index b04d94a..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/Query.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.api;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceProcessor;
-import net.sf.taverna.t2.provenance.lineageservice.utils.QueryVar;
-
-/**
- * @author Paolo Missier</br>
- * 
- * Bean encapsulating one provenance query, consisting of the following elements:
- * <ul>
- * <li>static scope: the (single) name of the workflow whose run(s) are queried
- * <li>dynamic scope: a list of workflow run IDs.
- * <li>a list of &lt;select> variables, encoded as List&lt;{@link QueryVar}>
- * <li>a list of &lt;target> processors, encoded as List&lt;{@link ProvenanceProcessor}> 
- * </ul>
- */
-public class Query {
-
-	String workflowName;
-	List<QueryVar> targetVars;
-	List<String> runIDList;
-	List<ProvenanceProcessor> selectedProcessors;
-
-
-	public String toString() {
-
-		StringBuffer sb = new StringBuffer();
-		sb.append("\n **** QUERY SCOPE: ****\n").
-		append("\tworkflow name: ").append(getWorkflowName()).
-
-		append("\n\truns: ");
-		for (String r:getRunIDList()) {
-			sb.append("\n\t"+r);
-		}
-
-		sb.append("\n**** TARGET PORTS: ****\n");
-		for (QueryVar v:getTargetVars()) {
-			sb.append("\n\t"+v.toString());
-		}
-
-		sb.append("\n\n**** SELECTED PROCESSORS: **** ");
-		for (ProvenanceProcessor pp:getSelectedProcessors()) {
-			sb.append("\n\t"+pp.toString());
-		}
-
-		return sb.toString();
-	}
-
-	/**
-	 * @return the targetVars
-	 */
-	public List<QueryVar> getTargetVars() {
-		return targetVars;
-	}
-	/**
-	 * @param targetVars the targetVars to set
-	 */
-	public void setTargetVars(List<QueryVar> targetVars) {
-		this.targetVars = targetVars;
-	}
-	/**
-	 * @return the selectedProcessors
-	 */
-	public List<ProvenanceProcessor>  getSelectedProcessors() {
-		return selectedProcessors;
-	}
-	/**
-	 * @param selectedProcessors the selectedProcessors to set
-	 */
-	public void setSelectedProcessors(List<ProvenanceProcessor>  selectedProcessors) {
-		this.selectedProcessors = selectedProcessors;
-	}
-	/**
-	 * @return the runIDList
-	 */
-	public List<String> getRunIDList() {
-		return runIDList;
-	}
-	/**
-	 * @param runIDList the runIDList to set
-	 */
-	public void setRunIDList(List<String> runIDList) {
-		this.runIDList = runIDList;
-	}
-
-	/**
-	 * @return the workflowName
-	 */
-	public String getWorkflowName() {
-		return workflowName;
-	}
-
-	/**
-	 * @param workflowName the workflowName to set
-	 */
-	public void setWorkflowName(String workflowName) {
-		this.workflowName = workflowName;
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/QueryAnswer.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/QueryAnswer.java
deleted file mode 100644
index ca1403d..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/QueryAnswer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.api;
-
-/**
- * @author Paolo Missier
- *<p/>Encapsulates a native Java data structure as a well as a String that holds the OPM graph that represents the query answer 
- *
- */
-public class QueryAnswer {
-
-	NativeAnswer nativeAnswer;
-	
-	String _OPMAnswer_AsRDF;
-	
-	/**
-	 * @return the native Java part of the query answer
-	 */
-	public NativeAnswer getNativeAnswer() { return nativeAnswer; }
-
-	/**
-	 * @param sets the query answer
-	 */
-	public void setNativeAnswer(NativeAnswer a) { this.nativeAnswer= a; }
-
-	/**
-	 * @return the OPM graph as RDF/XML string, or null if OPM was inhibited {@see OPM.computeGraph in APIClient.properties}  
-	 */
-	public String getOPMAnswer_AsRDF() {
-		return _OPMAnswer_AsRDF;
-	}
-
-	/**
-	 * @param set the OPM graph as RDF/XML string
-	 */
-	public void setOPMAnswer_AsRDF(String asRDF) {
-		_OPMAnswer_AsRDF = asRDF;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ReadProvenanceConfiguration.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ReadProvenanceConfiguration.java
deleted file mode 100644
index c8d5aeb..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/api/ReadProvenanceConfiguration.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.sf.taverna.t2.provenance.api;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class ReadProvenanceConfiguration {
-
-	String bundleName;
-	private ResourceBundle RESOURCE_BUNDLE;
-
-	private final String BUNDLE_NAME = "net.sf.taverna.t2.lineageService.capture.test.CaptureTestFiles"; //$NON-NLS-1$
-
-	public ReadProvenanceConfiguration(String bundleName) {  
-		this.bundleName = bundleName; 
-		RESOURCE_BUNDLE = ResourceBundle.getBundle(bundleName);
-		 }
-
-	public String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/JDBCConnector.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/JDBCConnector.java
deleted file mode 100644
index db49d66..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/JDBCConnector.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package net.sf.taverna.t2.provenance.connector;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-
-/**
- * A shared factory class for retrieving a connection to the database.
- * The client is responsible for closing the connection once its finished with.
- *
- * The connection needs to be configured externally using a JNDI data source named "jdbc/taverna"
- *
- * @author Stuart Owen
- */
-
-public class JDBCConnector {
-
-    /**
-     * Provides a connection to a database, that has been defined externally as a JNDI DataSource with the name 'jdbc/taverna'
-     *
-     * The client is responsible for closing the connection once finished with.
-     *
-     * @return a connection to the database
-     * @throws InstantiationException
-     * @throws IllegalAccessException
-     * @throws ClassNotFoundException
-     * @throws SQLException
-     */
-    public static Connection getConnection() throws InstantiationException,
-            IllegalAccessException, ClassNotFoundException, SQLException {
-        InitialContext context;
-        Connection connection = null;
-        try {
-            context = new InitialContext();
-            DataSource ds = (DataSource) context.lookup("jdbc/taverna");
-            connection = ds.getConnection(); 
-        } catch (NamingException ex) {
-            throw new SQLException("Unable to retrieve database connection for name jdbc/taverna");
-        }
-
-        return connection;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/ProvenanceConnector.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/ProvenanceConnector.java
deleted file mode 100644
index cfe09db..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/ProvenanceConnector.java
+++ /dev/null
@@ -1,443 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.connector;
-
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem;
-import net.sf.taverna.t2.provenance.lineageservice.EventProcessor;
-import net.sf.taverna.t2.provenance.lineageservice.LineageQueryResultRecord;
-import net.sf.taverna.t2.provenance.lineageservice.Provenance;
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceAnalysis;
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceQuery;
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceWriter;
-import net.sf.taverna.t2.provenance.lineageservice.WorkflowDataProcessor;
-import net.sf.taverna.t2.provenance.reporter.ProvenanceReporter;
-import net.sf.taverna.t2.reference.ReferenceService;
-
-import org.apache.log4j.Logger;
-
-/**
- * Collects {@link ProvenanceItem}s as it travels up and down the dispatch stack
- * inside the InvocationContext
- * 
- * @author Ian Dunlop
- * @author Stuart Owen
- * 
- */
-public abstract class ProvenanceConnector implements ProvenanceReporter {
-
-	private static Logger logger = Logger.getLogger(ProvenanceConnector.class);
-	private String saveEvents;    
-	private ProvenanceAnalysis provenanceAnalysis;
-	private ExecutorService executor = Executors.newSingleThreadExecutor();
-	private boolean finished = false;
-	private String sessionID;
-	private InvocationContext invocationContext;
-	private ReferenceService referenceService;
-
-	private Provenance provenance;
-	private ProvenanceWriter writer;
-	private ProvenanceQuery query;
-	private WorkflowDataProcessor wfdp;
-	private EventProcessor eventProcessor;
-
-	public ProvenanceConnector() { }
-
-
-	/**
-	 * Set up the the {@link EventProcessor}, {@link ProvenanceWriter} &
-	 * {@link ProvenanceQuery}. Since it is an SPI you don't want any code
-	 * cluttering the default constructor. Call this method after instantiation
-	 * and after the dbURL has been set.
-	 */
-	public void init() {
-		
-        createDatabase();
-
-		try {
-			setWfdp(new WorkflowDataProcessor());
-			getWfdp().setPq(getQuery());
-			getWfdp().setPw(getWriter());
-
-			setEventProcessor(new EventProcessor());
-			getEventProcessor().setPw(getWriter());
-			getEventProcessor().setPq(getQuery());
-			getEventProcessor().setWfdp(getWfdp());
-
-			setProvenanceAnalysis(new ProvenanceAnalysis(getQuery()));
-			setProvenance(new Provenance(getEventProcessor()));
-		} catch (InstantiationException e) {
-			logger.error("Problem with provenance initialisation: ",e);
-		} catch (IllegalAccessException e) {
-			logger.error("Problem with provenance initialisation: ",e);
-		} catch (ClassNotFoundException e) {
-			logger.error("Problem with provenance initialisation: ",e);
-		} catch (SQLException e) {
-			logger.error("Problem with provenance initialisation: ",e);
-		}
-	}
-
-
-
-	/**
-	 * @return the invocationContext
-	 */
-	public InvocationContext getInvocationContext() {
-		return invocationContext;
-	}
-
-	/**
-	 * @param invocationContext the invocationContext to set
-	 */
-	public void setInvocationContext(InvocationContext invocationContext) {
-		this.invocationContext = invocationContext;
-	}
-
-	/**
-	 * @return the referenceService
-	 */
-	public ReferenceService getReferenceService() {
-		return referenceService;
-	}
-
-	/**
-	 * @param referenceService the referenceService to set
-	 */
-	public void setReferenceService(ReferenceService referenceService) {
-		this.referenceService = referenceService;
-	}
-
-
-	/**
-	 * Uses a {@link ScheduledThreadPoolExecutor} to process events in a Thread
-	 * safe manner
-	 */
-	public synchronized void addProvenanceItem(
-			final ProvenanceItem provenanceItem) {
-
-//		Runnable runnable = new Runnable() {
-//
-//			public void run() {
-				try {
-
-					getProvenance().acceptRawProvenanceEvent(
-							provenanceItem.getEventType(), provenanceItem);
-
-				} catch (SQLException e) {
-					logger.warn("Could not add provenance for " + provenanceItem.getEventType() + " " + provenanceItem.getIdentifier() + " " + e);
-				} catch (IOException e) {
-					logger.warn("Could not add provenance for " + provenanceItem.getEventType() + " " + provenanceItem.getIdentifier() + " " + e);
-				}
-//
-//			}
-//		};
-//		getExecutor().execute(runnable);
-
-	}
-
-	protected Connection getConnection() throws InstantiationException,
-	IllegalAccessException, ClassNotFoundException, SQLException {
-		return JDBCConnector.getConnection();
-	}
-
-	/**
-	 * Used by database backed provenance stores. Ask the implementation to
-	 * create the database. Requires each datbase type to create all its own
-	 * tables
-	 */
-	public abstract void createDatabase();    
-
-
-	public void clearDatabase() { clearDatabase(true); }
-  
-	/**
-	 * Clear all the values in the database but keep the db there
-	 */
-	public void clearDatabase(boolean isClearDB) {
-
-		if (isClearDB) {
-			logger.info("clearing DB");
-			try {
-				getWriter().clearDBStatic();
-				
-				Set<String> danglingDataRefs = getWriter().clearDBDynamic();
-				
-				logger.info("references collected during removeRun:");
-				for (String s:danglingDataRefs) {
-					logger.info(s);
-				}
-				
-			} catch (SQLException e) {
-				logger.error("Problem clearing database: " + e);
-			}
-		} else {
-			System.out.println("clearDB is FALSE: not clearing");
-		}
-
-//		String q = null;
-//		Connection connection = null;
-
-//		Statement stmt = null;
-//		try {
-//		connection = getConnection();
-//		stmt = connection.createStatement();
-//		} catch (SQLException e) {
-//		logger.warn("Could not create database statement :" + e);
-//		} catch (InstantiationException e) {
-//		logger.warn("Could not create database statement :" + e);
-//		} catch (IllegalAccessException e) {
-//		logger.warn("Could not create database statement :" + e);
-//		} catch (ClassNotFoundException e) {
-//		logger.warn("Could not create database statement :" + e);
-//		}
-
-//		q = "DELETE FROM Workflow";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM Processor";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM Arc";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM Var";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM WfInstance";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM ProcBinding";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM VarBinding";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM Collection";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		q = "DELETE FROM Data";
-//		try {
-//		stmt.executeUpdate(q);
-//		} catch (SQLException e) {
-//		logger.warn("Could not execute statement " + q + " :" + e);
-//		}
-
-//		if (connection!=null) try {
-//		connection.close();
-//		} catch (SQLException ex) {
-//		logger.error("Error closing connection",ex);
-//		}
-	}
-
-	/**
-	 * The name for this type of provenance connector. Is used by the workbench
-	 * to ensure it adds the correct one to the InvocationContext
-	 *
-	 * @return
-	 */
-	public abstract String getName();
-
-	/**
-	 * A unique identifier for this run of provenance, should correspond to the
-	 * initial {@link WorkflowProvenanceItem} idenifier that gets sent through
-	 *
-	 * @param identifier
-	 */
-	public void setSessionID(String sessionID) {
-		this.sessionID = sessionID;
-	}
-
-	/**
-	 * What is the unique identifier used by this connector
-	 *
-	 * @return
-	 */
-	public String getSessionID() {
-		return sessionID;
-	}
-
-
-	public List<LineageQueryResultRecord> computeLineage(String wfInstance,
-			String var, String proc, String path, Set<String> selectedProcessors) {
-		return null;
-	}
-
-	public String getDataflowInstance(String dataflowId) {
-		String instanceID = null;
-		try {
-			instanceID = (getProvenance()).getPq().getRuns(dataflowId, null).get(0).getInstanceID();
-		} catch (SQLException e) {
-			logger.error("Error finding the dataflow instance", e);
-		}
-		return instanceID;
-	}
-
-	/**
-	 * @return the saveEvents
-	 */
-	public String getSaveEvents() {
-		return saveEvents;
-	}
-
-	/**
-	 * @param saveEvents
-	 *            the saveEvents to set
-	 */
-	public void setSaveEvents(String saveEvents) {
-		this.saveEvents = saveEvents;
-	}
-
-	public void setProvenance(Provenance provenance) {
-		this.provenance = provenance;
-	}
-
-	public Provenance getProvenance() {
-		return provenance;
-	}
-
-	public void setFinished(boolean finished) {
-		this.finished = finished;
-	}
-
-	public boolean isFinished() {
-		return finished;
-	}
-
-	public void setExecutor(ExecutorService executor) {
-		this.executor = executor;
-	}
-
-	public synchronized ExecutorService getExecutor() {
-		return executor;
-	}
-
-	public void setProvenanceAnalysis(ProvenanceAnalysis provenanceAnalysis) {
-		this.provenanceAnalysis = provenanceAnalysis;
-	}
-
-	/**
-	 * Use this {@link ProvenanceAnalysis} to carry out lineage queries on the
-	 * provenance
-	 *
-	 * @return
-	 */
-	public ProvenanceAnalysis getProvenanceAnalysis() {
-		return provenanceAnalysis;
-	}
-
-	/**
-	 * @return the writer
-	 */
-	public ProvenanceWriter getWriter() {
-		return writer;
-	}
-
-	/**
-	 * @param writer the writer to set
-	 */
-	protected void setWriter(ProvenanceWriter writer) {
-		this.writer = writer;
-	}
-
-	/**
-	 * @return the query
-	 */
-	public ProvenanceQuery getQuery() {
-		return query;
-	}
-
-	/**
-	 * @param query the query to set
-	 */
-	protected void setQuery(ProvenanceQuery query) {
-		this.query = query;
-	}
-
-	/**
-	 * @return the wfdp
-	 */
-	public WorkflowDataProcessor getWfdp() {
-		return wfdp;
-	}
-
-	/**
-	 * @param wfdp the wfdp to set
-	 */
-	public void setWfdp(WorkflowDataProcessor wfdp) {
-		this.wfdp = wfdp;
-	}
-
-	/**
-	 * @return the eventProcessor
-	 */
-	public EventProcessor getEventProcessor() {
-		return eventProcessor;
-	}
-
-	/**
-	 * @param eventProcessor the eventProcessor to set
-	 */
-	public void setEventProcessor(EventProcessor eventProcessor) {
-		this.eventProcessor = eventProcessor;
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/ProvenanceSQL.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/ProvenanceSQL.java
deleted file mode 100644
index 628c80e..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/connector/ProvenanceSQL.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package net.sf.taverna.t2.provenance.connector;
-
-public class ProvenanceSQL {
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/AnnotationsLoader.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/AnnotationsLoader.java
deleted file mode 100644
index 5c5debf..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/AnnotationsLoader.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-
-/**
- * @author Paolo Missier
- *
- */
-public class AnnotationsLoader {
-	
-	private static Logger logger = Logger.getLogger(AnnotationsLoader.class);
-
-
-	/**
-	 * 
-	 * @param annotationFile  by convention we use <workflow file name>+"annotations"
-	 * @return a map pname -> annotation so that the lineage query alg can use the annotation
-	 * when processing pname
-	 */
-	@SuppressWarnings("unchecked")
-	public Map<String,List<String>>  getAnnotations(String annotationFile)  {
-
-
-		Map<String,List<String>>  procAnnotations = new HashMap<String,List<String>>();
-
-		// load XML file as doc
-//		parse the event into DOM
-		SAXBuilder  b = new SAXBuilder();
-		Document d;
-
-		try {
-			d = b.build (new FileReader(annotationFile));
-
-			if (d == null)  return null;
-			
-			Element root = d.getRootElement();
-
-			// look for all processor elements
-			List<Element> processors = root.getChildren();
-			
-			for (Element el:processors) {
-				
-				String pName = el.getAttributeValue("name");
-				logger.info("processor name: "+pName);
-				
-				List<String>  annotations = new ArrayList<String>();
-				// extract all annotations for this pname
-
-				List<Element> annotEl = el.getChildren();
-				
-				for (Element annotElement: annotEl) {
-					
-					String annot = annotElement.getAttributeValue("type");
-					logger.info("annotation: "+annot);
-
-					// add this annotation
-					annotations.add(annot);
-				}
-
-				procAnnotations.put(pName, annotations);
-				
-			}
-			
-
-		} catch (JDOMException e) {
-			logger.error("Problem getting annotations from: " + annotationFile + " : " + e);
-		} catch (IOException e) {
-			logger.error("Problem getting annotations from: " + annotationFile + " : " + e);
-		} 
-		return procAnnotations;
-
-
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/Dependencies.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/Dependencies.java
deleted file mode 100644
index 1e376e5..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/Dependencies.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * @author Paolo Missier<p/>
- * Java bean to hold a list of dependencies, all of them associated with a pair (&lt;port name>, &lt;path>), as described in {@link net.sf.taverna.t2.provenance.api.QueryAnswer}.
- * <br/> Each element of the list is a record of type {@link LineageQueryResultRecord} in the provenance DB at the finest possible level of granularity, i.e., 
- * a single value possibly within a collection, bound to a processor port and associated to a specific run of a specific workflow.
- * @see LineageQueryResultRecord   
- */
-public class Dependencies {
-
-	final public static String COLL_TYPE = "referenceSetCollection";
-	final public static String ATOM_TYPE = "referenceSet";
-	
-	boolean printResolvedValue;
-
-	private List<LineageQueryResultRecord> records = new ArrayList<LineageQueryResultRecord>();
-
-	public ListIterator<LineageQueryResultRecord> iterator() { return getRecords().listIterator(); }
-
-	/**
-	 * adds a single record to the list of dependencies
-	 * @param wfNameRef
-	 * @param pname
-	 * @param vname
-	 * @param wfInstance
-	 * @param iteration
-	 * @param collIdRef
-	 * @param parentCollIDRef
-	 * @param value
-	 * @param resolvedValue
-	 * @param type
-	 * @param isInput
-	 * @param isCollection
-	 */
-	public void addLineageQueryResultRecord(
-			String wfNameRef,
-			String pname,
-			String vname,
-			String wfInstance,
-			String iteration,
-			String collIdRef,
-			String parentCollIDRef,
-			String value,
-			String resolvedValue,
-			String type, boolean isInput, boolean isCollection) {
-
-		LineageQueryResultRecord record = new LineageQueryResultRecord();
-
-		record.setWfName(wfNameRef);
-		record.setWfInstance(wfInstance);
-		record.setPname(pname);
-		record.setValue(value);
-		record.setVname(vname);
-		record.setIteration(iteration);
-		record.setResolvedValue(resolvedValue);
-		record.setInput(isInput);
-		record.setCollIdRef(collIdRef);
-		record.setParentCollIDRef(parentCollIDRef);
-		record.setCollection(isCollection);
-
-		getRecords().add(record);
-	}
-
-	/**
-	 * populates the bean with an entire list of {@link LineageQueryResultRecord} elements
-	 * @param records
-	 */
-	public void setRecords(List<LineageQueryResultRecord> records) {
-		this.records = records;
-	}
-
-	/**
-	 * @return the entire set of records
-	 */
-	public List<LineageQueryResultRecord> getRecords() {
-		return records;
-	}
-
-
-	public String toString() {
-
-		StringBuffer sb = new StringBuffer();
-		for (LineageQueryResultRecord record:getRecords()) {
-			
-			record.setPrintResolvedValue(printResolvedValue);
-			sb.append("***  record: ****\n"+record.toString());
-		}		
-		return sb.toString();
-	}
-
-	/**
-	 * @return true is the records contain the actual values, in addition to the URI references to the values
-	 * <br/>NOT YET SUPPORTED. This switch is currently ignored and no values are returned in the current version 
-	 */
-	public boolean isPrintResolvedValue() {
-		return printResolvedValue;
-	}
-
-	/**
-	 * @param toggles insertion of values in addition to references to values in the records
-	 * <br/>NOT YET SUPPORTED. This switch is currently ignored and no values are returned in the current version 
-	 */
-	public void setPrintResolvedValue(boolean printResolvedValue) {
-		this.printResolvedValue = printResolvedValue;
-	}
-}
-
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java
deleted file mode 100644
index 27fdbe4..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/EventProcessor.java
+++ /dev/null
@@ -1,1735 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.beans.ExceptionListener;
-import java.beans.XMLEncoder;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.sql.Blob;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.sql.rowset.serial.SerialBlob;
-
-import net.sf.taverna.t2.provenance.item.InputDataProvenanceItem;
-import net.sf.taverna.t2.provenance.item.IterationProvenanceItem;
-import net.sf.taverna.t2.provenance.item.OutputDataProvenanceItem;
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Arc;
-import net.sf.taverna.t2.provenance.lineageservice.utils.NestedListNode;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProcBinding;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceUtils;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.VarBinding;
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializerRegistry;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.Namespace;
-import org.jdom.input.SAXBuilder;
-import org.jdom.output.XMLOutputter;
-
-/**
- * @author Paolo Missier
- */
-public class EventProcessor {
-	/**
-	 * A map of UUIDs of the originating processor to the ProcBinding object
-	 * that contains its parameters
-	 */
-	private Map<String, ProcBinding> procBindingMap = new ConcurrentHashMap<String, ProcBinding>();;
-
-	/** A map of child ids to their parents in the hierarchy of events:
-	 *  workflow -> process -> processor -> activity -> iteration
-	 */
-	private Map<String, String> parentChildMap= new ConcurrentHashMap<String, String>();
-
-	private static Logger logger = Logger.getLogger(EventProcessor.class);
-
-	private static final String OUTPUT_CONTAINER_PROCESSOR = "_OUTPUT_";
-	private static final String INPUT_CONTAINER_PROCESSOR = "_INPUT_";
-	private static final String TEST_EVENTS_FOLDER = "/tmp/TEST-EVENTS";
-
-	private static final String DATAFLOW_PROCESSOR_TYPE = "net.sf.taverna.t2.activities.dataflow.DataflowActivity";
-
-	private int eventCnt = 0; // for events logging
-	private volatile boolean workflowStructureDone = false; // used to inhibit processing of multiple workflow events -- we only need the first
-	private int dataflowDepth = 0; // incremented when we recurse on a subflow, decremented on exit
-	private volatile String wfInstanceID = null; // unique run ID. set when we see the first event of type "process"
-
-	String topLevelDataflowName = null;
-	String topLevelDataflowID   = null;
-
-	Map<String, String> wfNestingMap = new ConcurrentHashMap<String, String>(); 
-	
-	// all input bindings are accumulated here so they can be "backpatched" (see backpatching() )
-	List<VarBinding> allInputVarBindings = Collections.synchronizedList(new ArrayList<VarBinding>()); 
-
-	// dedicated class for processing WorkflowData events which carry workflow output info 
-	private WorkflowDataProcessor  wfdp;
-	private ProvenanceWriter pw = null;
-	private ProvenanceQuery  pq = null;
-
-	public EventProcessor() { }
-
-	/**
-	 * @param pw
-	 * @throws SQLException
-	 * @throws ClassNotFoundException
-	 * @throws IllegalAccessException
-	 * @throws InstantiationException
-	 * 
-	 */
-	public EventProcessor(ProvenanceWriter pw, ProvenanceQuery pq, WorkflowDataProcessor wfdp)
-	throws InstantiationException, IllegalAccessException,
-	ClassNotFoundException, SQLException {
-		this.pw = pw;
-		this.pq = pq;
-		this.wfdp = wfdp;
-
-		logger.setLevel((Level)Level.INFO);
-	}
-
-
-	/**
-	 * this is the new version that makes use of the T2 deserializer
-	 * populate static portion of the DB<br/>
-	 * the static structure may already be in the DB -- this is detected as a duplicate top-level workflow ID.
-	 * In this case, we skip this processing altogether 
-	 * @param content
-	 *            is a serialized dataflow (XML) -- this is parsed using the T2
-	 *            Deserializer
-	 * @return the wfInstanceRef for this workflow structure
-	 */
-	public String processWorkflowStructure(ProvenanceItem provenanceItem) {
-
-		// this flag is set to prevent processing of separate workflowProvenanceItems that describe nested workflows.
-		// the processing of all nested workflows is done as part of the very first workflowProvenanceItem that we receive,
-		// which is self-consistent. so we ignore all others
-		if (workflowStructureDone)  { return null; }
-
-		setWfInstanceID(((WorkflowProvenanceItem)provenanceItem).getIdentifier());
-//		logger.debug("Workflow instance is: " + getWfInstanceID());
-		Dataflow df = null;
-
-		df = ((WorkflowProvenanceItem)provenanceItem).getDataflow();
-
-		workflowStructureDone = true;
-
-		topLevelDataflowName = df.getLocalName();
-		topLevelDataflowID   = df.getInternalIdentier();
-
-		// check whether we already have this WF in the DB
-		List<String> wfNames = null;
-		try {
-			wfNames = pq.getAllWFnames();
-		} catch (SQLException e) { 
-			logger.warn("Problem processing workflow structure", e);
-		}
-
-		if (wfNames != null && wfNames.contains(topLevelDataflowID)) {  // already in the DB
-//			logger.info("workflow structure with ID "+topLevelDataflowID+" is in the DB -- clearing static portion");
-
-			// clearing the portion of the static DB that pertains to this specific WF.
-			// it is going to be rewritten right away in the rest of this method
-			// this is simpler to implement than selectively avoiding duplicate writes to the DB
-			try {
-				pw.clearDBStatic(topLevelDataflowID);
-			} catch (SQLException e) {
-				logger.warn("Can't clear static database for " + topLevelDataflowID, e);
-			}
-
-		} else {
-//			logger.info("new workflow structure with ID "+topLevelDataflowID);
-		}
-
-		// record the top level dataflow as a processor in the DB
-		try {
-			pw.addProcessor(topLevelDataflowName, DATAFLOW_PROCESSOR_TYPE, topLevelDataflowID, true);  // true -> is top level
-		} catch (SQLException e) {
-			logger.warn("Can't add processor " + topLevelDataflowID, e);
-		}
-
-//		logger.info("top level wf name: "+topLevelDataflowName);
-		return processDataflowStructure(df, topLevelDataflowID, df.getLocalName());  // null: no external name given to top level dataflow
-	}		
-
-
-	/**
-	 * note: this method can be called as part of a recursion on sub-workflows
-	 * @param df 
-	 * @param dataflowID the UUID for the entire dataflow (may be a sub-dataflow)
-	 * @param localName the external name of the dataflow. Null if this is top level, not null if a sub-dataflow
-	 *  @return the wfInstanceRef for this workflow structure
-	 */
-	@SuppressWarnings("unchecked")
-	public String processDataflowStructure(Dataflow df, String dataflowID, String externalName) {
-
-		String localWfInstanceID = getWfInstanceID();
-
-		dataflowDepth++;
-
-		try {
-
-			List<Var> vars = new ArrayList<Var>();
-
-			// check whether we already have this WF in the DB
-			List<String> wfNames = null;
-			try {
-				wfNames = pq.getAllWFnames();
-			} catch (SQLException e) {
-				logger.warn("Problem processing dataflow structure for " + dataflowID, e);
-			}
-
-			if (wfNames != null && wfNames.contains(dataflowID)) {  // already in the DB
-//				logger.info("workflow structure with ID "+dataflowID+" is in the DB -- clearing static portion");
-
-				// clearing the portion of the static DB that pertains to this specific WF.
-				// it is going to be rewritten right away in the rest of this method
-				// this is simpler to implement than selectively avoiding duplicate writes to the DB
-				pw.clearDBStatic(dataflowID);
-			} else {
-//				logger.warn("new workflow structure with ID "+dataflowID);
-			}
-
-			// //////
-			// add workflow ID -- this is NOT THE SAME AS the wfInstanceID
-			// /////		
-
-			// this could be a nested workflow -- in this case, override its wfInstanceID with that of its parent
-			String parentDataflow;
-			if ((parentDataflow = wfNestingMap.get(dataflowID)) == null) {
-				Element serializeDataflow = XMLSerializerRegistry.getInstance().getSerializer().serializeDataflow(df);
-				String dataflowString = null;
-				try {
-				    XMLOutputter outputter = new XMLOutputter();
-				    StringWriter stringWriter = new StringWriter();
-				    outputter.output(serializeDataflow, stringWriter);
-				    dataflowString = stringWriter.toString();
-				    
-				} catch (java.io.IOException e) {
-				    logger.error("Could not serialise dataflow", e);
-				}
-				Blob blob = new SerialBlob(dataflowString.getBytes("UTF-8"));
-				// this is a top level dataflow description
-				pw.addWFId(dataflowID, null, externalName, blob); // set its dataflowID with no parent
-
-			} else {
-				Element serializeDataflow = XMLSerializerRegistry.getInstance().getSerializer().serializeDataflow(df);
-				String dataflowString = null;
-				try {
-				    XMLOutputter outputter = new XMLOutputter();
-				    StringWriter stringWriter = new StringWriter();
-				    outputter.output(serializeDataflow, stringWriter);
-				    dataflowString = stringWriter.toString();
-				    
-				} catch (java.io.IOException e) {
-				    logger.error("Could not serialise dataflow", e);
-				}
-				
-				Blob blob = new SerialBlob(dataflowString.getBytes("UTF-8"));
-				// we are processing a nested workflow structure
-				logger.debug("dataflow "+dataflowID+" with external name "+externalName+" is nested within "+parentDataflow);
-
-				pw.addWFId(dataflowID, parentDataflow, externalName, blob); // set its dataflowID along with its parent
-
-				// override wfInstanceID to point to top level -- UNCOMMENTED PM 9/09  CHECK
-				localWfInstanceID = pq.getRuns(parentDataflow, null).get(0).getInstanceID();
-//				logger.debug("overriding nested WFRef "+getWfInstanceID()+" with parent WFRef "+localWfInstanceID);
-
-
-			}
-			pw.addWFInstanceId(dataflowID, localWfInstanceID);  // wfInstanceID stripped by stripWfInstanceHeader() above
-
-			// //////
-			// add processors along with their variables
-			// /////
-			List<? extends Processor> processors = df.getProcessors();
-
-			for (Processor p : processors) {
-
-//				logger.info("adding processor "+p.getLocalName());
-
-				String pName = p.getLocalName();
-
-				//CHECK get type of first activity and set this as the type of the processor itself
-				List<? extends Activity<?>> activities = p.getActivityList();
-
-				String pType = null;
-				if (activities != null && !activities.isEmpty()) {
-					pType = activities.get(0).getClass().getCanonicalName();
-				}
-				pw.addProcessor(pName, pType, dataflowID, false);  // false: not a top level processor
-
-				// ///
-				// add all input ports for this processor as input variables
-				// ///
-				List<? extends ProcessorInputPort> inputs = p.getInputPorts();
-
-				for (ProcessorInputPort ip : inputs) {
-
-					Var inputVar = new Var();
-
-					inputVar.setPName(pName);
-					inputVar.setWfInstanceRef(dataflowID);
-					inputVar.setVName(ip.getName());
-					inputVar.setTypeNestingLevel(ip.getDepth());
-					inputVar.setInput(true);
-
-//					logger.info("processDataflowStructure: adding input var "+pName+":"+ip.getName());
-
-					vars.add(inputVar);
-				}
-
-				// ///
-				// add all output ports for this processor as output variables
-				// ///
-				List<? extends ProcessorOutputPort> outputs = p
-				.getOutputPorts();
-
-				for (ProcessorOutputPort op : outputs) {
-
-					Var outputVar = new Var();
-
-					outputVar.setPName(pName);
-					outputVar.setWfInstanceRef(dataflowID);
-					outputVar.setVName(op.getName());
-					outputVar.setTypeNestingLevel(op.getDepth());
-					outputVar.setInput(false);
-
-					vars.add(outputVar);
-				}
-
-
-				// check for nested structures: if the activity is DataflowActivity
-				// then this processor is a nested workflow
-				// make an entry into wfNesting map with its ID and recurse on the nested workflow 
-
-				for (Activity a:activities) {
-
-					if (a.getClass().getCanonicalName().contains("DataflowActivity" )) {
-
-						Dataflow nested = (Dataflow) a.getConfiguration();
-//						logger.info("RECURSION ON nested workflow: "+p.getLocalName()+" with id: "+nested.getInternalIdentier());
-
-						wfNestingMap.put(nested.getInternalIdentier(), dataflowID); // child -> parent
-
-						//////////////
-						/// RECURSIVE CALL 
-						//////////////
-						processDataflowStructure(nested, nested.getInternalIdentier(), p.getLocalName());
-
-						//List<? extends Processor> procs = nested.getProcessors();						
-//						for (Processor nestedP:procs) {
-//						System.out.println("recursion on nested processor: "+nestedP.getLocalName());
-//						}
-
-					}
-				}
-
-			} // end for each processor
-
-			// ////
-			// add inputs to entire dataflow
-			// ////
-
-			String pName = INPUT_CONTAINER_PROCESSOR;  // overridden -- see below
-
-			// check whether we are processing a nested workflow. in this case
-			// the input vars are not assigned to the INPUT processor but to the containing dataflow
-
-			if (externalName != null) { // override the default if we are nested or someone external name is provided
-				pName = externalName;
-			}
-
-			List<? extends DataflowInputPort> inputPorts = df.getInputPorts();
-
-			for (DataflowInputPort ip : inputPorts) {
-
-				Var inputVar = new Var();
-
-				inputVar.setPName(pName);
-				inputVar.setWfInstanceRef(dataflowID);
-				inputVar.setVName(ip.getName());
-				inputVar.setTypeNestingLevel(ip.getDepth());
-				inputVar.setInput(true);  // CHECK PM modified 11/08 -- input vars are actually outputs of input processors...
-
-				vars.add(inputVar);
-			}
-
-			// ////
-			// add outputs of entire dataflow
-			// ////
-			pName = OUTPUT_CONTAINER_PROCESSOR;  // overridden -- see below
-
-			// check whether we are processing a nested workflow. in this case
-			// the output vars are not assigned to the OUTPUT processor but to the containing dataflow
-
-			if (externalName != null) { // we are nested
-				pName = externalName;
-			}
-
-			List<? extends DataflowOutputPort> outputPorts = df
-			.getOutputPorts();
-
-			for (DataflowOutputPort op : outputPorts) {
-
-				Var outputVar = new Var();
-
-				outputVar.setPName(pName);
-				outputVar.setWfInstanceRef(dataflowID);
-				outputVar.setVName(op.getName());
-				outputVar.setTypeNestingLevel(op.getDepth());
-				outputVar.setInput(false);  // CHECK PM modified 11/08 -- output vars are actually outputs of output processors... 
-				vars.add(outputVar);
-			}
-
-			pw.addVariables(vars, dataflowID);
-
-			// ////
-			// add arc records using the dataflow links
-			// retrieving the processor names requires navigating from links to
-			// source/sink and from there to the processors
-			// ////
-			List<? extends Datalink> links = df.getLinks();
-
-			for (Datalink l : links) {
-
-				// TODO cover the case of arcs from an input and to an output to
-				// the entire dataflow
-
-				String sourcePname = null;
-				String sinkPname = null;
-
-				if (l.getSource() instanceof ProcessorOutputPort) {
-					sourcePname = ((ProcessorOutputPort) l.getSource())
-					.getProcessor().getLocalName();
-				} else {
-//					System.out.println("found link from dataflow input");
-				}
-
-				if (l.getSink() instanceof ProcessorInputPort) {
-					sinkPname = ((ProcessorInputPort) l.getSink())
-					.getProcessor().getLocalName();
-				} else {
-//					System.out.println("found link to dataflow output");
-				}
-
-				if (sourcePname != null && sinkPname != null) {
-//					System.out.println("adding regular internal arc");
-
-					pw.addArc(l.getSource().getName(), sourcePname, l.getSink()
-							.getName(), sinkPname, dataflowID);
-
-				} else if (sourcePname == null) {
-					// link is from dataflow input or subflow input
-					if (externalName != null) {  // link from subflow input
-						sourcePname = externalName;
-					} else {
-						sourcePname = INPUT_CONTAINER_PROCESSOR;
-					}
-
-					//Ian added this logic since there were some null sinkPnameRefs with merge ports
-
-					if (sinkPname == null) {
-						// link is to dataflow output
-
-						if (externalName != null) {  // link from subflow input
-							sinkPname = externalName;
-						} else {
-							sinkPname = OUTPUT_CONTAINER_PROCESSOR;
-						}
-					}
-
-//					System.out.println("adding arc from dataflow input");
-
-					pw.addArc(l.getSource().getName(),
-							sourcePname, l.getSink().getName(),
-							sinkPname, dataflowID);
-
-				} else if (sinkPname == null) {
-					// link is to dataflow output
-
-					if (externalName != null) {  // link from subflow input
-						sinkPname = externalName;
-					} else {
-						sinkPname = OUTPUT_CONTAINER_PROCESSOR;
-					}
-
-					//Ian added this bit at the same time as the null sinkPnameRef logic above - hope it is correct
-
-					if (sourcePname == null) {
-						// link is from dataflow input or subflow input
-						if (externalName != null) {  // link from subflow input
-							sourcePname = externalName;
-						} else {
-							sourcePname = INPUT_CONTAINER_PROCESSOR;
-						}
-					}
-
-					//					System.out.println("adding arc to dataflow output");
-
-					pw.addArc(l.getSource().getName(), sourcePname, l.getSink()
-							.getName(), sinkPname,
-							dataflowID);
-				}
-			}
-//			logger.info("completed processing dataflow " + dataflowID);
-
-		} catch (Exception e) {
-			logger.error("Problem processing provenance for dataflow", e);
-		}
-
-//		logger.debug("wfInstanceID at the end of processDataflowStructure: "+getWfInstanceID());
-
-		return dataflowID;
-	}
-
-
-
-	private Element stripWfInstanceHeader(String content) {
-
-		SAXBuilder  b = new SAXBuilder();
-		Document d;
-
-		try {
-			d = b.build (new StringReader(content));
-
-			// get identifier from <workflowItem> element
-			Element root = d.getRootElement();
-
-			setWfInstanceID(root.getAttributeValue("identifier"));
-
-			Namespace ns = Namespace.getNamespace("http://taverna.sf.net/2008/xml/t2flow");
-
-			Element workflowEl = root.getChild("workflow", ns);
-
-			return workflowEl;
-
-		} catch (JDOMException e) {
-			logger.warn("Problem stripping workflow instance header", e);
-		} catch (IOException e) {
-			logger.warn("Problem stripping workflow instance header", e);
-		}
-
-
-		return null;
-	}
-
-	/**
-	 * processes an elementary process execution event from T2. Collects info
-	 * from events as they happen and sends them to the writer for processing
-	 * when the iteration event is received. Uses the map of procBindings to
-	 * process event id and the map of child ids to parent ids to ensure that
-	 * the correct proc binding is used
-	 * @param currentWorkflowID 
-	 * 
-	 * @param d
-	 * @param context 
-	 */
-	public void processProcessEvent(ProvenanceItem provenanceItem, String currentWorkflowID) {
-
-		if (provenanceItem.getEventType().equals(SharedVocabulary.PROCESS_EVENT_TYPE)) {
-
-			String parentId = provenanceItem.getParentId();  // this is the workflowID
-			String identifier = provenanceItem.getIdentifier();  // use this as wfInstanceID if this is the top-level process
-
-			parentChildMap.put(identifier, parentId);
-			ProcBinding pb = new ProcBinding();
-			pb.setExecIDRef(getWfInstanceID());  
-			pb.setWfNameRef(currentWorkflowID);
-			procBindingMap.put(identifier, pb);
-
-		} else if (provenanceItem.getEventType().equals(SharedVocabulary.PROCESSOR_EVENT_TYPE)) {
-
-			String identifier = provenanceItem.getIdentifier();
-			String parentId = provenanceItem.getParentId();
-			String processID = provenanceItem.getProcessId(); // this is the external process ID
-
-			// this has the weird form facade0:dataflowname:pname  need to extract pname from here
-			String[] processName = processID.split(":");
-			procBindingMap.get(parentId).setPNameRef(processName[processName.length-1]);  // 3rd component of composite name
-
-
-			parentChildMap.put(identifier, parentId);
-
-		} else if (provenanceItem.getEventType().equals(SharedVocabulary.ACTIVITY_EVENT_TYPE)) {
-
-			String identifier = provenanceItem.getIdentifier();
-			String parentId = provenanceItem.getParentId();
-			procBindingMap.get(parentChildMap.get(parentId)).setActName(identifier);
-			parentChildMap.put(identifier, parentId);
-
-		} else if (provenanceItem.getEventType().equals(SharedVocabulary.ITERATION_EVENT_TYPE)) {
-
-			// traverse up to root to retrieve ProcBinding that was created when we saw the process event 
-			String iterationID = provenanceItem.getIdentifier();
-			String activityID = provenanceItem.getParentId();
-			String processorID = parentChildMap.get(activityID);
-			String processID = parentChildMap.get(processorID);
-			parentChildMap.put(iterationID, activityID);
-			parentChildMap.put(iterationID, activityID);
-			ProcBinding procBinding = procBindingMap.get(processID);
-
-			String itVector = extractIterationVector(ProvenanceUtils.iterationToString(((IterationProvenanceItem)provenanceItem).getIteration()));
-			procBinding.setIterationVector(itVector);
-			InputDataProvenanceItem   inputDataEl = ((IterationProvenanceItem)provenanceItem).getInputDataItem();
-						OutputDataProvenanceItem outputDataEl = ((IterationProvenanceItem)provenanceItem).getOutputDataItem();
-			processInput(inputDataEl, procBinding, currentWorkflowID);
-			processOutput(outputDataEl, procBinding, currentWorkflowID);
-
-			try {
-				getPw().addProcessorBinding(procBinding);
-			} catch (SQLException e) {
-				logger.debug("provenance has duplicate processor binding -- skipping the insertion"); //, e);
-			}
-		} else if (provenanceItem.getEventType().equals(SharedVocabulary.END_WORKFLOW_EVENT_TYPE)) {
-
-			// use this event to do housekeeping on the input/output varbindings 
-
-			dataflowDepth--;
-			if (dataflowDepth == 0) {
-
-				// process the outputs accumulated by WorkflowDataProcessor
-				getWfdp().processTrees(provenanceItem.getWorkflowId(), getWfInstanceID());
-
-				patchTopLevelnputs();
-
-				// PM changed 23/4/09
-				reconcileTopLevelOutputs();  // patchTopLevelOutputs		
-				workflowStructureDone = false; // CHECK reset for next run... 
-			}
-
-
-		} else if (provenanceItem.getEventType().equals(SharedVocabulary.WORKFLOW_DATA_EVENT_TYPE)) {
-			// give this event to a WorkflowDataProcessor object for pre-processing
-//			try {
-			// TODO may generate an exception when the data is an error CHECK
-			getWfdp().addWorkflowDataItem(provenanceItem);
-//			} catch (NumberFormatException e) {
-//			logger.error(e);
-//			}
-//			logger.info("Received workflow data - not processing");
-			//FIXME not sure  - needs to be stored somehow
-
-		} else if (provenanceItem.getEventType().equals((SharedVocabulary.ERROR_EVENT_TYPE))) {
-			//TODO process the error
-
-		} else {
-			// TODO broken, should we throw something here?
-			return;
-		}
-
-	}
-
-	/**
-	 * fills in the VBs for the global inputs -- this removes the need for explicit events
-	 * that account for these value bindings...
-	 */
-	public void patchTopLevelnputs() {
-
-		// for each input I to topLevelDataflow:
-		// pick first outgoing arc with sink P:X
-		// copy value X to I -- this can be a collection, so copy everything
-
-		// get all global input vars
-
-//		logger.info("\n\n BACKPATCHING GLOBAL INPUTS with dataflowDepth = "+dataflowDepth+"*******\n");
-
-		List<Var> inputs=null;
-		try {
-			inputs = getPq().getInputVars(topLevelDataflowName, topLevelDataflowID, getWfInstanceID());
-
-			for (Var input:inputs)  {
-
-//				logger.info("global input: "+input.getVName());
-
-				Map<String,String> queryConstraints = new HashMap<String,String>();
-
-				queryConstraints.put("sourceVarNameRef", input.getVName());
-				queryConstraints.put("sourcePNameRef", input.getPName());
-
-				List<Arc> outgoingArcs = getPq().getArcs(queryConstraints);
-
-				// any arc will do, use the first
-				String targetPname = outgoingArcs.get(0).getSinkPnameRef();
-				String targetVname = outgoingArcs.get(0).getSinkVarNameRef();
-
-//				logger.info("copying values from ["+targetPname+":"+targetVname+"] for instance ID: ["+wfInstanceID+"]");
-
-				queryConstraints.clear();
-				queryConstraints.put("varNameRef", targetVname);
-				queryConstraints.put("V.pNameRef", targetPname);
-				queryConstraints.put("VB.wfInstanceRef", getWfInstanceID());
-				queryConstraints.put("V.wfInstanceRef", topLevelDataflowID);
-
-				List<VarBinding> VBs = getPq().getVarBindings(queryConstraints);
-
-//				logger.info("found the following VBs:");
-				for (VarBinding vb:VBs) {
-//					logger.info(vb.getValue());
-
-					// insert VarBinding back into VB with the global input varname
-					vb.setPNameRef(input.getPName());
-					vb.setVarNameRef(input.getVName());
-					getPw().addVarBinding(vb);
-
-//					logger.info("added");
-
-				}
-
-			}
-		} catch (SQLException e) {
-			logger.warn("Patch top level inputs problem for provenance", e);
-		} catch (IndexOutOfBoundsException e) {
-			logger.error("Could not patch top level", e);
-		}
-
-	}
-
-
-	// PM added 23/4/09
-	/**
-	 * reconcile the top level outputs with the results from its immediate precedessors in the graph.<br/>
-	 * various cases have to be considered: predecessors may include records that are not in the output, 
-	 * while the output may include nested list structures that are not in the precedessors. This method accounts
-	 * for a 2-way reconciliation that considers all possible cases.<br/>
-	 * at the end, outputs and their predecessors contain the same data.<p/>
-	 * NOTE: if we assume that data values (URIs) are <em>always</em> unique then this is greatly simplified by just
-	 * comparing two sets of value records by their URIs and reconciling them. But this is not the way it is done here
-	 */
-	public void reconcileTopLevelOutputs() {
-		/*
-	for each output O
-
-	for each variable V in predecessors(O)
-
-	fetch all VB records for O into list OValues
-	fetch all VB records for V  into list Yalues
-
-	compare OValues and VValues:
-	it SHOULD be the case that OValues is a subset of YValues. Under this assumption:
-
-	for each vb in YValues:
-	- if there is a matching o in OValues then (vb may be missing collection information)
-	    copy o to vb
-	  else 
-	    if vb has no collection info && there is a matching tree node tn  in OTree (use iteration index for the match) then   
-	       set vb to be in collection tb
-	       copy vb to o
-
-     finally copy all Collection records for O in OTree -- catch duplicate errors
-		 */
-
-		Map<String,String> queryConstraints = new HashMap<String,String>();
-
-		List<Var> outputs=null;
-		try {
-
-			outputs = pq.getOutputVars(topLevelDataflowName, topLevelDataflowID, null);  // null InstanceID 
-
-			// for each output O
-			for (Var output:outputs)  {
-
-				// collect all VBs for O
-//				String oPName = output.getPName();
-//				String oVName = output.getVName();
-//				queryConstraints.put("varNameRef", oVName);
-//				queryConstraints.put("V.pNameRef", oPName);
-//				queryConstraints.put("VB.wfInstanceRef", wfInstanceID);
-//				queryConstraints.put("V.wfInstanceRef", topLevelDataflowID);
-
-//				List<VarBinding> OValues = pq.getVarBindings(queryConstraints);
-
-				// find all records for the immediate precedessor Y of O
-				queryConstraints.clear();
-				queryConstraints.put("sinkVarNameRef", output.getVName());
-				queryConstraints.put("sinkPNameRef", output.getPName());
-
-				List<Arc> incomingArcs = pq.getArcs(queryConstraints);
-
-				// there can be only one -- but check that there is one!
-				if (incomingArcs.size()==0)  continue;
-
-				String sourcePname = incomingArcs.get(0).getSourcePnameRef();
-				String sourceVname = incomingArcs.get(0).getSourceVarNameRef();
-
-				queryConstraints.clear();
-				queryConstraints.put("varNameRef", sourceVname);
-				queryConstraints.put("V.pNameRef", sourcePname);
-				queryConstraints.put("VB.wfInstanceRef", getWfInstanceID());
-				queryConstraints.put("V.wfInstanceRef", topLevelDataflowID);
-
-				List<VarBinding> YValues = pq.getVarBindings(queryConstraints);
-
-				// for each YValue look for a match in OValues
-				// (assume the YValues values are a superset of OValues)!)
-
-				for (VarBinding yValue:YValues) {
-
-
-//					System.out.println("reconcileTopLevelOutputs:: processing "+
-//					yValue.getPNameRef()+"/"+yValue.getVarNameRef()+"/"+yValue.getValue()+
-//					" with collid "+yValue.getCollIDRef());
-
-					// look for a matching record in VarBinding for output O
-					queryConstraints.clear();
-					queryConstraints.put("varNameRef", output.getVName());
-					queryConstraints.put("V.pNameRef", output.getPName());
-					queryConstraints.put("VB.wfInstanceRef", getWfInstanceID());
-					queryConstraints.put("V.wfInstanceRef", topLevelDataflowID);
-					queryConstraints.put("VB.iteration", yValue.getIteration());
-					if (yValue.getCollIDRef()!= null) {
-						queryConstraints.put("VB.collIDRef", yValue.getCollIDRef());
-						queryConstraints.put("VB.positionInColl", Integer.toString(yValue.getPositionInColl()));
-					}
-					List<VarBinding> matchingOValues = pq.getVarBindings(queryConstraints);
-
-//					System.out.println("querying for matching oValues: ");
-
-					// result at most size 1
-					if (matchingOValues.size() > 0) {
-
-						VarBinding oValue = matchingOValues.get(0);
-
-//						System.out.println("found "+oValue.getPNameRef()+"/"+oValue.getVarNameRef()+"/"+oValue.getValue()+
-//						" with collid "+oValue.getCollIDRef());
-
-						// copy collection info from oValue to yValue						
-						yValue.setCollIDRef(oValue.getCollIDRef());
-						yValue.setPositionInColl(oValue.getPositionInColl());
-
-						pw.updateVarBinding(yValue);
-
-//						System.out.println("oValue copied to yValue");
-					} else {
-
-//						System.out.println("no match found");
-
-						// copy the yValue to O 
-						// insert VarBinding back into VB with the global output varname
-						yValue.setPNameRef(output.getPName());
-						yValue.setVarNameRef(output.getVName());
-						pw.addVarBinding(yValue);
-					}
-
-				} // for each yValue in YValues
-
-				// copy all Collection records for O to Y 
-
-				// get all collections refs for O
-				queryConstraints.clear();
-				queryConstraints.put("wfInstanceRef", getWfInstanceID());
-				queryConstraints.put("PNameRef", output.getPName());
-				queryConstraints.put("varNameRef", output.getVName());
-
-				List<NestedListNode> oCollections = pq.getNestedListNodes(queryConstraints);
-
-				// insert back as collection refs for Y -- catch duplicates
-				for (NestedListNode nln:oCollections) {
-//					System.out.println("collection: "+nln.getCollId());
-
-					nln.setPNameRef(sourcePname);
-					nln.setPNameRef(sourceVname);
-
-					getPw().replaceCollectionRecord(nln, sourcePname, sourceVname);
-				}
-
-			} // for each output var
-
-		} catch (SQLException e) {
-			logger.warn("Problem reconciling top level outputs", e);
-		}
-
-	}
-
-
-
-
-	@SuppressWarnings("unchecked")
-	private void processOutput(OutputDataProvenanceItem provenanceItem, ProcBinding procBinding, String currentWorkflowID) {
-
-		Element dataItemAsXML = ProvenanceUtils.getDataItemAsXML(provenanceItem);
-		List<Element> outputPorts = dataItemAsXML.getChildren("port");
-		for (Element outputport : outputPorts) {
-
-			String portName = outputport.getAttributeValue("name");
-
-			// value type may vary
-			List<Element> valueElements = outputport.getChildren();
-			if (valueElements != null && valueElements.size() > 0) {
-
-				Element valueEl = valueElements.get(0); // only really 1 child
-
-				processVarBinding(valueEl,  procBinding.getPNameRef(), portName, procBinding.getIterationVector(),
-						getWfInstanceID(), currentWorkflowID);
-			}
-		}
-
-	}
-
-
-	/**
-	 * this method reconciles values in varBindings across an arc: Firstly, if vb's value is within a collection,
-	 *  _and_ it is copied from a value generated during a previous iteration,
-	 * then this method propagates the list reference to that iteration value, which wouldn't have it.
-	 * Conversely, if vb is going to be input to an iteration, then it's lost its containing list node, and we
-	 * put it back in by looking at the corresponding predecessor 
-	 * @param vb
-	 * @throws SQLException 
-	 */
-	private void backpatchIterationResults(List<VarBinding> newBindings) throws SQLException {
-
-		logger.debug("backpatchIterationResults: start");
-		for (VarBinding vb:newBindings) {
-
-			logger.debug("backpatchIterationResults: processing vb "+vb.getPNameRef()+"/"+vb.getVarNameRef()+"="+vb.getValue());
-
-			if (vb.getCollIDRef()!= null)  {  // this is a member of a collection
-				logger.debug("...which is inside a collection ");
-			}
-
-			// look for its antecedent
-			Map<String,String> queryConstraints = new HashMap<String,String>();
-
-			queryConstraints.put("sinkVarNameRef", vb.getVarNameRef());
-			queryConstraints.put("sinkPNameRef", vb.getPNameRef());				
-			queryConstraints.put("wfInstanceRef", pq.getWfNames(vb.getWfInstanceRef()).get(0));  // CHECK picking first element in list...
-
-			List<Arc> incomingArcs = pq.getArcs(queryConstraints);
-
-			// there can be only one -- but check that there is one!
-			if (incomingArcs.size()==0)  return;
-
-			String sourcePname = incomingArcs.get(0).getSourcePnameRef();
-			String sourceVname = incomingArcs.get(0).getSourceVarNameRef();
-
-			logger.debug("antecedent: "+sourcePname+":"+sourceVname);
-
-			// get the varbindings for this port and select the one with the same iteration vector as its successor
-			queryConstraints.clear();
-			queryConstraints.put("varNameRef", sourceVname);
-			queryConstraints.put("V.pNameRef", sourcePname);
-			queryConstraints.put("VB.value", vb.getValue());
-			queryConstraints.put("VB.wfInstanceRef", vb.getWfInstanceRef());
-
-			List<VarBinding> VBs = pq.getVarBindings(queryConstraints);
-
-			if (VBs.size() == 0) { logger.debug("nothing to reconcile"); }
-			
-			// reconcile
-			for (VarBinding b:VBs) {
-
-				logger.debug("backpatching "+sourceVname+" "+sourcePname);
-
-				if (vb.getCollIDRef() != null && b.getCollIDRef() == null) {
-					
-					logger.debug("successor "+vb.getVarNameRef()+" is in collection "+vb.getCollIDRef()+" but pred "+b.getVarNameRef()+" is not");
-					logger.debug("putting "+b.getVarNameRef()+" in collection "+vb.getCollIDRef()+" at pos "+vb.getPositionInColl());
-					b.setCollIDRef(vb.getCollIDRef());
-					b.setPositionInColl(vb.getPositionInColl());
-					getPw().updateVarBinding(b);
-					
-				} else if (vb.getCollIDRef() == null && b.getCollIDRef() != null) {
-					
-					logger.debug("successor "+vb.getVarNameRef()+" is NOT in collection but pred "+b.getVarNameRef()+" IS");
-					logger.debug("putting "+vb.getVarNameRef()+" in collection "+b.getCollIDRef()+" at pos "+b.getPositionInColl());
-					vb.setCollIDRef(b.getCollIDRef());
-					vb.setPositionInColl(b.getPositionInColl());
-					getPw().updateVarBinding(vb);						
-				}
-			}
-		}
-	}
-
-
-	/**
-	 * create one new VarBinding record for each input port binding
-	 * @param currentWorkflowID 
-	 */
-	@SuppressWarnings("unchecked")
-	private void processInput(InputDataProvenanceItem provenanceItem, ProcBinding procBinding, String currentWorkflowID) {
-
-		Element dataItemAsXML = ProvenanceUtils.getDataItemAsXML(provenanceItem);
-		List<Element> inputPorts = dataItemAsXML.getChildren("port");
-		int order = 0;
-		for (Element inputport : inputPorts) {
-
-			String portName = inputport.getAttributeValue("name");
-//			logger.info("processInput: processing VarBinding for "+procBinding.getPNameRef()+"  "+portName);
-
-			try {
-				// add process order sequence to Var for this portName
-
-				Map<String, String> queryConstraints = new HashMap<String, String>();
-				queryConstraints.put("wfInstanceRef", currentWorkflowID);
-				queryConstraints.put("pnameRef", procBinding.getPNameRef());
-				queryConstraints.put("varName", portName);
-				queryConstraints.put("inputOrOutput", "1");
-
-				List<Var> vars = getPq().getVars(queryConstraints);
-				try {
-					Var v = vars.get(0);
-					v.setPortNameOrder(order++);
-					getPw().updateVar(v);
-				}
-				catch (IndexOutOfBoundsException e) {
-					logger.error("Could not process input " + portName, e);
-				}
-			} catch (SQLException e1) {
-				logger.error("Could not process input " + portName, e1);
-			}
-
-			// value type may vary
-			List<Element> valueElements = inputport.getChildren(); // hopefully
-			// in the
-			// right
-			// order...
-			if (valueElements != null && valueElements.size() > 0) {
-
-				Element valueEl = valueElements.get(0); // expect only 1 child
-//				processVarBinding(valueEl, processor, portName, iterationVector,
-//				dataflow);
-
-				List<VarBinding> newBindings = 
-					processVarBinding(valueEl, procBinding.getPNameRef(), portName, procBinding.getIterationVector(),
-							getWfInstanceID(), currentWorkflowID);
-				// this is a list whenever valueEl is of type list: in this case processVarBinding recursively
-				// processes all values within the collection, and generates one VarBinding record for each of them
-
-				allInputVarBindings.addAll(newBindings);
-				
-//				logger.debug("newBindings now has "+newBindings.size()+" elements");
-
-				//				// if the new binding involves list values, then check to see if they need to be propagated back to 
-//				// results of iterations
-				try {
-					backpatchIterationResults(newBindings);
-				} catch (SQLException e) {
-					logger.warn("Problem with back patching iteration results", e);
-
-				}
-
-			} else {
-				  if (valueElements != null)  logger.debug("port name "+portName+"  "+valueElements.size());
-				  else logger.debug("valueElements is null for port name "+portName);
-			}
-		}
-
-	}
-
-	/**
-	 * capture the default case where the value is not a list
-	 * 
-	 * @param valueEl
-	 * @param processorId
-	 * @param portName
-	 * @param iterationId
-	 * @param wfInstanceRef
-	 * @param currentWorkflowID 
-	 */
-	private List<VarBinding> processVarBinding(Element valueEl, String processorId,
-			String portName, String iterationId, String wfInstanceRef, String currentWorkflowID) {
-
-		// uses the defaults:
-		// collIdRef = null
-		// parentcollectionRef = null
-		// positionInCollection = 1
-		return processVarBinding(valueEl, processorId, portName, null, 1, null,
-				iterationId, wfInstanceRef, null, currentWorkflowID);
-	}
-
-	/**
-	 * general case where value can be a list
-	 * @param valueEl
-	 * @param processorId
-	 * @param portName
-	 * @param collIdRef
-	 * @param positionInCollection
-	 * @param parentCollectionRef
-	 * @param iterationId
-	 * @param wfInstanceRef
-	 * @param currentWorkflowID 
-	 */
-	@SuppressWarnings("unchecked")
-	private List<VarBinding>  processVarBinding(Element valueEl, String processorId,
-			String portName, String collIdRef, int positionInCollection,
-			String parentCollectionRef, String iterationId, String wfInstanceRef, String itVector, String currentWorkflowID) {
-
-		List<VarBinding> newBindings = new ArrayList<VarBinding>();
-
-		String valueType = valueEl.getName();
-//		logger.info("value element for " + processorId + ": "
-//		+ valueType);
-
-		String iterationVector = null;
-
-		if (itVector == null) 
-			iterationVector = extractIterationVector(iterationId);
-		else iterationVector = itVector;
-
-		VarBinding vb = new VarBinding();
-
-		vb.setWfNameRef(currentWorkflowID);
-		vb.setWfInstanceRef(wfInstanceRef);
-		vb.setPNameRef(processorId);
-		vb.setValueType(valueType);
-		vb.setVarNameRef(portName);
-		vb.setCollIDRef(collIdRef);
-		vb.setPositionInColl(positionInCollection);
-
-		newBindings.add(vb);
-		
-		if (valueType.equals("literal")) {
-
-//			logger.warn("input of type literal");
-
-			try {
-
-				vb.setIterationVector(iterationVector);
-				vb.setValue(valueEl.getAttributeValue("id"));
-
-				logger.debug("new input VB with wfNameRef="+currentWorkflowID+" processorId="+processorId+
-						" valueType="+valueType+" portName="+portName+" collIdRef="+collIdRef+
-						" position="+positionInCollection+" itvector="+iterationVector+
-						" value="+vb.getValue());
-
-//				logger.info("calling addVarBinding on "+vb.getPNameRef()+" : "+vb.getVarNameRef()); 
-				getPw().addVarBinding(vb);
-
-			} catch (SQLException e) {
-				logger.warn("Process Var Binding problem with provenance", e);
-			}
-
-		} else if (valueType.equals("referenceSet")) {
-
-			vb.setIterationVector(iterationVector);
-			vb.setValue(valueEl.getAttributeValue("id"));
-			vb.setRef(valueEl.getChildText("reference"));
-
-			logger.debug("new input VB with wfNameRef="+currentWorkflowID+" processorId="+processorId+
-					" valueType="+valueType+" portName="+portName+" collIdRef="+collIdRef+
-					" position="+positionInCollection+" itvector="+iterationVector+
-					" value="+vb.getValue());
-
-			try {
-//				logger.debug("calling addVarBinding on "+vb.getPNameRef()+" : "+vb.getVarNameRef()+" with it "+vb.getIteration()); 
-				getPw().addVarBinding(vb);
-			} catch (SQLException e) {
-				logger.debug("Problem processing var binding -- performing update instead of insert", e); //, e);
-				// try to update the existing record instead using the current collection info
-				
-				getPw().updateVarBinding(vb);
-//				logger.warn("VarBinding update successful");
-				
-			}
-
-		} else if (valueType.equals("list")) {
-
-			logger.debug("input of type list");
-
-			// add entries to the Collection and to the VarBinding tables
-			// list id --> Collection.collId
-
-			String collId = valueEl.getAttributeValue("id");
-			try {
-
-				parentCollectionRef = getPw().addCollection(processorId, collId,
-						parentCollectionRef, iterationVector, portName,
-						wfInstanceRef);
-
-				// iterate over each list element
-				List<Element> listElements = valueEl.getChildren();
-
-				positionInCollection = 1;  // also use this as a suffix to extend the iteration vector
-
-				// extend iteration vector to account for additional levels within the list
-
-				String originalIterationVector = iterationVector;
-
-				// children can be any base type, including list itself -- so
-				// use recursion
-				for (Element el : listElements) {
-
-					if (originalIterationVector.length() >2)  { // vector is not empty
-						iterationVector = originalIterationVector.substring(0, 
-								originalIterationVector.length()-1) + ","+ 
-								Integer.toString(positionInCollection-1) + "]";
-					} else {
-						iterationVector = "["+ Integer.toString(positionInCollection-1) + "]";
-					}
-
-					List<VarBinding> bindings = processVarBinding(el, processorId, portName, collId,
-							positionInCollection, parentCollectionRef,
-							iterationId, wfInstanceRef, iterationVector, currentWorkflowID);
-
-					newBindings.addAll(bindings);
-
-					positionInCollection++;
-				}
-
-			} catch (SQLException e) {
-				logger.warn("Problem processing var binding", e);
-			}
-		} else if (valueType.equals("error")) {
-			try {
-				vb.setIterationVector(iterationVector);
-				vb.setValue(valueEl.getAttributeValue("id"));
-
-				getPw().addVarBinding(vb);
-
-			} catch (SQLException e) {
-				logger.warn("Process Var Binding problem with provenance", e);
-			}
-		} else {
-			logger.warn("unrecognized value type element for "
-					+ processorId + ": " + valueType);
-		}
-
-		return newBindings;
-	}
-
-
-	/**
-	 * OBSOLETE: returns the iteration vector x,y,z,... from [x,y,z,...]
-	 * <p/>
-	 * now returns the vector itself -- this is still experimental
-	 * 
-	 * @param iteration
-	 * @return
-	 */
-	String extractIterationVector(String iteration) {
-
-		return iteration;
-		// return iteration.substring(1, iteration.length() - 1);
-		// iteration is of the form "[n]" so we extract n
-		// String iterationN = iteration.substring(1, iteration.length()-1);
-
-		// if (iterationN.length() == 0) return 0;
-
-		// return Integer.parseInt(iterationN);
-	}
-
-	/**
-	 * log raw event to file system
-	 * 
-	 * @param content
-	 * @param eventType
-	 * @throws IOException
-	 */
-	public void saveEvent(ProvenanceItem provenanceItem, SharedVocabulary eventType) throws IOException {
-
-		// HACK -- XMLEncoder fails on IterationEvents and there is no way to catch the exception...
-		// so avoid this case
-		if (eventType.equals(SharedVocabulary.ITERATION_EVENT_TYPE))  {
-			return;
-		}
-
-//		System.out.println("saveEvent: start");
-
-		File f1 = null;
-
-		f1 = new File(TEST_EVENTS_FOLDER);
-		FileUtils.forceMkdir(f1);
-
-		String fname = "event_" + eventCnt++ + "_" + eventType + ".xml";
-		File f = new File(f1, fname);
-
-//		FileWriter fw = new FileWriter(f);
-
-		XMLEncoder en = new XMLEncoder(new BufferedOutputStream(
-				new FileOutputStream(f)));
-
-		en.setExceptionListener(new ExceptionListener()
-		{
-			public void exceptionThrown(Exception e)
-			{
-				logger.warn("XML encoding ERROR", e);
-				return;
-			}
-		});
-
-		logger.debug("saving to " + f); // save event for later inspection
-		logger.debug(provenanceItem);
-
-		en.writeObject(provenanceItem);
-
-		logger.debug("writer ok");
-		en.close();
-		logger.debug("closed");
-
-//		fw.write(content);
-//		fw.flush();
-//		fw.close();
-
-//		FileWriter fw = new FileWriter(f);
-//		fw.write(content);
-//		fw.flush();
-//		fw.close();
-
-//		System.out.println("saved as file " + fname);
-
-
-	}
-
-	/**
-	 * for each arc of the form (_INPUT_/I, P/V): propagate VarBinding for P/V
-	 * to var _INPUT_/I <br/>
-	 * 
-	 * @throws SQLException
-	 */
-	public void fillInputVarBindings(Object context) throws SQLException {
-
-		// System.out.println("*** fillInputVarBindings: ***");
-
-		// retrieve appropriate arcs
-		Map<String, String> constraints = new HashMap<String, String>();
-		constraints.put("sourcePnameRef", "_INPUT_");
-		constraints.put("W.instanceID", getWfInstanceID());
-		List<Arc> arcs = getPq().getArcs(constraints);
-
-		// backpropagate VarBinding from the target var of the arc to the source
-		for (Arc aArc : arcs) {
-
-//			logger.info("propagating VarBinding from ["
-//			+ aArc.getSinkPnameRef() + "/" + aArc.getSinkVarNameRef()
-//			+ "] to input [" + aArc.getSourcePnameRef() + "/"
-//			+ aArc.getSourceVarNameRef() + "]");
-
-			// get the varBinding for the arc sinks
-			Map<String, String> vbConstraints = new HashMap<String, String>();
-			vbConstraints.put("VB.PNameRef", aArc.getSinkPnameRef());
-			vbConstraints.put("VB.varNameRef", aArc.getSinkVarNameRef());
-			vbConstraints.put("VB.wfInstanceRef", getWfInstanceID());
-
-			List<VarBinding> vbList = getPq().getVarBindings(vbConstraints); // DB
-			// QUERY
-
-			for (VarBinding vb : vbList) {
-				// add a new VarBinding for the input
-
-				vb.setPNameRef(aArc.getSourcePnameRef());
-				vb.setVarNameRef(aArc.getSourceVarNameRef());
-				// all other attributes are the same --> CHECK!!
-
-				getPw().addVarBinding(vb);
-			}
-		}
-	}
-
-	/**
-	 * for each arc of the form (P/V, _OUTPUT_/O): propagate VarBinding for P/V
-	 * to var _OUTPUT_/O <br/>
-	 * 
-	 * @throws SQLException
-	 */
-	public void fillOutputVarBindings(Object context) throws SQLException {
-
-		//System.out.println("*** fillOutputVarBindings: ***");
-
-		// retrieve appropriate arcs
-		Map<String, String> constraints = new HashMap<String, String>();
-		constraints.put("sinkPnameRef", "_OUTPUT_");
-		constraints.put("wfInstanceRef", getWfInstanceID());
-		List<Arc> arcs = getPq().getArcs(constraints);
-
-		// fowd propagate VarBinding from the source var of the arc to the
-		// output
-		for (Arc aArc : arcs) {
-
-//			logger.info("fwd propagating VarBinding from ["
-//			+ aArc.getSourcePnameRef() + "/"
-//			+ aArc.getSourceVarNameRef() + "] to input ["
-//			+ aArc.getSinkPnameRef() + "/" + aArc.getSinkVarNameRef()
-//			+ "]");
-
-			// get the varBinding for the arc sinks
-			Map<String, String> vbConstraints = new HashMap<String, String>();
-			vbConstraints.put("VB.PNameRef", aArc.getSourcePnameRef());
-			vbConstraints.put("VB.varNameRef", aArc.getSourceVarNameRef());
-			vbConstraints.put("VB.wfInstanceRef", getWfInstanceID());
-
-			List<VarBinding> vbList = getPq().getVarBindings(vbConstraints); // DB
-			// QUERY
-
-			for (VarBinding vb : vbList) {
-				// add a new VarBinding for the input
-				getPw().addVarBinding(vb); // DB UPDATE
-			}
-
-		}
-	}
-
-
-	/**
-	 * silly class to hold pairs of strings. any better way??
-	 * @author paolo
-	 *
-	 */
-	class Pair {
-		String v1, v2;
-
-		public Pair(String current, String wfNameRef) {
-			v1=current; v2=wfNameRef;
-		}
-
-		/**
-		 * @return the v1
-		 */
-		public String getV1() {
-			return v1;
-		}
-
-		/**
-		 * @param v1 the v1 to set
-		 */
-		public void setV1(String v1) {
-			this.v1 = v1;
-		}
-
-		/**
-		 * @return the v2
-		 */
-		public String getV2() {
-			return v2;
-		}
-
-		/**
-		 * @param v2 the v2 to set
-		 */
-		public void setV2(String v2) {
-			this.v2 = v2;
-		}
-
-	}
-
-	public List<Pair> toposort(String dataflowName, String wfInstanceId) throws SQLException  {
-
-//		String wfNameRef = pq.getWfNameForDataflow(dataflowName, wfInstanceID);
-		String wfNameRef = pq.getWfNameForDataflow(dataflowName);
-
-		// fetch processors along with the count of their predecessors
-		Map<String, Integer> predecessorsCount = getPq().getPredecessorsCount(wfInstanceId);
-		Map<String, List<String>> successorsOf = new HashMap<String, List<String>>();
-//		List<String> procList = pq.getContainedProcessors(dataflowName, wfInstanceId);
-		List<String> procList = pq.getContainedProcessors(dataflowName);
-
-//		logger.debug("toposort on "+dataflowName);
-
-//		logger.debug("contained procs: ");
-		for (String s:procList) { 
-
-			List<String> successors = getPq().getSuccProcessors(s, wfNameRef, wfInstanceId);
-			successorsOf.put(s, successors);
-
-//			logger.debug(s+" with "+predecessorsCount.get(s)+" predecessors and successors:");
-
-//			for (String s1:successors) { logger.debug(s1); }
-		}
-
-		List<Pair>  sorted = tsort(procList, dataflowName, predecessorsCount, successorsOf, wfNameRef, wfInstanceId);
-
-//		logger.debug("tsort:");
-//		for (String p : sorted) { logger.debug(p); }
-
-		for (int i=0; i< sorted.size(); i++) {
-
-			String procName = sorted.get(i).getV1();
-
-			if (pq.isDataflow(procName) && !procName.equals(dataflowName)) {  // handle weirdness: a dataflow is contained within itself..
-				// recurse on procName
-
-//				logger.debug("recursion on "+procName);
-				List<Pair> sortedSublist = toposort(procName, wfInstanceId);
-
-				// replace procName with sortedSublist in sorted
-				sorted.remove(i);
-				sorted.addAll(i, sortedSublist);				
-			}
-		}
-		return sorted;
-	}
-
-
-
-	/**
-	 * STUB
-	 * @param procList
-	 * @param predecessorsCount 
-	 * @param successorsOf 
-	 * @param wfInstanceId 
-	 * @return
-	 * @throws SQLException 
-	 */
-	public List<Pair> tsort(List<String> procList, 
-			String dataflowName, 
-			Map<String, Integer> predecessorsCount, 
-			Map<String, List<String>> successorsOf, 
-			String wfNameRef, String wfInstanceId) throws SQLException {
-
-		List<Pair> L = new ArrayList<Pair>();		// holds sorted elements
-		List<String> Q = new ArrayList<String>(); 		// temp queue
-		Set<String> visited = new HashSet<String>();
-
-//		logger.debug("queue init with procList");
-		// init queue with procList processors that have no predecessors
-		for (String proc:procList) {			
-
-//			logger.debug("dataflowName: "+dataflowName+" proc: "+proc);
-
-			if (predecessorsCount.get(proc) == null || predecessorsCount.get(proc) == 0 &&
-					!proc.equals(dataflowName)) {
-
-				Q.add(proc);				
-			}
-//			logger.debug(proc + " added to queue");
-//			} else 
-//			logger.debug(proc+" not added to queue");
-		}
-
-//		logger.debug("queue has "+Q.size()+" elements");
-		while (!Q.isEmpty()) {
-
-			String current = Q.remove(0);
-//			logger.debug("extracted "+current+" and added to L");
-			L.add(new Pair(current,wfNameRef));
-
-//			for (String s:L) logger.debug(s);
-
-			List<String> successors = successorsOf.get(current);
-
-//			logger.debug("\n****successors of "+current);
-
-			if (successors == null) continue;
-
-			// reduce the number of predecessors to each of the successors by one
-			// NB we must traverse an additional arc through a nested workflow input if the successor is a dataflow!!
-			for (String succ : successors) {
-
-//				logger.debug(succ);
-
-				// decrease edge count for each successor processor
-				Integer cnt = predecessorsCount.get(succ);
-				predecessorsCount.put(succ, new Integer(cnt.intValue() - 1));
-
-//				logger.debug("now "+succ+" has "+predecessorsCount.get(succ)+" predecessors");
-
-				if (predecessorsCount.get(succ) == 0 && !succ.equals(dataflowName)) {
-					Q.add(succ);
-//					logger.debug("adding "+succ+" to queue");
-				}
-			}
-		} // end loop on Q
-		return L;
-	}
-
-
-	public void propagateANL(String wfInstanceId) throws SQLException {
-
-		String top = pq.getTopLevelDataflowName(wfInstanceId);
-
-		// //////////////////////
-		// PHASE I: toposort the processors in the whole graph
-		// //////////////////////
-		List<Pair> sorted = toposort(top, wfInstanceId);
-
-		logger.debug("final sorted list of processors");
-		for (Pair p:sorted) {  logger.debug(p.getV1()+"  in wfnameRef "+p.getV2()); }
-
-		// //////////////////////
-		// PHASE II: traverse and set anl on each port
-		// //////////////////////
-
-//		logger.debug("***** STARTING ANL *****");
-
-//		// sorted processor names in L at this point
-//		// process them in order
-		for (Pair pnameInContext : sorted) {
-
-//			logger.debug("setting ANL for "+pnameInContext.getV1()+" input vars");
-
-//			// process pname's inputs -- set ANL to be the DNL if not set in prior steps
-			String pname     = pnameInContext.getV1();
-			String wfNameRef = pnameInContext.getV2();
-
-//			logger.debug("processor "+pname);
-
-			List<Var> inputs = getPq().getInputVars(pname, wfNameRef, wfInstanceId); // null -> do not use instance (??) CHECK
-
-//			logger.debug(inputs.size()+" inputs for "+pnameInContext.getV1());
-
-			int totalANL = 0;
-			for (Var iv : inputs) {
-
-				if (iv.isANLset() == false) {
-					iv.setActualNestingLevel(iv.getTypeNestingLevel());
-					iv.setANLset(true);
-					getPw().updateVar(iv);
-
-//					logger.debug("var: "+iv.getVName()+" set at nominal level "+iv.getActualNestingLevel());					
-				}
-
-				int delta_nl = iv.getActualNestingLevel() - iv.getTypeNestingLevel();
-
-				// if delta_nl < 0 then Taverna wraps the value into a list --> use dnl(X) in this case
-				if (delta_nl < 0 ) delta_nl = 0;// CHECK iv.getTypeNestingLevel();
-//				logger.debug("delta for "+iv.getVName()+" "+delta_nl);
-
-				totalANL += delta_nl;
-
-				// this should take care of the special case of the top level dataflow with inputs that have successors in the graph
-				// propagate this through all the links from this var
-//				List<Var> successors = getPq().getSuccVars(pname, iv.getVName(), wfInstanceId);
-
-//				logger.debug(successors.size()+ " successors for var "+iv.getVName());
-
-//				for (Var v : successors) {
-//				v.setActualNestingLevel(iv.getActualNestingLevel());
-//				v.setANLset(true);
-//				getPw().updateVar(v);
-//				}
-			}
-//			logger.debug("total anl: "+totalANL);
-
-//			logger.debug("now setting ANL for "+pname+" output vars");
-
-			// process pname's outputs -- set ANL based on the sum formula (see
-			// paper)
-			List<Var> outputs = getPq().getOutputVars(pname, wfNameRef, wfInstanceId);
-			for (Var ov : outputs) {
-
-				ov.setActualNestingLevel(ov.getTypeNestingLevel() + totalANL);
-
-				logger.debug("anl for "+pname+":"+ov.getVName()+" = "+(ov.getTypeNestingLevel() + totalANL));
-				ov.setANLset(true);
-				getPw().updateVar(ov);
-
-				// propagate this through all the links from this var
-				List<Var> successors = getPq().getSuccVars(pname, ov.getVName(), wfNameRef);
-
-//				logger.debug(successors.size()+ " successors for var "+ov.getVName());
-
-				for (Var v : successors) {
-
-					List<Var> toBeProcessed = new ArrayList<Var>();
-					toBeProcessed.add(v);
-
-					if (pq.isDataflow(v.getPName()) && v.isInput()) {  // this is the input to a nested workflow
-
-//						String tempWfNameRef = pq.getWfNameForDataflow(v.getPName(), wfInstanceId);
-						String tempWfNameRef = pq.getWfNameForDataflow(v.getPName());
-						List<Var> realSuccessors = getPq().getSuccVars(v.getPName(), v.getVName(), tempWfNameRef);	
-
-//						logger.debug("realSuccessors size = "+realSuccessors.size());
-
-						toBeProcessed.remove(0);
-						toBeProcessed.addAll(realSuccessors);
-
-					}  else if (pq.isDataflow(v.getPName()) && !v.isInput()) {  // this is the output to a nested workflow
-
-//						String tempWfNameRef = pq.getWfNameForDataflow(v.getPName(), wfInstanceId);
-						String tempWfNameRef = pq.getWfNameForDataflow(v.getPName());
-						List<Var> realSuccessors = getPq().getSuccVars(v.getPName(), v.getVName(), null);	
-
-//						logger.debug("realSuccessors size = "+realSuccessors.size());
-
-						toBeProcessed.remove(0);
-						toBeProcessed.addAll(realSuccessors);
-
-					}
-
-					for (Var v1:toBeProcessed) {
-						v1.setActualNestingLevel(ov.getActualNestingLevel());
-						logger.debug("anl for "+v1.getPName()+":"+v1.getVName()+" = "+ov.getActualNestingLevel());
-
-						v1.setANLset(true);
-						getPw().updateVar(v1);
-					}
-				}
-			}
-		}
-	}
-
-
-
-
-	public void setPw(ProvenanceWriter pw) {
-		this.pw = pw;
-	}
-
-
-	public ProvenanceWriter getPw() {
-		return pw;
-	}
-
-
-	public void setPq(ProvenanceQuery pq) {
-		this.pq = pq;
-	}
-
-
-	public ProvenanceQuery getPq() {
-		return pq;
-	}
-
-	public void setWfInstanceID(String wfInstanceID) {
-		this.wfInstanceID = wfInstanceID;
-	}
-
-	public String getWfInstanceID() {
-		return wfInstanceID;
-	}
-
-	public void setWfdp(WorkflowDataProcessor wfdp) {
-		this.wfdp = wfdp;
-	}
-
-	public WorkflowDataProcessor getWfdp() {
-		return wfdp;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/LineageQueryResultRecord.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/LineageQueryResultRecord.java
deleted file mode 100644
index 3339034..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/LineageQueryResultRecord.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-/**
- * 
- * @author Paolo Missier<p/>
- * Java bean, holds a single provenance record at the finest level of granularity as it comes from the provenance DB. 
- * The content of such records is described elsewhere (see UML documentation) 
- *
- */
-public class LineageQueryResultRecord {
-
-	String wfName;
-	String pname;
-	String vname;
-	String wfInstance;
-	String iteration;
-	String value;     // atomic or XML-formatted collection -- this is actually a reference to the value...
-	String collIdRef;
-	String parentCollIDRef;
-	String resolvedValue;
-	String type;  // one of referenceSet, referenceSetCollection
-	boolean printResolvedValue;
-	boolean isInput; 
-	boolean isCollection;
-
-	public String toString() {
-		if (isCollection) {
-			return "COLLECTION: proc "+getPname()+
-			" var "+getVname()+" " +
-			" iteration: "+getIteration()+
-			" value: "+getValue()+
-			" collection id: "+getCollIdRef()+
-			" parent collection: "+getParentCollIDRef();
-		} else {
-
-			if (printResolvedValue)
-				return "workflow "+ getWfName()+
-				" proc "+getPname()+
-				" var "+getVname()+" " +
-				" iteration: "+getIteration()+
-				" value: "+getValue()+
-				" collection id: "+getCollIdRef()+
-				" resolvedValue: "+getResolvedValue();
-			else  
-				return "workflow "+ getWfName()+
-				" proc "+getPname()+
-				" var "+getVname()+" " +
-				" iteration: "+getIteration()+
-				" collection id: "+getCollIdRef()+
-				" value: "+getValue();
-		}
-	}
-
-
-	/**
-	 * @return the pname
-	 */
-	public String getPname() {
-		return pname;
-	}
-	/**
-	 * @param pname the pname to set
-	 */
-	public void setPname(String pname) {
-		this.pname = pname;
-	}
-	/**
-	 * @return the vname
-	 */
-	public String getVname() {
-		return vname;
-	}
-	/**
-	 * @param vname the vname to set
-	 */
-	public void setVname(String vname) {
-		this.vname = vname;
-	}
-	/**
-	 * @return the wfInstance
-	 */
-	public String getWfInstance() {
-		return wfInstance;
-	}
-	/**
-	 * @param wfInstance the wfInstance to set
-	 */
-	public void setWfInstance(String wfInstance) {
-		this.wfInstance = wfInstance;
-	}
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-	/**
-	 * @param value the value to set
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-	/**
-	 * @return the type
-	 */
-	public String getType() {
-		return type;
-	}
-	/**
-	 * @param type the type to set
-	 */
-	public void setType(String type) {
-		this.type = type;
-	}
-	/**
-	 * @return the iteration
-	 */
-	public String getIteration() {
-		return iteration;
-	}
-	/**
-	 * @param iteration the iteration to set
-	 */
-	public void setIteration(String iteration) {
-		this.iteration = iteration;
-	}
-	/**
-	 * @return the resolvedValue
-	 */
-	public String getResolvedValue() {
-		return resolvedValue;
-	}
-	/**
-	 * @param resolvedValue the resolvedValue to set
-	 */
-	public void setResolvedValue(String resolvedValue) {
-		this.resolvedValue = resolvedValue;
-	}
-
-
-	public void setPrintResolvedValue(boolean b) {
-		this.printResolvedValue = b
-		;	}
-
-
-	/**
-	 * @return the isInput
-	 */
-	public boolean isInput() {
-		return isInput;
-	}
-
-
-	/**
-	 * @param isInput the isInput to set
-	 */
-	public void setInput(boolean isInput) {
-		this.isInput = isInput;
-	}
-
-
-	/**
-	 * @return the collIdRef
-	 */
-	public String getCollIdRef() {
-		return collIdRef;
-	}
-
-
-	/**
-	 * @param collIdRef the collIdRef to set
-	 */
-	public void setCollIdRef(String collIdRef) {
-		this.collIdRef = collIdRef;
-	}
-
-
-	/**
-	 * @return the isCollection
-	 */
-	public boolean isCollection() {
-		return isCollection;
-	}
-
-
-	/**
-	 * @param isCollection the isCollection to set
-	 */
-	public void setCollection(boolean isCollection) {
-		this.isCollection = isCollection;
-	}
-
-
-	/**
-	 * @return the parentCollIDRef
-	 */
-	public String getParentCollIDRef() {
-		return parentCollIDRef;
-	}
-
-
-	/**
-	 * @param parentCollIDRef the parentCollIDRef to set
-	 */
-	public void setParentCollIDRef(String parentCollIDRef) {
-		this.parentCollIDRef = parentCollIDRef;
-	}
-
-
-	/**
-	 * @return the wfName
-	 */
-	public String getWfName() {
-		return wfName;
-	}
-
-
-	/**
-	 * @param wfName the wfName to set
-	 */
-	public void setWfName(String wfName) {
-		this.wfName = wfName;
-	}
-
-}
\ No newline at end of file
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/LineageSQLQuery.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/LineageSQLQuery.java
deleted file mode 100644
index b92638d..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/LineageSQLQuery.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-/**
- * encapsulates an SQL query along with directives on how to interpret the results, i.e., which elements of the select clause 
- * are to be considered relevant. For instance when the query includes a join with Collection, the intent is that lineage should
- * return the collection itself as opposed to any of its elements.  
- * @author paolo
- *
- */
-public class LineageSQLQuery {
-
-	String vbQuery = null;
-	String collQuery = null;
-	
-	int nestingLevel = 0;  // =0 => use var values, >0 => use enclosing collection
-
-
-	/**
-	 * @return the nestingLevel
-	 */
-	public int getNestingLevel() {
-		return nestingLevel;
-	}
-
-	/**
-	 * @param nestingLevel the nestingLevel to set
-	 */
-	public void setNestingLevel(int nestingLevel) {
-		this.nestingLevel = nestingLevel;
-	}
-
-	/**
-	 * @return the collQuery
-	 */
-	public String getCollQuery() {
-		return collQuery;
-	}
-
-	/**
-	 * @param collQuery the collQuery to set
-	 */
-	public void setCollQuery(String collQuery) {
-		this.collQuery = collQuery;
-	}
-
-	/**
-	 * @return the vbQuery
-	 */
-	public String getVbQuery() {
-		return vbQuery;
-	}
-
-	/**
-	 * @param vbQuery the vbQuery to set
-	 */
-	public void setVbQuery(String vbQuery) {
-		this.vbQuery = vbQuery;
-	}
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/Provenance.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/Provenance.java
deleted file mode 100644
index 669bfb2..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/Provenance.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import net.sf.taverna.t2.provenance.connector.ProvenanceConnector;
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem;
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-import org.apache.log4j.Logger;
-
-/**
- * Implemented by the database class that a {@link ProvenanceConnector}
- * implementation uses for storage purposes
- * 
- * @author Paolo Missier
- * @author Ian Dunlop
- * 
- */
-//FIXME is this class really needed. Can't we just push the
-//acceptRawProvanceEvent up into the ProvenanceConnector?
-public class Provenance {
-
-	@SuppressWarnings("unused")
-	private static Logger logger = Logger.getLogger(Provenance.class);
-
-	protected ProvenanceQuery pq;
-	protected ProvenanceWriter pw;
-	protected EventProcessor ep;
-
-	private String saveEvents;
-	
-	private volatile boolean firstWorkflowStructure = true;
-
-	public boolean isFirstWorkflowStructure() {
-		return firstWorkflowStructure;
-	}
-
-	public void setFirstWorkflowStructure(boolean firstWorkflowStructure) {
-		this.firstWorkflowStructure = firstWorkflowStructure;
-	}
-
-	private List<String> workflowIDStack = Collections.synchronizedList(new ArrayList<String>());
-	
-	private Map<String, String> workflowIDMap = new ConcurrentHashMap<String, String>(); 
-
-	public Provenance() {	}
-
-	public Provenance(EventProcessor eventProcessor) {
-		this.ep = eventProcessor;
-		this.pq = ep.getPq();
-		this.pw = ep.getPw();		
-	}
-
-	public void clearDB() throws SQLException {
-		getPw().clearDBStatic();
-		getPw().clearDBDynamic();
-	}
-	
-
-	/**
-	 * @return the saveEvents
-	 */
-	public String getSaveEvents() {
-		return saveEvents;
-	}
-
-	/**
-	 * @param saveEvents
-	 *            the saveEvents to set
-	 */
-	public void setSaveEvents(String saveEvents) {
-		this.saveEvents = saveEvents;
-	}
-
-	// FIXME I think the provenance query and writer should both come from the
-	// EventProcessor
-	// seems silly setting the ep, pq and pw separately.
-	public void setPq(ProvenanceQuery pq) {
-		this.pq = pq;
-	}
-
-	public ProvenanceQuery getPq() {
-		return pq;
-	}
-
-	public void setPw(ProvenanceWriter pw) {
-		this.pw = pw;
-	}
-
-	public ProvenanceWriter getPw() {
-		return pw;
-	}
-
-	public void setEp(EventProcessor ep) {
-		this.ep = ep;
-	}
-
-	public EventProcessor getEp() {
-		return ep;
-	}
-
-	/**
-	 * maps each incoming event to an insert query into the provenance store
-	 * 
-	 * @param eventType
-	 * @param content
-	 * @throws SQLException
-	 * @throws IOException
-	 */
-	public void acceptRawProvenanceEvent(SharedVocabulary eventType,
-			ProvenanceItem provenanceItem) throws SQLException, IOException {
-
-		processEvent(provenanceItem, eventType);
-	}
-
-	/**
-	 * parse d and generate SQL insert calls into the provenance DB
-	 * 
-	 * @param d
-	 *            DOM for the event
-	 * @param eventType
-	 *            see {@link SharedVocabulary}
-	 * @throws SQLException
-	 * @throws IOException
-	 */
-	@SuppressWarnings("unchecked")
-	protected void processEvent(ProvenanceItem provenanceItem,
-			SharedVocabulary eventType) throws SQLException, IOException {
-
-		// only attempt to save the data events, since the workflow itself may not be XMLEncode-able
-		if (!eventType.equals(SharedVocabulary.WORKFLOW_EVENT_TYPE)) {
-
-			// saveEvent for debugging / testing
-			if ("all".equals(getSaveEvents())) {
-				getEp().saveEvent(provenanceItem, eventType);
-			} else if ("iteration".equals(getSaveEvents())) {
-				if (eventType.equals("iteration"))
-					getEp().saveEvent(provenanceItem, eventType);
-
-			}
-		}
-
-		if (eventType.equals(SharedVocabulary.WORKFLOW_EVENT_TYPE)) {
-			// process the workflow structure
-
-			if (isFirstWorkflowStructure()) {
-
-				String dataflowId = ((WorkflowProvenanceItem) provenanceItem).getDataflow().getInternalIdentier();
-				String instanceId = provenanceItem.getIdentifier();
-				
-				workflowIDMap.put(instanceId, dataflowId);
-//				logger.debug("pushed workflowID "+dataflowId);
-				setFirstWorkflowStructure(false);
-//				logger.debug("processing event of type "
-//						+ SharedVocabulary.WORKFLOW_EVENT_TYPE);
-				String processWorkflowStructure = getEp().processWorkflowStructure(provenanceItem);
-				synchronized(workflowIDStack) {
-					workflowIDStack.add(0,processWorkflowStructure);
-				}
-				
-//				logger.debug("pushed workflowID "+workflowIDStack.get(0));
-
-				getEp().propagateANL(provenanceItem.getIdentifier());
-			} else {
-				
-				String dataflowId = ((WorkflowProvenanceItem) provenanceItem).getDataflow().getInternalIdentier();
-				String instanceId = provenanceItem.getIdentifier();
-				
-				workflowIDMap.put(instanceId, dataflowId);
-//				logger.debug("pushed workflowID "+dataflowId);
-
-				Dataflow df = ((WorkflowProvenanceItem)provenanceItem).getDataflow();
-				synchronized(workflowIDStack) {
-					workflowIDStack.add(0,df.getInternalIdentier());
-				}
-			}
-
-		} else if (provenanceItem.getEventType().equals(SharedVocabulary.END_WORKFLOW_EVENT_TYPE)) {
-
-//			String currentWorkflowID = workflowIDStack.get(0);
-//			workflowIDStack.remove(0);
-			
-
-			String currentWorkflowID = workflowIDMap.get(provenanceItem.getParentId());
-			
-//			logger.debug("popped workflowID "+currentWorkflowID);
-			
-			getEp().processProcessEvent(provenanceItem, currentWorkflowID);
-			
-		} else {  // all other event types (iteration etc.)
-			
-//			logger.debug("processEvent of type "+provenanceItem.getEventType()+" for item of type "+provenanceItem.getClass().getName());
-			String currentWorkflowID = provenanceItem.getWorkflowId();
-//			String currentWorkflowID = workflowIDMap.get(provenanceItem.getParentId());
-
-//			logger.debug("setting currentWorkflowID to "+ currentWorkflowID);
-			getEp().processProcessEvent(provenanceItem, currentWorkflowID);
-		
-//			getEp().processProcessEvent(provenanceItem, workflowIDStack.get(0));
-		}
-
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceAnalysis.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceAnalysis.java
deleted file mode 100644
index d75317e..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceAnalysis.java
+++ /dev/null
@@ -1,1157 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBException;
-
-import net.sf.taverna.t2.provenance.api.NativeAnswer;
-import net.sf.taverna.t2.provenance.api.QueryAnswer;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Arc;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceProcessor;
-import net.sf.taverna.t2.provenance.lineageservice.utils.QueryVar;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.VarBinding;
-import net.sf.taverna.t2.provenance.lineageservice.utils.WorkflowInstance;
-import net.sf.taverna.t2.provenance.opm.OPMManager;
-
-import org.apache.log4j.Logger;
-import org.tupeloproject.kernel.OperatorException;
-import org.tupeloproject.provenance.ProvenanceArtifact;
-import org.tupeloproject.provenance.ProvenanceRole;
-
-/**
- * @author paolo<p/>
- * the main class for querying the lineage DB
- * assumes a provenance DB ready to be queried
- */
-public class ProvenanceAnalysis {
-
-	private static Logger logger = Logger.getLogger(ProvenanceAnalysis.class);
-
-	private static final String IP_ANNOTATION = "index-preserving";
-	private static final String OUTPUT_CONTAINER_PROCESSOR = "_OUTPUT_";
-	private static final String INPUT_CONTAINER_PROCESSOR = "_INPUT_";
-	public static final String ALL_PATHS_KEYWORD = "ALL";
-
-	private ProvenanceQuery pq = null;
-	private AnnotationsLoader al = new AnnotationsLoader();  // singleton
-
-	// paths collected by lineageQuery and to be used by naive provenance query
-	private Map<ProvenanceProcessor, List<List<String>>> validPaths = new HashMap<ProvenanceProcessor, List<List<String>>>();
-
-	private List<String> currentPath;
-	private Map<String,List<String>> annotations = null;  // user-made annotations to processors
-
-	private boolean ready = false; // set to true as soon as init succeeds. this means pa is ready to answer queries
-
-	private boolean returnOutputs = false; // by default only return input bindings
-
-	private boolean includeDataValue = false; // forces the lineage queries to return de-referenced data values
-
-	private boolean generateOPMGraph = true;
-
-	// TODO extract this to prefs -- selects which OPMManager is to be used to export to OPM
-	private String OPMManagerClass = "net.sf.taverna.t2.provenance.lineageservice.ext.pc3.PANSTARRSOPMManager";
-
-	private OPMManager aOPMManager = null;
-
-	private boolean recordArtifactValues = false;
-
-	public ProvenanceAnalysis() { ; }
-
-	public ProvenanceAnalysis(ProvenanceQuery pq) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
-		this.pq = pq;
-		setReady(tryInit());
-	}
-
-
-	private boolean tryInit() throws SQLException {
-
-		if (getWFInstanceIDs() != null && getWFInstanceIDs().size()>0) {
-			initGraph();  // init OPM provenance graph
-			return true;
-		} else 
-			return false;		
-	}
-
-	/**
-	 * Call to create the opm graph and annotation loader. 
-	 * this may fail due to queries being issued before DB is populated, minimally with wfInstanceID 
-	 */
-	public void initGraph() {
-
-		// OPM management
-		try {
-			aOPMManager  = (OPMManager) Class.forName(OPMManagerClass).newInstance();
-		} catch (InstantiationException e1) {
-			logger.error("Problem initialising opm graph: ",  e1);
-		} catch (IllegalAccessException e1) {
-			logger.error("Problem initialising opm graph: ", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.info("chosen OPMmanager: "+OPMManagerClass+" not available, reverting to default");
-			aOPMManager  = new OPMManager();
-		}
-
-		try {
-			aOPMManager.createAccount(getWFInstanceIDs().get(0).getInstanceID());
-		} catch (SQLException e) {
-			logger.error("Could not initialise OPM Manager: ", e);
-		}
-	}
-
-
-	/**
-	 * asks the OPM manager to convert its current RDF OPMGraph to XML 
-	 * @return the filename of the OPM XML file
-	 * @throws OperatorException
-	 * @throws IOException
-	 * @throws JAXBException
-	 */
-//	public String OPMRdf2Xml() throws OperatorException, IOException, JAXBException {
-//	if (isReady()) {
-//	return aOPMManager.Rdf2Xml();
-//	}  
-//	return null;
-//	}
-
-	/**
-	 * asks the OPM manager to create a dot file representing its current RDF OPMGraph<br/>
-	 * needs fixing
-	 * @return
-	 * @throws IOException 
-	 * @throws OperatorException 
-	 */
-	public String OPMRdf2Dot() throws OperatorException, IOException {
-		if (aOPMManager != null && aOPMManager.isActive() && isReady()) {
-			return aOPMManager.Rdf2Dot();
-		}  
-		return null;		
-	}
-
-
-	public void setAnnotationFile(String annotationFile) {
-
-		annotations = al.getAnnotations(annotationFile);
-
-		if (annotations == null) {
-			logger.warn("no annotations have been loaded");
-			return;
-		}
-
-		logger.info("processor annotations for lineage refinement: ");
-		for (Map.Entry<String,List<String>> entry:annotations.entrySet())  {
-
-			logger.info("annotations for proc "+entry.getKey());
-			for (String ann: (List<String>) entry.getValue()) {
-				logger.info(ann);
-			}
-		}
-
-	}
-
-
-	/**
-	 * returns all available instances across all workflows
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<WorkflowInstance> getWFInstanceIDs() throws SQLException { return getPq().getRuns(null, null); }
-
-
-	/**
-	 * returns all available instances for workflow wfName
-	 *@param wfName
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<WorkflowInstance> getWFInstanceID(String wfName) throws SQLException { 
-		return getPq().getRuns(wfName, null); }
-
-
-	/**
-	 * @param wfInstance lineage scope -- a specific instance
-	 * @param pname for a specific processor [required]
-	 * @param a specific (input or output) variable [optional]
-	 * @param iteration and a specific iteration [optional]
-	 * @param wfNameRef 
-	 * @return a lineage query ready to be executed, or null if we cannot return an answer because we are not ready
-	 * (for instance the DB is not yet populated) 
-	 * @throws SQLException
-	 */
-	public Dependencies fetchIntermediateResult(
-			String wfInstance,
-			String wfNameRef,
-			String pname,
-			String vname,
-			String iteration) throws SQLException  {
-
-		if (!isReady()) {
-			setReady(tryInit());
-			if (!isReady())  return null;
-		}
-
-
-		LineageSQLQuery lq = getPq().simpleLineageQuery(wfInstance, wfNameRef, pname, vname, iteration);
-
-		return getPq().runLineageQuery(lq, isIncludeDataValue());
-	}
-
-
-
-	public QueryAnswer lineageQuery(List<QueryVar> qvList,
-			String wfInstance, List<ProvenanceProcessor> selectedProcessors) throws SQLException {
-
-		QueryAnswer  completeAnswer = new QueryAnswer();
-		NativeAnswer nativeAnswer   = new NativeAnswer();
-
-		Map<QueryVar, Map<String, List<Dependencies>>> answerContent = new HashMap<QueryVar, Map<String, List<Dependencies>>>();
-
-		// launch a lineage query for each target variable
-		for (QueryVar qv:qvList) {
-
-			// full lineage query			
-			logger.info("************\n lineage query: [instance, workflow, proc, port, path] = ["+
-					wfInstance+","+qv.getWfName()+","+qv.getPname()+","+qv.getVname()+",["+qv.getPath()+"]]\n***********");
-
-			// the OPM manager builds an OPM graph behind the scenes as a side-effect
-			Map<String, List<Dependencies>> a = 
-				computeLineageSingleVar(wfInstance, qv.getWfName(), qv.getVname(), qv.getPname(), qv.getPath(), selectedProcessors);
-
-			answerContent.put(qv, a);
-		}
-
-		nativeAnswer.setAnswer(answerContent);
-		completeAnswer.setNativeAnswer(nativeAnswer);
-
-		if (aOPMManager != null && aOPMManager.isActive())  {
-//			String _OPM_asXML_File;
-//			try {
-
-//			_OPM_asXML_File = aOPMManager.Rdf2Xml();
-			String _OPM_asRDF_File = aOPMManager.writeGraph();
-
-			completeAnswer.setOPMAnswer_AsRDF(_OPM_asRDF_File);
-//			completeAnswer.setOPMAnswer_AsXML(_OPM_asXML_File);
-
-//			} catch (OperatorException e) {
-//			logger.error("Problem running query: " + e);
-//			} catch (IOException e) {
-//			logger.error("Problem running query: " + e);
-//			} catch (JAXBException e) {
-//			logger.error("Problem running query: " + e);
-//			}
-		}
-		return completeAnswer;
-	}
-
-	/**
-	 * facade for computeLineage: if path == ALL then it retrieves all VBs for (proc,var) ignoring path
-	 * (i.e., all values within the collection bound to var) and invokes computeLineageSingleBinding() on each path</br>
-	 * if path is specified, however, this just passes the request to computeLineageSingleBinding. in this case the result map 
-	 * only contains one entry
-	 * @param wfInstance
-	 * @param var
-	 * @param proc
-	 * @param path
-	 * @param string 
-	 * @param selectedProcessors
-	 * @return a map <pre>{ path -> List<LineageQueryResult> }</pre>, one entry for each path
-	 * @throws SQLException
-	 */
-	public Map<String, List<Dependencies>> computeLineageSingleVar (
-			String wfInstance,   // dynamic scope 
-			String wfNameRef,    // static scope
-			String var,   // target var
-			String proc,   // qualified with its processor name
-			String path,   // possibly empty when no collections or no granular lineage required
-			List<ProvenanceProcessor> selectedProcessors
-	) throws SQLException  {
-
-		if (!isReady()) {
-			setReady(tryInit());
-			if (!isReady())  return null;
-		}
-
-		// are we returning all outputs in addition to the inputs?
-		logger.info("return outputs: "+isReturnOutputs());
-
-		Map<String, List<Dependencies>> qa = new HashMap<String, List<Dependencies>>();
-
-		// run a query for each variable in the entire workflow graph
-		if (path.equals(ALL_PATHS_KEYWORD)) {
-
-			Map<String, String> vbConstraints = new HashMap<String, String>();
-			vbConstraints.put("VB.PNameRef", proc);
-			vbConstraints.put("VB.varNameRef", var);
-			vbConstraints.put("VB.wfInstanceRef", wfInstance);
-
-			List<VarBinding> vbList = getPq().getVarBindings(vbConstraints); // DB
-
-			if (vbList.isEmpty()) {
-				logger.warn(ALL_PATHS_KEYWORD+" specified for paths but no varBindings found. nothing to compute");
-			}
-
-			for (VarBinding vb:vbList) {
-
-				// path is of the form [x,y..]  we need it as x,y... 
-				path = vb.getIteration().substring(1, vb.getIteration().length()-1);
-
-				List<Dependencies> result = computeLineageSingleBinding(
-						wfInstance, wfNameRef, var, proc, path, selectedProcessors);
-				qa.put(vb.getIteration(), result);
-			}
-		}  else {
-			qa.put(path, computeLineageSingleBinding(
-					wfInstance, wfNameRef, var, proc, path, selectedProcessors));
-		}
-		return qa;		
-	}
-
-
-	/**
-	 * main lineage query method. queries the provenance DB 
-	 * with a single originating proc/var/path and a set of selected Processors
-	 * @param wfID
-	 * @param var
-	 * @param proc
-	 * @param path
-	 * @param path2 
-	 * @param selectedProcessors
-	 * @return a list of bindings. each binding involves an input var for one of the selectedProcessors. Note 
-	 * each var can contribute multiple bindings, i.e., when all elements in a collection bound to the var are retrieved.
-	 * Note also that bindings for input vars are returned as well, when the query is configured with returnOutputs = true
-	 * {@link ProvenanceAnalysis#isReturnOutputs() }
-	 * @throws SQLException
-	 */
-	public List<Dependencies> computeLineageSingleBinding(
-			String wfID,   // dynamic scope
-			String wfNameRef,  // static scope
-			String var,   // target var
-			String proc,   // qualified with its processor name
-			String path,   // possibly empty when no collections or no granular lineage required
-			List<ProvenanceProcessor> selectedProcessors
-	) throws SQLException  {
-
-//		Map<String, LineageSQLQuery>  varName2lqList =  new HashMap<String, LineageSQLQuery>();
-
-//		System.out.println("timing starts...");
-		long start = System.currentTimeMillis();
-
-		List<LineageSQLQuery>  lqList =  searchDataflowGraph(wfID, wfNameRef, var, proc, path, selectedProcessors);
-		long stop = System.currentTimeMillis();
-
-		long gst = stop-start;
-
-		// execute queries in the LineageSQLQuery list
-		logger.info("\n****************  executing lineage queries:  (includeDataValue is "+ isIncludeDataValue() +"**************\n");
-		start = System.currentTimeMillis();
-
-		List<Dependencies> results =  getPq().runLineageQueries(lqList, isIncludeDataValue());
-		stop = System.currentTimeMillis();
-
-		long qrt = stop-start;
-		logger.info("search time: "+gst+"ms\nlineage query response time: "+qrt+" ms");
-		logger.info("total exec time "+(gst+qrt)+"ms");
-
-		return results;
-	}
-
-
-	/**
-	 * compute lineage queries using path projections
-	 * @param wfID the (single) instance defines the scope of a query<br/>
-	 * added 2/9: collect a list of paths in the process to be used by the naive query. In practice
-	 * we use this as the graph search phase that is needed by the naive query anyway
-	 * @param var
-	 * @param proc
-	 * @param path  within var (can be empty but not null)
-	 * @param selectedProcessors pairs (wfID, proceName), encoded as a Map. only report lineage when you reach any of these processors
-	 * @throws SQLException
-	 */
-	public List<LineageSQLQuery> searchDataflowGraph(
-			String wfID,   // dymamic scope
-			String wfNameRef,  // static scope
-			String var,   // target var
-			String proc,   // qualified with its processor name
-			String path,  // can be empty but not null
-			List<ProvenanceProcessor> selectedProcessors
-	) throws SQLException  {
-
-		List<LineageSQLQuery>  lqList =  new ArrayList<LineageSQLQuery>();
-
-		// TODO we are ignoring the wfId context information in the list of selected processors!!
-
-		// init paths accumulation. here "path" is a path in the graph, not within a collection!
-		//  associate an empty list of paths to each selected processor
-		for (ProvenanceProcessor s:selectedProcessors) { validPaths.put(s, new ArrayList<List<String>>()); }
-
-		currentPath = new ArrayList<String>();
-
-		// start with xfer or xform depending on whether initial var is output or input
-
-		// get (var, proc) from Var  to see if it's input/output
-		Map<String, String>  varQueryConstraints = new HashMap<String, String>();
-		varQueryConstraints.put("W.instanceID", wfID);
-		varQueryConstraints.put("V.pnameRef", proc);  
-		varQueryConstraints.put("V.varName", var);  
-		varQueryConstraints.put("V.wfInstanceRef", wfNameRef);  
-
-		List<Var> vars = getPq().getVars(varQueryConstraints);
-
-		if (vars.isEmpty())  {
-			logger.info("variable ("+var+","+proc+") not found, lineage query terminated");
-			return null;
-		}
-
-		Var v = vars.get(0); 		// expect exactly one record
-		// CHECK there can be multiple (pname, varname) pairs, i.e., in case of nested workflows
-		// here we pick the first that turns up -- we would need to let users choose, or process all of them...
-
-		if (v.isInput() || getPq().isDataflow(proc)) { // if vName is input, then do a xfer() step
-
-			// rec. accumulates SQL queries into lqList
-			xferStep(wfID, wfNameRef, var, proc, path, selectedProcessors, lqList);
-
-		} else { // start with xform
-
-			// rec. accumulates SQL queries into lqList
-			xformStep(wfID, wfNameRef, v, proc, path, selectedProcessors, lqList);			
-		}
-
-		return lqList;
-
-	}  // end searchDataflowGraph
-
-
-
-	/**
-	 * accounts for an inverse transformation from one output to all inputs of a processor
-	 * @param wfID
-	 * @param var  the output var
-	 * @param proc  the processor
-	 * @param selectedProcessors  the processors for which we are interested in producing lineage 
-	 * @param path iteration vector within a VarBinding collection
-	 * @param lqList  partial list of spot lineage queries, to be added to
-	 * @throws SQLException 
-	 */
-	private void xformStep(
-			String wfID,
-			String wfNameRef, 				
-			Var outputVar, // we need the dnl from this output var
-			String proc,
-			String path,
-			List<ProvenanceProcessor> selectedProcessors, 
-			List<LineageSQLQuery> lqList 
-	) throws SQLException {
-
-		// retrieve input vars for current processor 
-		Map<String, String>  varsQueryConstraints = new HashMap<String, String>();
-
-		List<Var>  inputVars = null;
-
-		// here we fetch the input vars for the current proc.
-		// however, it may be the case that we are looking at a dataflow port (for the entire dataflow or
-		// for a subdataflow) rather than a real processor. in this case 
-		// we treat this as a 
-		// special processor that does nothing -- so we "input var" in this case 
-		// is a copy of the port, and we are ready to go for the next xfer step.
-		// in this way we can seamlessly traverse the graph over intermediate I/O that are part 
-		// of nested dataflows
-
-		if (getPq().isDataflow(proc)) { // if we are looking at the output of an entire dataflow
-
-			// force the "input vars" for this step to be the output var itself
-			// this causes the following xfer step to trace back to the next processor _within_ proc 
-			inputVars = new ArrayList<Var>();
-			inputVars.add(outputVar);
-
-		} else if (proc.equals(OUTPUT_CONTAINER_PROCESSOR)) {  // same action as prev case, but may change in the future
-
-			inputVars = new ArrayList<Var>();
-			inputVars.add(outputVar);
-
-		} else {
-
-			varsQueryConstraints.put("W.instanceID", wfID);
-			varsQueryConstraints.put("pnameRef", proc);  
-			varsQueryConstraints.put("inputOrOutput", "1");  
-
-			inputVars = getPq().getVars(varsQueryConstraints);
-		}
-
-		///////////
-		/// path projections
-		///////////
-		// maps each var to its projected path
-		Map<Var,String> var2Path = new HashMap<Var,String>();
-		Map<Var,Integer> var2delta = new HashMap<Var,Integer>();
-
-		if (path == null) {  // nothing to split
-			for (Var inputVar: inputVars)  var2Path.put(inputVar, null);
-		} else {
-
-			int minPathLength = 0;  // if input path is shorter than this we give up granularity altogether
-			for (Var inputVar: inputVars) {
-				int delta = inputVar.getActualNestingLevel() - inputVar.getTypeNestingLevel();
-				var2delta.put(inputVar, new Integer(delta));
-				minPathLength += delta;
-//				System.out.println("xform() from ["+proc+"] upwards to ["+inputVar.getPName()+":"+inputVar.getVName()+"]");
-			}
-
-			String iterationVector[] = path.split(",");
-
-			if (iterationVector.length < minPathLength) {  // no path is propagated
-				for (Var inputVar: inputVars) {
-					var2Path.put(inputVar, null);
-				}
-			} else { // compute projected paths
-
-				String[] projectedPath; 
-
-				int start = 0;
-				for (Var inputVar: inputVars) {
-
-					// 24/7/08 get DNL (declared nesting level) and ANL (actual nesting level) from VAR
-					// TODO account for empty paths
-					int projectedPathLength = var2delta.get(inputVar);  // this is delta			
-
-					if (projectedPathLength > 0) {  // this var is involved in iteration
-
-						projectedPath = new String[projectedPathLength];
-						for (int i=0; i<projectedPathLength; i++) {					
-							projectedPath[i] = iterationVector[start+i];
-						}		
-						start += projectedPathLength;
-
-						StringBuffer iterationFragment = new StringBuffer();
-						for (String s:projectedPath) { iterationFragment.append(s+","); }
-						iterationFragment.deleteCharAt(iterationFragment.length()-1);
-
-						var2Path.put(inputVar, iterationFragment.toString());
-					} else {  // associate empty path to this var
-						var2Path.put(inputVar, null);
-					}
-				}
-			}
-		}
-
-		// accumulate this proc to current path 
-		currentPath.add(proc);
-
-		// if this is a selected processor, add a copy of the current path to the list of paths for the processor
-
-		// is <wfNameRef, proc>  in selectedProcessors?
-		boolean isSelected = false;
-		for (ProvenanceProcessor pp: selectedProcessors)  {
-			if (pp.getWfInstanceRef().equals(wfNameRef) && pp.getPname().equals(proc)) {
-				List<List<String>> paths = validPaths.get(pp);
-
-				// copy the path since the original will change
-				// also remove spurious dataflow processors at this point
-				List<String> pathCopy = new ArrayList<String>();
-				for (String s:currentPath) {
-					if (!getPq().isDataflow(s)) pathCopy.add(s);
-				}			
-				paths.add(pathCopy);
-				isSelected = true;
-				break;
-			}
-		}
-
-		///////////
-		/// generate SQL if necessary -- for all input vars, based on the current path
-		/// the projected paths are required to determine the level in the collection at which 
-		/// we look at the value assignment
-		///////////
-
-		Map<String, ProvenanceArtifact> var2Artifact = new HashMap<String, ProvenanceArtifact>();
-		Map<String, ProvenanceRole> var2ArtifactRole = new HashMap<String, ProvenanceRole>();
-
-		// if this transformation is important to the user, produce an output and also an OPM graph fragment
-		if (selectedProcessors.isEmpty() || isSelected) {
-
-			List<LineageSQLQuery> newLqList = getPq().lineageQueryGen(wfID, proc, var2Path, outputVar, path, isReturnOutputs() || var2Path.isEmpty());
-			lqList.addAll(newLqList);
-
-			// BEGIN OPM update section
-			//
-			// create OPM artifact and role for the output var of this xform
-			//
-			boolean doOPM = (aOPMManager != null && aOPMManager.isActive());  // any problem below will set this to false
-
-			String role = null;
-			VarBinding vb = null;
-			String URIFriendlyIterationVector =null;
-
-			if (doOPM) {
-				// fetch value for this variable and assert it as an Artifact in the OPM graph
-				Map<String, String> vbConstraints = new HashMap<String, String>();
-				vbConstraints.put("VB.PNameRef", outputVar.getPName());
-				vbConstraints.put("VB.varNameRef", outputVar.getVName());
-				vbConstraints.put("VB.wfInstanceRef", wfID);
-
-				if (path != null) { 
-
-					// account for x,y,.. format as well as [x,y,...]  depending on where the request is coming from
-					// TODO this is just irritating must be removed
-					if (path.startsWith("[")) 
-						vbConstraints.put("VB.iteration", path);
-					else
-						vbConstraints.put("VB.iteration", "["+path+"]");
-				}
-
-				List<VarBinding> vbList = getPq().getVarBindings(vbConstraints); // DB
-
-				// use only the first result (expect only one) -- in this method we assume path is not null
-
-				// map the resulting varBinding to an Artifact
-				if (vbList == null || vbList.size()==0) {
-					logger.debug("no entry corresponding to conditions: proc="+
-							outputVar.getPName()+" var = "+outputVar.getVName()+" iteration = "+path);
-					doOPM = false;
-				}  else {
-					vb = vbList.get(0);
-
-					URIFriendlyIterationVector = vb.getIteration().
-					replace(',', '-').replace('[', ' ').replace(']', ' ').trim();
-
-					if (URIFriendlyIterationVector.length()>0) {
-						role = vb.getPNameRef()+"/"+vb.getVarNameRef()+"?it="+URIFriendlyIterationVector;
-					} else
-						role = vb.getPNameRef()+"/"+vb.getVarNameRef();
-
-					if (aOPMManager!=null && !pq.isDataflow(proc)) {
-						if (isRecordArtifactValues())
-							aOPMManager.addArtifact(vb.getValue(), vb.getResolvedValue());
-						else 
-							aOPMManager.addArtifact(vb.getValue());
-
-						aOPMManager.createRole(role);
-					}
-
-					// assert proc as Process -- include iteration vector to separate different activations of the same process					
-					aOPMManager.addProcess(proc, vb.getIteration(), URIFriendlyIterationVector);
-
-					//
-					// create OPM generatedBy property between output value and this process node
-					// avoid the pathological case where a dataflow generates its own inputs
-					//
-					aOPMManager.assertGeneratedBy(
-							aOPMManager.getCurrentArtifact(), 
-							aOPMManager.getCurrentProcess(), 
-							aOPMManager.getCurrentRole(), 
-							aOPMManager.getCurrentAccount(),
-							true);   // true -> prevent duplicates CHECK
-				}
-			}
-			// 
-			// create OPM process for this xform
-			//
-			for (LineageSQLQuery lq: newLqList) {
-				// if OPM is on, execute the query so we get the value we need for the Artifact node
-				Dependencies inputs = getPq().runLineageQuery(lq, isIncludeDataValue());
-
-				if (doOPM && inputs.getRecords().size()>0 && !pq.isDataflow(proc)) {
-
-					//	update OPM graph with inputs and used properties
-					for (LineageQueryResultRecord resultRecord: inputs.getRecords()) {
-
-						// process inputs only
-						if (!resultRecord.isInput()) continue;
-
-						URIFriendlyIterationVector = resultRecord.getIteration().
-						replace(',', '-').replace('[', ' ').replace(']', ' ').trim();
-
-						boolean found = false;  // used to avoid duplicate process resources
-
-						// map each input var in the resultRecord to an Artifact
-						// create new Resource for the resultRecord
-						//    use the value as URI for the Artifact, and resolvedValue as the actual value
-
-						//
-						// create OPM artifact and role for the input var obtained by path projection
-						//
-						if (isRecordArtifactValues())							
-							aOPMManager.addArtifact(resultRecord.getValue(), resultRecord.getResolvedValue());
-						else 
-							aOPMManager.addArtifact(resultRecord.getValue());
-						var2Artifact.put(resultRecord.getVname(), aOPMManager.getCurrentArtifact());
-
-						if (URIFriendlyIterationVector.length()>0) {
-							role = resultRecord.getPname()+"/"+resultRecord.getVname()+"?it="+URIFriendlyIterationVector;
-						} else
-							role = resultRecord.getPname()+"/"+resultRecord.getVname();
-
-						aOPMManager.createRole(role);	// this also sets currentRole to role				
-						var2ArtifactRole.put(resultRecord.getVname(), aOPMManager.getCurrentRole());
-
-
-						//
-						// create OPM used property between process and the input var obtained by path projection
-						//
-						// avoid output variables, it would assert that P used one of its outputs!
-
-						aOPMManager.assertUsed(
-								aOPMManager.getCurrentArtifact(), 
-								aOPMManager.getCurrentProcess(), 
-								aOPMManager.getCurrentRole(), 
-								aOPMManager.getCurrentAccount(),
-								true);   // true -> prevent duplicates CHECK	
-					}
-				}
-			}
-//			END OPM update section
-		}
-
-		// recursion -- xfer path is next up
-		for (Var inputVar: inputVars) {
-			xferStep(wfID, wfNameRef, inputVar.getVName(), inputVar.getPName(), var2Path.get(inputVar), selectedProcessors, lqList);	
-		}
-		currentPath.remove(currentPath.size()-1);  // CHECK	
-	}  // end xformStep
-
-
-
-	private void xferStep(
-			String wfInstanceID,
-			String wfNameRef, 
-			String var, 
-			String proc,
-			String path, 
-			List<ProvenanceProcessor> selectedProcessors,
-			List<LineageSQLQuery> lqList) throws SQLException {
-
-		String sourceProcName = null;
-		String sourceVarName  = null;
-
-		// retrieve all Arcs ending with (var,proc) -- ideally there is exactly one
-		// (because multiple incoming arcs are disallowed)
-		Map<String, String>  arcsQueryConstraints = new HashMap<String, String>();
-
-		arcsQueryConstraints.put("W.instanceID", wfInstanceID);
-		arcsQueryConstraints.put("sinkVarNameRef", var);  
-		arcsQueryConstraints.put("sinkPNameRef", proc);  
-
-		List<Arc> arcs = getPq().getArcs(arcsQueryConstraints);
-
-		if (arcs.size() == 0) {
-//			System.out.println("no arcs going up from ["+proc+","+var+"] ... returning");
-			return; // CHECK
-		}
-
-		Arc a = arcs.get(0); 
-
-		// get source node
-		sourceProcName = a.getSourcePnameRef();
-		sourceVarName  = a.getSourceVarNameRef();
-
-		//System.out.println("xfer() from ["+proc+","+var+"] to ["+sourceProcName+","+sourceVarName+"]");
-
-		// CHECK transfer same path with only exception: when anl(sink) > anl(source)
-		// in this case set path to null
-
-		// retrieve full record for var:
-		// retrieve input vars for current processor 
-		Map<String, String>  varsQueryConstraints = new HashMap<String, String>();
-
-		varsQueryConstraints.put("W.instanceID", wfInstanceID);
-		varsQueryConstraints.put("pnameRef", sourceProcName);  
-		varsQueryConstraints.put("varName", sourceVarName);  
-		List<Var>  varList  = getPq().getVars(varsQueryConstraints);
-
-		Var outputVar = varList.get(0);
-
-		// recurse on xform
-		xformStep(wfInstanceID, wfNameRef, outputVar, sourceProcName, path, selectedProcessors, lqList);
-
-	} // end xferStep2
-
-
-	/**
-	 * this class represents the annotation (single or sequence, to be determined) 
-	 * that are produced upon visiting the graph structure and that drive the generation of 
-	 * a pinpoint lineage query<br/>
-	 * this is still a placeholder
-	 */
-	class LineageAnnotation {
-
-		List<String> path = new ArrayList<String>();
-
-		boolean isXform = true;
-
-		String iteration = "";  // this is the iteration projected on a single variable. Used for propagation upwards default is no iteration --
-		String iterationVector = ""; // iteration vector accounts for cross-products. Used to be matched exactly in queries. 
-		int iic = 0;  // index in collection -- default is 0 
-		int collectionNesting = 0;  // n indicates granularity is n levels from leaf. 
-		// This quantifies loss of lineage precision when working with collections
-		String collectionRef = null;
-		String proc;
-		String var;
-		String varType = null;   // dtring, XML,... see Taverna type system
-
-		int DNL = 0; // declared nesting level -- copied from VAR
-		int ANL  = 0;  // actual nesting level -- copied from Var
-
-		String wfInstance;  // TODO generalize to list / time interval?
-
-		public String toString() {
-
-			StringBuffer sb = new StringBuffer();
-
-			if (isXform)  sb.append(" xform: ");
-			else sb.append(" xfer: ");
-
-			sb.append("<PROC/VAR/VARTYPE, IT, IIC, ITVECTOR, COLLNESTING> = "+
-					proc + "/" + var + "/" + varType +
-					"," + "["+iteration +"]"+
-					","+ iic + 
-					", ["+ iterationVector + "]"+
-					","+ collectionNesting);
-
-			return sb.toString();
-		}
-
-
-		public void addStep(String step) {
-			path.add(step);
-		}
-
-		public void removeLastStep() {
-			path.remove(path.size()-1);
-		}
-
-
-		/**
-		 * @return the path
-		 */
-		public List<String> getPath() {
-			return path;
-		}
-
-
-		/**
-		 * @param path the path to set
-		 */
-		public void setPath(List<String> path) {
-			this.path = path;
-		}
-
-
-		/**
-		 * @return the iteration
-		 */
-		public String getIteration() {
-			return iteration;
-		}
-
-
-		/**
-		 * @param iteration the iteration to set
-		 */
-		public void setIteration(String iteration) {
-			this.iteration = iteration;
-		}
-
-
-		/**
-		 * @return the iic
-		 */
-		public int getIic() {
-			return iic;
-		}
-
-
-		/**
-		 * @param iic the iic to set
-		 */
-		public void setIic(int iic) {
-			this.iic = iic;
-		}
-
-
-		/**
-		 * @return the collectionRef
-		 */
-		public String getCollectionRef() {
-			return collectionRef;
-		}
-
-
-		/**
-		 * @param collectionRef the collectionRef to set
-		 */
-		public void setCollectionRef(String collectionRef) {
-			this.collectionRef = collectionRef;
-		}
-
-
-		/**
-		 * @return the proc
-		 */
-		public String getProc() {
-			return proc;
-		}
-
-
-		/**
-		 * @param proc the proc to set
-		 */
-		public void setProc(String proc) {
-			this.proc = proc;
-		}
-
-
-		/**
-		 * @return the var
-		 */
-		public String getVar() {
-			return var;
-		}
-
-
-		/**
-		 * @param var the var to set
-		 */
-		public void setVar(String var) {
-			this.var = var;
-		}
-
-
-		/**
-		 * @return the varType
-		 */
-		public String getVarType() {
-			return varType;
-		}
-
-
-		/**
-		 * @param varType the varType to set
-		 */
-		public void setVarType(String varType) {
-			this.varType = varType;
-		}
-
-
-		/**
-		 * @return the wfInstance
-		 */
-		public String getWfInstance() {
-			return wfInstance;
-		}
-
-
-		/**
-		 * @param wfInstance the wfInstance to set
-		 */
-		public void setWfInstance(String wfInstance) {
-			this.wfInstance = wfInstance;
-		}
-
-
-		/**
-		 * @return the isXform
-		 */
-		public boolean isXform() {
-			return isXform;
-		}
-
-
-		/**
-		 * @param isXform the isXform to set
-		 */
-		public void setXform(boolean isXform) {
-			this.isXform = isXform;
-		}
-
-
-
-		/**
-		 * @return the collectionNesting
-		 */
-		public int getCollectionNesting() {
-			return collectionNesting;
-		}
-
-
-		/**
-		 * @param collectionNesting the collectionNesting to set
-		 */
-		public void setCollectionNesting(int collectionNesting) {
-			this.collectionNesting = collectionNesting;
-		}
-
-
-		/**
-		 * @return the iterationVector
-		 */
-		public String getIterationVector() {
-			return iterationVector;
-		}
-
-
-		/**
-		 * @param iterationVector the iterationVector to set
-		 */
-		public void setIterationVector(String iterationVector) {
-			this.iterationVector = iterationVector;
-		}
-
-
-		/**
-		 * @return the dNL
-		 */
-		public int getDNL() {
-			return DNL;
-		}
-
-
-		/**
-		 * @param dnl the dNL to set
-		 */
-		public void setDNL(int dnl) {
-			DNL = dnl;
-		}
-
-
-		/**
-		 * @return the aNL
-		 */
-		public int getANL() {
-			return ANL;
-		}
-
-
-		/**
-		 * @param anl the aNL to set
-		 */
-		public void setANL(int anl) {
-			ANL = anl;
-		}
-	}
-
-
-	/**
-	 * @return the validPaths
-	 */
-	public Map<ProvenanceProcessor, List<List<String>>> getValidPaths() {
-		return validPaths;
-	}
-
-
-	/**
-	 * @param validPaths the validPaths to set
-	 */
-	public void setValidPaths(Map<ProvenanceProcessor, List<List<String>>> validPaths) {
-		this.validPaths = validPaths;
-	}
-
-
-	public void setPq(ProvenanceQuery pq) {
-		this.pq = pq;
-	}
-
-
-	public ProvenanceQuery getPq() {
-		return pq;
-	}
-
-	/**
-	 * @return the ready
-	 */
-	public boolean isReady() {
-		return ready;
-	}
-
-	/**
-	 * @param ready the ready to set
-	 */
-	public void setReady(boolean ready) {
-		this.ready = ready;
-	}
-
-	/**
-	 * @return the returnOutputs
-	 */
-	public boolean isReturnOutputs() {
-		return returnOutputs;
-	}
-
-	/**
-	 * @param returnOutputs the returnOutputs to set
-	 */
-	public void setReturnOutputs(boolean returnOutputs) {
-		this.returnOutputs = returnOutputs;
-	}
-
-	/**
-	 * @return the recordArtifactValues
-	 */
-	public boolean isRecordArtifactValues() {
-		return recordArtifactValues;
-	}
-
-	/**
-	 * @param recordArtifactValues the recordArtifactValues to set
-	 */
-	public void setRecordArtifactValues(boolean recordArtifactValues) {
-		this.recordArtifactValues = recordArtifactValues;
-
-	}
-
-	/**
-	 * @return the includeDataValue
-	 */
-	public boolean isIncludeDataValue() {
-		return includeDataValue;
-	}
-
-	/**
-	 * @param includeDataValue the includeDataValue to set
-	 */
-	public void setIncludeDataValue(boolean includeDataValue) {
-		this.includeDataValue = includeDataValue;
-	}
-
-	/**
-	 * @return the generateOPMGraph
-	 */
-	public boolean isGenerateOPMGraph() {
-		return generateOPMGraph;
-	}
-
-	/**
-	 * @param generateOPMGraph the generateOPMGraph to set
-	 */
-	public void setGenerateOPMGraph(boolean generateOPMGraph) {
-		this.generateOPMGraph = generateOPMGraph;
-		if (aOPMManager != null) { aOPMManager.setActive(generateOPMGraph); }
-	}
-
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java
deleted file mode 100644
index da26f7b..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceQuery.java
+++ /dev/null
@@ -1,2414 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.sql.Blob;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.provenance.connector.JDBCConnector;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Arc;
-import net.sf.taverna.t2.provenance.lineageservice.utils.DDRecord;
-import net.sf.taverna.t2.provenance.lineageservice.utils.NestedListNode;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProcBinding;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceProcessor;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.VarBinding;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Workflow;
-import net.sf.taverna.t2.provenance.lineageservice.utils.WorkflowInstance;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.impl.T2ReferenceImpl;
-
-import org.apache.log4j.Logger;
-import org.jdom.Document;
-import org.jdom.Element;
-
-/**
- * Handles all the querying of provenance items in the database layer. Uses
- * standard SQL so all specific instances of this class can extend this writer
- * to handle all of the db queries
- * 
- * @author Paolo Missier
- * @author Ian Dunlop
- * @author Stuart Owen
- * 
- */
-public abstract class ProvenanceQuery {
-
-	protected Logger logger = Logger.getLogger(ProvenanceQuery.class);
-	public static String DATAFLOW_TYPE = "net.sf.taverna.t2.activities.dataflow.DataflowActivity";
-	
-	public Connection getConnection() throws InstantiationException,
-	IllegalAccessException, ClassNotFoundException, SQLException {
-		return JDBCConnector.getConnection();
-	}
-
-	/**
-	 * implements a set of query constraints of the form var = value into a
-	 * WHERE clause
-	 *
-	 * @param q0
-	 * @param queryConstraints
-	 * @return
-	 */
-	protected String addWhereClauseToQuery(String q0,
-			Map<String, String> queryConstraints, boolean terminate) {
-
-		// complete query according to constraints
-		StringBuffer q = new StringBuffer(q0);
-
-		boolean first = true;
-		if (queryConstraints != null && queryConstraints.size() > 0) {
-			q.append(" where ");
-
-			for (Entry<String, String> entry : queryConstraints.entrySet()) {
-				if (!first) {
-					q.append(" and ");
-				}
-				q.append(" " + entry.getKey() + " = \'" + entry.getValue() + "\' ");
-				first = false;
-			}
-		}
-
-		return q.toString();
-	}
-
-	protected String addOrderByToQuery(String q0, List<String> orderAttr,
-			boolean terminate) {
-
-		// complete query according to constraints
-		StringBuffer q = new StringBuffer(q0);
-
-		boolean first = true;
-		if (orderAttr != null && orderAttr.size() > 0) {
-			q.append(" ORDER BY ");
-
-			int i = 1;
-			for (String attr : orderAttr) {
-				q.append(attr);
-				if (i++ < orderAttr.size()) {
-					q.append(",");
-				}
-			}
-		}
-
-		return q.toString();
-	}
-
-	/**
-	 * select Var records that satisfy constraints
-	 */
-	public List<Var> getVars(Map<String, String> queryConstraints)
-	throws SQLException {
-		List<Var> result = new ArrayList<Var>();
-
-		String q0 = "SELECT  * FROM Var V JOIN WfInstance W ON W.wfnameRef = V.wfInstanceRef";
-
-		String q = addWhereClauseToQuery(q0, queryConstraints, true);
-
-		List<String> orderAttr = new ArrayList<String>();
-		orderAttr.add("V.order");
-
-		String q1 = addOrderByToQuery(q, orderAttr, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q1.toString());
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-
-					Var aVar = new Var();
-
-					aVar.setWfInstanceRef(rs.getString("WfInstanceRef"));
-
-					if (rs.getInt("inputOrOutput") == 1) {
-						aVar.setInput(true);
-					} else {
-						aVar.setInput(false);
-					}
-					aVar.setPName(rs.getString("pnameRef"));
-					aVar.setVName(rs.getString("varName"));
-					aVar.setType(rs.getString("type"));
-					aVar.setTypeNestingLevel(rs.getInt("nestingLevel"));
-					aVar.setActualNestingLevel(rs.getInt("actualNestingLevel"));
-					aVar.setANLset((rs.getInt("anlSet") == 1 ? true : false));
-					result.add(aVar);
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-
-		return result;
-	}
-
-	private List<Var> getVarsNoInstance(Map<String, String> queryConstraints)
-	throws SQLException {
-
-		List<Var> result = new ArrayList<Var>();
-
-		String q0 = "SELECT  * FROM Var V";
-
-		String q = addWhereClauseToQuery(q0, queryConstraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q.toString());
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-
-					Var aVar = new Var();
-
-					aVar.setWfInstanceRef(rs.getString("WfInstanceRef"));
-
-					if (rs.getInt("inputOrOutput") == 1) {
-						aVar.setInput(true);
-					} else {
-						aVar.setInput(false);
-					}
-					aVar.setPName(rs.getString("pnameRef"));
-					aVar.setVName(rs.getString("varName"));
-					aVar.setType(rs.getString("type"));
-					aVar.setTypeNestingLevel(rs.getInt("nestingLevel"));
-					aVar.setActualNestingLevel(rs.getInt("actualNestingLevel"));
-					aVar.setANLset((rs.getInt("anlSet") == 1 ? true : false));
-					result.add(aVar);
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-	public List<String> getVarValues(String wfInstance, String pname,
-			String vname) throws SQLException {
-
-		List<String> result = new ArrayList<String>();
-
-		String q0 = "SELECT  value FROM VarBinding VB";
-
-		Map<String, String> queryConstraints = new HashMap<String, String>();
-		queryConstraints.put("wfInstanceRef", wfInstance);
-		queryConstraints.put("PNameRef", pname);
-		queryConstraints.put("varNameRef", vname);
-
-		String q = addWhereClauseToQuery(q0, queryConstraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q.toString());
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-					result.add(rs.getString("value"));
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-
-		return result;
-	}
-
-	/**
-	 * return the input variables for a given processor and a wfInstanceId
-	 *
-	 * @param pname
-	 * @param wfInstanceId
-	 * @return list of input variables
-	 * @throws SQLException
-	 */
-	public List<Var> getInputVars(String pname, String wfID, String wfInstanceID)
-	throws SQLException {
-		// get (var, proc) from Var to see if it's input/output
-		Map<String, String> varQueryConstraints = new HashMap<String, String>();
-
-		varQueryConstraints.put("V.wfInstanceRef", wfID);
-		varQueryConstraints.put("V.pnameRef", pname);
-		varQueryConstraints.put("V.inputOrOutput", "1");
-		if (wfInstanceID != null) {
-			varQueryConstraints.put("W.instanceID", wfInstanceID);
-			return getVars(varQueryConstraints);
-		} else {
-			return getVarsNoInstance(varQueryConstraints);
-		}
-	}
-
-	/**
-	 * return the output variables for a given processor and a wfInstanceId
-	 *
-	 * @param pname
-	 * @param wfInstanceId
-	 * @return list of output variables
-	 * @throws SQLException
-	 */
-	public List<Var> getOutputVars(String pname, String wfID, String wfInstanceID)
-	throws SQLException {
-		// get (var, proc) from Var to see if it's input/output
-		Map<String, String> varQueryConstraints = new HashMap<String, String>();
-
-		varQueryConstraints.put("V.wfInstanceRef", wfID);
-		varQueryConstraints.put("V.pnameRef", pname);
-		varQueryConstraints.put("V.inputOrOutput", "0");
-		if (wfInstanceID != null) {
-			varQueryConstraints.put("W.instanceID", wfInstanceID);
-		}
-
-		return getVars(varQueryConstraints);
-	}
-
-	/**
-	 * selects all Arcs
-	 *
-	 * @param queryConstraints
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<Arc> getArcs(Map<String, String> queryConstraints)
-	throws SQLException {
-		List<Arc> result = new ArrayList<Arc>();
-
-		String q0 = "SELECT * FROM Arc A JOIN WfInstance W ON W.wfnameRef = A.wfInstanceRef";
-
-		String q = addWhereClauseToQuery(q0, queryConstraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q.toString());
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-
-					Arc aArc = new Arc();
-
-					aArc.setWfInstanceRef(rs.getString("WfInstanceRef"));
-					aArc.setSourcePnameRef(rs.getString("sourcePNameRef"));
-					aArc.setSourceVarNameRef(rs.getString("sourceVarNameRef"));
-					aArc.setSinkPnameRef(rs.getString("sinkPNameRef"));
-					aArc.setSinkVarNameRef(rs.getString("sinkVarNameRef"));
-
-					result.add(aArc);
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-
-	public String getTopLevelWfName(String runID) throws SQLException {
-
-		List<String> wfNames = new ArrayList<String>();
-
-		List<Workflow> workflows = getWorkflowForRun(runID);
-
-		for (Workflow w:workflows) { 	
-			if (w.getParentWFname() == null) { return w.getWfname(); }
-		}		
-		return null;		
-	}
-
-	/**
-	 * returns the names of all workflows (top level + nested) for a given runID
-	 * @param runID
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<String> getWfNames(String runID) throws SQLException {
-
-		List<String> wfNames = new ArrayList<String>();
-
-		List<Workflow> workflows = getWorkflowForRun(runID);
-
-		for (Workflow w:workflows) { wfNames.add(w.getWfname()); }
-
-		return wfNames;
-	}
-
-
-	/**
-	 * returns the workflows associated to a single runID
-	 * @param runID
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<Workflow> getWorkflowForRun(String runID) throws SQLException {
-
-		List<Workflow> result = new ArrayList<Workflow>();
-
-		String q = "SELECT * FROM WfInstance I join Workflow W on I.wfnameRef = W.wfname where instanceID = ?";
-
-		PreparedStatement stmt = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			stmt = connection.prepareStatement(q);
-			stmt.setString(1, runID);
-
-			boolean success = stmt.execute();
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-
-					Workflow w = new Workflow();
-					w.setWfName(rs.getString("wfnameRef"));
-					w.setParentWFname(rs.getString("parentWFName"));
-
-					result.add(w);					
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.error("Error finding the workflow reference", e);
-		} catch (IllegalAccessException e) {
-			logger.error("Error finding the workflow reference", e);
-		} catch (ClassNotFoundException e) {
-			logger.error("Error finding the workflow reference", e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return result;
-	}
-
-
-
-	/**
-	 * @param dataflowID
-	 * @param conditions currently only understands "from" and "to" as timestamps for range queries
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<WorkflowInstance> getRuns(String dataflowID, Map<String, String> conditions) throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		List<WorkflowInstance> result = new ArrayList<WorkflowInstance>();
-
-		String q = "SELECT * FROM WfInstance I join Workflow W on I.wfnameRef = W.wfname";
-
-		List<String> conds = new ArrayList<String>();
-
-		if (dataflowID != null) { conds.add("wfnameRef = '"+dataflowID+"'"); }
-		if (conditions != null) {
-			if (conditions.get("from") != null) { conds.add("timestamp >= "+conditions.get("from")); }
-			if (conditions.get("to") != null) { conds.add("timestamp <= "+conditions.get("to")); }
-		}
-		if (conds.size()>0) { q = q + " where "+conds.get(0); conds.remove(0); }
-
-		while (conds.size()>0) {
-			q = q + " and '"+conds.get(0)+"'"; 
-			conds.remove(0); 
-		}
-		
-		q = q + " ORDER BY timestamp desc ";
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(q);
-
-			logger.debug(q);
-			
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-					WorkflowInstance i = new WorkflowInstance();
-					i.setInstanceID(rs.getString("instanceID"));
-					i.setTimestamp(rs.getString("timestamp"));
-					i.setWorkflowIdentifier(rs.getString("wfnameRef"));
-					i.setWorkflowExternalName(rs.getString("externalName"));
-					Blob blob = rs.getBlob("dataflow");
-					long length = blob.length();
-					blob.getBytes(1, (int) length);
-					i.setDataflowBlob(blob.getBytes(1, (int) length));
-					result.add(i);
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return result;
-	}
-
-
-	/*
-	 * gets all available run instances, most recent first
-	 * @return a list of pairs <wfanme, wfinstance>
-	 * @see net.sf.taverna.t2.provenance.lineageservice.mysql.ProvenanceQuery#
-	 * getWFInstanceIDs()
-	 */
-	public List<String> getWFNamesByTime() throws SQLException {
-
-		List<String> result = new ArrayList<String>();
-
-		String q = "SELECT instanceID, wfnameRef FROM WfInstance order by timestamp desc";
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-
-					result.add(rs.getString("wfnameRef"));
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * all ProCBinding records that satisfy the input constraints
-	 *
-	 * @param constraints
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<ProcBinding> getProcBindings(Map<String, String> constraints)
-	throws SQLException {
-		List<ProcBinding> result = new ArrayList<ProcBinding>();
-
-		String q = "SELECT * FROM ProcBinding PB ";
-
-		q = addWhereClauseToQuery(q, constraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-					ProcBinding pb = new ProcBinding();
-
-					pb.setActName(rs.getString("actName"));
-					pb.setExecIDRef(rs.getString("execIDRef"));
-					pb.setIterationVector(rs.getString("iteration"));
-					pb.setPNameRef(rs.getString("pnameRef"));
-					pb.setWfNameRef(rs.getString("wfNameRef"));
-
-					result.add(pb);
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-
-	}
-
-	/**
-	 * TODO this currently returns the data value as a string, which is
-	 * incorrect as it is an untyped byte array
-	 *
-	 * @param constraints
-	 *            a Map columnName -> value that defines the query constraints.
-	 *            Note: columnName must be fully qualified. This is not done
-	 *            well at the moment, i.e., PNameRef should be
-	 *            VarBinding.PNameRef to avoid ambiguities
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<VarBinding> getVarBindings(Map<String, String> constraints)
-	throws SQLException {
-		List<VarBinding> result = new ArrayList<VarBinding>();
-
-		String q = "SELECT * FROM VarBinding VB join Var V " + 
-		"on (VB.varNameRef = V.varName and VB.PNameRef =  V.PNameRef and VB.wfNameRef = V.wfInstanceRef) " + 
-		"JOIN WfInstance W ON VB.wfInstanceRef = W.instanceID and VB.wfNameRef = W.wfnameRef " + 
-		"LEFT OUTER JOIN Data D ON D.wfInstanceID = VB.wfInstanceRef and D.dataReference = VB.value";
-
-		q = addWhereClauseToQuery(q, constraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-					VarBinding vb = new VarBinding();
-
-					vb.setWfNameRef(rs.getString("wfNameRef"));
-					vb.setVarNameRef(rs.getString("varNameRef"));
-					vb.setWfInstanceRef(rs.getString("wfInstanceRef"));
-					vb.setValue(rs.getString("value"));
-
-					if (rs.getString("collIdRef") == null || rs.getString("collIdRef").equals("null")) {
-						vb.setCollIDRef(null);
-					} else {
-						vb.setCollIDRef(rs.getString("collIdRef"));
-					}
-
-					vb.setIterationVector(rs.getString("iteration"));
-					vb.setPNameRef(rs.getString("PNameRef"));
-					vb.setPositionInColl(rs.getInt("positionInColl"));
-					try {
-						vb.setResolvedValue(rs.getString("D.data"));
-					} catch (Exception e1) {
-						// ignore this since D.data is experimental and will be
-						// removed at some point
-					}
-
-					result.add(vb);
-				}
-
-			}
-		} catch (Exception e) {
-			logger.warn("Add VB failed:" + e.getMessage());
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return result;
-	}
-
-	public List<NestedListNode> getNestedListNodes(
-			Map<String, String> constraints) throws SQLException {
-
-		List<NestedListNode> result = new ArrayList<NestedListNode>();
-
-		String q = "SELECT * FROM Collection C ";
-
-		q = addWhereClauseToQuery(q, constraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-		} catch (InstantiationException e) {
-			logger.error("Error finding the nested list nodes", e);
-		} catch (IllegalAccessException e) {
-			logger.error("Error finding the nested list nodes", e);
-		} catch (ClassNotFoundException e) {
-			logger.error("Error finding the nested list nodes", e);
-		}
-
-		boolean success;
-		try {
-			success = stmt.execute(q);
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-					VarBinding vb = new VarBinding();
-
-					NestedListNode nln = new NestedListNode();
-
-					nln.setCollId(rs.getString("collId"));
-					nln.setParentCollIdRef(rs.getString("parentCollIdRef"));
-					nln.setWfInstanceRef(rs.getString("wfInstanceRef"));
-					nln.setPNameRef(rs.getString("PNameRef"));
-					nln.setVarNameRef(rs.getString("varNameRef"));
-					nln.setIteration(rs.getString("iteration"));
-
-					result.add(nln);
-
-				}
-			}
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-
-		return result;
-	}
-
-	public Map<String, Integer> getPredecessorsCount(String wfInstanceID) {
-
-		PreparedStatement ps = null;
-
-		Map<String, Integer> result = new HashMap<String, Integer>();
-
-		// get all arcs for the entire workflow structure for this particular instance
-		Connection connection = null;
-		try {
-
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT A.sourcePNameRef as source , A.sinkPNameRef as sink, A.wfInstanceRef as wfName1, W1.wfName as wfName2, W2.wfName as wfName3 " +
-					"FROM Arc A join WfInstance I on A.wfInstanceRef = I.wfnameRef " +
-					"left outer join Workflow W1 on W1.externalName = A.sourcePNameRef " +
-					"left outer join Workflow W2 on W2.externalName = A.sinkPNameRef " +
-			"where I.instanceID = ? order by wfInstanceRef");
-			ps.setString(1, wfInstanceID);
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-
-					String sink = rs.getString("sink");
-					String source = rs.getString("source");
-
-					if (result.get(sink) == null) {
-						result.put(sink, 0);
-					}
-
-					String name1 = rs.getString("wfName1");
-					String name2 = rs.getString("wfName2");
-					String name3 = rs.getString("wfName3");
-
-					if (isDataflow(source) && name1.equals(name2)) {
-						continue;
-					}
-					if (isDataflow(sink) && name1.equals(name3)) {
-						continue;
-					}
-
-					result.put(sink, result.get(sink) + 1);
-				}
-			}
-		} catch (InstantiationException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (SQLException e) {
-			logger.error("Error executing query", e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * new impl of getProcessorsIncomingLinks whicih avoids complications due to nesting, and relies on the wfInstanceID
-	 * rather than the wfnameRef
-	 * @param wfInstanceID
-	 * @return
-	 */
-	public Map<String, Integer> getPredecessorsCountOld(String wfInstanceID) {
-
-		PreparedStatement ps = null;
-
-		Map<String, Integer> result = new HashMap<String, Integer>();
-
-		// get all arcs for the entire workflow structure for this particular instance
-		Connection connection = null;
-		try {
-
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT sinkPnameRef, P1.type, count(*) as pred " +
-					" FROM Arc A join WfInstance I on A.wfInstanceRef = I.wfnameRef " +
-					" join Processor P1 on P1.pname = A.sinkPnameRef " +
-					" join Processor P2 on P2.pname = A.sourcePnameRef " +
-					"  where I.instanceID = ? " +
-					"  and P2.type <> 'net.sf.taverna.t2.activities.dataflow.DataflowActivity' " +
-					" and ((P1.type = 'net.sf.taverna.t2.activities.dataflow.DataflowActivity' and P1.wfInstanceRef = A.wfInstanceRef) or " +
-					" (P1.type <> 'net.sf.taverna.t2.activities.dataflow.DataflowActivity')) " +
-			" group by A.sinkPnameRef, type");
-			ps.setString(1, wfInstanceID);
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-
-					int cnt = rs.getInt("pred");
-
-					result.put(rs.getString("sinkPnameRef"), new Integer(cnt));
-				}
-			}
-		} catch (InstantiationException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * used in the toposort phase -- propagation of anl() values through the
-	 * graph
-	 *
-	 * @param wfnameRef
-	 *            reference to static wf name
-	 * @return a map <processor name> --> <incoming links count> for each
-	 *         processor, without counting the arcs from the dataflow input to
-	 *         processors. So a processor is at the root of the graph if it has
-	 *         no incoming links, or all of its incoming links are from dataflow
-	 *         inputs.<br/>
-	 *         Note: this must be checked for processors that are roots of
-	 *         sub-flows... are these counted as top-level root nodes??
-	 */
-	public Map<String, Integer> getProcessorsIncomingLinks(String wfnameRef)
-	throws SQLException {
-		Map<String, Integer> result = new HashMap<String, Integer>();
-
-		boolean success;
-
-		String currentWorkflowProcessor = null;
-
-		PreparedStatement ps = null;
-
-		Statement stmt;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"SELECT pName, type FROM Processor WHERE wfInstanceRef = ?");
-			ps.setString(1, wfnameRef);
-
-			success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-
-					// PM CHECK 6/09
-					if (rs.getString("type").equals("net.sf.taverna.t2.activities.dataflow.DataflowActivity")) {
-						currentWorkflowProcessor = rs.getString("pName");
-						logger.info("currentWorkflowProcessor = " + currentWorkflowProcessor);
-					}
-					result.put(rs.getString("pName"), new Integer(0));
-				}
-			}
-		} catch (InstantiationException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Could not execute query: " + e1);
-		} finally {
-			try {
-				connection.close();
-			} catch (SQLException ex) {
-				logger.error("An error occurred closing the database connection", ex);
-			}
-			connection = null;
-		}
-
-		// fetch the name of the top-level dataflow. We use this to exclude arcs
-		// outgoing from its inputs
-
-		////////////////
-		// CHECK below -- gets confused on nested workflows
-		////////////////
-		String parentWF = getParentOfWorkflow(wfnameRef);
-		if (parentWF == null) {
-			parentWF = wfnameRef;  // null parent means we are the top
-		}
-		logger.debug("parent WF: " + parentWF);
-
-		// get nested dataflows -- we want to avoid these in the toposort algorithm
-		List<ProvenanceProcessor> procs = getProcessorsShallow(
-				"net.sf.taverna.t2.activities.dataflow.DataflowActivity",
-				parentWF);
-
-		StringBuffer pNames = new StringBuffer();
-		pNames.append("(");
-		boolean first = true;
-		for (ProvenanceProcessor p : procs) {
-
-			if (!first) {
-				pNames.append(",");
-			} else {
-				first = false;
-			}
-			pNames.append(" '" + p.getPname() + "' ");
-		}
-		pNames.append(")");
-
-
-		// exclude processors connected to inputs -- those have 0 predecessors
-		// for our purposes
-		// and we add them later
-
-		// PM 6/09 not sure we need to exclude arcs going into sub-flows?? so commented out the condition
-		String q = "SELECT sinkPNameRef, count(*) as cnt " + "FROM Arc " + "WHERE wfInstanceRef = \'" + wfnameRef + "\' " + "AND sinkPNameRef NOT IN " + pNames + " " //		+ "AND sourcePNameRef NOT IN " + pNames
-		+ " GROUP BY sinkPNameRef";
-
-		logger.info("executing \n" + q);
-
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			success = stmt.execute(q);
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-				while (rs.next()) {
-
-					if (!rs.getString("sinkPNameRef").equals(currentWorkflowProcessor)) {
-						result.put(rs.getString("sinkPNameRef"), new Integer(rs.getInt("cnt")));
-					}
-				}
-				result.put(currentWorkflowProcessor, 0);
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			try {
-				connection.close();
-			} catch (SQLException ex) {
-				logger.error("An error occurred closing the database connection", ex);
-			}
-		}
-
-		return result;
-	}
-
-	public List<Var> getSuccVars(String pName, String vName,
-			String wfInstanceRef) throws SQLException {
-
-		List<Var> result = new ArrayList<Var>();
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT v.* " + "FROM Arc a JOIN Var v ON a.sinkPNameRef = v.pnameRef " + "AND  a.sinkVarNameRef = v.varName " + "AND a.wfInstanceRef = v.wfInstanceRef " + "WHERE sourceVarNameRef = ? AND sourcePNameRef = ?");
-
-			ps.setString(1, vName);
-			ps.setString(2, pName);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-
-					if (wfInstanceRef != null && !rs.getString("v.wfInstanceRef").equals(wfInstanceRef)) {
-						continue;
-					}
-
-					Var aVar = new Var();
-
-					aVar.setWfInstanceRef(rs.getString("WfInstanceRef"));
-
-					if (rs.getInt("inputOrOutput") == 1) {
-						aVar.setInput(true);
-					} else {
-						aVar.setInput(false);
-					}
-					aVar.setPName(rs.getString("pnameRef"));
-					aVar.setVName(rs.getString("varName"));
-					aVar.setType(rs.getString("type"));
-					aVar.setTypeNestingLevel(rs.getInt("nestingLevel"));
-					aVar.setActualNestingLevel(rs.getInt("actualNestingLevel"));
-					aVar.setANLset((rs.getInt("anlSet") == 1 ? true : false));
-
-					result.add(aVar);
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-	public List<String> getSuccProcessors(String pName, String wfNameRef, String wfInstanceId)
-	throws SQLException {
-		List<String> result = new ArrayList<String>();
-
-		PreparedStatement ps = null;
-
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT distinct sinkPNameRef FROM Arc A JOIN Wfinstance I on A.wfInstanceRef = I.wfnameRef " + "WHERE A.wfInstanceRef = ? and I.instanceID = ? AND sourcePNameRef = ?");
-			ps.setString(1, wfNameRef);
-			ps.setString(2, wfInstanceId);
-			ps.setString(3, pName);
-
-			boolean success = ps.execute();
-
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-					result.add(rs.getString("sinkPNameRef"));
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * get all processors of a given type within a structure identified by
-	 * wfnameRef (reference to dataflow). type constraint is ignored if value is null.<br>
-	 * this only returns the processor for the input wfNameRef, without going into any neted workflows
-	 *
-	 * @param wfnameRef
-	 * @param type
-	 * @return a list, that contains at most one element
-	 * @throws SQLException
-	 */
-	public List<ProvenanceProcessor> getProcessorsShallow(String type, String wfnameRef)
-	throws SQLException {
-		Map<String, String> constraints = new HashMap<String, String>();
-
-		constraints.put("P.wfInstanceRef", wfnameRef);
-		if (type != null) {
-			constraints.put("P.type", type);
-		}
-		return getProcessors(constraints);
-	}
-
-
-	/**
-	 * this is similar to {@link #getProcessorsShallow(String, String)} but it recursively fetches all processors
-	 * within nested workflows. The result is collected in the form of a map: wfName -> {ProvenanceProcessor}
-	 * @param type
-	 * @param wfnameRef
-	 * @return a map: wfName -> {ProvenanceProcessor} where wfName is the name of a (possibly nested) workflow, and 
-	 * the values are the processors within that workflow
-	 */
-	public Map<String, List<ProvenanceProcessor>> getProcessorsDeep(String type, String wfnameRef) {
-
-		Map<String, List<ProvenanceProcessor>> result = new HashMap<String, List<ProvenanceProcessor>>();
-
-		List<ProvenanceProcessor> currentProcs;
-
-		try {
-			currentProcs = getProcessorsShallow(type, wfnameRef);
-
-			result.put(wfnameRef, currentProcs);
-
-			for (ProvenanceProcessor pp:currentProcs) {
-				if (pp.getType() == DATAFLOW_TYPE) {
-					// recurse 
-					Map<String, List<ProvenanceProcessor>> deepProcessors = getProcessorsDeep(type, pp.getWfInstanceRef());
-
-					for (Map.Entry<String, List<ProvenanceProcessor>> entry: deepProcessors.entrySet()) {
-						result.put(entry.getKey(), entry.getValue());
-					}				
-				}
-			}
-		} catch (SQLException e) {
-			logger.error("Problem getting nested workflow processors for: " + wfnameRef + " : " + e);
-		}
-		return result;
-	}
-
-	/**
-	 * generic method to fetch processors subject to additional query constraints
-	 * @param constraints
-	 * @return
-	 * @throws SQLException
-	 */
-	public List<ProvenanceProcessor> getProcessors(
-			Map<String, String> constraints) throws SQLException {
-		List<ProvenanceProcessor> result = new ArrayList<ProvenanceProcessor>();
-
-		String q = "SELECT * FROM Processor P JOIN WfInstance W ON P.wfInstanceRef = W.wfnameRef "+
-		           "JOIN Workflow WF on W.wfnameRef = WF.wfname";
-
-		q = addWhereClauseToQuery(q, constraints, true);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-					ProvenanceProcessor proc = new ProvenanceProcessor();
-
-					proc.setPname(rs.getString("pname"));
-					proc.setType(rs.getString("type"));
-					proc.setWfInstanceRef(rs.getString("wfInstanceRef"));
-					proc.setWorkflowExternalName(rs.getString("externalName"));
-
-					result.add(proc);
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return result;
-	}
-
-	
-	public String getProcessorForWorkflow(String workflowID) {
-	
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT * from Processor WHERE wfInstanceRef = ?");
-			ps.setString(1, workflowID);
-
-			boolean success = ps.execute();
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				if (rs.next()) {  return rs.getString("pname"); }
-			}
-		} catch (SQLException e) {
-			logger.error("Problem getting processor for workflow: " + workflowID+ " : " + e);
-		} catch (InstantiationException e) {
-			logger.error("Problem getting processor for workflow: " + workflowID+ " : " + e);
-		} catch (IllegalAccessException e) {
-			logger.error("Problem getting processor for workflow: " + workflowID+ " : " + e);
-		} catch (ClassNotFoundException e) {
-			logger.error("Problem getting processor for workflow: " + workflowID+ " : " + e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException e) {
-					logger.error("Problem getting processor for workflow: " + workflowID+ " : " + e);
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * simplest possible pinpoint query. Uses iteration info straight away. Assumes result is in VarBinding not in Collection
-	 *
-	 * @param wfInstance
-	 * @param pname
-	 * @param vname
-	 * @param iteration
-	 * @return
-	 */
-	public LineageSQLQuery simpleLineageQuery(String wfInstance, String wfNameRef, String pname,
-			String vname, String iteration) {
-		LineageSQLQuery lq = new LineageSQLQuery();
-
-		String q1 = "SELECT * FROM VarBinding VB join Var V " + 
-		"on (VB.varNameRef = V.varName and VB.PNameRef =  V.PNameRef and VB.wfNameRef=V.wfInstanceRef) " + 
-		"JOIN WfInstance W ON VB.wfInstanceRef = W.instanceID and VB.wfNameRef = W.wfnameRef ";
-//		+ "LEFT OUTER JOIN Data D ON D.wfInstanceID = VB.wfInstanceRef and D.dataReference = VB.value";
-
-		// constraints:
-		Map<String, String> lineageQueryConstraints = new HashMap<String, String>();
-
-		lineageQueryConstraints.put("W.instanceID", wfInstance);
-		lineageQueryConstraints.put("VB.PNameRef", pname);
-		lineageQueryConstraints.put("VB.wfNameRef", wfNameRef);
-
-		if (vname != null) {
-			lineageQueryConstraints.put("VB.varNameRef", vname);
-		}
-		if (iteration != null) {
-			lineageQueryConstraints.put("VB.iteration", iteration);
-		}
-
-		q1 = addWhereClauseToQuery(q1, lineageQueryConstraints, false); // false:
-		// do
-		// not
-		// terminate
-		// query
-
-		// add order by clause
-		List<String> orderAttr = new ArrayList<String>();
-		orderAttr.add("varNameRef");
-		orderAttr.add("iteration");
-
-		q1 = addOrderByToQuery(q1, orderAttr, true);
-
-		logger.debug("Query is: " + q1);
-		lq.setVbQuery(q1);
-
-		return lq;
-	}
-
-	/**
-	 * if var2Path is null this generates a trivial query for the current output
-	 * var and current path
-	 *
-	 * @param wfInstanceID
-	 * @param proc
-	 * @param var2Path
-	 * @param outputVar
-	 * @param path
-	 * @param returnOutputs
-	 *            returns inputs *and* outputs if set to true
-	 * @return
-	 */
-	public List<LineageSQLQuery> lineageQueryGen(String wfInstanceID, String proc,
-			Map<Var, String> var2Path, Var outputVar, String path,
-			boolean returnOutputs) {
-		// setup
-		StringBuffer effectivePath = new StringBuffer();
-
-		List<LineageSQLQuery> newQueries = new ArrayList<LineageSQLQuery>();
-
-		// use the calculated path for each input var
-		boolean isInput = true;
-		for (Var v : var2Path.keySet()) {
-			LineageSQLQuery q = generateSQL2(wfInstanceID, proc, v.getVName(), var2Path.get(v), isInput);
-			if (q != null) {
-				newQueries.add(q);
-			}
-		}
-
-		// is returnOutputs is true, then use proc, path for the output var as well
-		if (returnOutputs) {
-
-			isInput = false;
-
-			LineageSQLQuery q = generateSQL2(wfInstanceID, proc, outputVar.getVName(), path, isInput);  // && !var2Path.isEmpty());
-			if (q != null) {
-				newQueries.add(q);
-			}
-		}
-		return newQueries;
-
-
-	}
-
-	protected LineageSQLQuery generateSQL2(String wfInstance, String proc,
-			String var, String path, boolean returnInput) {
-
-		LineageSQLQuery lq = new LineageSQLQuery();
-
-		// constraints:
-		Map<String, String> collQueryConstraints = new HashMap<String, String>();
-
-		// base Collection query
-		String collQuery = "SELECT * FROM Collection C JOIN WfInstance W ON " + "C.wfInstanceRef = W.instanceID " + "JOIN Var V on " + "V.wfInstanceRef = W.wfnameRef and C.PNameRef = V.pnameRef and C.varNameRef = V.varName ";
-
-		collQueryConstraints.put("W.instanceID", wfInstance);
-		collQueryConstraints.put("C.PNameRef", proc);
-
-		if (path != null && path.length() > 0) {
-			collQueryConstraints.put("C.iteration", "[" + path + "]"); // PM 1/09 -- path
-		}
-
-		// inputs or outputs?
-		if (returnInput) {
-			collQueryConstraints.put("V.inputOrOutput", "1");
-		} else {
-			collQueryConstraints.put("V.inputOrOutput", "0");
-		}
-
-		collQuery = addWhereClauseToQuery(collQuery, collQueryConstraints, false);
-
-		lq.setCollQuery(collQuery);
-
-		//  vb query
-
-		Map<String, String> vbQueryConstraints = new HashMap<String, String>();
-
-		// base VarBinding query
-		String vbQuery = "SELECT * FROM VarBinding VB JOIN WfInstance W ON " + 
-						 "VB.wfInstanceRef = W.instanceID " + 
-						 "JOIN Var V on " + 
-						 "V.wfInstanceRef = W.wfnameRef and VB.PNameRef = V.pnameRef and VB.varNameRef = V.varName "; 
-//						 "LEFT OUTER JOIN Data D ON D.wfInstanceID = VB.wfInstanceRef and D.dataReference = VB.value";
-
-		vbQueryConstraints.put("W.instanceID", wfInstance);
-		vbQueryConstraints.put("VB.PNameRef", proc);
-		vbQueryConstraints.put("VB.varNameRef", var);
-
-		if (path != null && path.length() > 0) {
-			vbQueryConstraints.put("VB.iteration", "[" + path + "]"); // PM 1/09 -- path
-		}
-
-		// limit to inputs?
-		if (returnInput) {
-			vbQueryConstraints.put("V.inputOrOutput", "1");
-		} else {
-			vbQueryConstraints.put("V.inputOrOutput", "0");
-		}
-
-		vbQuery = addWhereClauseToQuery(vbQuery, vbQueryConstraints, false);
-
-		List<String> orderAttr = new ArrayList<String>();
-		orderAttr.add("varNameRef");
-		orderAttr.add("iteration");
-
-		vbQuery = addOrderByToQuery(vbQuery, orderAttr, true);
-
-		lq.setVbQuery(vbQuery);
-
-		return lq;
-	}
-
-	/**
-	 * if effectivePath is not null: query varBinding using: wfInstanceRef =
-	 * wfInstance, iteration = effectivePath, PNameRef = proc if input vars is
-	 * null, then use the output var this returns the bindings for the set of
-	 * input vars at the correct iteration if effectivePath is null: fetch
-	 * VarBindings for all input vars, without constraint on the iteration<br/>
-	 * added outer join with Data<br/>
-	 * additionally, try querying the collection table first -- if the query succeeds, it means
-	 * the path is pointing to an internal node in the collection, and we just got the right node.
-	 * Otherwise, query VarBinding for the leaves
-	 *
-	 * @param wfInstance
-	 * @param proc
-	 * @param effectivePath
-	 * @param returnOutputs
-	 *            returns both inputs and outputs if set to true
-	 * @return
-	 */
-	public LineageSQLQuery generateSQL(String wfInstance, String proc,
-			String effectivePath, boolean returnOutputs) {
-
-		LineageSQLQuery lq = new LineageSQLQuery();
-
-		// constraints:
-		Map<String, String> collQueryConstraints = new HashMap<String, String>();
-
-		// base Collection query
-		String collQuery = "SELECT * FROM Collection C JOIN WfInstance W ON " + "C.wfInstanceRef = W.instanceID " + "JOIN Var V on " + "V.wfInstanceRef = W.wfnameRef and C.PNameRef = V.pnameRef and C.varNameRef = V.varName ";
-
-		collQueryConstraints.put("W.instanceID", wfInstance);
-		collQueryConstraints.put("C.PNameRef", proc);
-
-		if (effectivePath != null && effectivePath.length() > 0) {
-			collQueryConstraints.put("C.iteration", "[" + effectivePath.toString() + "]"); // PM 1/09 -- path
-		}
-
-		// limit to inputs?
-		if (returnOutputs) {
-			collQueryConstraints.put("V.inputOrOutput", "1");
-		}
-
-		collQuery = addWhereClauseToQuery(collQuery, collQueryConstraints, false);
-
-		lq.setCollQuery(collQuery);
-
-		//  vb query
-
-		Map<String, String> vbQueryConstraints = new HashMap<String, String>();
-
-		// base VarBinding query
-//		String vbQuery = "SELECT * FROM VarBinding VB JOIN wfInstance W ON " + "VB.wfInstanceRef = W.instanceID " + "JOIN Var V on " + "V.wfInstanceRef = W.wfnameRef and VB.PNameRef = V.pnameRef and VB.varNameRef = V.varName " + "LEFT OUTER JOIN Data D ON D.wfInstanceID = VB.wfInstanceRef and D.dataReference = VB.value";
-
-		String vbQuery = "SELECT * FROM VarBinding VB JOIN WfInstance W ON " + 
-						 "VB.wfInstanceRef = W.instanceID " + 
-						 "JOIN Var V on " + 
-						 "V.wfInstanceRef = W.wfnameRef and VB.PNameRef = V.pnameRef and VB.varNameRef = V.varName "; 
-
-		vbQueryConstraints.put("W.instanceID", wfInstance);
-		vbQueryConstraints.put("VB.PNameRef", proc);
-
-		if (effectivePath != null && effectivePath.length() > 0) {
-			vbQueryConstraints.put("VB.iteration", "[" + effectivePath.toString() + "]"); // PM 1/09 -- path
-		}
-
-		// limit to inputs?
-		if (!returnOutputs) {
-			vbQueryConstraints.put("V.inputOrOutput", "1");
-		}
-
-		vbQuery = addWhereClauseToQuery(vbQuery, vbQueryConstraints, false);
-
-		List<String> orderAttr = new ArrayList<String>();
-		orderAttr.add("varNameRef");
-		orderAttr.add("iteration");
-
-		vbQuery = addOrderByToQuery(vbQuery, orderAttr, true);
-
-
-		lq.setVbQuery(vbQuery);
-
-		return lq;
-	}
-
-	public Dependencies runCollectionQuery(LineageSQLQuery lq) throws SQLException {
-
-		String q = lq.getCollQuery();
-
-		Dependencies lqr = new Dependencies();
-
-		if (q == null) {
-			return lqr;
-		}
-
-		logger.debug("running collection query: " + q);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-
-				while (rs.next()) {
-
-					String type = lqr.ATOM_TYPE; // temp -- FIXME
-
-					String wfNameRef = rs.getString("wfNameRef");
-					String wfInstance = rs.getString("wfInstanceRef");
-					String proc = rs.getString("PNameRef");
-					String var = rs.getString("varNameRef");
-					String it = rs.getString("iteration");
-					String coll = rs.getString("collID");
-					String parentColl = rs.getString("parentCollIDRef");
-
-					lqr.addLineageQueryResultRecord(wfNameRef, proc, var, wfInstance,
-							it, coll, parentColl, null, null, type, false, true);  // true -> is a collection
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return lqr;
-	}
-
-	
-	/**
-	 * 
-	 * @param lq
-	 * @param includeDataValue  IGNORED. always false
-	 * @return
-	 * @throws SQLException
-	 */
-	public Dependencies runVBQuery(LineageSQLQuery lq, boolean includeDataValue) throws SQLException {
-
-		String q = lq.getVbQuery();
-
-		logger.debug("running VB query: " + q);
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				Dependencies lqr = new Dependencies();
-
-				while (rs.next()) {
-
-					String type = lqr.ATOM_TYPE; // temp -- FIXME
-
-					String wfNameRef = rs.getString("wfNameRef");
-					String wfInstance = rs.getString("wfInstanceRef");
-					String proc = rs.getString("PNameRef");
-					String var = rs.getString("varNameRef");
-					String it = rs.getString("iteration");
-					String coll = rs.getString("collIDRef");
-					String value = rs.getString("value");
-					boolean isInput = (rs.getInt("inputOrOutput") == 1) ? true
-							: false;
-
-					
-					// FIXME there is no D and no VB - this is in generateSQL,
-					// not simpleLineageQuery
-					// commented out as D table no longer available. Need to replace this with deref from DataManager
-//					if (includeDataValue) {
-//						String resolvedValue = rs.getString("D.data");
-
-						// System.out.println("resolved value: "+resolvedValue);
-//						lqr.addLineageQueryResultRecord(wfNameRef, proc, var, wfInstance,
-//								it, coll, null, value, resolvedValue, type, isInput, false);  // false -> not a collection
-//					} else {
-
-						// FIXME if the data is required then the query needs
-						// fixing
-						lqr.addLineageQueryResultRecord(wfNameRef, proc, var, wfInstance,
-								it, coll, null, value, null, type, isInput, false);
-//					}
-				}
-				return lqr;
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * executes one of the lineage queries produced by the graph visit algorithm. This first executes the collection query, and then
-	 * if no result is returned, the varBinding query
-	 *
-	 * @param lq
-	 *            a lineage query computed during the graph traversal
-	 * @param includeDataValue
-	 *            if true, then the referenced value is included in the result.
-	 *            This may only be necessary for testing: the data reference in
-	 *            field value (which is a misleading field name, and actually
-	 *            refers to the data reference) should be sufficient
-	 * @return
-	 * @throws SQLException
-	 */
-	public Dependencies runLineageQuery(LineageSQLQuery lq,
-			boolean includeDataValue) throws SQLException {
-
-		Dependencies result = runCollectionQuery(lq);
-
-		if (result.getRecords().size() == 0) // query was really VB
-		{
-			return runVBQuery(lq, includeDataValue);
-		}
-
-		return result;
-	}
-
-	public List<Dependencies> runLineageQueries(
-			List<LineageSQLQuery> lqList, boolean includeDataValue)
-			throws SQLException {
-
-		List<Dependencies> allResults = new ArrayList<Dependencies>();
-
-		if (lqList == null) {
-			logger.warn("lineage queries list is NULL, nothing to evaluate");
-			return allResults;
-		}
-
-		for (LineageSQLQuery lq : lqList) {
-			if (lq == null) {
-				continue;
-			}
-			allResults.add(runLineageQuery(lq, includeDataValue));
-		}
-
-		return allResults;
-	}
-
-	/**
-	 * takes an ordered set of records for the same variable with iteration
-	 * indexes and builds a collection out of it
-	 *
-	 * @param lqr
-	 * @return a jdom Document with the collection
-	 */
-	public Document recordsToCollection(Dependencies lqr) {
-		// process each var name in turn
-		// lqr ordered by var name and by iteration number
-		Document d = new Document(new Element("list"));
-
-		String currentVar = null;
-		for (ListIterator<LineageQueryResultRecord> it = lqr.iterator(); it.hasNext();) {
-
-			LineageQueryResultRecord record = it.next();
-
-			if (currentVar != null && record.getVname().equals(currentVar)) { // multiple
-				// occurrences
-				addToCollection(record, d); // adds record to d in the correct
-				// position given by the iteration
-				// vector
-			}
-			if (currentVar == null) {
-				currentVar = record.getVname();
-			}
-		}
-		return d;
-	}
-
-	private void addToCollection(LineageQueryResultRecord record, Document d) {
-
-		Element root = d.getRootElement();
-
-		String[] itVector = record.getIteration().split(",");
-
-		Element currentEl = root;
-		// each element gives us a corresponding child in the tree
-		for (int i = 0; i < itVector.length; i++) {
-
-			int index = Integer.parseInt(itVector[i]);
-
-			List<Element> children = currentEl.getChildren();
-			if (index < children.size()) { // we already have the child, just
-				// descend
-				currentEl = children.get(index);
-			} else { // create child
-				if (i == itVector.length - 1) { // this is a leaf --> atomic
-					// element
-					currentEl.addContent(new Element(record.getValue()));
-				} else { // create internal element
-					currentEl.addContent(new Element("list"));
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * returns the set of all processors that are structurally contained within
-	 * the wf corresponding to the input dataflow name
-	 * @param dataflowName the name of a processor of type DataFlowActivity
-	 * @return
-	 */
-	public List<String> getContainedProcessors(String dataflowName) {
-
-		List<String> result = new ArrayList<String>();
-
-		// dataflow name -> wfRef
-		String containerDataflow = getWfNameForDataflow(dataflowName);
-
-		// get all processors within containerDataflow
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-//					"SELECT pname FROM Processor P  join wfInstance I on P.wfInstanceRef = I.wfnameRef " +
-//			"where wfInstanceRef = ? and I.instanceID = ?");
-					"SELECT pname FROM Processor P " +
-					"where wfInstanceRef = ?");
-			ps.setString(1, containerDataflow);
-//			ps.setString(2, instanceID);
-
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-					result.add(rs.getString("pname"));
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			try {
-				connection.close();
-			} catch (SQLException ex) {
-				logger.error("An error occurred closing the database connection", ex);
-			}
-		}
-		return result;
-	}
-
-	public String getTopLevelDataflowName(String wfInstanceID) {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT pname FROM Processor P  join WfInstance I on P.wfInstanceRef = I.wfnameRef " +
-			"where  I.instanceID =? and isTopLevel = 1");
-
-
-			ps.setString(1, wfInstanceID);
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				if (rs.next()) {
-					return rs.getString("pname");
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			try {
-				connection.close();
-			} catch (SQLException ex) {
-				logger.error("An error occurred closing the database connection", ex);
-			}
-		}
-		return null;
-	}
-
-	
-	/**
-	 * returns the internal ID of a dataflow given its external name
-	 * @param dataflowName
-	 * @param instanceID
-	 * @return
-	 */
-	public String getWfNameForDataflow(String dataflowName) {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-
-			ps = connection.prepareStatement(
-//			"SELECT wfname FROM Workflow W join WfInstance I on W.wfname = I.wfNameRef WHERE W.externalName = ? and I.instanceID = ?");
-			"SELECT wfname FROM Workflow W WHERE W.externalName = ?");
-			ps.setString(1, dataflowName);
-//			ps.setString(2, instanceID);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				if (rs.next()) {
-					return rs.getString("wfname");
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (SQLException e) {
-			logger.error("Could not execute query: " + e);
-		} finally {
-			try {
-				if (connection != null) {
-					connection.close();
-				}
-			} catch (SQLException ex) {
-				logger.error("An error occurred closing the database connection", ex);
-			}
-		}
-		return null;
-	}
-
-	public List<String> getChildrenOfWorkflow(String parentWFName)
-	throws SQLException {
-
-		List<String> result = new ArrayList<String>();
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"SELECT wfname FROM Workflow WHERE parentWFname = ? ");
-			ps.setString(1, parentWFName);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-					result.add(rs.getString("wfname"));
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * fetch children of parentWFName from the Workflow table
-	 *
-	 * @return
-	 * @param childWFName
-	 * @throws SQLException
-	 */
-	public String getParentOfWorkflow(String childWFName) throws SQLException {
-
-		PreparedStatement ps = null;
-		String result = null;
-		Connection connection = null;
-
-		String q = "SELECT parentWFname FROM Workflow WHERE wfname = ?";
-		// Statement stmt;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(q);
-			ps.setString(1, childWFName);
-
-			logger.debug("getParentOfWorkflow - query: " + q + "  with wfname = " + childWFName);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-
-					result = rs.getString("parentWFname");
-
-					logger.debug("result: " + result);
-					break;
-
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-	public List<String> getAllWFnames() throws SQLException {
-		List<String> result = new ArrayList<String>();
-
-		String q = "SELECT wfname FROM Workflow";
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-				while (rs.next()) {
-					result.add(rs.getString("wfname"));
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 *
-	 * @param procName
-	 * @return true if procName is the external name of a dataflow, false
-	 *         otherwise
-	 * @throws SQLException
-	 */
-	public boolean isDataflow(String procName) throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"SELECT type FROM Processor WHERE pname = ?");
-			ps.setString(1, procName);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				if (rs.next() && rs.getString("type") != null && rs.getString("type").equals(DATAFLOW_TYPE)) {
-					return true;
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return false;
-	}
-
-	public String getTopDataflow(String wfInstanceID) {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT * FROM T2Provenance.Processor P join WfInstance I on P.wfInstanceRef = I.wfNameRef " +
-					" where I.instanceID = ? " +
-			" and isTopLevel = 1 ");
-			ps.setString(1, wfInstanceID);
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				if (rs.next()) {
-					return rs.getString("PName");
-				}
-			}
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			try {
-				if (connection != null) {
-					connection.close();
-				}
-			} catch (SQLException ex) {
-				logger.error("An error occurred closing the database connection", ex);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 *
-	 * @param p
-	 *            pTo processor
-	 * @param var
-	 *            vTo
-	 * @param value
-	 *            valTo
-	 * @return a set of DDRecord
-	 * @throws SQLException
-	 */
-	public List<DDRecord> queryDD(String p, String var, String value,
-			String iteration, String wfInstance) throws SQLException {
-
-		List<DDRecord> result = new ArrayList<DDRecord>();
-
-		Map<String, String> queryConstraints = new HashMap<String, String>();
-
-		queryConstraints.put("pTo", p);
-		queryConstraints.put("vTo", var);
-		if (value != null) {
-			queryConstraints.put("valTo", value);
-		}
-		if (iteration != null) {
-			queryConstraints.put("iteration", iteration);
-		}
-		if (wfInstance != null) {
-			queryConstraints.put("wfInstance", wfInstance);
-		}
-
-		String q = "SELECT * FROM   DD ";
-
-		q = addWhereClauseToQuery(q, queryConstraints, true); // true: terminate
-		// SQL statement
-
-		Statement stmt;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			boolean success = stmt.execute(q);
-
-			if (success) {
-				ResultSet rs = stmt.getResultSet();
-
-				while (rs.next()) {
-
-					DDRecord aDDrecord = new DDRecord();
-					aDDrecord.setPFrom(rs.getString("pFrom"));
-					aDDrecord.setVFrom(rs.getString("vFrom"));
-					aDDrecord.setValFrom(rs.getString("valFrom"));
-					aDDrecord.setPTo(rs.getString("pTo"));
-					aDDrecord.setVTo(rs.getString("vTo"));
-					aDDrecord.setValTo(rs.getString("valTo"));
-
-					result.add(aDDrecord);
-				}
-				return result;
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return null;
-	}
-
-	public Set<DDRecord> queryArcsForDD(String p, String v, String val,
-			String wfInstance) throws SQLException {
-
-		Set<DDRecord> result = new HashSet<DDRecord>();
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		String q = "SELECT DISTINCT A.sourcePNameRef AS p, A.sourceVarNameRef AS var, VB.value AS val " + "FROM   Arc A JOIN VarBinding VB ON VB.varNameRef = A.sinkVarNameRef AND VB.PNameRef = A.sinkPNameRef " + "JOIN   WfInstance WF ON WF.wfnameRef = A.wfInstanceRef AND WF.instanceID = VB.wfInstanceRef  " + "WHERE  WF.instanceID = '" + wfInstance + "' AND A.sinkPNameRef = '" + p + "' AND A.sinkVarNameRef = '" + v + "' AND VB.value = '" + val + "' ";
-
-		// Statement stmt;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT DISTINCT A.sourcePNameRef AS p, A.sourceVarNameRef AS var, VB.value AS val " + "FROM   Arc A JOIN VarBinding VB ON VB.varNameRef = A.sinkVarNameRef AND VB.PNameRef = A.sinkPNameRef " + "JOIN   WfInstance WF ON WF.wfnameRef = A.wfInstanceRef AND WF.instanceID = VB.wfInstanceRef  " + "WHERE  WF.instanceID = ? AND A.sinkPNameRef = ? AND A.sinkVarNameRef = ? AND VB.value = ?");
-
-			ps.setString(1, wfInstance);
-			ps.setString(2, p);
-			ps.setString(3, v);
-			ps.setString(4, val);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-
-					DDRecord aDDrecord = new DDRecord();
-					aDDrecord.setPTo(rs.getString("p"));
-					aDDrecord.setVTo(rs.getString("var"));
-					aDDrecord.setValTo(rs.getString("val"));
-
-					result.add(aDDrecord);
-				}
-				return result;
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return null;
-	}
-
-	public Set<DDRecord> queryAllFromValues(String wfInstance)
-	throws SQLException {
-
-		Set<DDRecord> result = new HashSet<DDRecord>();
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"SELECT DISTINCT PFrom, vFrom, valFrom FROM DD where wfInstance = ?");
-			ps.setString(1, wfInstance);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-
-					DDRecord aDDrecord = new DDRecord();
-					aDDrecord.setPFrom(rs.getString("PFrom"));
-					aDDrecord.setVFrom(rs.getString("vFrom"));
-					aDDrecord.setValFrom(rs.getString("valFrom"));
-
-					result.add(aDDrecord);
-				}
-				return result;
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		return null;
-
-	}
-
-
-	public boolean isRootProcessorOfWorkflow(String procName, String wfName,
-			String wfInstanceId) {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT * FROM Arc A join WfInstance I on A.wfInstanceRef = I.wfnameRef " +
-					"join Processor P on P.pname = A.sourcePnameRef where sourcePnameRef = ? " +
-					"and P.wfInstanceRef <> A.wfInstanceRef " +
-					"and I.instanceID = ? " +
-			"and sinkPNameRef = ? ");
-
-			ps.setString(1, wfName);
-			ps.setString(2, wfInstanceId);
-			ps.setString(3, procName);
-
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				if (rs.next()) {
-					return true;
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-		return false;
-	}
-
-
-	public List<Workflow> getContainingWorkflowsForProcessor(
-			String pname) {
-
-		List<Workflow> wfList = new ArrayList<Workflow>();
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT * FROM T2Provenance.Processor P "+
-					"join Workflow W on P.wfInstanceRef = W.wfName "+
-			"where pname = ? ");
-
-			ps.setString(1, pname);
-
-			boolean success = ps.execute();
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				while (rs.next()) {
-					Workflow wf = new Workflow();
-					wf.setWfName(rs.getString("wfInstanceRef"));
-					wf.setParentWFname(rs.getString("parentWFName"));
-
-					wfList.add(wf);
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-		return wfList;
-	}
-
-
-
-/**
- * returns a Workflow record from the DB given the workflow internal ID
- * @param dataflowID
- * @return
- */
-	public Workflow getWorkflow(String dataflowID) {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"SELECT * FROM T2Provenance.Workflow W "+
-			"where wfname = ? ");
-
-			ps.setString(1, dataflowID);
-
-			boolean success = ps.execute();
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-
-				if (rs.next()) {
-					Workflow wf = new Workflow();
-					wf.setWfName(rs.getString("wfname"));
-					wf.setParentWFname(rs.getString("parentWFName"));
-					wf.setExternalName(rs.getString("externalName"));
-
-					return wf;
-				}
-			}
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (SQLException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-		return null;
-
-	}
-
-}
-
-
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java
deleted file mode 100644
index c61f7f0..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/ProvenanceWriter.java
+++ /dev/null
@@ -1,914 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.sql.Blob;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.provenance.connector.JDBCConnector;
-import org.apache.log4j.Logger;
-
-import net.sf.taverna.t2.provenance.lineageservice.utils.NestedListNode;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProcBinding;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.VarBinding;
-
-/**
- * Handles all the writing out of provenance items to the database layer. Uses
- * standard SQL so all specific instances of this class can extend this writer
- * to handle all of the db writes
- * 
- * @author Paolo Missier
- * @author Ian Dunlop
- * @author Stuart Owen
- * 
- */
-public abstract class ProvenanceWriter {
-
-	protected static Logger logger = Logger.getLogger(ProvenanceWriter.class);    
-	protected int cnt; // counts number of calls to VarBinding
-
-	public Connection getConnection() throws InstantiationException,
-	IllegalAccessException, ClassNotFoundException, SQLException {
-		return JDBCConnector.getConnection();
-	}
-
-	/**
-	 * add each Var as a row into the VAR DB table<br/>
-	 * <strong>note: no static var type available as part of the
-	 * dataflow...</strong>
-	 *
-	 * @param vars
-	 * @param wfId
-	 * @throws SQLException
-	 */
-	public void addVariables(List<Var> vars, String wfId) throws SQLException {
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Var (varname, pNameRef, inputOrOutput, nestingLevel, wfInstanceRef) VALUES(?,?,?,?,?)");
-			String q;
-			for (Var v : vars) {
-
-				int isInput = v.isInput() ? 1 : 0;
-
-				int i = v.getTypeNestingLevel() >= 0 ? v.getTypeNestingLevel() : 0;
-				ps.setString(1, v.getVName());
-				ps.setString(2, v.getPName());
-				ps.setInt(3, isInput);
-				ps.setInt(4, i);
-				ps.setString(5, wfId);
-
-				try {
-					ps.executeUpdate();
-
-				} catch (Exception e) {
-					continue;
-				}
-
-			}
-
-		} catch (InstantiationException e1) {
-			logger.warn("Could not execute insert to add variables", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Could not execute insert to add variables", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Could not execute insert to add variables", e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-	}
-
-	/**
-	 * inserts one row into the ARC DB table -- OBSOLETE, see instead
-	 *
-	 * @param sourceVar
-	 * @param sinkVar
-	 * @param wfId
-	 */
-	public void addArc(Var sourceVar, Var sinkVar, String wfId)
-	throws SQLException {
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Arc (wfInstanceRef, sourcePNameRef, SourceVarNameRef, sinkPNameRef,sinkVarNameRef) VALUES(?,?,?,?,?)");
-			ps.setString(1, wfId);
-			ps.setString(2, sourceVar.getPName());
-			ps.setString(3, sourceVar.getVName());
-			ps.setString(4, sinkVar.getPName());
-			ps.setString(5, sinkVar.getVName());
-
-			int result = ps.executeUpdate();
-
-		} catch (InstantiationException e1) {
-			logger.warn("Could not execute insert for Arc", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Could not execute insert for Arc", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Could not execute insert for Arc", e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-	}
-
-	public void addArc(String sourceVarName, String sourceProcName,
-			String sinkVarName, String sinkProcName, String wfId) {
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Arc (wfInstanceRef, sourcePNameRef, sourceVarNameRef, sinkPNameRef, sinkVarNameRef) VALUES(?,?,?,?,?)");
-
-
-			ps.setString(1, wfId);
-			ps.setString(2, sourceProcName);
-			ps.setString(3, sourceVarName);
-			ps.setString(4, sinkProcName);
-			ps.setString(5, sinkVarName);
-
-			int result = ps.executeUpdate();
-
-
-		} catch (InstantiationException e1) {
-			logger.warn("Could not execute insert to add Arc", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Could not execute insert to add Arc", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Could not execute insert to add Arc", e1);
-		} catch (SQLException e) {
-			logger.warn("Could not execute insert to add Arc", e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-
-	}
-
-	public void addWFId(String wfId) throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Workflow (wfName) VALUES (?)");
-			ps.setString(1, wfId);
-			ps.executeUpdate();
-
-		} catch (InstantiationException e1) {
-			logger.warn(e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn(e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn(e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-	}
-
-	public void addWFId(String wfId, String parentWFname, String externalName, Blob dataflow) throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Workflow (wfname, parentWFname, externalName, dataflow) VALUES (?,?,?, ?)");
-			ps.setString(1, wfId);
-			ps.setString(2, parentWFname);
-			ps.setString(3, externalName);
-			ps.setBlob(4, dataflow);
-
-			ps.executeUpdate();
-
-		} catch (InstantiationException e1) {
-			logger.warn(e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn(e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn(e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-	}
-
-	public void addWFInstanceId(String wfId, String wfInstanceId)
-	throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO WfInstance (instanceID, wfnameRef) VALUES (?,?)");
-
-			ps.setString(1, wfInstanceId);
-			ps.setString(2, wfId);
-
-			ps.executeUpdate();
-		} catch (InstantiationException e1) {
-			logger.warn(e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn(e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn(e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-	}
-
-	/**
-	 * insert new processor into the provenance DB
-	 *
-	 * @param name
-	 * @throws SQLException
-	 */
-	public void addProcessor(String name, String wfID, boolean isTopLevel) throws SQLException {
-		addProcessor(name, null, wfID, isTopLevel);
-	}
-
-	/**
-	 * add a processor to the static portion of the DB with given name, type and
-	 * wfnameRef scope
-	 *
-	 * @param name
-	 * @param type
-	 * @param wfNameRef
-	 * @throws SQLException
-	 */
-	public void addProcessor(String name, String type, String wfNameRef, boolean isTopLevel)
-	throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Processor (pname, type, wfInstanceRef, isTopLevel) VALUES (?,?,?,?)");
-
-			ps.setString(1, name);
-			ps.setString(2, type);
-			ps.setString(3, wfNameRef);
-			ps.setBoolean(4, isTopLevel);
-
-			ps.executeUpdate();
-		} catch (InstantiationException e1) {
-			logger.warn("Error inserting record for Processor", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error inserting record for Processor", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error inserting record for Processor", e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-
-	}
-
-	public void addProcessorBinding(ProcBinding pb) throws SQLException {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO ProcBinding (wfNameRef, pnameRef, execIDRef, iteration, actName) VALUES(?,?,?,?,?)");
-			ps.setString(1, pb.getWfNameRef());
-			ps.setString(2, pb.getPNameRef());
-			ps.setString(3, pb.getExecIDRef());
-			ps.setString(4, pb.getIterationVector());
-			ps.setString(5, pb.getActName());
-
-			ps.executeUpdate();
-			logger.debug("adding proc binding:\n "+ps.toString());
-
-		} catch (InstantiationException e1) {
-			logger.warn("Error inserting record for Processor binding", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error inserting record for Processor binding", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error inserting record for Processor binding", e1);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException e) {
-					logger.warn("Can't close connection", e);
-				}
-			}
-		}
-
-
-
-
-
-	}
-
-	public String addCollection(String processorId, String collId,
-			String parentCollectionId, String iteration, String portName,
-			String dataflowId) throws SQLException {
-		String newParentCollectionId = null;
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO Collection (PNameRef, wfInstanceRef, varNameRef, iteration, parentCollIdRef, collId) VALUES(?,?,?,?,?,?)");
-
-			if (parentCollectionId == null) {
-				// this is a top-level list
-				parentCollectionId = "TOP";
-			}
-
-			newParentCollectionId = collId;
-
-			ps.setString(1, processorId);
-			ps.setString(2, dataflowId);
-			ps.setString(3, portName);
-			ps.setString(4, iteration);
-			ps.setString(5, parentCollectionId);
-			ps.setString(6, collId);
-
-			ps.executeUpdate();
-
-		} catch (InstantiationException e1) {
-			logger.warn("Error inserting record for a collection", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error inserting record for a collection", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error inserting record for a collection", e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-
-		return newParentCollectionId;
-	}
-
-	/**
-	 * OBSOLETE<p/>
-	 * adds (dataRef, data) pairs to the Data table (only for string data)
-	 */
-	public void addData(String dataRef, String wfInstanceId, byte[] data)
-	throws SQLException {
-
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			PreparedStatement ps = null;
-			ps = connection.prepareStatement(
-			"INSERT INTO Data (dataReference,wfInstanceID,data) VALUES (?,?,?)");
-			ps.setString(1, dataRef);
-			ps.setString(2, wfInstanceId);
-			ps.setBytes(3, data);
-
-			ps.executeUpdate();
-
-			cnt++;
-
-		} catch (SQLException e) {
-			// the same ID will come in several times -- duplications are
-			// expected, don't panic
-		} catch (InstantiationException e) {
-			logger.warn("Error inserting record for a data", e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Error inserting record for a data", e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Error inserting record for a data", e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-	}
-
-	/**
-	 *
-	 * @param dataRef
-	 * @param wfInstanceId
-	 * @param data  the data in bytearray form, untyped
-	 * @param dve  an instance of a DataExtractor. This maps the data bytearray to a string according to the
-	 * semantics of the data prior to inserting the data into the DB. It's a bit of a hack used in this impl. to extract significant parts of an XMLEncoded bean
-	 * that can be then used in other contexts (mainly, in OPM graphs, where a raw byte array would not be interpreted).
-	 * @throws SQLException
-	 */
-	public void addVarBinding(VarBinding vb) throws SQLException {
-		PreparedStatement ps = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"INSERT INTO VarBinding (wfNameRef, pnameRef, wfInstanceRef, varNameRef, valueType, value, ref, collIdRef, iteration,positionInColl) VALUES(?,?,?,?,?,?,?,?,?,?)");
-
-			ps.setString(1, vb.getWfNameRef());
-			ps.setString(2, vb.getPNameRef());
-			ps.setString(3, vb.getWfInstanceRef());
-			ps.setString(4, vb.getVarNameRef());
-			ps.setString(5, vb.getValueType());
-			ps.setString(6, vb.getValue());
-			ps.setString(7, vb.getRef());
-			ps.setString(8, vb.getCollIDRef());
-			ps.setString(9, vb.getIteration());
-			ps.setInt(10, vb.getPositionInColl());
-
-			logger.debug("addVarBinding query: \n"+ps.toString());
-			ps.executeUpdate();
-			logger.debug("insert done");
-
-			cnt++;  // who uses this?
-
-		} catch (InstantiationException e1) {
-			logger.warn("Error inserting record for a varBinding", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error inserting record for a varBinding", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error inserting record for a varBinding", e1);
-//		} catch (SQLException e) {
-//			logger.warn("Var binding insert failed", e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-	}
-
-	/**
-	 * persists var v back to DB
-	 *
-	 * @param v
-	 * @throws SQLException
-	 */
-	public void updateVar(Var v) throws SQLException {
-		// Statement stmt;
-		PreparedStatement ps = null;
-
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"UPDATE Var SET type = ?, inputOrOutput=?, nestingLevel = ?," + "actualNestingLevel = ?, anlSet = ? , Var.order = ? WHERE varName = ? AND pnameRef = ? AND wfInstanceRef = ?");
-			ps.setString(1, v.getType());
-			int i = v.isInput() ? 1 : 0;
-			ps.setInt(2, i);
-			ps.setInt(3, v.getTypeNestingLevel());
-			ps.setInt(4, v.getActualNestingLevel());
-			int j = v.isANLset() ? 1 : 0;
-			ps.setInt(5, j);
-			ps.setInt(6, v.getPortNameOrder());
-			ps.setString(7, v.getVName());
-			ps.setString(8, v.getPName());
-			ps.setString(9, v.getWfInstanceRef());
-
-
-			ps.execute();
-		} catch (InstantiationException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Could not execute query: " + e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Could not execute query: " + e);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-	}
-
-	public void updateVarBinding(VarBinding vb) {
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"UPDATE VarBinding SET valueType = ?, value = ?, ref = ?, collIdRef = ?, positionInColl = ? "+
-			"WHERE varNameRef = ? AND wfInstanceRef = ? AND pnameRef = ? AND iteration = ?");
-
-			ps.setString(1, vb.getValueType());
-			ps.setString(2, vb.getValue());
-			ps.setString(3, vb.getRef());
-			ps.setString(4, vb.getCollIDRef());
-			ps.setInt(5, vb.getPositionInColl());
-			ps.setString(6, vb.getVarNameRef());
-			ps.setString(7, vb.getWfInstanceRef());
-			ps.setString(8, vb.getPNameRef());
-			ps.setString(9, vb.getIteration());
-
-			ps.executeUpdate();
-
-			cnt++;
-
-		} catch (SQLException e) {
-			logger.warn("****  insert failed for query ", e);
-		} catch (InstantiationException e) {
-			logger.warn("****  insert failed ", e);
-		} catch (IllegalAccessException e) {
-			logger.warn("****  insert failed ", e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("****  insert failed ", e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-	}
-
-	public void replaceCollectionRecord(NestedListNode nln, String prevPName,
-			String prevVarName) {
-
-		// Statement stmt;
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-					"DELETE FROM Collection WHERE collId = ? and wfInstanceRef = ?" + " and varNameRef = ? and pnameRef = ? and iteration = ?");
-			ps.setString(1, nln.getCollId());
-			ps.setString(2, nln.getWfInstanceRef());
-			ps.setString(3, prevVarName);
-			ps.setString(4, prevPName);
-			ps.setString(5, nln.getIteration());
-
-			int result = ps.executeUpdate();
-
-		} catch (SQLException e) {
-			logger.warn("Error replacing collection record", e);
-		} catch (InstantiationException e) {
-			logger.warn("Error replacing collection record", e);
-		} catch (IllegalAccessException e) {
-			logger.warn("Error replacing collection record", e);
-		} catch (ClassNotFoundException e) {
-			logger.warn("Error replacing collection record", e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection", ex);
-				}
-			}
-		}
-
-		try {
-			addCollection(prevPName, nln.getCollId(), nln.getParentCollIdRef(),
-					nln.getIteration(), prevVarName, nln.getWfInstanceRef());
-		} catch (SQLException e) {
-			logger.warn("insert failed due to [" + e.getMessage() + "]");
-		}
-	}
-
-	/**
-	 * deletes DB contents for the static structures -- called prior to each run
-	 *
-	 * @throws SQLException
-	 */
-	public void clearDBStatic() throws SQLException {
-		String q = null;
-
-		Statement stmt = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-		} catch (InstantiationException e1) {
-			logger.error("Problem clearing static DB: " + e1);
-		} catch (IllegalAccessException e1) {
-			logger.error("Problem clearing static DB: " + e1);
-		} catch (ClassNotFoundException e1) {
-			logger.error("Problem clearing static DB: " + e1);
-		}
-		try {
-			q = "DELETE FROM Workflow";
-
-			stmt.executeUpdate(q);
-
-			q = "DELETE FROM Processor";
-			stmt.executeUpdate(q);
-
-			q = "DELETE FROM Arc";
-			stmt.executeUpdate(q);
-
-			q = "DELETE FROM Var";
-
-			stmt.executeUpdate(q);
-		} catch (SQLException e) {
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		logger.info("DB cleared STATIC");
-	}
-
-	/**
-	 * deletes DB contents for the static structures -- called prior to each run
-	 *
-	 * @throws SQLException
-	 */
-	public void clearDBStatic(String wfID) throws SQLException {
-		String q = null;
-
-
-		PreparedStatement ps = null;
-		Connection connection = null;
-		try {
-			connection = getConnection();
-			ps = connection.prepareStatement(
-			"DELETE FROM Workflow WHERE wfname = ?");
-			ps.setString(1, wfID);
-			ps.executeUpdate();
-			ps = connection.prepareStatement(
-			"DELETE FROM Processor WHERE wfInstanceRef = ?");
-			ps.setString(1, wfID);
-			ps.executeUpdate();
-			ps = connection.prepareStatement(
-			"DELETE FROM Arc WHERE wfInstanceRef = ?");
-			ps.setString(1, wfID);
-			ps.executeUpdate();
-			ps = connection.prepareStatement(
-			"DELETE FROM Var WHERE wfInstanceRef = ?");
-			ps.setString(1, wfID);
-			ps.executeUpdate();
-
-		} catch (InstantiationException e1) {
-			logger.warn("Error deleting provenance records", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error deleting provenance records", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error deleting provenance records", e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-
-		logger.info("DB cleared STATICfor wfID " + wfID);
-	}
-
-
-	public Set<String>  clearDBDynamic() throws SQLException {
-		return clearDBDynamic(null);
-	}
-
-	/**
-	 * deletes DB contents for all runs -- for testing purposes
-	 *
-	 * @throws SQLException
-	 */
-	public Set<String> clearDBDynamic(String runID) throws SQLException {
-		String q = null;
-
-		Set<String>  refsToRemove = collectValueReferences(runID);  // collect all relevant refs from VarBinding and Collection
-
-		Connection connection = null;
-		PreparedStatement ps = null;
-		try {
-			connection = getConnection();
-
-			if (runID != null) {
-				ps = connection.prepareStatement("DELETE FROM WfInstance WHERE instanceID = ?");
-				ps.setString(1, runID);
-			} else 
-				ps = connection.prepareStatement("DELETE FROM WfInstance");
-			ps.executeUpdate();
-
-			if (runID != null) {
-				ps = connection.prepareStatement("DELETE FROM ProcBinding WHERE execIDRef = ?");
-				ps.setString(1, runID);
-			} else 
-				ps = connection.prepareStatement("DELETE FROM ProcBinding");
-			ps.executeUpdate();
-
-			if (runID != null) {
-				ps = connection.prepareStatement("DELETE FROM Data WHERE wfInstanceID = ?");
-				ps.setString(1, runID);
-			} else 
-				ps = connection.prepareStatement("DELETE FROM Data");
-			ps.executeUpdate();
-
-			if (runID != null) {
-				ps = connection.prepareStatement("DELETE FROM VarBinding WHERE wfInstanceRef = ?");
-				ps.setString(1, runID);
-			} else 
-				ps = connection.prepareStatement("DELETE FROM VarBinding");
-			ps.executeUpdate();
-
-			if (runID != null) {
-				ps = connection.prepareStatement("DELETE FROM Collection WHERE wfInstanceRef = ?");
-				ps.setString(1, runID);
-			} else 
-				ps = connection.prepareStatement("DELETE FROM Collection");
-			ps.executeUpdate();
-
-
-		} catch (InstantiationException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		logger.info("DB cleared DYNAMIC");
-		return refsToRemove;
-	}
-
-
-
-	private Set<String> collectValueReferences(String runID) throws SQLException {
-
-		Set<String> refs = new HashSet<String>();
-
-		Connection connection = null;
-		PreparedStatement ps = null;
-
-		try {
-			connection = getConnection();
-
-			if (runID != null) {
-				ps = connection.prepareStatement("SELECT value FROM VarBinding WHERE wfInstanceRef = ?");
-				ps.setString(1, runID);
-			} else {
-				ps = connection.prepareStatement("SELECT value FROM VarBinding");
-			}
-			boolean success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-					refs.add(rs.getString("value"));
-				}
-			}
-
-			if (runID != null) {
-				ps = connection.prepareStatement("SELECT collId FROM Collection WHERE wfInstanceRef = ?");
-				ps.setString(1, runID);
-			} else {
-				ps = connection.prepareStatement("SELECT collId FROM Collection");
-			}
-			success = ps.execute();
-
-			if (success) {
-				ResultSet rs = ps.getResultSet();
-				while (rs.next()) {
-					refs.add(rs.getString("collId"));
-				}
-			}
-
-		} catch (InstantiationException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (SQLException e) {
-			logger.error("Problem collecting value references for: " + runID + " : " + e);  
-		} finally {
-			if (connection != null) {
-				connection.close();
-			}
-		}
-		return refs;
-	}
-
-
-
-	public void clearDD() {
-
-		Statement stmt = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			String q = "DELETE FROM DD";
-			stmt.executeUpdate(q);
-		} catch (InstantiationException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error execting delete query for provenance records", e1);
-		} catch (SQLException e) {
-			logger.warn("Error execting delete query for provenance records", e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection.", ex);
-				}
-			}
-		}
-	}
-
-	/**
-	 * used to support the implementation of
-	 *
-	 * @param pname
-	 * @param vFrom
-	 * @param valFrom
-	 * @param vTo
-	 * @param valTo
-	 * @param iteration
-	 * @param wfInstanceID
-	 */
-	// FIXME needs the db statement corrected
-	public void writeDDRecord(String pFrom, String vFrom, String valFrom,
-			String pTo, String vTo, String valTo, String iteration,
-			String wfInstanceID) {
-
-		Statement stmt = null;
-		Connection connection = null;
-
-		try {
-			connection = getConnection();
-			stmt = connection.createStatement();
-			String q = "INSERT INTO DD (PFrom,VFrom,valFrom,PTo,VTo,valTo,iteration,wfInstance) VALUES (" + "\'" + pFrom + "\'," + "\'" + vFrom + "\",  " + "valFrom = \"" + valFrom + "\", " + "PTo = \"" + pTo + "\", " + "VTo = \"" + vTo + "\", " + "valTo  = \"" + valTo + "\", " + "iteration = \"" + iteration + "\", " + "wfInstance = \"" + wfInstanceID + "\"; ";
-
-			stmt.executeUpdate(q);
-		} catch (InstantiationException e1) {
-			logger.warn("Error inserting record into DD", e1);
-		} catch (IllegalAccessException e1) {
-			logger.warn("Error inserting record into DD", e1);
-		} catch (ClassNotFoundException e1) {
-			logger.warn("Error inserting record into DD", e1);
-		} catch (SQLException e) {
-			logger.warn("Error inserting record into DD", e);
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException ex) {
-					logger.error("There was an error closing the database connection.", ex);
-				}
-			}
-		}
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java
deleted file mode 100644
index 72913fa..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/WorkflowDataProcessor.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.lineageservice;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowDataProvenanceItem;
-import net.sf.taverna.t2.provenance.lineageservice.utils.ProvenanceUtils;
-import net.sf.taverna.t2.provenance.lineageservice.utils.VarBinding;
-
-/**
- * @author paolo
- * this class manages the outputs from a workflow, as they come along through WorkflowData events
- */
-public class WorkflowDataProcessor {
-
-	private static Logger logger = Logger.getLogger(WorkflowDataProcessor.class);
-
-	// set of trees (impl as lists), one for each varname
-	// PM varname not enough must use the WFID as context as well, because the same output varname 
-	// may occur in multiple nested workflows 
-	Map<String, List<WorkflowDataNode>> workflowDataTrees = new HashMap<String, List<WorkflowDataNode>>();  
-
-	ProvenanceQuery pq=null;
-	ProvenanceWriter pw = null;
-
-	/**
-	 * adds the input ProvenanceItem event to the tree structure corresponding to the varname found in the item. 
-	 * Repeated invocations of this method incrementally reconstruct the tree structure for each of the workflow outputs
-	 * @param root
-	 */
-	public void addWorkflowDataItem(ProvenanceItem provenanceItem) {
-
-		WorkflowDataNode wdn = new WorkflowDataNode();
-		wdn.setVarName(((WorkflowDataProvenanceItem)provenanceItem).getPortName());
-		wdn.setValue(((WorkflowDataProvenanceItem)provenanceItem).getData().toString());
-		int[] index = ((WorkflowDataProvenanceItem)provenanceItem).getIndex();
-		String iterationToString = ProvenanceUtils.iterationToString(index);
-		wdn.setIndex(iterationToString);
-		wdn.setWorkflowID(((WorkflowDataProvenanceItem)provenanceItem).getWorkflowId());
-
-		if (wdn.getValue().contains("list")) wdn.setList(true);  // HACK
-		else wdn.setList(false);
-
-		// position this wdn into the tree associated to its varname
-		List<WorkflowDataNode> aTree = workflowDataTrees.get(wdn.getVarName());
-
-		if (aTree == null)  { // first item in the tree
-			aTree = new ArrayList<WorkflowDataNode>();
-			workflowDataTrees.put(wdn.getVarName(), aTree);
-		} else {
-			// update parent pointers
-			for (WorkflowDataNode aNode: aTree) {
-				if (isParent(wdn.getIndex(), aNode.getIndex())) {
-					aNode.setParent(wdn);
-
-					// set position in collection as the last index in the vector
-					aNode.setRelativePosition(getPosition(aNode));
-				}
-			}
-		}
-		aTree.add(wdn);
-	}
-
-
-
-
-	/**
-	 * writes records to VarBinding or Collection by traversing the trees<br/>
-	 * expect this to be invoked after workflow completion
-	 * @param wfInstanceRef  the runID
-	 * @param dataflowID the external name of the dataflow (not the UUID)
-	 */
-	public void processTrees(String dataflowID, String wfInstanceRef) {
-
-		logger.debug("processing output trees");
-
-		for (Map.Entry<String, List<WorkflowDataNode>> entry:workflowDataTrees.entrySet()) {
-
-			String varName = entry.getKey();
-			List<WorkflowDataNode> tree = entry.getValue();
-
-			VarBinding vb = null;
-
-			try {
-				logger.debug("storing tree for var "+varName+" in workflow with ID "+dataflowID+" and instance "+wfInstanceRef);
-				for (WorkflowDataNode node:tree) {
-
-					if (!node.getWorkflowID().equals(dataflowID)) continue;
-
-					if (node.isList) {
-
-						logger.debug("creating collection entry for "+
-								node.value+" with index "+
-								node.index);
-
-						if (node.getParent()!=null) {
-							logger.debug(" and parent "+node.parent.index);
-							// write a collection record to DB
-							getPw().addCollection(dataflowID, 
-									node.getValue(), 
-									node.getParent().getValue(), 
-									node.getIndex(), 
-									varName, 
-									wfInstanceRef);
-						} else {
-							getPw().addCollection(dataflowID, 
-									node.getValue(), 
-									null, 
-									node.getIndex(), 
-									varName, 
-									wfInstanceRef);							
-						}
-
-					} else {
-						logger.debug("creating VarBinding for "+node.value+" with index "+node.index);
-
-						vb = new VarBinding();
-
-						vb.setWfNameRef(dataflowID);
-						vb.setWfInstanceRef(wfInstanceRef);
-						
-						vb.setPNameRef(pq.getWorkflow(dataflowID).getExternalName());
-						
-						// vb.setValueType(); // TODO not sure what to set this to
-						vb.setVarNameRef(varName);
-						vb.setIterationVector(node.getIndex());
-						vb.setValue(node.getValue());
-
-						if (node.getParent()!=null) {
-							logger.debug(" in collection "+node.getParent().value+
-									" with index "+node.getParent().getIndex());
-
-							vb.setCollIDRef(node.getParent().getValue());
-							vb.setPositionInColl(node.getRelativePosition());
-
-						} else {
-							vb.setPositionInColl(1);  // default							
-						}						
-						getPw().addVarBinding(vb);
-					}
-				}
-			} catch (SQLException e) {
-				logger.debug("Problem processing trees for workflow: " +dataflowID + " instance: " + wfInstanceRef + " : "+
-						" updating instead of inserting");
-				getPw().updateVarBinding(vb);
-			}
-
-		}
-
-	}
-
-
-
-	/**
-	 * @param node
-	 * @return the last digit in the index 
-	 */
-	private int getPosition(WorkflowDataNode node) {
-
-		String[] vector = node.getIndex().substring(1, node.getIndex().length()-1).split(",");
-		//TODO need some logic  here to avoid trying to parse "" as integer, this is my try
-
-		//logger.debug("Vector length is " + vector.length);
-		//logger.debug("get position is " + vector[vector.length-1]);
-		if ((vector[vector.length-1]).equals("")) {
-			return 1;
-		}
-		return Integer.parseInt(vector[vector.length-1]) +1;
-	}
-
-
-
-	private boolean isParent(String index1, String index2) {
-
-		// strip first and last '[' ']'
-		String index11 = index1.substring(1, index1.length()-1);
-		String index22 = index2.substring(1, index2.length()-1);
-
-		String[] tokens1 = index11.split(",");
-		String[] tokens2 = index22.split(",");
-
-		// [] cannot be parent of [x1,x2,...]  with >= 2 elements
-		if (index11.equals("") && tokens2.length>1) return false;
-
-		// [] is parent of any [x] 
-		if (index11.equals("") && tokens2.length==1) return true;
-
-		// [x1,x2, ...,xk] cannot be parent of [x1,x2,...xh] when k < h-1 
-		// because [x1,x2,...xh] is more than one level deeper than [x1,x2, ...,xk] 
-		if (tokens1.length != tokens2.length -1) return false;
-
-		return (index22.startsWith(index11));
-	}
-
-
-	class WorkflowDataNode {
-
-		String varName;
-		String value;
-		String index;
-		String workflowID;
-		int  relativePosition;
-		boolean isList;
-		WorkflowDataNode parent;
-
-		/**
-		 * @return the value
-		 */
-		public String getValue() {
-			return value;
-		}
-		/**
-		 * @param value the value to set
-		 */
-		public void setValue(String value) {
-			this.value = value;
-		}
-		/**
-		 * @return the index
-		 */
-		public String getIndex() {
-			return index;
-		}
-		/**
-		 * @param index the index to set
-		 */
-		public void setIndex(String index) {
-			this.index = index;
-		}
-
-		/**
-		 * @return the varName
-		 */
-		public String getVarName() {
-			return varName;
-		}
-		/**
-		 * @param varName the varName to set
-		 */
-		public void setVarName(String varName) {
-			this.varName = varName;
-		}
-		/**
-		 * @return the isList
-		 */
-		public boolean isList() {
-			return isList;
-		}
-		/**
-		 * @param isList the isList to set
-		 */
-		public void setList(boolean isList) {
-			this.isList = isList;
-		}
-		/**
-		 * @return the parent
-		 */
-		public WorkflowDataNode getParent() {
-			return parent;
-		}
-		/**
-		 * @param parent the parent to set
-		 */
-		public void setParent(WorkflowDataNode parent) {
-			this.parent = parent;
-		}
-		/**
-		 * @return the relativePosition
-		 */
-		public int getRelativePosition() {
-			return relativePosition;
-		}
-		/**
-		 * @param relativePosition the relativePosition to set
-		 */
-		public void setRelativePosition(int relativePosition) {
-			this.relativePosition = relativePosition;
-		}
-		/**
-		 * @return the workflowID
-		 */
-		public String getWorkflowID() {
-			return workflowID;
-		}
-		/**
-		 * @param workflowID the workflowID to set
-		 */
-		public void setWorkflowID(String workflowID) {
-			this.workflowID = workflowID;
-		}
-
-	}
-
-
-
-	/**
-	 * @return the pq
-	 */
-	public ProvenanceQuery getPq() {
-		return pq;
-	}
-
-
-
-	/**
-	 * @param pq the pq to set
-	 */
-	public void setPq(ProvenanceQuery pq) {
-		this.pq = pq;
-	}
-
-
-
-	/**
-	 * @return the pw
-	 */
-	public ProvenanceWriter getPw() {
-		return pw;
-	}
-
-
-
-	/**
-	 * @param pw the pw to set
-	 */
-	public void setPw(ProvenanceWriter pw) {
-		this.pw = pw;
-	}
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ActivityType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ActivityType.java
deleted file mode 100644
index b466291..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ActivityType.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-import net.sf.taverna.t2.provenance.lineageservice.types.ProvenanceEventType;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class ActivityType  implements ProvenanceEventType {
-    private IterationType[] iteration;
-
-    private java.lang.String id;  // attribute
-
-    public ActivityType() {
-    }
-
-    public ActivityType(
-           IterationType[] iteration,
-           java.lang.String id) {
-           this.iteration = iteration;
-           this.id = id;
-    }
-
-
-    /**
-     * Gets the iteration value for this ActivityType.
-     * 
-     * @return iteration
-     */
-    public IterationType[] getIteration() {
-        return iteration;
-    }
-
-
-    /**
-     * Sets the iteration value for this ActivityType.
-     * 
-     * @param iteration
-     */
-    public void setIteration(IterationType[] iteration) {
-        this.iteration = iteration;
-    }
-
-    public IterationType getIteration(int i) {
-        return this.iteration[i];
-    }
-
-    public void setIteration(int i, IterationType _value) {
-        this.iteration[i] = _value;
-    }
-
-
-    /**
-     * Gets the id value for this ActivityType.
-     * 
-     * @return id
-     */
-    public java.lang.String getId() {
-        return id;
-    }
-
-
-    /**
-     * Sets the id value for this ActivityType.
-     * 
-     * @param id
-     */
-    public void setId(java.lang.String id) {
-        this.id = id;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/DataDocumentType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/DataDocumentType.java
deleted file mode 100644
index fcbfa58..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/DataDocumentType.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class DataDocumentType  implements ProvenanceEventType {
-    private java.lang.String reference;
-
-    private java.lang.String id;  // attribute
-
-    public DataDocumentType() {
-    }
-
-    public DataDocumentType(
-           java.lang.String reference,
-           java.lang.String id) {
-           this.reference = reference;
-           this.id = id;
-    }
-
-
-    /**
-     * Gets the reference value for this DataDocumentType.
-     * 
-     * @return reference
-     */
-    public java.lang.String getReference() {
-        return reference;
-    }
-
-
-    /**
-     * Sets the reference value for this DataDocumentType.
-     * 
-     * @param reference
-     */
-    public void setReference(java.lang.String reference) {
-        this.reference = reference;
-    }
-
-
-    /**
-     * Gets the id value for this DataDocumentType.
-     * 
-     * @return id
-     */
-    public java.lang.String getId() {
-        return id;
-    }
-
-
-    /**
-     * Sets the id value for this DataDocumentType.
-     * 
-     * @param id
-     */
-    public void setId(java.lang.String id) {
-        this.id = id;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/IterationType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/IterationType.java
deleted file mode 100644
index 8074c47..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/IterationType.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class IterationType  implements ProvenanceEventType {
-    private PortsSequenceType inputdata;
-
-    private PortsSequenceType outputdata;
-
-    private java.lang.String id;  // attribute
-
-    public IterationType() {
-    }
-
-    public IterationType(
-           PortsSequenceType inputdata,
-           PortsSequenceType outputdata,
-           java.lang.String id) {
-           this.inputdata = inputdata;
-           this.outputdata = outputdata;
-           this.id = id;
-    }
-
-
-    /**
-     * Gets the inputdata value for this IterationType.
-     * 
-     * @return inputdata
-     */
-    public PortsSequenceType getInputdata() {
-        return inputdata;
-    }
-
-
-    /**
-     * Sets the inputdata value for this IterationType.
-     * 
-     * @param inputdata
-     */
-    public void setInputdata(PortsSequenceType inputdata) {
-        this.inputdata = inputdata;
-    }
-
-
-    /**
-     * Gets the outputdata value for this IterationType.
-     * 
-     * @return outputdata
-     */
-    public PortsSequenceType getOutputdata() {
-        return outputdata;
-    }
-
-
-    /**
-     * Sets the outputdata value for this IterationType.
-     * 
-     * @param outputdata
-     */
-    public void setOutputdata(PortsSequenceType outputdata) {
-        this.outputdata = outputdata;
-    }
-
-
-    /**
-     * Gets the id value for this IterationType.
-     * 
-     * @return id
-     */
-    public java.lang.String getId() {
-        return id;
-    }
-
-
-    /**
-     * Sets the id value for this IterationType.
-     * 
-     * @param id
-     */
-    public void setId(java.lang.String id) {
-        this.id = id;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/LiteralType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/LiteralType.java
deleted file mode 100644
index aad5ea1..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/LiteralType.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class LiteralType  implements ProvenanceEventType {
-    private java.lang.String id;  // attribute
-
-    public LiteralType() {
-    }
-
-    public LiteralType(
-           java.lang.String id) {
-           this.id = id;
-    }
-
-
-    /**
-     * Gets the id value for this LiteralType.
-     * 
-     * @return id
-     */
-    public java.lang.String getId() {
-        return id;
-    }
-
-
-    /**
-     * Sets the id value for this LiteralType.
-     * 
-     * @param id
-     */
-    public void setId(java.lang.String id) {
-        this.id = id;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/PortType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/PortType.java
deleted file mode 100644
index 5e0d1a4..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/PortType.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- *
- * @author Paolo Missier
- *
- */
-public class PortType  implements ProvenanceEventType {
-    private DataDocumentType dataDocument;
-
-    private LiteralType literal;
-
-    private java.lang.String name;  // attribute
-
-    public PortType() {
-    }
-
-    public PortType(
-           DataDocumentType dataDocument,
-           LiteralType literal,
-           java.lang.String name) {
-           this.dataDocument = dataDocument;
-           this.literal = literal;
-           this.name = name;
-    }
-
-
-    /**
-     * Gets the dataDocument value for this PortType.
-     * 
-     * @return dataDocument
-     */
-    public DataDocumentType getDataDocument() {
-        return dataDocument;
-    }
-
-
-    /**
-     * Sets the dataDocument value for this PortType.
-     * 
-     * @param dataDocument
-     */
-    public void setDataDocument(DataDocumentType dataDocument) {
-        this.dataDocument = dataDocument;
-    }
-
-
-    /**
-     * Gets the literal value for this PortType.
-     * 
-     * @return literal
-     */
-    public LiteralType getLiteral() {
-        return literal;
-    }
-
-
-    /**
-     * Sets the literal value for this PortType.
-     * 
-     * @param literal
-     */
-    public void setLiteral(LiteralType literal) {
-        this.literal = literal;
-    }
-
-
-    /**
-     * Gets the name value for this PortType.
-     * 
-     * @return name
-     */
-    public java.lang.String getName() {
-        return name;
-    }
-
-
-    /**
-     * Sets the name value for this PortType.
-     * 
-     * @param name
-     */
-    public void setName(java.lang.String name) {
-        this.name = name;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/PortsSequenceType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/PortsSequenceType.java
deleted file mode 100644
index 54c5844..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/PortsSequenceType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class PortsSequenceType  implements ProvenanceEventType {
-    private PortType[] port;
-
-    public PortsSequenceType() {
-    }
-
-    public PortsSequenceType(
-           PortType[] port) {
-           this.port = port;
-    }
-
-
-    /**
-     * Gets the port value for this PortsSequenceType.
-     * 
-     * @return port
-     */
-    public PortType[] getPort() {
-        return port;
-    }
-
-
-    /**
-     * Sets the port value for this PortsSequenceType.
-     * 
-     * @param port
-     */
-    public void setPort(PortType[] port) {
-        this.port = port;
-    }
-
-    public PortType getPort(int i) {
-        return this.port[i];
-    }
-
-    public void setPort(int i, PortType _value) {
-        this.port[i] = _value;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProcessType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProcessType.java
deleted file mode 100644
index c33836a..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProcessType.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class ProcessType  implements ProvenanceEventType {
-    private ProcessorType[] processor;
-
-    private java.lang.String dataflowID;  // attribute
-
-    private java.lang.String facadeID;  // attribute
-
-    public ProcessType() {
-    }
-
-    public ProcessType(
-           ProcessorType[] processor,
-           java.lang.String dataflowID,
-           java.lang.String facadeID) {
-           this.processor = processor;
-           this.dataflowID = dataflowID;
-           this.facadeID = facadeID;
-    }
-
-
-    /**
-     * Gets the processor value for this ProcessType.
-     * 
-     * @return processor
-     */
-    public ProcessorType[] getProcessor() {
-        return processor;
-    }
-
-
-    /**
-     * Sets the processor value for this ProcessType.
-     * 
-     * @param processor
-     */
-    public void setProcessor(ProcessorType[] processor) {
-        this.processor = processor;
-    }
-
-    public ProcessorType getProcessor(int i) {
-        return this.processor[i];
-    }
-
-    public void setProcessor(int i, ProcessorType _value) {
-        this.processor[i] = _value;
-    }
-
-
-    /**
-     * Gets the dataflowID value for this ProcessType.
-     * 
-     * @return dataflowID
-     */
-    public java.lang.String getDataflowID() {
-        return dataflowID;
-    }
-
-
-    /**
-     * Sets the dataflowID value for this ProcessType.
-     * 
-     * @param dataflowID
-     */
-    public void setDataflowID(java.lang.String dataflowID) {
-        this.dataflowID = dataflowID;
-    }
-
-
-    /**
-     * Gets the facadeID value for this ProcessType.
-     * 
-     * @return facadeID
-     */
-    public java.lang.String getFacadeID() {
-        return facadeID;
-    }
-
-
-    /**
-     * Sets the facadeID value for this ProcessType.
-     * 
-     * @param facadeID
-     */
-    public void setFacadeID(java.lang.String facadeID) {
-        this.facadeID = facadeID;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProcessorType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProcessorType.java
deleted file mode 100644
index 7de7a68..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProcessorType.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * 
- * @author Paolo Missier
- *
- */
-public class ProcessorType  implements ProvenanceEventType {
-    private ActivityType[] activity;
-
-    private java.lang.String id;  // attribute
-
-    public ProcessorType() {
-    }
-
-    public ProcessorType(
-           ActivityType[] activity,
-           java.lang.String id) {
-           this.activity = activity;
-           this.id = id;
-    }
-
-
-    /**
-     * Gets the activity value for this ProcessorType.
-     * 
-     * @return activity
-     */
-    public ActivityType[] getActivity() {
-        return activity;
-    }
-
-
-    /**
-     * Sets the activity value for this ProcessorType.
-     * 
-     * @param activity
-     */
-    public void setActivity(ActivityType[] activity) {
-        this.activity = activity;
-    }
-
-    public ActivityType getActivity(int i) {
-        return this.activity[i];
-    }
-
-    public void setActivity(int i, ActivityType _value) {
-        this.activity[i] = _value;
-    }
-
-
-    /**
-     * Gets the id value for this ProcessorType.
-     * 
-     * @return id
-     */
-    public java.lang.String getId() {
-        return id;
-    }
-
-
-    /**
-     * Sets the id value for this ProcessorType.
-     * 
-     * @param id
-     */
-    public void setId(java.lang.String id) {
-        this.id = id;
-    }
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProvenanceEventType.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProvenanceEventType.java
deleted file mode 100644
index 3dddb3e..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/types/ProvenanceEventType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.types;
-
-/**
- * Used by an implementation of Provenance to identify the item type
- * 
- * @author Paolo Missier
- * 
- */
-public interface ProvenanceEventType {
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Arc.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Arc.java
deleted file mode 100644
index 524c9d8..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Arc.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-
-/**
- * @author paolo
- * 
- */
-
-public class Arc {
-	private
-	String identifier;
-
-	String wfInstanceRef;
-	String sourcePnameRef;
-	String sourceVarNameRef;
-	String sinkPnameRef;
-	String sinkVarNameRef;
-
-	/**
-	 * @return the wfInstanceRef
-	 */
-	public String getWfInstanceRef() {
-		return wfInstanceRef;
-	}
-
-	/**
-	 * @param wfInstanceRef
-	 *            the wfInstanceRef to set
-	 */
-	public void setWfInstanceRef(String wfInstanceRef) {
-		this.wfInstanceRef = wfInstanceRef;
-	}
-
-	/**
-	 * @return the sourcePnameRef
-	 */
-	public String getSourcePnameRef() {
-		return sourcePnameRef;
-	}
-
-	/**
-	 * @param sourcePnameRef
-	 *            the sourcePnameRef to set
-	 */
-	public void setSourcePnameRef(String sourcePnameRef) {
-		this.sourcePnameRef = sourcePnameRef;
-	}
-
-	/**
-	 * @return the sourceVarNameRef
-	 */
-	public String getSourceVarNameRef() {
-		return sourceVarNameRef;
-	}
-
-	/**
-	 * @param sourceVarNameRef
-	 *            the sourceVarNameRef to set
-	 */
-	public void setSourceVarNameRef(String sourceVarNameRef) {
-		this.sourceVarNameRef = sourceVarNameRef;
-	}
-
-	/**
-	 * @return the sinkPnameRef
-	 */
-	public String getSinkPnameRef() {
-		return sinkPnameRef;
-	}
-
-	/**
-	 * @param sinkPnameRef
-	 *            the sinkPnameRef to set
-	 */
-	public void setSinkPnameRef(String sinkPnameRef) {
-		this.sinkPnameRef = sinkPnameRef;
-	}
-
-	/**
-	 * @return the sinkVarNameRef
-	 */
-	public String getSinkVarNameRef() {
-		return sinkVarNameRef;
-	}
-
-	/**
-	 * @param sinkVarNameRef
-	 *            the sinkVarNameRef to set
-	 */
-	public void setSinkVarNameRef(String sinkVarNameRef) {
-		this.sinkVarNameRef = sinkVarNameRef;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Collection.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Collection.java
deleted file mode 100644
index c0d06dd..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Collection.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-
-public class Collection {
-	private String identifier;
-	
-	private String parentIdentifier;
-	
-	private String workflowIdentifier;
-	
-	private String processorName;
-	
-	private String varName;
-	
-	private String iteration;
-	
-	private String collId;
-	
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public String getParentIdentifier() {
-		return parentIdentifier;
-	}
-
-	public void setParentIdentifier(String parentIdentifier) {
-		this.parentIdentifier = parentIdentifier;
-	}
-
-	public String getWorkflowIdentifier() {
-		return workflowIdentifier;
-	}
-
-	public void setWorkflowIdentifier(String workflowIdentifier) {
-		this.workflowIdentifier = workflowIdentifier;
-	}
-
-	public String getProcessorName() {
-		return processorName;
-	}
-
-	public void setProcessorName(String processorName) {
-		this.processorName = processorName;
-	}
-
-	public String getVarName() {
-		return varName;
-	}
-
-	public void setVarName(String varName) {
-		this.varName = varName;
-	}
-
-	public String getIteration() {
-		return iteration;
-	}
-
-	public void setIteration(String iteration) {
-		this.iteration = iteration;
-	}
-
-	public void setCollId(String collId) {
-		this.collId = collId;
-	}
-
-	public String getCollId() {
-		return collId;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/DDRecord.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/DDRecord.java
deleted file mode 100644
index c835fd6..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/DDRecord.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-/**
- * a simple bean to hold a database record from the DD table
- * @author paolo
- *
- */
-public class DDRecord {
-
-	String  PFrom;
-	String  PTo;
-	String  vTo;
-	String  valTo;
-	String  vFrom;
-	String  valFrom;
-	String iteration;
-	public boolean isInput;
-	
-	public String toString() {
-		return new String("proc: "+PFrom+" vFrom: "+vFrom+" valFrom: "+valFrom+"PTo: "+PTo+" vTo: "+vTo+" valTo: "+valTo);
-	}
-	
-	
-	/**
-	 * @return the vTo
-	 */
-	public String getVTo() {
-		return vTo;
-	}
-	/**
-	 * @param to the vTo to set
-	 */
-	public void setVTo(String to) {
-		vTo = to;
-	}
-	/**
-	 * @return the valTo
-	 */
-	public String getValTo() {
-		return valTo;
-	}
-	/**
-	 * @param valTo the valTo to set
-	 */
-	public void setValTo(String valTo) {
-		this.valTo = valTo;
-	}
-	/**
-	 * @return the vFrom
-	 */
-	public String getVFrom() {
-		return vFrom;
-	}
-	/**
-	 * @param from the vFrom to set
-	 */
-	public void setVFrom(String from) {
-		vFrom = from;
-	}
-	/**
-	 * @return the valFrom
-	 */
-	public String getValFrom() {
-		return valFrom;
-	}
-	/**
-	 * @param valFrom the valFrom to set
-	 */
-	public void setValFrom(String valFrom) {
-		this.valFrom = valFrom;
-	}
-
-
-	/**
-	 * @return the isInput
-	 */
-	public boolean isInput() {
-		return isInput;
-	}
-
-
-	/**
-	 * @param isInput the isInput to set
-	 */
-	public void setInput(boolean isInput) {
-		this.isInput = isInput;
-	}
-
-
-	/**
-	 * @return the pFrom
-	 */
-	public String getPFrom() {
-		return PFrom;
-	}
-
-
-	/**
-	 * @param from the pFrom to set
-	 */
-	public void setPFrom(String from) {
-		PFrom = from;
-	}
-
-
-	/**
-	 * @return the pTo
-	 */
-	public String getPTo() {
-		return PTo;
-	}
-
-
-	/**
-	 * @param to the pTo to set
-	 */
-	public void setPTo(String to) {
-		PTo = to;
-	}
-
-
-	/**
-	 * @return the iteration
-	 */
-	public String getIteration() {
-		return iteration;
-	}
-
-
-	/**
-	 * @param iteration the iteration to set
-	 */
-	public void setIteration(String iteration) {
-		this.iteration = iteration;
-	}
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/DataValueExtractor.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/DataValueExtractor.java
deleted file mode 100644
index be4179b..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/DataValueExtractor.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-/**
- * @author paolo
- *
- */
-public interface DataValueExtractor {
-
-	/**
-	 * extracts a printable string from a more complex object. This is not the same as toString() as 
-	 * it is applied to an object, rather than being a method on the object itself
-	 * @param complexContent should really be a byte array FIXME
-	 * @return
-	 */
-	public String extractString(Object complexContent);
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/NestedListNode.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/NestedListNode.java
deleted file mode 100644
index 4c73f07..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/NestedListNode.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-/**
- * @author paolo
- *
- */
-public class NestedListNode {
-
-	String collId;
-	String parentCollIdRef;
-	String wfInstanceRef;
-	String PNameRef;
-	String varNameRef;
-	String iteration;
-	/**
-	 * @return the collId
-	 */
-	public String getCollId() {
-		return collId;
-	}
-	/**
-	 * @param collId the collId to set
-	 */
-	public void setCollId(String collId) {
-		this.collId = collId;
-	}
-	/**
-	 * @return the parentCollIdRef
-	 */
-	public String getParentCollIdRef() {
-		return parentCollIdRef;
-	}
-	/**
-	 * @param parentCollIdRef the parentCollIdRef to set
-	 */
-	public void setParentCollIdRef(String parentCollIdRef) {
-		this.parentCollIdRef = parentCollIdRef;
-	}
-	/**
-	 * @return the wfInstanceRef
-	 */
-	public String getWfInstanceRef() {
-		return wfInstanceRef;
-	}
-	/**
-	 * @param wfInstanceRef the wfInstanceRef to set
-	 */
-	public void setWfInstanceRef(String wfInstanceRef) {
-		this.wfInstanceRef = wfInstanceRef;
-	}
-	/**
-	 * @return the pNameRef
-	 */
-	public String getPNameRef() {
-		return PNameRef;
-	}
-	/**
-	 * @param nameRef the pNameRef to set
-	 */
-	public void setPNameRef(String nameRef) {
-		PNameRef = nameRef;
-	}
-	/**
-	 * @return the varNameRef
-	 */
-	public String getVarNameRef() {
-		return varNameRef;
-	}
-	/**
-	 * @param varNameRef the varNameRef to set
-	 */
-	public void setVarNameRef(String varNameRef) {
-		this.varNameRef = varNameRef;
-	}
-	/**
-	 * @return the iteration
-	 */
-	public String getIteration() {
-		return iteration;
-	}
-	/**
-	 * @param iteration the iteration to set
-	 */
-	public void setIteration(String iteration) {
-		this.iteration = iteration;
-	}
-	
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProcBinding.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProcBinding.java
deleted file mode 100644
index 2514fbe..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProcBinding.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-
-
-/**
- * @author Paolo Missier
- *
- */
-public class ProcBinding {
-	private String identifier;
-
-	private String pNameRef;
-	private String execIDRef;
-	private String wfNameRef;
-	private String actName;
-	private String iterationVector;
-	
-	
-	public String toString() {
-		
-		StringBuffer sb = new StringBuffer();
-		
-		sb.append("**** ProcBinding: \n").
-			append("execIDRef = "+execIDRef+"\n").
-			append("wfNameRef = "+wfNameRef+"\n").
-			append("PNameRef = "+pNameRef+"\n").
-			append("actName = "+actName+"\n").
-			append("iteration = "+iterationVector+"\n");
-
-		return sb.toString();
-	}
-	
-	/**
-	 * @return the pNameRef
-	 */
-	public String getPNameRef() {
-		return pNameRef;
-	}
-	/**
-	 * @param nameRef the pNameRef to set
-	 */
-	public void setPNameRef(String nameRef) {
-		pNameRef = nameRef;
-	}
-	/**
-	 * @return the execIDRef
-	 */
-	public String getExecIDRef() {
-		return execIDRef;
-	}
-	/**
-	 * @param execIDRef the execIDRef to set
-	 */
-	public void setExecIDRef(String execIDRef) {
-		this.execIDRef = execIDRef;
-	}
-	/**
-	 * @return the actName
-	 */
-	public String getActName() {
-		return actName;
-	}
-	/**
-	 * @param actName the actName to set
-	 */
-	public void setActName(String actName) {
-		this.actName = actName;
-	}
-	/**
-	 * @return the iteration
-	 */
-	public String getIterationVector() {
-		return iterationVector;
-	}
-	/**
-	 * @param iterationVector the iteration to set
-	 */
-	public void setIterationVector(String iterationVector) {
-		this.iterationVector = iterationVector;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	/**
-	 * @return the wfNameRef
-	 */
-	public String getWfNameRef() {
-		return wfNameRef;
-	}
-
-	/**
-	 * @param wfNameRef the wfNameRef to set
-	 */
-	public void setWfNameRef(String wfNameRef) {
-		this.wfNameRef = wfNameRef;
-	}
-	
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProvenanceProcessor.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProvenanceProcessor.java
deleted file mode 100644
index d8f4bd5..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProvenanceProcessor.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-
-/**
- * a Var that has no pName is either a WF input or output, depending on isInput
- * @author Paolo Missier
- */
-public class ProvenanceProcessor {
-	
-	String identifier;
-	String pname;
-	String wfInstanceRef;
-	String workflowExternalName;
-	String type;
-	
-	
-	public String toString() {
-
-		StringBuffer sb = new StringBuffer();
-		sb.append("PROCESSOR: ****").
-		append("\nworkflow: "+getWfInstanceRef()).
-		append("\nworkflow name "+getWorkflowExternalName()).
-		append("\nprocessor name: "+getPname()).
-		append("\ntype: "+getType());
-
-		return sb.toString();
-	}
-
-	
-	/**
-	 * @return the wfInstanceRef
-	 */
-	public String getWfInstanceRef() {
-		return wfInstanceRef;
-	}
-	/**
-	 * @param wfInstanceRef the wfInstanceRef to set
-	 */
-	public void setWfInstanceRef(String wfInstanceRef) {
-		this.wfInstanceRef = wfInstanceRef;
-	}
-	/**
-	 * @return the type
-	 */
-	public String getType() {
-		return type;
-	}
-	/**
-	 * @param type the type to set
-	 */
-	public void setType(String type) {
-		this.type = type;
-	}
-	/**
-	 * @return the pname
-	 */
-	public String getPname() {
-		return pname;
-	}
-	/**
-	 * @param pname the pname to set
-	 */
-	public void setPname(String pname) {
-		this.pname = pname;
-	}
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-	public String getIdentifier() {
-		return identifier;
-	}
-
-
-	/**
-	 * @return the workflowExternalName
-	 */
-	public String getWorkflowExternalName() {
-		return workflowExternalName;
-	}
-
-
-	/**
-	 * @param workflowExternalName the workflowExternalName to set
-	 */
-	public void setWorkflowExternalName(String workflowExternalName) {
-		this.workflowExternalName = workflowExternalName;
-	}
-
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProvenanceUtils.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProvenanceUtils.java
deleted file mode 100644
index 713c670..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/ProvenanceUtils.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.provenance.item.DataProvenanceItem;
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-
-import org.jdom.Element;
-
-public class ProvenanceUtils {
-	
-	public static String iterationToString(int[] iteration) {
-		String result = "[";
-		for (int i = 0; i < iteration.length; i++) {
-			result += iteration[i];
-			if (i < (iteration.length - 1))
-				result += ",";
-		}
-		result += "]";
-		return result;
-	}
-	
-	/**
-	 * Returns an Element representing the data item, identfied as either input
-	 * or output. References to data are currently resolved to their actual
-	 * values
-	 */
-	public static Element getDataItemAsXML(DataProvenanceItem provenanceItem) {
-		String name;
-		if (provenanceItem.getEventType().equals(SharedVocabulary.INPUTDATA_EVENT_TYPE)) {
-			name = "inputdata";
-		} else {
-			name = "outputdata";
-		}
-		Element result = new Element(name);
-		result.setAttribute("identifier", provenanceItem.getIdentifier());
-		result.setAttribute("processID", provenanceItem.getProcessId());
-		result.setAttribute("parent", provenanceItem.getParentId());
-		for (String port : provenanceItem.getDataMap().keySet()) {
-			Element portElement = new Element("port");
-			portElement.setAttribute("name", port);
-			portElement.setAttribute("depth", Integer.toString(provenanceItem.getDataMap()
-					.get(port).getDepth()));
-			result.addContent(portElement);
-			portElement.addContent(resolveToElement(provenanceItem.getDataMap().get(port), provenanceItem.getReferenceService()));
-			Element element = new Element("some_stuff");
-			portElement.addContent(element);
-		}
-		return result;
-	}
-	
-	/**
-	 * Given a {@link T2Reference} return all the other {@link T2Reference}s
-	 * which it contains as an XML Element.
-	 * 
-	 * @param entityIdentifier
-	 * @return
-	 * @throws NotFoundException
-	 * @throws RetrievalException
-	 */
-	private static org.jdom.Element resolveToElement(T2Reference reference, ReferenceService referenceService) {
-
-		org.jdom.Element element = new org.jdom.Element("resolvedReference");
-		if (reference.getReferenceType().equals(T2ReferenceType.ErrorDocument)) {
-			ErrorDocument error = referenceService.getErrorDocumentService()
-					.getError(reference);
-
-			element.setName("error");
-			element.setAttribute("id", reference.toString());
-			org.jdom.Element messageElement = new org.jdom.Element("message");
-			messageElement.addContent(error.getExceptionMessage());
-			element.addContent(messageElement);
-		} else if (reference.getReferenceType().equals(
-				T2ReferenceType.ReferenceSet)) {
-			element.setName("referenceSet");
-			element.setAttribute("id", reference.toString());
-			ReferenceSet referenceSet = referenceService
-					.getReferenceSetService().getReferenceSet(reference);
-			Set<ExternalReferenceSPI> externalReferences = referenceSet
-					.getExternalReferences();
-			for (ExternalReferenceSPI externalReference : externalReferences) {
-				// FIXME does this make sense? No!! Should get the actual value
-				// not what it is (TEXT etc)
-				org.jdom.Element refElement = new org.jdom.Element("reference");
-				refElement.addContent(externalReference.getDataNature()
-						.toString());
-				element.addContent(refElement);
-			}
-
-		} else if (reference.getReferenceType().equals(
-				T2ReferenceType.IdentifiedList)) {
-			IdentifiedList<T2Reference> list = referenceService
-					.getListService().getList(reference);
-
-			element.setName("list");
-			element.setAttribute("id", reference.toString());
-			for (T2Reference ref : list) {
-				element.addContent(resolveToElement(ref, referenceService));
-			}
-		} else {
-			// throw something (maybe a tantrum)
-		}
-		return element;
-	}
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/QueryVar.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/QueryVar.java
deleted file mode 100644
index 00f6458..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/QueryVar.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-/**
- * @author Paolo Missier<p/>
- *
- */	
-public class QueryVar {
-
-	String wfInstanceId;
-	String wfName;
-	String pname;
-	String vname;
-	String path;
-	String value;
-
-	public String toString() {
-
-		StringBuffer sb = new StringBuffer();
-		sb.append("PORT: ****").
-		append("\nworkflow: "+getWfName()).
-		append("\nprocessor: "+getPname()).
-		append("\nport: "+getVname()).
-		append("\npath to value: "+getPath());
-
-		return sb.toString();
-	}
-
-
-	/**
-	 * @return the pname
-	 */
-	public String getPname() {
-		return pname;
-	}
-	/**
-	 * @param pname the pname to set
-	 */
-	public void setPname(String pname) {
-		this.pname = pname;
-	}
-	/**
-	 * @return the vname
-	 */
-	public String getVname() {
-		return vname;
-	}
-	/**
-	 * @param vname the vname to set
-	 */
-	public void setVname(String vname) {
-		this.vname = vname;
-	}
-	/**
-	 * @return the path
-	 */
-	public String getPath() {
-		return path;
-	}
-	/**
-	 * @param path the path to set
-	 */
-	public void setPath(String path) {
-		this.path = path;
-	}
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-	/**
-	 * @param value the value to set
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-	/**
-	 * @return the wfInstanceId
-	 */
-	public String getWfInstanceId() {
-		return wfInstanceId;
-	}
-	/**
-	 * @param wfInstanceId the wfInstanceId to set
-	 */
-	public void setWfInstanceId(String wfInstanceId) {
-		this.wfInstanceId = wfInstanceId;
-	}
-	/**
-	 * @return the wfName
-	 */
-	public String getWfName() {
-		return wfName;
-	}
-	/**
-	 * @param wfName the wfName to set
-	 */
-	public void setWfName(String wfName) {
-		this.wfName = wfName;
-	}
-
-}
\ No newline at end of file
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Var.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Var.java
deleted file mode 100644
index 8900d58..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Var.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-
-/**
- * a Var that has no pName is either a WF input or output, depending on isInput
- * @author Paolo Missier
- */
-public class Var {
-	
-	private String identifier;
-	private String vName, pName;
-	private boolean isInput;
-	private String wfInstanceRef;
-	private String type;
-	private int typeNestingLevel = 0;
-	private int actualNestingLevel = 0;
-	private boolean isANLset = false;  // set to true when the ANL has been set 
-	private int portNameOrder = 0;
-	
-	/**
-	 * @return the wfInstanceRef
-	 */
-	public String getWfInstanceRef() {
-		return wfInstanceRef;
-	}
-	/**
-	 * @param wfInstanceRef the wfInstanceRef to set
-	 */
-	public void setWfInstanceRef(String wfInstanceRef) {
-		this.wfInstanceRef = wfInstanceRef;
-	}
-	/**
-	 * @return the vName
-	 */
-	public String getVName() {
-		return vName;
-	}
-	/**
-	 * @param name the vName to set
-	 */
-	public void setVName(String name) {
-		vName = name;
-	}
-	/**
-	 * @return the pName
-	 */
-	public String getPName() {
-		return pName;
-	}
-	/**
-	 * @param name the pName to set
-	 */
-	public void setPName(String name) {
-		pName = name;
-	}
-	/**
-	 * @return the isInput
-	 */
-	public boolean isInput() {
-		return isInput;
-	}
-	/**
-	 * @param isInput the isInput to set
-	 */
-	public void setInput(boolean isInput) {
-		this.isInput = isInput;
-	}
-	/**
-	 * @return the type
-	 */
-	public String getType() {
-		return type;
-	}
-	/**
-	 * @param type the type to set
-	 */
-	public void setType(String type) {
-		this.type = type;
-	}
-	/**
-	 * @return the typeNestingLevel
-	 */
-	public int getTypeNestingLevel() {
-		return typeNestingLevel;
-	}
-	/**
-	 * @param typeNestingLevel the typeNestingLevel to set
-	 */
-	public void setTypeNestingLevel(int typeNestingLevel) {
-		this.typeNestingLevel = typeNestingLevel;
-	}
-	/**
-	 * @return the actualNestingLevel
-	 */
-	public int getActualNestingLevel() {
-		return actualNestingLevel;
-	}
-	/**
-	 * @param actualNestingLevel the actualNestingLevel to set
-	 */
-	public void setActualNestingLevel(int actualNestingLevel) {
-		this.actualNestingLevel = actualNestingLevel;
-	}
-	/**
-	 * @return the isANLset
-	 */
-	public boolean isANLset() {
-		return isANLset;
-	}
-	/**
-	 * @param isANLset the isANLset to set
-	 */
-	public void setANLset(boolean isANLset) {
-		this.isANLset = isANLset;
-	}
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-	public String getIdentifier() {
-		return identifier;
-	}
-	/**
-	 * @return the portNameOrder
-	 */
-	public int getPortNameOrder() {
-		return portNameOrder;
-	}
-	/**
-	 * @param portNameOrder the portNameOrder to set
-	 */
-	public void setPortNameOrder(int portNameOrder) {
-		this.portNameOrder = portNameOrder;
-	}
-
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/VarBinding.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/VarBinding.java
deleted file mode 100644
index 02d9c63..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/VarBinding.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-/**
- * @author Paolo Missier
- *
- */
-public class VarBinding {
-
-	String wfNameRef;
-	String varNameRef;
-	String wfInstanceRef;
-	String value;
-	String collIDRef;
-	int positionInColl;
-	String PNameRef;
-	String valueType;
-	String ref;
-	String    iterationVector;
-	String resolvedValue;
-	
-	
-	public String toString() {
-	
-		StringBuffer sb = new StringBuffer();
-		
-		sb.append("**** VarBinding: \n").
-			append("wfInstanceRef = "+wfInstanceRef+"\n").
-			append("wfNameRef = "+wfNameRef+"\n").
-			append("PNameRef = "+PNameRef+"\n").
-			append("varNameRef = "+varNameRef+"\n").
-			append("iteration = "+iterationVector+"\n").
-			append("collIdef  " +collIDRef+"\n").
-			append("positionInColl = "+positionInColl+"\n").
-			append("value = "+value+"\n").
-			append("ref = "+ref+"\n").
-			append("resolvedValue = "+resolvedValue+"\n");
-			
-
-		return sb.toString();
-	}
-	
-	
-	/**
-	 * @return the positionInColl
-	 */
-	public int getPositionInColl() {
-		return positionInColl;
-	}
-	/**
-	 * @param positionInColl the positionInColl to set
-	 */
-	public void setPositionInColl(int positionInColl) {
-		this.positionInColl = positionInColl;
-	}
-	/**
-	 * @return the valueType
-	 */
-	public String getValueType() {
-		return valueType;
-	}
-	/**
-	 * @param valueType the valueType to set
-	 */
-	public void setValueType(String valueType) {
-		this.valueType = valueType;
-	}
-	/**
-	 * @return the varNameRef
-	 */
-	public String getVarNameRef() {
-		return varNameRef;
-	}
-	/**
-	 * @param varNameRef the varNameRef to set
-	 */
-	public void setVarNameRef(String varNameRef) {
-		this.varNameRef = varNameRef;
-	}
-	/**
-	 * @return the wfInstanceRef
-	 */
-	public String getWfInstanceRef() {
-		return wfInstanceRef;
-	}
-	/**
-	 * @param wfInstanceRef the wfInstanceRef to set
-	 */
-	public void setWfInstanceRef(String wfInstanceRef) {
-		this.wfInstanceRef = wfInstanceRef;
-	}
-	/**
-	 * @return the pNameRef
-	 */
-	public String getPNameRef() {
-		return PNameRef;
-	}
-	/**
-	 * @param nameRef the pNameRef to set
-	 */
-	public void setPNameRef(String nameRef) {
-		PNameRef = nameRef;
-	}
-	/**
-	 * @return the collIDRef
-	 */
-	public String getCollIDRef() {
-		return collIDRef;
-	}
-	/**
-	 * @param collIDRef the collIDRef to set
-	 */
-	public void setCollIDRef(String collIDRef) {
-		this.collIDRef = collIDRef;
-	}
-	/**
-	 * @return the iteration
-	 */
-	public String getIteration() {
-		return iterationVector;
-	}
-	/**
-	 * @param iterationVector the iteration to set
-	 */
-	public void setIterationVector(String iterationVector) {
-		this.iterationVector = iterationVector;
-	}
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-	/**
-	 * @param value the value to set
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-	/**
-	 * @return the ref
-	 */
-	public String getRef() {
-		return ref;
-	}
-	/**
-	 * @param ref the ref to set
-	 */
-	public void setRef(String ref) {
-		this.ref = ref;
-	}
-
-
-	/**
-	 * @return the resolvedValue
-	 */
-	public String getResolvedValue() {
-		return resolvedValue;
-	}
-
-
-	/**
-	 * @param resolvedValue the resolvedValue to set
-	 */
-	public void setResolvedValue(String resolvedValue) {
-		this.resolvedValue = resolvedValue;
-	}
-
-
-	/**
-	 * @return the wfNameRef
-	 */
-	public String getWfNameRef() {
-		return wfNameRef;
-	}
-
-
-	/**
-	 * @param wfNameRef the wfNameRef to set
-	 */
-	public void setWfNameRef(String wfNameRef) {
-		this.wfNameRef = wfNameRef;
-	}
-	
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Workflow.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Workflow.java
deleted file mode 100644
index 9878a6e..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/Workflow.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-public class Workflow {
-
-	private String wfname;
-	private String parentWFname;
-	private String externalName;
-	
-	public void setWfName(String identifier) {
-		this.wfname = identifier;
-	}
-
-	public String getWfname() {
-		return wfname;
-	}
-
-	public void setParentWFname(String parentIdentifier) {
-		this.parentWFname = parentIdentifier;
-	}
-
-	public String getParentWFname() {
-		return parentWFname;
-	}
-
-	/**
-	 * @return the externalName
-	 */
-	public String getExternalName() {
-		return externalName;
-	}
-
-	/**
-	 * @param externalName the externalName to set
-	 */
-	public void setExternalName(String externalName) {
-		this.externalName = externalName;
-	}
-	
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/WorkflowInstance.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/WorkflowInstance.java
deleted file mode 100644
index 9a07bd6..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/lineageservice/utils/WorkflowInstance.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package net.sf.taverna.t2.provenance.lineageservice.utils;
-
-import java.sql.Blob;
-
-public class WorkflowInstance {
-
-	private String instanceID;
-	private String wfnameRef;  // this is the wfnameRef for the TOP LEVEL workflow for this run  CHECK
-	private String timestamp;
-	private String workflowExternalName;
-	private byte[] dataflowBlob;
-
-	public void setWorkflowIdentifier(String workflowIdentifier) {
-		this.wfnameRef = workflowIdentifier;
-	}
-
-	public String getWorkflowIdentifier() {
-		return wfnameRef;
-	}
-
-	public void setTimestamp(String timestamp) {
-		this.timestamp = timestamp;
-	}
-
-	public String getTimestamp() {
-		return timestamp;
-	}
-
-	/**
-	 * @return the instanceID
-	 */
-	public String getInstanceID() {
-		return instanceID;
-	}
-
-	/**
-	 * @param instanceID the instanceID to set
-	 */
-	public void setInstanceID(String instanceID) {
-		this.instanceID = instanceID;
-	}
-
-	/**
-	 * @return the workflowExternalName
-	 */
-	public String getWorkflowExternalName() {
-		return workflowExternalName;
-	}
-
-	/**
-	 * @param workflowExternalName the workflowExternalName to set
-	 */
-	public void setWorkflowExternalName(String workflowExternalName) {
-		this.workflowExternalName = workflowExternalName;
-	}
-	
-	/**
-	 * A {@link Blob} object representing the dataflow
-	 * @param bs
-	 */
-	public void setDataflowBlob(byte[] bs) {
-		this.dataflowBlob = bs;
-	}
-
-	public byte[] getDataflowBlob() {
-		return dataflowBlob;
-	}
-
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/opm/OPMImporter.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/opm/OPMImporter.java
deleted file mode 100644
index 6f0947b..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/opm/OPMImporter.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.opm;
-
-import java.io.File;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-import javax.xml.bind.JAXBException;
-
-import net.sf.taverna.t2.provenance.lineageservice.ProvenanceWriter;
-import net.sf.taverna.t2.provenance.lineageservice.utils.Var;
-import net.sf.taverna.t2.provenance.lineageservice.utils.VarBinding;
-
-import org.apache.log4j.Logger;
-import org.openprovenance.model.Account;
-import org.openprovenance.model.AccountId;
-import org.openprovenance.model.Accounts;
-import org.openprovenance.model.Artifact;
-import org.openprovenance.model.ArtifactId;
-import org.openprovenance.model.Artifacts;
-import org.openprovenance.model.CausalDependencies;
-import org.openprovenance.model.OPMDeserialiser;
-import org.openprovenance.model.OPMGraph;
-import org.openprovenance.model.ProcessId;
-import org.openprovenance.model.Role;
-import org.openprovenance.model.Used;
-import org.openprovenance.model.WasControlledBy;
-import org.openprovenance.model.WasDerivedFrom;
-import org.openprovenance.model.WasGeneratedBy;
-import org.openprovenance.model.WasTriggeredBy;
-
-/**
- * @author paolo
- * imports foreign XML-serialized OPM graphs into the native Taverna provenance DB, so they can be queried using
- * 
- * {@link net.sf.taverna.t2.provenance.lineageservice.ProvenanceAnalysis} 
- */
-public class OPMImporter {
-
-	private static final String PROC_NAME = "P";
-	private static final String OPM_DEF_ACCOUNT = "OPMDefaultAccount";
-	ProvenanceWriter pw;
-	OPMGraph graph;
-
-	private static Logger logger = Logger.getLogger(OPMImporter.class);
-
-	// Maps Account names to Taverna workflows
-	Map<String, String> accountToWorkflow  = new HashMap<String, String>();
-	Map<String, String> workflowToInstance = new HashMap<String, String>();
-
-	// maps wfName --> (wfName --> List(Var))
-	private Map<String, Map<String, List<Var>>> usedVarsByAccount = new HashMap<String, Map<String, List<Var>>>();
-	private Map<String, Map<String, List<Var>>> wgbVarsByAccount = new HashMap<String, Map<String, List<Var>>>();
-
-	// maps accountname --> (artifact -> List(Process))
-	private Map<String, Map<String,List<String>>> wgbArtifactsByAccount = new HashMap<String, Map<String,List<String>>>(); 
-
-	// maps accountname --> (artifact -> List(Process))
-	private Map<String, Map<String,List<String>>> usedArtifactsByAccount = new HashMap<String, Map<String,List<String>>>(); 
-
-	int procNameCounter;
-	private String masterAccount = OPM_DEF_ACCOUNT;
-
-	public OPMImporter(ProvenanceWriter pw) {
-		this.pw = pw;
-	}	
-
-	/**
-	 * orphan artifacts are those that are in the graph but are never used neither generated. this 
-	 * indicates some problem with the graph structure. this method is used for diagnostics after import has finished
-	 * @return
-	 */
-	public List<String> getOrphanArtifacts() {
-
-		List<String> allwgb  = new ArrayList<String>();
-		List<String> allUsed = new ArrayList<String>();
-		List<String> orphans = new ArrayList<String>();
-
-		if (graph == null)  {
-			logger.warn("null graph while attempting to count orphan artifacts -- giving up");
-			return orphans; 
-		}
-		
-		Artifacts allArtifacts = graph.getArtifacts();
-
-		for ( Map.Entry<String, Map<String,List<String>>>entry: wgbArtifactsByAccount.entrySet()) {
-			allwgb.addAll(entry.getValue().keySet());
-		}
-
-		for ( Map.Entry<String, Map<String,List<String>>>entry: usedArtifactsByAccount.entrySet()) {
-			allUsed.addAll(entry.getValue().keySet());
-		}
-
-		List<Artifact> artifacts = allArtifacts.getArtifact();
-
-		for (Artifact a:artifacts) {
-			if (!allwgb.contains(a.getId()) && !allUsed.contains(a.getId())) {
-				orphans.add(a.getId());
-			}
-		}
-		return orphans;
-	}
-
-
-	public void importGraph(String XMLOPMGraphFilename) throws JAXBException, SQLException  {
-
-		try {
-			logger.info("Importing OPM XML from file "+XMLOPMGraphFilename);
-
-			// deserialize an XML OPM graph from file
-			OPMDeserialiser deser = new OPMDeserialiser();
-			graph = deser.deserialiseOPMGraph(new File(XMLOPMGraphFilename));
-
-		} catch (Exception e) {
-			logger.fatal("exception while deserializing -- unable to continue");
-			logger.fatal(e.getMessage());
-			return;
-		}
-
-		logger.debug("XML graph deserialized");
-
-		// 
-		// generates one pair <wfName, wfInstance> for each account in the graph
-		//
-		List<Account> allAccounts = null;
-		try {
-			Accounts accounts = graph.getAccounts();
-
-			// use this global account alongside any other that may be defined in the graph
-			generateWFFromAccount(OPM_DEF_ACCOUNT);
-
-			if (accounts == null) {
-				logger.warn("this graph contains no accounts -- using only the default");
-			} else {
-				for (Account acc:accounts.getAccount()) {
-					// writes both workflow and instance into the DB, updates accountToWorkflow
-					generateWFFromAccount(acc.getId());   
-				}
-			}
-		} catch (Exception e) {
-			logger.warn("exception while getting accounts for this graph");
-		}
-
-		// 
-		// associates processes and ports to workflows and varbindings to corresponding wfInstances
-		//
-		List<Object> allDeps;
-
-		// what have we got?
-		// retrieve all OPM relations from the graph		
-		CausalDependencies cd = graph.getCausalDependencies();
-		allDeps = cd.getUsedOrWasGeneratedByOrWasTriggeredBy();
-
-		// make sure these are processed in the right order: used, wgby, THEN wdf because this latter is derived from the first 2!
-		// so collect them into sets and process them separately
-
-		Set<WasGeneratedBy> wgbSet = new HashSet<WasGeneratedBy>();
-		Set<Used> usedSet = new HashSet<Used>();
-		Set<WasDerivedFrom> wdfSet = new HashSet<WasDerivedFrom>();
-		Set<WasControlledBy> wcbSet = new HashSet<WasControlledBy>();
-		Set<WasTriggeredBy> wtbSet = new HashSet<WasTriggeredBy>();
-
-		for (Object dep:allDeps) {
-			logger.info("dependency of type: "+dep.getClass().getName());
-
-			if (dep instanceof org.openprovenance.model.WasGeneratedBy) {
-				wgbSet.add((WasGeneratedBy) dep);
-			} else if (dep instanceof org.openprovenance.model.Used) {
-				usedSet.add((Used) dep);
-			} else if (dep instanceof org.openprovenance.model.WasDerivedFrom) {
-				wdfSet.add((WasDerivedFrom) dep);
-			} else if (dep instanceof org.openprovenance.model.WasControlledBy) {
-				wcbSet.add((WasControlledBy) dep);
-			} else if (dep instanceof org.openprovenance.model.WasTriggeredBy) {
-				wtbSet.add((WasTriggeredBy) dep);
-			}
-		}
-
-		// process these in the correct order
-		int cnt =0;  // used to debug a nasty outofmemory error
-		for (WasGeneratedBy dep: wgbSet) {
-//			logger.debug(cnt++);
-			processWGBy(dep);
-		}
-
-		for (Used dep:usedSet) processUsed(dep);
-
-		for (WasDerivedFrom dep: wdfSet) processWDF(dep);
-
-		// we actually ignore the others... 
-
-		// *********
-		// complete the induced graph by building arcs using the Artifact -> [Var] maps
-		// *********
-
-		List<String>  accountNames = new ArrayList<String>();
-
-		accountNames.add(OPM_DEF_ACCOUNT);
-
-		if (allAccounts != null)  
-			for (Account acc:allAccounts) { accountNames.add(acc.getId()); }
-
-		for (String acc:accountNames) {
-
-			String wfName = accountToWorkflow.get(acc);
-
-			Map<String, List<Var>> usedVars = usedVarsByAccount.get(wfName);
-			Map<String, List<Var>> wgbVars =  wgbVarsByAccount.get(wfName);
-
-			if (usedVars == null || wgbVars == null) continue;
-
-			// install an Arc from each wgb var to each used var when the artifact is the same
-			for (Map.Entry<String, List<Var>> entry:wgbVars.entrySet()) {
-
-				// all Vars for this artifact get connected to all corresponding Vars in used
-				List<Var> sourceVars = entry.getValue();				
-				List<Var> targetVars = usedVars.get(entry.getKey());
-
-				if (sourceVars == null || targetVars == null) continue;
-
-				// create an arc from each sourceVar to each targetVar
-				// note that we expect a single targetVar, but this is not guaranteed
-				for (Var sourceVar:sourceVars) {
-					for (Var targetVar:targetVars) {
-						pw.addArc(sourceVar.getVName(), sourceVar.getPName(), targetVar.getVName(), targetVar.getPName(), wfName);
-					}
-				}
-			}
-		}
-	}
-
-	private void generateWFFromAccount(String accName) throws SQLException {
-
-		String wfName     = accName+"-"+UUID.randomUUID().toString();
-		String wfInstance = accName+"-"+UUID.randomUUID().toString();
-
-		pw.addWFId(wfName);
-		pw.addWFInstanceId(wfName, wfInstance);
-		accountToWorkflow.put(accName, wfName);
-		workflowToInstance.put(wfName, wfInstance);
-
-		logger.info("generated wfName "+wfName+" and instance "+wfInstance+"  for account "+accName);
-	}
-
-
-	private Var processProcessArtifactDep(String procName, String value, String varName,
-			String wfName, String wfInstance, boolean artifactIsInput) {
-
-		// generate Process
-		try {
-			pw.addProcessor(procName, wfName, false);
-			logger.debug("added processor "+procName+" to workflow "+wfName);
-		} catch (SQLException e) {  // no panic -- just catch duplicates
-			logger.warn(e.getMessage());
-		}
-
-		// generate Var
-		Var outputVar = new Var();
-
-		outputVar.setPName(procName);
-		outputVar.setWfInstanceRef(wfName);
-		outputVar.setVName(varName);
-		outputVar.setTypeNestingLevel(0);
-		outputVar.setInput(artifactIsInput);  // wgby is an output var   
-
-		List<Var> vars = new ArrayList<Var>(); // only one Var in the list
-		vars.add(outputVar);
-
-		try {
-			pw.addVariables(vars, wfName);
-			logger.debug("added var "+varName+" to workflow "+wfName);
-		} catch (SQLException e) {  // no panic -- just catch duplicates
-			logger.warn(e.getMessage());
-		}
-
-		// generate VarBindings (wfInstance, procName, varname, value)			
-		VarBinding vb = new VarBinding();
-
-		vb.setWfInstanceRef(wfInstance);
-		vb.setPNameRef(procName);
-		vb.setVarNameRef(varName);
-		vb.setValue(value);
-		vb.setIterationVector("[]");
-
-		try {
-			pw.addVarBinding(vb);
-			logger.debug("added var binding with value "+value+" to workflow instance "+wfInstance);
-		} catch (SQLException e) {  // no panic -- just catch duplicates
-			logger.error("Failed to add var binding: " + e.getMessage());
-		}
-
-		return outputVar;
-	}
-
-
-	/**
-	 * generic processing of a process-artifact dependency
-	 * @param procID
-	 * @param artId
-	 * @param role
-	 * @param wfName
-	 * @param wfInstance
-	 * @param artifactIsInput
-	 */
-	private Var processProcessArtifactDep(ProcessId procID, ArtifactId artId, Role role, 
-			String wfName, String wfInstance, boolean artifactIsInput) {
-
-		String procName = ((org.openprovenance.model.Process) procID.getId()).getId();
-		String varName  = role.getValue();
-		String value    = ((Artifact) artId.getId()).getId();
-
-		varName = removeBlanks(varName);
-
-		return processProcessArtifactDep(procName, value, varName, wfName, wfInstance, artifactIsInput);
-	}
-
-
-
-	private String removeBlanks(String varName) {		
-		return varName.replace(" ", "_");
-	}
-
-
-	/**
-	 * used(A,R,P,acc): generates a process for P, a Var for (P,R) an <em>input</em> VarBinding for (P,R,A)
-	 * <br/> this is very similar to {@link #processWGBy(WasGeneratedBy)}
-	 * @param dep
-	 */
-	private void processUsed(Used dep) {
-
-		// Acc determines the scope -- this dep may belong to > 1 account, deal with all of them
-		List<AccountId> accountIDs = dep.getAccount();
-		ProcessId procID = dep.getEffect();
-		ArtifactId artId = dep.getCause();
-		Role role = dep.getRole();
-
-		List<String>  accNames = new ArrayList<String>();
-
-		for (AccountId accId:accountIDs) {
-			accNames.add(((Account) accId.getId()).getId());
-		}
-
-		accNames.add(OPM_DEF_ACCOUNT);
-
-		for (String accName: accNames) {
-			String wfName = accountToWorkflow.get(accName);
-			String wfInstance = workflowToInstance.get(wfName);
-
-			Var v  = processProcessArtifactDep(procID, artId, role, wfName, wfInstance, true);  // true -> input var
-
-			// save the mapping from artifact to var for this account
-			Map<String, List<Var>> usedVars = usedVarsByAccount.get(wfName);
-			if (usedVars == null) {
-				usedVars = new HashMap<String, List<Var>>();
-				usedVarsByAccount.put(wfName, usedVars);
-			}
-			List<Var> vars = usedVars.get(((Artifact) artId.getId()).getId());
-
-			if (vars == null) {
-				vars = new ArrayList<Var>();
-				usedVars.put(((Artifact) artId.getId()).getId(), vars);
-			}
-			vars.add(v);
-
-			// record the fact that (procID used artId) within this account
-			Map<String, List<String>> usedArtifacts = usedArtifactsByAccount.get(accName);
-			if (usedArtifacts == null) {
-				usedArtifacts = new HashMap<String, List<String>>();
-				usedArtifactsByAccount.put(accName, usedArtifacts);
-			}
-
-			String artifactName = ((Artifact) artId.getId()).getId();
-			List<String> processes = usedArtifacts.get(artifactName);
-			if (processes == null) {
-				processes = new ArrayList<String>();
-				usedArtifacts.put(artifactName, processes);
-			}
-			processes.add(((org.openprovenance.model.Process) procID.getId()).getId());
-		}
-	}
-
-
-
-	/**
-	 * wgb(A,R,P,Acc): generates a Process for P, a Var for (P,R), an <em>output</em> VarBinding for (P,R,A) 
-	 * This is all relative to the workflow corresponding to account Acc. <br/>
-	 * 
-	 * @param dep 
-	 * @throws SQLException 
-	 */
-	private void processWGBy(WasGeneratedBy dep)  {
-
-		// Acc determines the scope -- this dep may belong to > 1 account, deal with all of them
-		List<AccountId> accountIDs = dep.getAccount();
-		ProcessId procID = dep.getCause();
-		ArtifactId artId = dep.getEffect();
-		Role role = dep.getRole();
-
-		List<String>  accNames = new ArrayList<String>();
-
-		for (AccountId accId:accountIDs) {
-			accNames.add(((Account) accId.getId()).getId());
-		}
-
-		accNames.add(OPM_DEF_ACCOUNT);
-
-		for (String accName:accNames) {
-
-			String wfName = accountToWorkflow.get(accName);
-			String wfInstance = workflowToInstance.get(wfName);
-
-			Var v = processProcessArtifactDep(procID, artId, role, wfName, wfInstance, false);  // false -> output var
-
-			Map<String, List<Var>> wgbVars = wgbVarsByAccount.get(wfName);
-			if (wgbVars == null) {
-				wgbVars = new HashMap<String, List<Var>>();
-				wgbVarsByAccount.put(wfName, wgbVars);
-			}
-
-			List<Var> vars = wgbVars.get(((Artifact) artId.getId()).getId());
-			if (vars == null) {
-				vars = new ArrayList<Var>();
-				wgbVars.put(((Artifact) artId.getId()).getId(), vars);
-			}
-			vars.add(v);
-
-			// record the fact that (artId wgby procID) within this account
-			Map<String, List<String>> wgbArtifacts = wgbArtifactsByAccount.get(accName);
-			if (wgbArtifacts == null) {
-				wgbArtifacts = new HashMap<String, List<String>>();
-				wgbArtifactsByAccount.put(accName, wgbArtifacts);
-			}
-
-			String artifactName = ((Artifact) artId.getId()).getId();
-			List<String> processes = wgbArtifacts.get(artifactName);
-			if (processes == null) {
-				processes = new ArrayList<String>();
-				wgbArtifacts.put(artifactName, processes);
-			}
-			processes.add(((org.openprovenance.model.Process) procID.getId()).getId());
-		}
-	}
-
-
-	/**
-	 * this is a dep between two artifacts A1 and A2.
-	 * In Taverna we need to postulate the existence of a Process to mediate this dependency.
-	 * <br/> However, we only need to account for this dep if it cannot be inferred from a combination of used and wgby that 
-	 * involve A1 and A2:  if there exists P s.t. A1 wgby P and P used A2, then this dep. is redundant in the DB and we can safely ignore it.
-	 * <br/> note that this analysis is conducted regardless of the accounts in which the wgby and used properties appear, as one account could 
-	 * be used deliberately to 
-	 * This will unclutter the DB.
-	 * @param dep
-	 */
-	private void processWDF(WasDerivedFrom dep) {
-		List<AccountId> accountIDs = dep.getAccount();
-		ArtifactId fromArtId = dep.getCause();
-		ArtifactId toArtId = dep.getEffect();
-
-		List<String>  accNames = new ArrayList<String>();
-
-		for (AccountId accId:accountIDs) {
-			accNames.add(((Account) accId.getId()).getId());
-		}
-
-		accNames.add(OPM_DEF_ACCOUNT);
-
-		for (String accName:accNames) {
-
-			int varCounter = 0;
-
-			String wfName = accountToWorkflow.get(accName);
-			String wfInstance = workflowToInstance.get(wfName);
-
-			List<String> generatingProcesses=null, usingProcesses=null;
-
-			// look for any triple fromArtId wasGeneratedBy P within this account
-			Map<String, List<String>> wgbArtifacts = wgbArtifactsByAccount.get(accName);
-
-			if (wgbArtifacts != null) {
-				String toArtifactName = ((Artifact) toArtId.getId()).getId();
-				generatingProcesses = wgbArtifacts.get(toArtifactName);
-				if (generatingProcesses != null) {
-					logger.debug("artifact "+toArtifactName+" wgby one or more processes...");
-				}
-			}
-
-			// look for any triple (P used toArtId) within this account
-
-			// get map for this account
-			Map<String, List<String>> usedArtifacts = usedArtifactsByAccount.get(accName);
-
-			if (usedArtifacts != null) {
-				String fromArtifactName = ((Artifact) fromArtId.getId()).getId();
-				usingProcesses = usedArtifacts.get(fromArtifactName);
-				if (usingProcesses != null) {
-					logger.debug("artifact "+fromArtifactName+" was used by one or more processes...");
-				}
-			}
-
-			boolean found = false;
-			if (generatingProcesses != null && usingProcesses != null) {
-				for (String gp:generatingProcesses) {
-					if (usingProcesses.contains(gp)) { 
-						logger.debug("intersection between process sets not empty, this WDF is redundant");
-						found = true; 
-						break; 
-					} 
-				}
-			}
-
-			// only postulate a new process if the native one has not been found
-			if (found) return;
-
-			String procName = PROC_NAME+"_"+procNameCounter++;
-
-			try {
-				pw.addProcessor(procName, wfName, false);
-				logger.info("created non-native added processor "+procName+" to workflow "+wfName);
-			} catch (SQLException e) {  // no panic -- just catch duplicates
-				logger.warn(e.getMessage());
-			}
-
-			// create a role for fromArtId from the procName
-			String inputVarName = procName+"_"+varCounter++;
-			String inputValue = ((Artifact) fromArtId.getId()).getId();
-
-			// add to DB
-			processProcessArtifactDep(procName, inputValue, inputVarName, wfName, wfInstance, true);
-
-			// create a role for toArtId
-			String outputVarName = procName+"_"+varCounter++;
-			String outputValue = ((Artifact) toArtId.getId()).getId();
-
-			// add to DB
-			processProcessArtifactDep(procName, outputValue, outputVarName, wfName, wfInstance, false);
-		}		
-	}
-
-
-
-	/**
-	 * there is no counterpart in Taverna provenance for this dependency. This is translated into
-	 * a control link but this is not part of the provenance model
-	 * @param dep
-	 */
-	private void processWTBy(WasTriggeredBy dep) {
-
-	}
-
-
-	/**
-	 * there is no counterpart in Taverna for this dependency, as it involves agents which we don't support
-	 * @param dep
-	 */
-	private void processWCBy(WasControlledBy dep) {
-		// TODO Auto-generated method stub
-	}
-
-
-
-}
diff --git a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/opm/OPMManager.java b/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/opm/OPMManager.java
deleted file mode 100644
index 08477b6..0000000
--- a/trunk/provenanceconnector/src/main/java/net/sf/taverna/t2/provenance/opm/OPMManager.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.provenance.opm;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import javax.xml.bind.JAXBException;
-
-import net.sf.taverna.t2.provenance.lineageservice.utils.DataValueExtractor;
-
-import org.apache.log4j.Logger;
-import org.openprovenance.model.Artifact;
-import org.openprovenance.model.OPMGraph;
-import org.openprovenance.model.OPMToDot;
-import org.openprovenance.model.Process;
-import org.openprovenance.rdf.OPMRdf2Xml;
-import org.tupeloproject.kernel.Context;
-import org.tupeloproject.kernel.OperatorException;
-import org.tupeloproject.kernel.UnionContext;
-import org.tupeloproject.kernel.impl.MemoryContext;
-import org.tupeloproject.kernel.impl.ResourceContext;
-import org.tupeloproject.provenance.ProvenanceAccount;
-import org.tupeloproject.provenance.ProvenanceArtifact;
-import org.tupeloproject.provenance.ProvenanceGeneratedArc;
-import org.tupeloproject.provenance.ProvenanceProcess;
-import org.tupeloproject.provenance.ProvenanceRole;
-import org.tupeloproject.provenance.ProvenanceUsedArc;
-import org.tupeloproject.provenance.impl.ProvenanceContextFacade;
-import org.tupeloproject.rdf.Literal;
-import org.tupeloproject.rdf.Resource;
-import org.tupeloproject.rdf.Triple;
-import org.tupeloproject.rdf.xml.RdfXmlWriter;
-
-
-/**
- * @author paolo
- *
- */
-public class OPMManager {
-
-	private static Logger logger = Logger.getLogger(OPMManager.class);
-
-	public static final String OPM_TAVERNA_NAMESPACE = "http://taverna.opm.org/";
-	private static final String OPM_RDF_GRAPH_FILE = "src/test/resources/provenance-testing/OPM/OPMGraph.rdf";
-	private static final String  OPM_DOT_FILE = "src/test/resources/provenance-testing/OPM/OPMGraph.dot";
-	private static final String VALUE_PROP = "value";
-	
-	ProvenanceContextFacade graph = null;
-	Context context = null;
-
-	ProvenanceAccount  currentAccount = null;
-	ProvenanceArtifact currentArtifact = null;
-	ProvenanceRole     currentRole = null;
-	ProvenanceProcess  currentProcess = null;
-
-	private boolean isActive = true;
-
-	public OPMManager() {
-
-		// init Tupelo RDF provenance graph
-		MemoryContext mc = new MemoryContext();
-		ResourceContext rc = new ResourceContext("http://example.org/data/","/provenanceExample/");
-		context = new UnionContext();
-		context.addChild(mc);
-		context.addChild(rc);
-
-		graph = new ProvenanceContextFacade(mc);
-	}
-
-
-	/**
-	 * default implementation of this method returns null -- has no idea how to extract simple values from incoming artifact values 
-	 * @return
-	 */
-	public List<DataValueExtractor> getDataValueExtractor() { return null; }
-
-
-	/**
-	 * 	create new account to hold the causality graph
-	 *  and give it a Resource name
-	 * @param accountName
-	 */
-	public void createAccount(String accountName) {
-
-		currentAccount = graph.newAccount("OPM-"+
-				accountName, Resource.uriRef(OPM_TAVERNA_NAMESPACE+accountName));
-		graph.assertAccount(currentAccount);
-	}
-
-
-	/**
-	 * 
-	 * @param aName
-	 * @param aValue  actual value can be used optionally as part of a separate triple. Whether this is used or not 
-	 * depends on the settings, see {@link OPMManager.addValueTriple}.
-	 * This also sets the currentArtifact to the newly created artifact
-	 */
-	public void addArtifact(String aName, String aValue) {
-
-		String artID=aName;
-		// make sure artifact name is a good URI
-		try {
-			URI artURI = new URI(aName);
-
-			if (artURI.getAuthority() == null) {
-				artID = OPM_TAVERNA_NAMESPACE+aName;				
-			}
-		} catch (URISyntaxException e1) {
-			artID = OPM_TAVERNA_NAMESPACE+aName;
-		}
-
-
-		Resource r = Resource.uriRef(artID);
-		currentArtifact = graph.newArtifact(artID, r);
-		graph.assertArtifact(currentArtifact);
-
-		if (false) {
-// following fragment commented out  
-//		if (aValue != null) {
-//			System.out.println("OPMManager::addArtifact: aValue is NOT NULL");
-
-			// if we have a valid DataValueExtractor, use it here
-			List<DataValueExtractor> dveList;
-			String extractedValue = aValue;  // default is same value
-			if ((dveList = getDataValueExtractor()) != null) {
-
-				// try all available extractors... UGLY but data comes with NO TYPE at all!
-				for (DataValueExtractor dve: dveList) {
-					try {
-
-//						System.out.println("OPMManager::addArtifact: trying extractor "+dve.getClass().getName());
-						extractedValue = dve.extractString(aValue);						
-//						System.out.println("OPMManager::addArtifact: - extracted value = "+extractedValue);
-						break; // extractor worked
-					} catch (Exception e) {
-						// no panic, reset value and try another extractor
-//						System.out.println("OPMManager::addArtifact: extractor failed");
-						extractedValue = aValue;
-					}
-				}
-			}
-
-//			System.out.println("OPMManager::addArtifact: using value "+extractedValue);
-			try {
-				Literal lValue = Resource.literal(extractedValue);
-				context.addTriple(r, Resource.uriRef(OPM_TAVERNA_NAMESPACE+VALUE_PROP), lValue);
-			} catch (OperatorException e) {
-				logger.warn("OPM iteration triple creation exception: "+e.getMessage());
-			}
-		}  else {
-//			System.out.println("OPMManager::addArtifact: aValue for ["+aName+"] is NULL");
-		}
-	}
-
-
-	/**
-	 * no actual value is recorded
-	 * @param aName
-	 */
-	public void addArtifact(String aName) {
-
-		Resource r = Resource.uriRef(aName);
-		currentArtifact = graph.newArtifact(aName, r);
-		graph.assertArtifact(currentArtifact);		
-	}
-
-
-
-	public void createRole(String aRole) {
-
-		Resource r = Resource.uriRef(OPM_TAVERNA_NAMESPACE+aRole);		
-		currentRole = graph.newRole(aRole, r);
-	}
-
-
-	public void addProcess(String proc, String iterationVector, String URIfriendlyIterationVector) {
-
-		String processID;
-
-		// PM added 5/09 -- a process name may already be a URI -- this happens for example when we export back OPM
-		// after importing a workflow from our own OPM... in this case, do not pre-pend a new URI scheme
-
-		try {
-			URI procURI = new URI(proc);
-
-			if (procURI.getAuthority() == null) {
-				processID = OPM_TAVERNA_NAMESPACE+proc;				
-			} else {
-				processID = proc;
-			}
-		} catch (URISyntaxException e1) {
-			processID = OPM_TAVERNA_NAMESPACE+proc;
-		}
-		if (URIfriendlyIterationVector.length()>0) {
-			processID = processID+"?it="+URIfriendlyIterationVector;
-		}
-
-		Resource processResource = Resource.uriRef(processID);					
-		currentProcess = graph.newProcess(processID, processResource);
-		graph.assertProcess(currentProcess );
-
-		// add a triple to specify the iteration vector for this occurrence of Process, if it is available
-		if (URIfriendlyIterationVector.length() > 0) {
-//			Resource inputProcessSubject = ((RdfProvenanceProcess) process).getSubject();
-			try {
-				context.addTriple(processResource, Resource.uriRef(OPM_TAVERNA_NAMESPACE+"iteration"), iterationVector);
-			} catch (OperatorException e) {
-				logger.warn("OPM iteration triple creation exception: "+e.getMessage());
-			}
-		}
-	}
-
-
-	public void assertGeneratedBy(ProvenanceArtifact artifact, 
-			ProvenanceProcess process, 
-			ProvenanceRole role, 
-			ProvenanceAccount account,
-			boolean noDuplicates) {
-
-		boolean found = false;
-		if (noDuplicates && artifact != null) {
-			Collection<ProvenanceGeneratedArc> generatedBy = graph.getGeneratedBy(artifact);
-
-			for (ProvenanceGeneratedArc arc:generatedBy) {						
-				ProvenanceProcess pp = arc.getProcess();
-				if (pp.getName().equals(process.getName())) { found = true; break; }						
-			}
-		}
-
-		if (!noDuplicates || (noDuplicates && !found) && artifact != null)
-			graph.assertGeneratedBy(artifact, process, role, account);
-	}
-
-
-
-	public void assertUsed(ProvenanceArtifact artifact,			
-			ProvenanceProcess process, 
-			ProvenanceRole role,
-			ProvenanceAccount account, 
-			boolean noDuplicates) {
-
-		boolean found = false;
-
-		if (noDuplicates) {
-			Collection<ProvenanceUsedArc> used = graph.getUsed(process);
-
-			for (ProvenanceUsedArc arc:used) {						
-				ProvenanceArtifact pa = arc.getArtifact();
-				if (pa.getName().equals(artifact.getName())) { found = true; break; }						
-			}
-		}
-
-		if (!noDuplicates || (noDuplicates && !found) )
-			graph.assertUsed(process, artifact, role, account);
-	}
-
-
-	public ProvenanceContextFacade getGraph() { return graph; }
-
-
-	/**
-	 * @return the account
-	 */
-	public ProvenanceAccount getAccount() { return currentAccount; }
-
-
-	/**
-	 * @param account the account to set
-	 */
-	public void setAccount(ProvenanceAccount account) { this.currentAccount = account; }
-
-	/**
-	 * @return the currentRole
-	 */
-	public ProvenanceRole getCurrentRole() { return currentRole; }
-
-	/**
-	 * @param currentRole the currentRole to set
-	 */
-	public void setCurrentRole(ProvenanceRole currentRole) { this.currentRole = currentRole; }
-
-	/**
-	 * @return the currentArtifact
-	 */
-	public ProvenanceArtifact getCurrentArtifact() { return currentArtifact; }
-
-	/**
-	 * @param currentArtifact the currentArtifact to set
-	 */
-	public void setCurrentArtifact(ProvenanceArtifact currentArtifact) { this.currentArtifact = currentArtifact; }
-
-	/**
-	 * @return the currentAccount
-	 */
-	public ProvenanceAccount getCurrentAccount() { return currentAccount; }
-
-	/**
-	 * @param currentAccount the currentAccount to set
-	 */
-	public void setCurrentAccount(ProvenanceAccount currentAccount) { this.currentAccount = currentAccount; }
-
-	/**
-	 * @return the currentProcess
-	 */
-	public ProvenanceProcess getCurrentProcess() { return currentProcess; }
-
-	/**
-	 * @param currentProcess the currentProcess to set
-	 */
-	public void setCurrentProcess(ProvenanceProcess currentProcess) { this.currentProcess = currentProcess; }
-
-	public String writeGraph() {
-
-		// print out OPM graph in RDF/XML form
-		try {
-			Set<Triple> allTriples = context.getTriples();
-
-			RdfXmlWriter writer = new RdfXmlWriter();	
-			StringWriter sw = new StringWriter();
-			writer.write(allTriples, sw);
-			return sw.toString();
-
-		} catch (OperatorException e) {
-			logger.error("Could not write graph: " + e);
-		} catch (IOException e) {
-			logger.error("Could not write graph: " + e);
-		}	
-		return null;
-	}
-
-
-
-	/**
-	 * IN THE RELEASE WE DO NOT SUPPORT XML -- ONE CAN CONVERT THE RDF TO XML OUT-OF-BAND
-	 * simply invokes the org.openprovenance for converting an RDF OPM graph to an XML OPM graph
-	 * @return a hard-coded filename for the converted XML OPM graph
-	 * @throws OperatorException
-	 * @throws IOException
-	 * @throws JAXBException
-	 */
-//	public String Rdf2Xml() throws OperatorException, IOException, JAXBException {
-//
-//		OPMRdf2Xml converter = new OPMRdf2Xml();
-//		converter.convert(OPM_RDF_GRAPH_FILE, OPM_XML_GRAPH_FILE);		
-//		return OPM_XML_GRAPH_FILE;
-//	}
-
-
-	/**
-	 * creates a dot file from the current OPMGraph. <br/>
-	 * DOT NOT USE NEEDS FIXING
-	 * @return
-	 * @throws IOException 
-	 * @throws OperatorException 
-	 */
-	public String Rdf2Dot() throws OperatorException, IOException {
-
-		OPMRdf2Xml converter = new OPMRdf2Xml();
-		OPMGraph graph = converter.convert(OPM_RDF_GRAPH_FILE);
-
-		List<Process> processes = graph.getProcesses().getProcess();		
-		for (Process p:processes) { p.setId("\""+p.getId()+"\""); }
-
-		List<Artifact> artifacts = graph.getArtifacts().getArtifact();		
-		for (Artifact a:artifacts) { a.setId("\""+a.getId()+"\""); }
-
-//		OPMToDot aOPMToDot = new OPMToDot(DOT_CONFIG_FILE);  		
-		OPMToDot aOPMToDot = new OPMToDot();  		
-
-		aOPMToDot.convert(graph, new File(OPM_DOT_FILE));
-		return OPM_DOT_FILE;
-
-	}
-
-
-	/**
-	 * @param graph the graph to set
-	 */
-	public void setGraph(ProvenanceContextFacade graph) { this.graph = graph; }
-
-	public void setActive(boolean active) { isActive = active; }
-
-	public boolean isActive()  { return isActive; }
-
-}
diff --git a/trunk/reference-api/pom.xml b/trunk/reference-api/pom.xml
deleted file mode 100644
index 281e01f..0000000
--- a/trunk/reference-api/pom.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>net.sf.taverna.t2</groupId>
-		<artifactId>core</artifactId>
-		<version>0.9</version>
-	</parent>
-	<groupId>net.sf.taverna.t2.core</groupId>
-	<artifactId>reference-api</artifactId>
-	<name>API package for the T2 reference manager</name>
-	<description>
-		Core APIs and extension points for the T2 reference manager.
-		This includes the SPIs for external references, translators and
-		publishers.
-	</description>
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-tx</artifactId>
-			<version>2.5.4</version>
-			<scope>compile</scope>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/AbstractExternalReference.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/AbstractExternalReference.java
deleted file mode 100644
index 2ad1f1d..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/AbstractExternalReference.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import static net.sf.taverna.t2.reference.ReferencedDataNature.*;
-
-/**
- * A trivial implementation of ExternalReference. This abstract class should be
- * used as the superclass of any ExternalReference implementations as it
- * provides base metadata for the hibernate-based persistence system used by the
- * main reference manager implementation. While the interface contract cannot
- * require this your extensions will likely not work properly unless you use
- * this class.
- * 
- * @author Tom Oinn
- */
-public abstract class AbstractExternalReference implements ExternalReferenceSPI {
-
-	// Used internally by Hibernate for this class and subclasses
-	private int primaryKey;
-
-	/**
-	 * Used by Hibernate internally to establish a foreign key relationship
-	 * between this abstract superclass and tables corresponding to
-	 * implementations of the ExternalReference interface. Has no impact on any
-	 * application level code, this method is only ever used by the internals of
-	 * the hibernate framework.
-	 */
-	public final void setPrimaryKey(int newKey) {
-		this.primaryKey = newKey;
-	}
-
-	/**
-	 * Used by Hibernate internally to establish a foreign key relationship
-	 * between this abstract superclass and tables corresponding to
-	 * implementations of the ExternalReference interface. Has no impact on any
-	 * application level code, this method is only ever used by the internals of
-	 * the hibernate framework.
-	 */
-	public final int getPrimaryKey() {
-		return this.primaryKey;
-	}
-
-	/**
-	 * Default to returning DataReferenceNature.UNKNOWN
-	 */
-	public ReferencedDataNature getDataNature() {
-		return UNKNOWN;
-	}
-
-	/**
-	 * Default to returning null for charset
-	 */
-	public String getCharset() {
-		return null;
-	}
-
-	/**
-	 * Default to a value of 0.0f for the resolution cost, but implementations
-	 * should at least attempt to set this to a more sensible level!
-	 */
-	public float getResolutionCost() {
-		return 0.0f;
-	}
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ContextualizedT2Reference.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ContextualizedT2Reference.java
deleted file mode 100644
index 532a9ba..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ContextualizedT2Reference.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Used by the {@link ReferenceService#traverseFrom(T2Reference, int)} when
- * traversing a collection structure. Each contextualized t2reference contains
- * the {@link T2Reference} along with an integer array index representing the
- * position of that reference within the traversal structure. The index [i<sub>0</sub>,i<sub>1</sub>,i<sub>2</sub>
- * ... i<sub>n</sub>] is interpreted such that the reference is located at
- * parent.get(i<sub>0</sub>).get(i<sub>1</sub>).get(i<sub>2</sub>)....get(i<sub>n</sub>).
- * If the index is empty then the T2Reference <em>is</em> the original
- * reference supplied to the {@link ReferenceService#traverseFrom(T2Reference, int) traverseFrom} method.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ContextualizedT2Reference {
-
-	/**
-	 * @return the T2Reference to which the associated index applies.
-	 */
-	public T2Reference getReference();
-	
-	/**
-	 * @return the index of this T2Reference
-	 */
-	public int[] getIndex();
-	
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/DaoException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/DaoException.java
deleted file mode 100644
index 1cd3a20..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/DaoException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown by the Data Access Object interface methods, wrapping any underlying
- * exception.
- * 
- * @author Tom Oinn
- * 
- */
-public class DaoException extends RuntimeException {
-
-	static final long serialVersionUID = 8496141798637577803L;
-
-	public DaoException() {
-		super();
-	}
-
-	public DaoException(String message) {
-		super(message);
-	}
-
-	public DaoException(Throwable cause) {
-		super(cause);
-	}
-
-	public DaoException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/DereferenceException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/DereferenceException.java
deleted file mode 100644
index ef811c4..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/DereferenceException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown when a problem occurs during de-reference of an ExternalReferenceSPI
- * implementation. This include operations which implicitly de-reference the
- * reference such as those infering character set or data natures.
- * 
- * @author Tom Oinn
- * 
- */
-public class DereferenceException extends RuntimeException {
-
-	private static final long serialVersionUID = 8054381613840005541L;
-
-	public DereferenceException() {
-		// 
-	}
-
-	public DereferenceException(String message) {
-		super(message);
-	}
-
-	public DereferenceException(Throwable cause) {
-		super(cause);
-	}
-
-	public DereferenceException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocument.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocument.java
deleted file mode 100644
index 9cf14b8..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocument.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Contains the definition of an error token within the workflow system.
- * 
- * @author Tom Oinn
- * @author David Withers
- */
-public interface ErrorDocument extends Identified {
-
-	/**
-	 * If the error document is created from a Throwable it will have a stack
-	 * trace, in this case the stack trace is represented as a list of
-	 * StackTraceElement beans
-	 */
-	public List<StackTraceElementBean> getStackTraceStrings();
-
-	/**
-	 * If the error document is created from a Throwable this contains the
-	 * message part of the Throwable
-	 */
-	public String getExceptionMessage();
-
-	/**
-	 * Error documents can carry an arbitrary string message, this returns it.
-	 */
-	public String getMessage();
-	
-	/**
-	 * If the error document is created from set of references that contain error
-	 * documents, this method returns them. 
-	 */
-	public Set<T2Reference> getErrorReferences();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentDao.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentDao.java
deleted file mode 100644
index a735015..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentDao.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Data access object handling ErrorDocument instances.
- * 
- * @author Tom Oinn
- */
-public interface ErrorDocumentDao {
-
-	/**
-	 * Store a named ErrorDocument to the database.
-	 * 
-	 * @param errorDoc
-	 *            error document to store
-	 * @throws DaoException
-	 *             if any exception is thrown when connecting to the underlying
-	 *             store or when storing the error document
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public void store(ErrorDocument errorDoc) throws DaoException;
-
-	/**
-	 * Retrieves a named and populated ErrorDocument
-	 * 
-	 * @param reference
-	 *            id of the error document to retrieve
-	 * @return a previously stored ErrorDocument instance
-	 * @throws DaoException
-	 *             if any exception is thrown when connecting to the underlying
-	 *             data store or when attempting retrieval of the error document
-	 */
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public ErrorDocument get(T2Reference reference) throws DaoException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(ErrorDocument errorDoc) throws DaoException;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentService.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentService.java
deleted file mode 100644
index de9881a..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentService.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.Set;
-
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Provides facilities to register list of T2References, register empty lists at
- * any given depth and to resolve appropriate T2Reference instances back to
- * these lists. Registration operations assign names and lock the list contents
- * as a result. This service operates strictly on T2References, it neither tries
- * to nor is capable of any form of reference resolution, so aspects such as
- * collection traversal are not handled here (these are performed by the top
- * level reference service)
- * 
- * @author Tom Oinn
- */
-@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-public interface ErrorDocumentService {
-
-	/**
-	 * Register a new error document
-	 * 
-	 * @param message
-	 *            a free text message describing the error, if available. If
-	 *            there is no message use the empty string here.
-	 * @param t
-	 *            a Throwable describing the underlying fault causing this error
-	 *            document to be registered, if any. If there is no Throwable
-	 *            associated use null.
-	 * @param depth
-	 *            depth of the error, used when returning an error document
-	 *            instead of an identified list.
-	 * @return a new ErrorDocument instance, constructed fully and stored in the
-	 *         underlying storage system
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public ErrorDocument registerError(String message, Throwable t, int depth)
-			throws ErrorDocumentServiceException;
-
-	/**
-	 * Equivalent to <code>registerError(message, null, depth)</code>
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public ErrorDocument registerError(String message, int depth)
-			throws ErrorDocumentServiceException;
-
-	/**
-	 * Equivalent to <code>registerError("",t, depth)</code>
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public ErrorDocument registerError(Throwable t, int depth)
-			throws ErrorDocumentServiceException;
-
-	/**
-	 * Register a new error document
-	 * 
-	 * @param message
-	 *            a free text message describing the error, if available. If
-	 *            there is no message use the empty string here.
-	 * @param errors
-	 *            a set of references that contain error documents.
-	 * @param depth
-	 *            depth of the error, used when returning an error document
-	 *            instead of an identified list.
-	 * @return a new ErrorDocument instance, constructed fully and stored in the
-	 *         underlying storage system
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public ErrorDocument registerError(String message, Set<T2Reference> errors, int depth)
-			throws ErrorDocumentServiceException;
-
-	/**
-	 * Retrieve a previously named and registered ErrorDocument from the backing
-	 * store
-	 * 
-	 * @param id
-	 *            identifier of the error document to retrieve
-	 * @return an ErrorDocument
-	 * @throws ErrorDocumentServiceException
-	 *             if anything goes wrong with the retrieval process or if there
-	 *             is something wrong with the reference (such as it being of
-	 *             the wrong reference type).
-	 */
-	public ErrorDocument getError(T2Reference id)
-			throws ErrorDocumentServiceException;
-
-	/**
-	 * Functionality the same as {@link #getError(T2Reference) getError} but in
-	 * asynchronous mode, returning immediately and using the supplied callback
-	 * to communicate its results.
-	 * 
-	 * @param id
-	 *            a {@link T2Reference} identifying an {@link ErrorDocument} to
-	 *            retrieve
-	 * @param callback
-	 *            a {@link ErrorDocumentServiceCallback} used to convey the
-	 *            results of the asynchronous call
-	 * @throws ErrorDocumentServiceException
-	 *             if the reference set service is not correctly configured.
-	 *             Exceptions encountered when performing the asynchronous call
-	 *             are not returned here, for obvious reasons, and are instead
-	 *             messaged through the callback interface.
-	 */
-	public void getErrorAsynch(T2Reference id,
-			ErrorDocumentServiceCallback callback)
-			throws ErrorDocumentServiceException;
-
-	/**
-	 * Return the T2Reference for the sole child of an error document
-	 * identifier.
-	 */
-	public T2Reference getChild(T2Reference errorId)
-			throws ErrorDocumentServiceException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(T2Reference reference) throws ReferenceServiceException;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentServiceCallback.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentServiceCallback.java
deleted file mode 100644
index 0aa58c8..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentServiceCallback.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Callback interface used by asynchronous methods in the
- * {@link ErrorDocumentService} interface
- * 
- * @author Tom Oinn
- * 
- */
-public interface ErrorDocumentServiceCallback {
-
-	/**
-	 * Called when the requested {@link ReferenceSet} has been successfully
-	 * retrieved.
-	 * 
-	 * @param errorDoc
-	 *            the ErrorDocument requested
-	 */
-	public void errorRetrieved(ErrorDocument errorDoc);
-
-	/**
-	 * Called if the retrieval failed for some reason
-	 * 
-	 * @param cause
-	 *            an ErrorDocumentServiceException explaining the retrieval
-	 *            failure
-	 */
-	public void errorRetrievalFailed(ErrorDocumentServiceException cause);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentServiceException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentServiceException.java
deleted file mode 100644
index e47fd35..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ErrorDocumentServiceException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * RuntimeException subclass thrown by the error document service layer
- * interfaces. All underlying exceptions are either handled by the service layer
- * or wrapped in this exception (or a subclass) and rethrown.
- * 
- * @author Tom Oinn
- * 
- */
-public class ErrorDocumentServiceException extends RuntimeException {
-
-	private static final long serialVersionUID = 5556399589785258956L;
-
-	public ErrorDocumentServiceException() {
-		super();
-	}
-
-	public ErrorDocumentServiceException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	public ErrorDocumentServiceException(String message) {
-		super(message);
-	}
-
-	public ErrorDocumentServiceException(Throwable cause) {
-		super(cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceBuilderSPI.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceBuilderSPI.java
deleted file mode 100644
index ae9a129..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceBuilderSPI.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.io.InputStream;
-
-/**
- * Constructs an ExternalReferenceSPI instance from a byte stream. Used by the
- * {@link ReferenceSetAugmentor} when there isn't a direct reference to
- * reference translation path available for a desired target type, but available
- * for external use wherever this functionality is needed.
- * <p>
- * Where an underlying resource is required this is extracted from the supplied
- * ReferenceContext, this implies that all methods in implementations of this
- * interface should be thread safe, allowing multiple concurrent threads
- * cleanly. For SPI purposes implementations should be java beans with default
- * constructors.
- * 
- * @author Tom Oinn
- */
-public interface ExternalReferenceBuilderSPI<TargetType extends ExternalReferenceSPI> {
-
-	/**
-	 * Given a stream of bytes, build the appropriate target
-	 * ExternalReferenceSPI implementation which would de-reference to the value
-	 * of that stream and return it.
-	 * 
-	 * @param existingReferences
-	 *            the references to be used as sources for the translation. In
-	 *            general the implementation will use one of these references.
-	 * @param context
-	 *            a reference resolution context, needed potentially to
-	 *            construct the new ExternalReferenceSchemeSPI, especially in
-	 *            cases where the context contains security agents giving access
-	 *            to a remote data staging system *
-	 * @throws ExternalReferenceConstructionException
-	 *             if an error occurs instantiating the new reference.
-	 * @return the newly constructed ExternalReferenceSPI instance.
-	 */
-	public TargetType createReference(InputStream byteStream,
-			ReferenceContext context);
-
-	/**
-	 * Expose the type of the ExternalReferenceSPI that this builder can
-	 * construct
-	 * 
-	 * @return the class of ExternalReferenceSPI returned by the create
-	 *         reference methods.
-	 */
-	public Class<TargetType> getReferenceType();
-
-	/**
-	 * Because the reference builder may rely on facilities provided to it
-	 * through the context this method is available to check whether these
-	 * facilities are sufficient.
-	 * 
-	 * @param context
-	 *            the reference context that will be used to construct new
-	 *            references
-	 * @return whether the context contains necessary resources for the
-	 *         reference construction process
-	 */
-	public boolean isEnabled(ReferenceContext context);
-
-	/**
-	 * Return an approximate complexity cost of the reference construction. In
-	 * general we can't make any guarantees about this because the complexity of
-	 * the construction depends on more than just the type involved - it can
-	 * depend on local configuration, network location relative to the data
-	 * stores referenced and in some cases on the data themselves. For now
-	 * though we assign an approximation, the default value is 1.0f and lower
-	 * values represent less costly operations.
-	 */
-	public float getConstructionCost();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceConstructionException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceConstructionException.java
deleted file mode 100644
index 15e6964..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceConstructionException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown when an exception occurs during construction of an
- * ExternalReferenceSPI instance. This includes construction through direct
- * method invocation, through the ExternalReferenceBuilderSPI interface and
- * through the ExternalReferenceTranslatorSPI interface.
- * 
- * @author Tom Oinn
- * 
- */
-public class ExternalReferenceConstructionException extends RuntimeException {
-
-	private static final long serialVersionUID = 8334725795238353354L;
-
-	public ExternalReferenceConstructionException() {
-		super();
-	}
-
-	public ExternalReferenceConstructionException(String message) {
-		super(message);
-	}
-
-	public ExternalReferenceConstructionException(Throwable cause) {
-		super(cause);
-	}
-
-	public ExternalReferenceConstructionException(String message,
-			Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceSPI.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceSPI.java
deleted file mode 100644
index bb0286b..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceSPI.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.io.InputStream;
-
-/**
- * A reference to a single piece of data. This may or may not be within the
- * enactment infrastructure, it could refer to data held in a file, a URL, a
- * grid storage system or anything of that nature. Ideally the data this
- * reference points to should not change - we'd like to say 'must not change' at
- * this point but this isn't always possible, implementations should aim to
- * provide the appearance that data are immutable.
- * <p>
- * When used within the workflow engine implementations of this interface are
- * always contained in a ReferenceSet instance.
- * <p>
- * Implementors of this interface are strongly advised to use the
- * AbstractExternalReference superclass - this provides the necessary primary
- * key information used by hibernate-based implementations of the reference
- * manager. Technically we don't require it as it's possible that other backend
- * stores may exist, but the core store used by T2 is based on hibernate so it's
- * a very good idea to follow this! Basically if you don't your code won't work
- * in the current system.
- * <p>
- * This interface is an SPI - while implementations are never constructed based
- * on the SPI registry it is used to discover all implementing classes and
- * automatically register their hibernate mapping files. Implementors should add
- * their implementation class name to a
- * META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI file in
- * the implementation artifact. For examples please refer to the
- * t2reference-core-extensions module, this contains implementations of this
- * interface for common basic reference types.
- * <p>
- * Note - if your implementation class has a complex hibernate mapping that uses
- * components which are themselves mapped into the database (perfectly legal to
- * do) then you must mark those components as instances of HibernateMappedEntity
- * so their corresponding mapping and class definitions are loaded by the
- * Hibernate backed reference set dao. If your implementation class uses inline
- * compound keys or other component types where you reference another class but
- * the other class is not mapped itself in hibernate you must instead make the
- * component class an instance of HibernateComponentClass - a marker interface -
- * for the same reason. Both of these are SPIs themselves, and require the
- * appropriate entries to be added to their service metadata files in your
- * extension jar.
- * 
- * @author Tom Oinn
- */
-public interface ExternalReferenceSPI {
-
-	/**
-	 * Determine, if possible, whether the data this reference refers to is
-	 * textual or binary in nature. If this determination is impossible, either
-	 * because the ExternalReference implementation does not know or because the
-	 * data is not accessible for some reason then this should return
-	 * ReferenceDataNature.UNKNOWN
-	 * 
-	 * @return the nature of the referenced data
-	 */
-	public ReferencedDataNature getDataNature();
-
-	/**
-	 * For textual data return the character set that should be used to pull
-	 * data into a java String object. Callers must deal with a null return
-	 * value in the event of either unknown charset or unknown or binary data
-	 * types.
-	 * 
-	 * @return string character set, for example 'utf-8', or <code>null</code>
-	 *         if binary or unknown type.
-	 */
-	public String getCharset();
-
-	/**
-	 * Open and return an InputStream to the data referenced using, if required,
-	 * any facilities within the supplied context.
-	 * 
-	 * @param context
-	 *            the ReferenceContext object used to obtain e.g. security
-	 *            agents or other facilities required when de-referencing this
-	 *            reference.
-	 * @return an InputStream providing access to the referenced data
-	 * @throws DereferenceException
-	 *             if the reference cannot be de-referenced. This may be because
-	 *             of problems with the context such as security failures, or it
-	 *             may be because the reference is inherently not possible to
-	 *             de-reference (as in the case of a non-serializable API
-	 *             consumer reference).
-	 */
-	public InputStream openStream(ReferenceContext context)
-			throws DereferenceException;
-
-	/**
-	 * Resolution cost is an informal guide to how costly the process of
-	 * de-referencing this reference would be. It's used when assessing which
-	 * out of a set of ExternalReferenceSPI implementations to use to get the
-	 * value of the reference(s), in particular when rendering to POJOs or when
-	 * translating throught the de-reference / construct from stream route. As
-	 * this property is highly complex and potentially expensive in itself to
-	 * evaluate there's no requirement for it to be absolutely correct, it's
-	 * just used as a guide that, for example, it is easier to get bytes from a
-	 * file on the local disk than to get them from a resource held on a grid on
-	 * the other side of the planet.
-	 * 
-	 * @return a float representing some notion of resolution cost, lower values
-	 *         represent cheaper de-reference paths.
-	 */
-	public float getResolutionCost();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceTranslatorSPI.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceTranslatorSPI.java
deleted file mode 100644
index ef9d31d..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceTranslatorSPI.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Constructs an ExternalReference instance from an existing ExternalReference,
- * most usually of a different type. Used by the {@link ReferenceSetAugmentor}.
- * This SPI should not be used for cases where an ExternalReferenceSPI is
- * constructed from a stream of bytes, this is intended for direct reference to
- * reference translation with the assumption that this is more efficient for
- * whatever reason. For cases where the reference is constructed from a byte
- * stream you should implement {@link ExternalReferenceBuilder} instead.
- * <p>
- * For SPI purposes implementations should be java beans with default
- * constructors, any required state such as the location of remote repositories
- * to which data can be staged will be passed in in the ReferenceContext.
- * 
- * @author Tom Oinn
- */
-public interface ExternalReferenceTranslatorSPI<SourceType extends ExternalReferenceSPI, TargetType extends ExternalReferenceSPI> {
-
-	/**
-	 * Given an existing ExternalReferenceSPI, build the appropriate target
-	 * ExternalReferenceSPI implementation and return it.
-	 * 
-	 * @param sourceReference
-	 *            the reference to be used as source for the translation.
-	 * @param context
-	 *            a reference resolution context, needed potentially to access
-	 *            the existing external references or to construct the new one,
-	 *            especially in cases where the context contains security agents
-	 *            giving access to a remote data staging system
-	 * @throws ExternalReferenceConstructionException
-	 *             if an error occurs instantiating the new reference.
-	 * @return the newly constructed ExternalReferenceSPI instance.
-	 */
-	public TargetType createReference(SourceType sourceReference,
-			ReferenceContext context);
-
-	/**
-	 * Return the type of external reference that this translator consumes.
-	 * 
-	 * @return ExternalReferenceSPI class corresponding to the reference type
-	 *         used as a source by this translator.
-	 */
-	public Class<SourceType> getSourceReferenceType();
-
-	/**
-	 * Return the type of external reference this translator constructs.
-	 * 
-	 * @return ExternalReferenceSPI class corresponding to the reference type
-	 *         emitted by this translator.
-	 */
-	public Class<TargetType> getTargetReferenceType();
-
-	/**
-	 * Because the reference translator may rely on facilities provided to it
-	 * through the context this method is available to check whether these
-	 * facilities are sufficient.
-	 * 
-	 * @param context
-	 *            the reference context that will be used to construct new
-	 *            references during the translation process
-	 * @return whether the context contains necessary resources for the
-	 *         reference construction process
-	 */
-	public boolean isEnabled(ReferenceContext context);
-
-	/**
-	 * Return an approximate complexity cost of the translation. In general we
-	 * can't make any guarantees about this because the complexity of the
-	 * translation depends on more than just the types involved - it can depend
-	 * on local configuration, network location relative to the data stores
-	 * referenced and in some cases on the data themselves. For now though we
-	 * assign an approximation, the default value is 1.0f and lower values
-	 * represent less costly operations.
-	 */
-	public float getTranslationCost();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceValidationException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceValidationException.java
deleted file mode 100644
index c5f2687..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ExternalReferenceValidationException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown by setter methods and constructors of ExternalReferenceSPI
- * implementations when fed parameters which cause some kind of format or
- * validation error. These might include badly formed URL or file paths or any
- * other property that fails to validate against some reference type specific
- * scheme.
- * 
- * @author Tom Oinn
- * 
- */
-public class ExternalReferenceValidationException extends RuntimeException {
-
-	private static final long serialVersionUID = 3031393671457773057L;
-
-	public ExternalReferenceValidationException() {
-		// 
-	}
-
-	public ExternalReferenceValidationException(String message) {
-		super(message);
-	}
-
-	public ExternalReferenceValidationException(Throwable cause) {
-		super(cause);
-	}
-
-	public ExternalReferenceValidationException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/Identified.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/Identified.java
deleted file mode 100644
index 214b828..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/Identified.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Interface for any object that has an associated T2Reference
- * 
- * @author Tom Oinn
- * 
- */
-public interface Identified {
-
-	/**
-	 * Return an appropriately configured instance of T2Reference for this
-	 * identified object.
-	 * 
-	 * @return the id of this object in the form of a T2Reference
-	 */
-	public T2Reference getId();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/IdentifiedList.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/IdentifiedList.java
deleted file mode 100644
index dde8fa5..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/IdentifiedList.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.List;
-
-/**
- * An identified list is a list which is identified by a T2Reference. Lists are
- * immutable once named - if getId() returns a non null value all list methods
- * modifying the underlying list data will throw IllegalStateException. In the
- * reference management API this list sub-interface is used to represent both
- * collections of identifiers (i.e. 'raw' stored lists) and more fully resolved
- * structures where the types in the list can be reference sets, error documents
- * and other lists of such. The ListDao interface uses only the 'raw' form
- * consisting of flat lists of identifiers.
- * <p>
- * The IdentifiedList has a unique T2Reference associated with it. If this is
- * null the contents of the list may be modified, otherwise all modification
- * operations throw IllegalStateException. Lists in T2, once named, are
- * immutable.
- * 
- * @author Tom Oinn
- * 
- * @param <T>
- */
-public interface IdentifiedList<T> extends List<T>, Identified {
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListDao.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListDao.java
deleted file mode 100644
index d670c59..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListDao.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Data access object handling NamedLists of T2Reference instances.
- * 
- * @author Tom Oinn
- */
-public interface ListDao {
-
-	/**
-	 * Store a named and populated IdentifiedList of T2Reference to the
-	 * database.
-	 * 
-	 * @param theList
-	 *            list to store
-	 * @throws DaoException
-	 *             if any exception is thrown when connecting to the underlying
-	 *             store or when storing the list
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public void store(IdentifiedList<T2Reference> theList) throws DaoException;
-
-	/**
-	 * Retrieves a named and populated IdentifiedList of T2Reference from the
-	 * database by T2Reference
-	 * 
-	 * @param reference
-	 *            id of the list to retrieve
-	 * @return a previously stored list of T2References
-	 * @throws DaoException
-	 *             if any exception is thrown when connecting to the underlying
-	 *             data store or when attempting retrieval of the list
-	 */
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public IdentifiedList<T2Reference> get(T2Reference reference)
-			throws DaoException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(IdentifiedList<T2Reference> theList)
-			throws DaoException;
-	
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListService.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListService.java
deleted file mode 100644
index 448ab0b..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListService.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.List;
-
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.annotation.Propagation;
-
-/**
- * Provides facilities to register list of T2References, register empty lists at
- * any given depth and to resolve appropriate T2Reference instances back to
- * these lists. Registration operations assign names and lock the list contents
- * as a result. This service operates strictly on T2References, it neither tries
- * to nor is capable of any form of reference resolution, so aspects such as
- * collection traversal are not handled here (these are performed by the top
- * level reference service)
- * 
- * @author Tom Oinn
- */
-@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
-public interface ListService {
-
-	/**
-	 * Register a new list of T2References. The depth of the list will be
-	 * calculated based on the depth of the references within it - if these are
-	 * not uniform the list won't be created (all children of a list in T2 must
-	 * have the same depth as their siblings). Provided this constraint is
-	 * satisfied the list is named and stored in the backing store. The returned
-	 * list is at this point immutable, operations modifying it either directly
-	 * or through the ListIterator will fail with an IllegalStateException.
-	 * Implementations should copy the input list rather than keeping a
-	 * reference to it to preserve this property.
-	 * 
-	 * @param items
-	 *            the T2Reference instances to store as a list.
-	 * @return a new IdentifiedList of T2Reference instances allocated with a
-	 *         T2Reference itself as the unique name and cached by the backing
-	 *         store.
-	 * @throws ListServiceException
-	 *             if there is a problem either with the specified list of
-	 *             references or with the storage subsystem.
-	 */
-	@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
-	public IdentifiedList<T2Reference> registerList(List<T2Reference> items)
-			throws ListServiceException;
-
-	/**
-	 * Register a new empty list with the specified depth. This is needed
-	 * because in the case of empty lists we can't calculate the depth from the
-	 * list items (what with there not being any!), but the depth property is
-	 * critical for the T2 iteration and collection management system in the
-	 * enactor - we need to know that this is an empty list that
-	 * <em>would have</em> contained lists, for example.
-	 * 
-	 * @param depth
-	 *            the depth of the empty list, must be >=1
-	 * @return a new empty IdentifiedList allocated with a T2Reference itself as
-	 *         the unique name and cached by the backing store.
-	 * @throws ListServiceException
-	 *             if there is a problem with the storage subsystem or if called
-	 *             with an invalid depth argument
-	 */
-	@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
-	public IdentifiedList<T2Reference> registerEmptyList(int depth)
-			throws ListServiceException;
-
-	/**
-	 * Retrieve a previously named and registered list of T2Reference instances
-	 * identified by the specified T2Reference (which must be of type
-	 * T2ReferenceType.IdentifiedList)
-	 * 
-	 * @param id
-	 *            identifier of the list of reference to retrieve
-	 * @return an IdentifiedList of T2References. Note that because this list is
-	 *         named it is effectively immutable, if you want to modify the list
-	 *         you have to create and register a new list, you cannot modify the
-	 *         returned value of this directly. This is why there is no update
-	 *         method in the service or dao for reference lists.
-	 * @throws ListServiceException
-	 *             if anything goes wrong with the retrieval process or if there
-	 *             is something wrong with the reference (such as it being of
-	 *             the wrong reference type).
-	 */
-	public IdentifiedList<T2Reference> getList(T2Reference id)
-			throws ListServiceException;
-
-	/**
-	 * Functionality the same as {@link #getList(T2Reference) getList} but in
-	 * asynchronous mode, returning immediately and using the supplied callback
-	 * to communicate its results.
-	 * 
-	 * @param id
-	 *            a {@link T2Reference} identifying an {@link IdentifiedList} to
-	 *            retrieve
-	 * @param callback
-	 *            a {@link ListServiceCallback} used to convey the results of
-	 *            the asynchronous call
-	 * @throws ListServiceException
-	 *             if the reference set service is not correctly configured.
-	 *             Exceptions encountered when performing the asynchronous call
-	 *             are not returned here, for obvious reasons, and are instead
-	 *             messaged through the callback interface.
-	 */
-	public void getListAsynch(T2Reference id, ListServiceCallback callback)
-			throws ListServiceException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(T2Reference reference) throws ReferenceServiceException;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListServiceCallback.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListServiceCallback.java
deleted file mode 100644
index df73d76..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListServiceCallback.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Callback interface used by asynchronous methods in the
- * {@link ListService} interface
- * 
- * @author Tom Oinn
- * 
- */
-public interface ListServiceCallback {
-
-	/**
-	 * Called when the requested {@link ReferenceSet} has been successfully
-	 * retrieved.
-	 * 
-	 * @param references
-	 *            the ReferenceSet requested
-	 */
-	public void listRetrieved(IdentifiedList<T2Reference> references);
-
-	/**
-	 * Called if the retrieval failed for some reason
-	 * 
-	 * @param cause
-	 *            a ListServiceException explaining the retrieval
-	 *            failure
-	 */
-	public void listRetrievalFailed(ListServiceException cause);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListServiceException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListServiceException.java
deleted file mode 100644
index 22bd91c..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ListServiceException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown by methods in the ListService interface if anything goes wrong with
- * list registration or retrieval. Any underlying exceptions that can't be
- * handled in the service layer are wrapped in this and re-thrown.
- * 
- * @author Tom Oinn
- */
-public class ListServiceException extends RuntimeException {
-
-	private static final long serialVersionUID = 5049346991071587866L;
-
-	public ListServiceException() {
-		super();
-	}
-
-	public ListServiceException(String message) {
-		super(message);
-	}
-
-	public ListServiceException(Throwable cause) {
-		super(cause);
-	}
-
-	public ListServiceException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceContext.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceContext.java
deleted file mode 100644
index d2496ee..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceContext.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.List;
-
-/**
- * Many operations over the reference manager require access to an appropriate
- * context. The context contains hooks out to platform level facilities such as
- * the security agent framework (when used in conjunction with the enactor).
- * <p>
- * This interface is also used to pass in resources required by the external
- * reference translation and construction SPIs. An example might be a translator
- * from File to URL could work by copying the source file to a web share of some
- * kind, but obviously this can't happen unless properties such as the location
- * of the web share folder are known. These properties tend to be properties of
- * the installation rather than of the code, referring as they do to resources
- * on the machine hosting the reference manager (and elsewhere).
- * <p>
- * Where entities in the context represent properties of the platform rather
- * than the 'session' they are likely to be configured in a central location
- * such as a Spring context definition, this interface is neutral to those
- * concerns.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceContext {
-
-	/**
-	 * Return a list of all entities in the resolution context which match the
-	 * supplied entity type argument.
-	 * 
-	 * @param <T>
-	 *            The generic type of the returned entity list. In general the
-	 *            compiler is smart enough that you don't need to specify this,
-	 *            it can pick it up from the entityType parameter.
-	 * @param entityType
-	 *            Class of entity to return. Use Object.class to return all
-	 *            entities within the resolution context
-	 * @return a list of entities from the resolution context which can be cast
-	 *         to the specified type.
-	 */
-	public <T extends Object> List<? extends T> getEntities(Class<T> entityType);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceService.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceService.java
deleted file mode 100644
index 7f7c68b..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceService.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Top level access point to the reference manager for client code which is
- * aware of references and error documents. Provides methods to store and
- * retrieve instances of ReferenceSet, IdentifiedList&lt;T2Reference&gt; and
- * ErrorDocument. Acts as an integration layer for the three sub-component
- * service, providing in addition collection traversal and retrieval of lists of
- * identified entities (ReferenceSet, IdentifiedList&lt;Identified&gt; and
- * ErrorDocument) from a T2Reference identifying a list.
- * <p>
- * Also provides registration and retrieval logic for POJOs where supported by
- * appropriate plug-in instances, these methods can be used by code which is not
- * 'reference aware' to store and retrieve value types transparently.
- * <p>
- * Resolution of collections can happen at three different levels:
- * <ol>
- * <li>The embedded {@link ListService} resolves the collection ID to a list of
- * child IDs, and doesn't traverse these children if they are themselves lists.
- * Use the {@link #getListService()}.{@link ListService#getList(T2Reference) getList()}
- * to call this method directly on the list service if you need this
- * functionality, returning a list of {@link T2Reference}</li>
- * <li>The
- * {@link #resolveIdentifier(T2Reference, Set, ReferenceContext) resolveIdentifier}
- * method in this service instead resolves to a fully realized collection of the
- * entities which those IDs reference, and does recursively apply this to child
- * lists, resulting in a nested collection structure where the leaf nodes are
- * ReferenceSet and ErrorDocument instances and non-leaf are IdentifiedList of
- * Identified (the super-interface for IdentifiedList, ReferenceSet and
- * ErrorDocument). Use this method if you want to access the
- * ExternalReferenceSPI and ErrorDocument entities directly because your code
- * can act on a particular reference type - in general in these cases you would
- * also be using the augmentation system to ensure that the required reference
- * type was actually present in the collection structure.</li>
- * <li>The third level of resolution is to render the identifier through
- * {@link #renderIdentifier(T2Reference, Class, ReferenceContext) renderIdentifier}
- * to a nested structure as in
- * {@link #resolveIdentifier(T2Reference, Set, ReferenceContext) resolveIdentifier}
- * but where the structure consists of POJOs of the specified type and lists or
- * either list or the leaf type. This is used when your code is reference
- * agnostic and just requires the values in an easy to consume fashion. Note
- * that because this involves pulling the entire structure into memory it may
- * not be suitable for large data, use with caution. This method will, unlike
- * {@link #resolveIdentifier(T2Reference, Set, ReferenceContext) resolveIdentifier},
- * fail if the reference contains or is an error.</li>
- * </ol>
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceService {
-
-	/**
-	 * Perform recursive identifier resolution, building a collection structure
-	 * of Identified objects, any collection elements being IdentifiedLists of
-	 * Identified subclasses. If the id has depth 0 this will just return the
-	 * Identified to which that id refers.
-	 * 
-	 * @param id
-	 *            the T2Reference to resolve
-	 * @param ensureTypes
-	 *            a set of ExternalReferenceSPI classes, this is used to augment
-	 *            any resolved ReferenceSet instances to ensure that each one
-	 *            has at least one of the specified types. If augmentation is
-	 *            not required this can be set to null.
-	 * @param context
-	 *            the ReferenceContext to use to resolve this and any
-	 *            recursively resolved identifiers <br/> If null the
-	 *            implementation should insert a new empty context and proceed.
-	 * @return fully resolved Identified subclass - this is either a (recursive)
-	 *         IdentifiedList of Identified, a ReferenceSet or an ErrorDocument
-	 * @throws ReferenceServiceException
-	 *             if any problems occur during resolution
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public Identified resolveIdentifier(T2Reference id,
-			Set<Class<ExternalReferenceSPI>> ensureTypes,
-			ReferenceContext context) throws ReferenceServiceException;
-
-	/**
-	 * As resolveIdentifier but using a callback object and returning
-	 * immediately
-	 * 
-	 * @throws ReferenceServiceException
-	 *             if anything goes wrong with the setup of the resolution job.
-	 *             Any exceptions during the resolution process itself are
-	 *             communicated through the callback object.
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public void resolveIdentifierAsynch(T2Reference id,
-			Set<Class<ExternalReferenceSPI>> ensureTypes,
-			ReferenceContext context,
-			ReferenceServiceResolutionCallback callback)
-			throws ReferenceServiceException;
-
-	/**
-	 * Resolve the given identifier, building a POJO structure where the
-	 * non-list items are of the desired class. This makes of any external
-	 * references that can directly expose the appropriate object type, then, if
-	 * none are present in a given reference set, it attempts to locate a POJO
-	 * builder and uses the cheapest available reference to get an InputStream
-	 * and build the target object. If no appropriate builder or embedded value
-	 * can be found the process throws ReferenceServiceException, it also does
-	 * this if any error occurs during retrieval of a (potentially nested)
-	 * identifier.
-	 * <p>
-	 * This method will return a collection structure mirroring that of the
-	 * specified T2Reference, client code should use T2Reference.getDepth() to
-	 * determine the depth of this structure; a reference with depth of 0 means
-	 * that the object returned is of the specified class, one of depth 1 is a
-	 * list of this class and so on.
-	 * <p>
-	 * If the T2Reference contains or is an error this method will not retrieve
-	 * it, and instead throws ReferenceServiceException
-	 * 
-	 * @see StreamToValueConverterSPI
-	 * @see ValueCarryingExternalReference
-	 * @param id
-	 *            the T2Reference to render to a POJO
-	 * @param leafClass
-	 *            the java class for leaves in the resulting POJO structure
-	 * @param context
-	 *            a reference context, potentially used if required by the
-	 *            openStream methods of ExternalReferenceSPI implementations
-	 *            used as sources for the POJO construction <br/> If null the
-	 *            implementation should insert a new empty context and proceed.
-	 * @return a java structure as defined above
-	 * @throws ReferenceServiceException
-	 *             if anything fails during this process
-	 */
-	public Object renderIdentifier(T2Reference id, Class<?> leafClass,
-			ReferenceContext context) throws ReferenceServiceException;
-
-	/**
-	 * The top level registration method is used to register either as yet
-	 * unregistered ErrorDocuments and ReferenceSets (if these are passed in and
-	 * already have an identifier this call does nothing) and arbitrarily nested
-	 * Lists of the same. In addition any ExternalReferenceSPI instances found
-	 * will be wrapped in a single item ReferenceSet and registered, and any
-	 * Throwables will be wrapped in an ErrorDocument and registered. Lists will
-	 * be converted to IdentifiedList&lt;T2Reference&gt; and registered if all
-	 * children can be (or were already) appropriately named.
-	 * <p>
-	 * This method is only valid on parameters of the following type :
-	 * <ol>
-	 * <li>{@link T2Reference} - returned immediately as itself, this is needed
-	 * because it means we can register lists of existing T2Reference</li>
-	 * <li>{@link ReferenceSet} - registered if not already registered,
-	 * otherwise returns existing T2Reference</li>
-	 * <li>{@link ErrorDocument} - same behaviour as ReferenceSet</li>
-	 * <li>{@link ExternalReferenceSPI} - wrapped in ReferenceSet, registered
-	 * and ID returned</li>
-	 * <li>Throwable - wrapped in {@link ErrorDocument} with no message,
-	 * registered and ID returned</li>
-	 * <li>List - all children are first registered, if this succeeds the list
-	 * is itself registered as an {@link IdentifiedList} of {@link T2Reference}
-	 * and its reference returned.</li>
-	 * </ol>
-	 * The exception to this is if the useConvertorSPI parameter is set to true -
-	 * in this case any objects which do not match the above allowed list will
-	 * be run through any available ValueToReferenceConvertorSPI instances in
-	 * turn until one succeeds or all fail, which may result in the creation of
-	 * ExternalReferenceSPI instances. As these can be registered such objects
-	 * will not cause an exception to be thrown.
-	 * 
-	 * @see ValueToReferenceConverterSPI
-	 * @param o
-	 *            the object to register with the reference system, must comply
-	 *            with and will be interpreted as shown in the type list above.
-	 * @param targetDepth
-	 *            the depth of the top level object supplied. This is needed
-	 *            when registering empty collections and error documents,
-	 *            whether as top level types or as members of a collection
-	 *            within the top level type. If registering a collection this is
-	 *            the collection depth, so a List of ReferenceSchemeSPI would be
-	 *            depth 1. Failing to specify this correctly will result in
-	 *            serious problems downstream so be careful! We can't catch all
-	 *            potential problems in this method (although some errors will
-	 *            be trapped).
-	 * @param useConverterSPI
-	 *            whether to attempt to use the ValueToReferenceConvertorSPI
-	 *            registry (if defined and available) to map arbitrary objects
-	 *            to ExternalReferenceSPI instances on the fly. The registry of
-	 *            converters is generally injected into the implementation of
-	 *            this service.
-	 * @param context
-	 *            ReferenceContext to use if required by component services,
-	 *            this is most likely to be used by the object to reference
-	 *            converters if engaged. <br/> If null the implementation should
-	 *            insert a new empty context and proceed.
-	 * @return a T2Reference to the registered object
-	 * @throws ReferenceServiceException
-	 *             if the object type (or, for collections, the recursive type
-	 *             of its contents) is not in the allowed list or if a problem
-	 *             occurs during registration. Also thrown if attempting to use
-	 *             the converter SPI without an attached registry.
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public T2Reference register(Object o, int targetDepth,
-			boolean useConverterSPI, ReferenceContext context)
-			throws ReferenceServiceException;
-	
-	/**
-	 * Given a string representation of a T2Reference create a new T2Reference with
-	 * the correct depth etc.
-	 * @param reference
-	 * @return a new T2Reference parsed from the original
-	 */
-	public T2Reference referenceFromString(String reference);
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(T2Reference reference) throws ReferenceServiceException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(List<T2Reference> references) throws ReferenceServiceException;
-	
-	/**
-	 * Returns the {@link ErrorDocumentService} this ReferenceService uses, use
-	 * this when you need functionality from that service explicitly.
-	 */
-	public ErrorDocumentService getErrorDocumentService();
-
-	/**
-	 * Returns the {@link ReferenceSetService} this ReferenceService uses, use
-	 * this when you need functionality from that service explicitly.
-	 */
-	public ReferenceSetService getReferenceSetService();
-
-	/**
-	 * Returns the {@link ListService} this ReferenceService uses, use this when
-	 * you need functionality from that service explicitly.
-	 */
-	public ListService getListService();
-
-	/**
-	 * Initiates a traversal of the specified t2reference, traversing to
-	 * whatever level of depth is required such that all identifiers returned
-	 * within the iterator have the specified depth. The context (i.e. the index
-	 * path from the originally specified reference to each reference within the
-	 * iteration) is included through use of the ContextualizedT2Reference
-	 * wrapper class
-	 * 
-	 * @param source
-	 *            the T2Reference from which to traverse. In general this is the
-	 *            root of a collection structure.
-	 * @param desiredDepth
-	 *            the desired depth of all returned T2References, must be less
-	 *            than or equal to that of the source reference.
-	 * @throws ReferenceServiceException
-	 *             if unable to create the iterator for some reason. Note that
-	 *             implementations are free to lazily perform the iteration so
-	 *             this method may succeed but the iterator produced can fail
-	 *             when used. If the iterator fails it will do so by throwing
-	 *             one of the underlying sub-service exceptions.
-	 */
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public Iterator<ContextualizedT2Reference> traverseFrom(T2Reference source,
-			int desiredDepth);
-	
-	
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceCacheProvider.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceCacheProvider.java
deleted file mode 100644
index 50b7686..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceCacheProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * A simple interface to be implemented by data access object cache providers,
- * intended to be used to inject cache implementations through AoP
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceServiceCacheProvider {
-
-	/**
-	 * Called after an Identified has been written to the backing store, either
-	 * for the first time or after modification. In our model ReferenceSet is
-	 * the only Identified that is modifiable, specifically only by the addition
-	 * of ExternalReferenceSPI instances to its reference set.
-	 * 
-	 * @param i
-	 *            the Identified written to the backing store
-	 */
-	void put(Identified i);
-
-	/**
-	 * Called before an attempt is made to retrieve an item from the backing
-	 * store
-	 * 
-	 * @param id
-	 *            the T2Reference of the item to retrieve
-	 * @return a cached item with matching T2Reference, or null if the cache
-	 *         does not contain that item
-	 */
-	Identified get(T2Reference id);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceException.java
deleted file mode 100644
index ebcc836..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown by methods in the ReferenceService, used to wrap any underlying
- * exceptions from lower layers.
- * 
- * @author Tom Oinn
- * 
- */
-public class ReferenceServiceException extends RuntimeException {
-
-	private static final long serialVersionUID = -2607675495513408333L;
-
-	public ReferenceServiceException() {
-		//
-	}
-
-	public ReferenceServiceException(String message) {
-		super(message);
-	}
-
-	public ReferenceServiceException(Throwable cause) {
-		super(cause);
-	}
-
-	public ReferenceServiceException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceResolutionCallback.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceResolutionCallback.java
deleted file mode 100644
index be52d8f..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceServiceResolutionCallback.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Used by the asynchronous form of the resolveIdentifier method in
- * ReferenceService
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceServiceResolutionCallback {
-
-	/**
-	 * Called when the resolution process has completed
-	 * 
-	 * @param result
-	 *            the Identified that corresponds to the T2Reference specified
-	 *            in the call to resolveIdentifierAsynch in ReferenceService
-	 */
-	public void identifierResolved(Identified result);
-
-	/**
-	 * Called when the resolution process has failed
-	 * 
-	 * @param cause
-	 *            a ReferenceServiceException describing the failure
-	 */
-	public void resolutionFailed(ReferenceServiceException cause);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSet.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSet.java
deleted file mode 100644
index ecb6cdc..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSet.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.Set;
-
-/**
- * A set of ExternalReferenceSPI instances, all of which point to the same (byte
- * equivalent) data. The set is identified by a T2Reference. This interface is
- * read-only, as are most of the interfaces in this package. Rather than
- * modifying properties of the reference set directly the client code should use
- * the reference manager functionality.
- * <p>
- * It is technically okay, but rather unhelpful, to have a ReferenceSet with no
- * ExternalReferenceSPI implementations. In general this is a sign that
- * something has gone wrong somewhere as the reference set will not be
- * resolvable in any way, but it would still retain its unique identifier so
- * there may be occasions where this is the desired behaviour.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceSet extends Identified {
-
-	/**
-	 * The reference set contains a set of ExternalReferenceSPI instances, all
-	 * of which point to byte equivalent data.
-	 * 
-	 * @return the set of references to external data
-	 */
-	public Set<ExternalReferenceSPI> getExternalReferences();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentationException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentationException.java
deleted file mode 100644
index 2545f80..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentationException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown when the reference set augmentor is unable to provide at least one of
- * the desired types for any reason.
- * 
- * @author Tom Oinn
- * 
- */
-public class ReferenceSetAugmentationException extends RuntimeException {
-
-	private static final long serialVersionUID = -6156508424485682266L;
-
-	public ReferenceSetAugmentationException() {
-		//
-	}
-
-	public ReferenceSetAugmentationException(String message) {
-		super(message);
-	}
-
-	public ReferenceSetAugmentationException(Throwable cause) {
-		super(cause);
-	}
-
-	public ReferenceSetAugmentationException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentor.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentor.java
deleted file mode 100644
index 0d62bbb..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentor.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.Set;
-
-/**
- * Provides a framework to find and engage appropriate instances of
- * {@link ExternalReferenceTranslatorSPI} and
- * {@link ExternalReferenceBuilderSPI} to build external references from,
- * respectively, other external references and from streams. These are then used
- * to augment the contents of implementations of {@link ReferenceSet} with
- * additional {@link ExternalReferenceSPI} implementations.
- * <p>
- * Methods in this interface throw the runtime exception
- * {@link ReferenceSetAugmentationException} for all problems, other exceptions
- * are wrapped in this type and re-thrown.
- * 
- * @author Tom Oinn
- */
-public interface ReferenceSetAugmentor {
-
-	/**
-	 * Attempts to modify the supplied ReferenceSet such that it contains an
-	 * implementation of at least one of the ExternalReferenceSPI classes
-	 * specified. Uses the supplied context if required to build or translate
-	 * existing references within the reference set.
-	 * 
-	 * @param references
-	 *            reference set object to augment
-	 * @param targetReferenceTypes
-	 *            a set of Class objects, this method succeeds if it can create
-	 *            an instance of at least one of these pointing to the same data
-	 *            as the other external references in the supplied reference set
-	 * @param context
-	 *            a reference resolution context, potentially required for
-	 *            access to the existing references or for creation of the
-	 *            augmentations
-	 * @return a set of new ExternalReferenceSPI instances such that the union
-	 *         of this set with the pre-existing reference set satisfies the
-	 *         target reference constraint. It is the responsibility of the
-	 *         caller to re-integrate these references into the original
-	 *         ReferenceSet if so desired.
-	 * @throws ReferenceSetAugmentationException
-	 *             if a problem occurs either in configuration of the
-	 *             ReferenceSetAugmentor or in the augmentation process itself.
-	 *             Any other exception types are wrapped in this and re-thrown.
-	 */
-	public Set<ExternalReferenceSPI> augmentReferenceSet(ReferenceSet references,
-			Set<Class<ExternalReferenceSPI>> targetReferenceTypes,
-			ReferenceContext context) throws ReferenceSetAugmentationException;
-
-	/**
-	 * As with {@link #augmentReferenceSet(ReferenceSet, Set, ReferenceContext)}
-	 * but called in an asynchronous fashion. Returns immediately and uses the
-	 * supplied instance of {@link ReferenceSetAugmentorCallback} to provide
-	 * either the augmented {@link ReferenceSet} or an exception indicating a
-	 * failure in the augmentation process.
-	 * 
-	 * @param callback
-	 *            callback object used to indicate failure or to return the
-	 *            modified reference set
-	 * @throws ReferenceSetAugmentationException
-	 *             if the ReferenceSetAugmentor is missing critical
-	 *             configuration. Exceptions that happen during augmentation or
-	 *             as a result of a failure to find an appropriate augmentation
-	 *             path are signalled by calls to the callback object, this
-	 *             method only throws the exception if it can't even try to do
-	 *             the augmentation for some reason.
-	 */
-	public void augmentReferenceSetAsynch(ReferenceSet references,
-			Set<Class<ExternalReferenceSPI>> targetReferenceTypes,
-			ReferenceContext context, ReferenceSetAugmentorCallback callback)
-			throws ReferenceSetAugmentationException;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentorCallback.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentorCallback.java
deleted file mode 100644
index 2bde7c9..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetAugmentorCallback.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.Set;
-
-/**
- * Callback interface used when augmenting a ReferenceSet in an asynchronous
- * fashion through
- * {@link ReferenceSetAugmentor#augmentReferenceSetAsynch(ReferenceSet, Set, ReferenceContext, ReferenceSetAugmentorCallback) augmentReferenceSetAsynch}
- * in {@link ReferenceSetAugmentor}.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceSetAugmentorCallback {
-
-	/**
-	 * Called when the augmentation has succeeded
-	 * 
-	 * @param newReferences
-	 *            a set of ExternalReferenceSPI instances created during the
-	 *            augmentation process. It is the responsibility of the caller
-	 *            to re-integrate these back into the ReferenceSet used in the
-	 *            translation
-	 */
-	public void augmentationCompleted(Set<ExternalReferenceSPI> newReferences);
-
-	/**
-	 * Called when the augmentation has failed for some reason
-	 * 
-	 * @param cause
-	 *            a {@link ReferenceSetAugmentationException} object describing
-	 *            the failure.
-	 */
-	public void augmentationFailed(ReferenceSetAugmentationException cause);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetDao.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetDao.java
deleted file mode 100644
index 9ccd254..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetDao.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Data Access Object interface for {@link ReferenceSet}. Used by the
- * {@link ReferenceSetService} to store and retrieve implementations of
- * reference set to and from the database. Client code should use the reference
- * set service rather than using this Dao directly.
- * <p>
- * All methods throw DaoException, and nothing else. Where a deeper error is
- * propagated it is wrapped in a DaoException and passed on to the caller.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceSetDao {
-
-	/**
-	 * Store the specified new reference set
-	 * 
-	 * @param rs
-	 *            a reference set, must not already exist in the database.
-	 * @throws DaoException
-	 *             if the entry already exists in the database or some other
-	 *             database related problem occurs
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public void store(ReferenceSet rs) throws DaoException;
-
-	/**
-	 * Update a pre-existing entry in the database
-	 * 
-	 * @param rs
-	 *            the reference set to update. This must already exist in the
-	 *            database
-	 * @throws DaoException
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public void update(ReferenceSet rs) throws DaoException;
-
-	/**
-	 * Fetch a reference set by id
-	 * 
-	 * @param ref
-	 *            the T2Reference to fetch
-	 * @return a retrieved ReferenceSet
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public ReferenceSet get(T2Reference ref) throws DaoException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(ReferenceSet rs) throws DaoException;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetService.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetService.java
deleted file mode 100644
index ec60eeb..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetService.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Provides facilities to register sets of ExternalReferenceSPI implementations
- * within the reference manager and to retrieve these sets by T2Reference either
- * as stored or with translation support. In general applications should be
- * using this interface (where only ReferenceSet functionality is required) or
- * the support classes which in turn use this and the collection and error
- * handling interfaces to present a unified view over the various components of
- * the reference management system.
- * 
- * @author Tom Oinn
- */
-@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-public interface ReferenceSetService {
-
-	/**
-	 * Register a set of {@link ExternalReferenceSPI} instances, all of which
-	 * should point to byte equivalent data, and return the newly created
-	 * {@link ReferenceSet}. This method blocks on the underlying store, but
-	 * guarantees that the returned value has been persisted.
-	 * 
-	 * @param references
-	 *            a set of {@link ExternalReferenceSPI} implementations to
-	 *            register as a {@link ReferenceSet}
-	 * @return the registered {@link ReferenceSet}
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public ReferenceSet registerReferenceSet(
-			Set<ExternalReferenceSPI> references)
-			throws ReferenceSetServiceException;
-
-	/**
-	 * Get a previously registered {@link ReferenceSet} by {@link T2Reference}.
-	 * Note that this method blocks and may take some time to return in the case
-	 * of distributed reference managers; if this is likely to be an issue then
-	 * you should use the asynchronous form
-	 * {@link #getReferenceSetAsynch(T2Reference, ReferenceSetServiceCallback) getReferenceSetAsynch}
-	 * instead of this method.
-	 * 
-	 * @param id
-	 *            a {@link T2Reference} identifying a {@link ReferenceSet} to
-	 *            retrieve
-	 * @return the requested {@link ReferenceSet}
-	 */
-	public ReferenceSet getReferenceSet(T2Reference id)
-			throws ReferenceSetServiceException;
-
-	/**
-	 * Functionality the same as
-	 * {@link #getReferenceSet(T2Reference) getReferenceSet} but in asynchronous
-	 * mode, returning immediately and using the supplied callback to
-	 * communicate its results.
-	 * 
-	 * @param id
-	 *            a {@link T2Reference} identifying a {@link ReferenceSet} to
-	 *            retrieve
-	 * @param callback
-	 *            a {@link ReferenceSetServiceCallback} used to convey the
-	 *            results of the asynchronous call
-	 * @throws ReferenceSetServiceException
-	 *             if the reference set service is not correctly configured.
-	 *             Exceptions encountered when performing the asynchronous call
-	 *             are not returned here, for obvious reasons, and are instead
-	 *             messaged through the callback interface.
-	 */
-	public void getReferenceSetAsynch(T2Reference id,
-			ReferenceSetServiceCallback callback)
-			throws ReferenceSetServiceException;
-
-	/**
-	 * Functionality the same as
-	 * {@link #getReferenceSet(T2Reference) getReferenceSet} but with the
-	 * additional option to specify a set of {@link ExternalReferenceSPI}
-	 * classes. The reference set manager will attempt to ensure that the
-	 * returned {@link ReferenceSet} contains an instance of at least one of the
-	 * specified classes. This method blocks, and may potentially incur both the
-	 * remote lookup overhead of the simpler version of this call and any
-	 * translation logic. It is <em>strongly</em> recommended that you do not
-	 * use this version of the call and instead use the asynchronous form
-	 * {@link #getReferenceSetWithAugmentationAsynch(T2Reference, Set, ReferenceContext, ReferenceSetServiceCallback) getReferenceSetWithAugmentationAsynch}
-	 * instead.
-	 * <p>
-	 * If the translation logic cannot provide at least one of the required
-	 * types this call will fail, even if the {@link ReferenceSet} requested is
-	 * otherwise available.
-	 * 
-	 * @param id
-	 *            a {@link T2Reference} identifying a {@link ReferenceSet} to
-	 *            retrieve
-	 * @param ensureTypes
-	 *            a set of {@link ExternalReferenceSPI} classes. The framework
-	 *            will attempt to ensure there is an instance of at least one of
-	 *            these classes in the returned {@link ReferenceSet}
-	 * @param context
-	 *            if translation of references is required the translation
-	 *            infrastructure will need information in this
-	 *            {@link ReferenceContext} parameter.
-	 *            <p>
-	 *            If null the implementation should insert a new empty context
-	 *            and proceed.
-	 * @return the requested {@link ReferenceSet}
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public ReferenceSet getReferenceSetWithAugmentation(T2Reference id,
-			Set<Class<ExternalReferenceSPI>> ensureTypes,
-			ReferenceContext context) throws ReferenceSetServiceException;
-
-	/**
-	 * Functionality as
-	 * {@link #getReferenceSetWithAugmentation(T2Reference, Set, ReferenceContext) getReferenceSetWithAugmentation}
-	 * but with the addition of a callback interface to report the result or
-	 * failure of the method.
-	 * 
-	 * @param id
-	 *            a {@link T2Reference} identifying a {@link ReferenceSet} to
-	 *            retrieve
-	 * @param ensureTypes
-	 *            a set of {@link ExternalReferenceSPI} classes. The framework
-	 *            will attempt to ensure there is an instance of at least one of
-	 *            these classes in the returned {@link ReferenceSet}
-	 * @param context
-	 *            if translation of references is required the translation
-	 *            infrastructure will need information in this
-	 *            {@link ReferenceContext} parameter.
-	 *            <p>
-	 *            If null the implementation should insert a new empty context
-	 *            and proceed.
-	 * @param callback
-	 *            a {@link ReferenceSetServiceCallback} used to convey the
-	 *            results of the asynchronous call *
-	 * @throws ReferenceSetServiceException
-	 *             if the reference set service is not correctly configured.
-	 *             Exceptions encountered when performing the asynchronous call
-	 *             are not returned here, for obvious reasons, and are instead
-	 *             messaged through the callback interface.
-	 */
-	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
-	public void getReferenceSetWithAugmentationAsynch(T2Reference id,
-			Set<Class<ExternalReferenceSPI>> ensureTypes,
-			ReferenceContext context, ReferenceSetServiceCallback callback)
-			throws ReferenceSetServiceException;
-	
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = false)
-	public boolean delete(T2Reference reference) throws ReferenceServiceException;
-	
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetServiceCallback.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetServiceCallback.java
deleted file mode 100644
index 4f6701a..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetServiceCallback.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Callback interface used by asynchronous methods in the
- * {@link ReferenceSetService} interface
- * 
- * @author Tom Oinn
- * 
- */
-public interface ReferenceSetServiceCallback {
-
-	/**
-	 * Called when the requested {@link ReferenceSet} has been successfully
-	 * retrieved.
-	 * 
-	 * @param references
-	 *            the ReferenceSet requested
-	 */
-	public void referenceSetRetrieved(ReferenceSet references);
-
-	/**
-	 * Called if the retrieval failed for some reason
-	 * 
-	 * @param cause
-	 *            a ReferenceSetServiceException explaining the retrieval
-	 *            failure
-	 */
-	public void referenceSetRetrievalFailed(ReferenceSetServiceException cause);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetServiceException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetServiceException.java
deleted file mode 100644
index 8825439..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferenceSetServiceException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * RuntimeException subclass thrown by the reference set service layer
- * interfaces. All underlying exceptions are either handled by the service layer
- * or wrapped in this exception (or a subclass) and rethrown.
- * 
- * @author Tom Oinn
- * 
- */
-public class ReferenceSetServiceException extends RuntimeException {
-
-	private static final long serialVersionUID = -2762995062729638168L;
-
-	public ReferenceSetServiceException() {
-		//
-	}
-
-	public ReferenceSetServiceException(String message) {
-		super(message);
-	}
-
-	public ReferenceSetServiceException(Throwable cause) {
-		super(cause);
-	}
-
-	public ReferenceSetServiceException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferencedDataNature.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferencedDataNature.java
deleted file mode 100644
index 5bb30fe..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ReferencedDataNature.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Where possible ExternalReferenceSPI implementations should be able to
- * determine whether the data they refer to is textual or binary in nature. This
- * enumeration contains values for textual, binary and unknown data natures.
- * 
- * @author Tom Oinn
- * 
- */
-public enum ReferencedDataNature {
-
-	/**
-	 * The data is binary, no character encoding will be specified.
-	 */
-	BINARY,
-
-	/**
-	 * The data is textual, character encoding may be defined.
-	 */
-	TEXT,
-
-	/**
-	 * Unknown data nature.
-	 */
-	UNKNOWN;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/StackTraceElementBean.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/StackTraceElementBean.java
deleted file mode 100644
index c6e1ac0..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/StackTraceElementBean.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Used by the {@link ErrorDocument} interface to represent a frame within a
- * stack trace
- * 
- * @author Tom Oinn
- * 
- */
-public interface StackTraceElementBean {
-
-	/**
-	 * Returns the fully qualified name of the class containing the execution
-	 * point represented by this stack trace element.
-	 */
-	public String getClassName();
-
-	/**
-	 * Returns the name of the source file containing the execution point
-	 * represented by this stack trace element.
-	 */
-	public String getFileName();
-
-	/**
-	 * Returns the line number of the source line containing the execution point
-	 * represented by this stack trace element.
-	 */
-	public int getLineNumber();
-
-	/**
-	 * Returns the name of the method containing the execution point represented
-	 * by this stack trace element.
-	 */
-	public String getMethodName();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/StreamToValueConverterSPI.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/StreamToValueConverterSPI.java
deleted file mode 100644
index 9e77671..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/StreamToValueConverterSPI.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.io.InputStream;
-
-/**
- * SPI for objects that can render a POJO from an InputStream
- * 
- * @author Tom Oinn
- * 
- */
-public interface StreamToValueConverterSPI<T> {
-
-	/**
-	 * The class of objects which this builder can construct from a stream
-	 */
-	public Class<T> getPojoClass();
-
-	/**
-	 * Render the stream to the target object type
-	 * 
-	 * @param stream
-	 *            input stream of data to render to the object
-	 * @return the newly created object
-	 */
-	public T renderFrom(InputStream stream);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2Reference.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2Reference.java
deleted file mode 100644
index 5c63eba..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2Reference.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-import java.net.URI;
-
-/**
- * The T2Reference is used within the workflow system to refer to any entity
- * within the reference management system, whether reference set, list or error
- * document. The reference carries certain properties which can be evaluated
- * without resolution, these include a depth property and whether the reference
- * either is or contains an error document at any point in its structure.
- * 
- * @author Tom Oinn
- * 
- */
-public interface T2Reference {
-
-	/**
-	 * To determine the entity that this reference points to we use an
-	 * enumeration of possible entity types
-	 * 
-	 * @return the type of entity to which this reference refers.
-	 */
-	public T2ReferenceType getReferenceType();
-
-	/**
-	 * All entities identified by a T2Reference have a conceptual depth. In the
-	 * case of lists the depth is the (uniform) depth of any item in the list
-	 * plus one, in the case of reference sets the depth is 0. Error documents
-	 * and empty lists may also have non zero depth; error documents in
-	 * particular have a depth corresponding to the depth of the list or
-	 * reference set that would have been created if there was no error.
-	 * 
-	 * @return the depth of the entity identified by this T2Reference
-	 */
-	public int getDepth();
-
-	/**
-	 * Error documents always return true, as do any lists where at least one
-	 * immediate child of the list returns true when this property is evaluated.
-	 * As lists are immutable this property is actually set on list
-	 * registration. This is used to determine whether to allow POJO resolution
-	 * of the entity identified by this T2Reference - this is configurable by
-	 * the caller but there will be some cases where an attempt to render a
-	 * collection containing errors to a POJO should return an error and other
-	 * occasions when it should return a collection containing error objects.
-	 * <p>
-	 * ReferenceSet implementations always return false.
-	 * 
-	 * @return whether the entity identified by this T2Reference either is or
-	 *         contains an error document. Containment is transitive, so a list
-	 *         containing a list that contained an error would return true.
-	 */
-	public boolean containsErrors();
-
-	/**
-	 * T2Reference instances retain a reference to the reference manager which
-	 * created them in the form of a namespace. This is an opaque string
-	 * matching the regular expression [a-zA-Z_0-9]+, and is immutable once
-	 * assigned (as are the other properties of this interface). The reference
-	 * manager infrastructure uses this namespace property primarily to
-	 * differentiate between cases where a reference cannot be resolved because
-	 * of a lack of connection to the appropriate remote reference manager and
-	 * those where the reference simply does not exist anywhere.
-	 * 
-	 * @return the namespace of this T2Reference as a string.
-	 */
-	public String getNamespacePart();
-
-	/**
-	 * In addition to the namespace the T2Reference contains a local identifier.
-	 * This identifier is unique in the context of the namespace and is also
-	 * represented as a string matching the regular expression [a-z_A-Z0-9]+
-	 * 
-	 * @return the local part of this T2Reference as a string.
-	 */
-	public String getLocalPart();
-
-	/**
-	 * All T2Reference instances can be represented as a URI.
-	 * 
-	 * @return representation of this T2Reference as a URI
-	 */
-	public URI toUri();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2ReferenceGenerator.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2ReferenceGenerator.java
deleted file mode 100644
index 73d131a..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2ReferenceGenerator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Provides new unique T2Reference instances. Used by and injected into the
- * various service interface implementations when registering new reference
- * sets, error documents and lists.
- * 
- * @author Tom Oinn
- * 
- */
-public interface T2ReferenceGenerator {
-
-	/**
-	 * All T2Reference objects will have this namespace
-	 * 
-	 * @return the namespace as a string
-	 */
-	public String getNamespace();
-
-	/**
-	 * Create a new and otherwise unused T2Reference to a ReferenceSet
-	 * 
-	 * @return new T2Reference for a ReferenceSet, namespace and local parts
-	 *         will be initialized and the reference is ready to use when
-	 *         returned.
-	 */
-	public T2Reference nextReferenceSetReference();
-
-	/**
-	 * Create a new and otherwise unused T2Reference to an IdentifiedList
-	 * 
-	 * @param containsErrors
-	 *            whether the list this reference is generated for contains
-	 *            t2references with their containsErrors property set to true.
-	 *            Returns true if <em>any</em> reference in the list is or
-	 *            contains an error.
-	 * @param listDepth
-	 *            depth of the list to which this identifier will be applied
-	 * @return a new T2Reference for an IdentifiedList. Namespace, type and
-	 *         local parts will be initialized but depth and error content will
-	 *         still be at their default values of '0' and 'false' respectively,
-	 *         these will need to be re-set before the reference is viable.
-	 */
-	public T2Reference nextListReference(boolean containsErrors, int listDepth);
-
-	/**
-	 * Create a new and otherwise unused T2Reference to an ErrorDocument
-	 * 
-	 * @param depth
-	 *            the depth of the error document to which this identifier will
-	 *            refer
-	 * @return a new T2Reference for an ErrorDocument
-	 */
-	public T2Reference nextErrorDocumentReference(int depth);
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2ReferenceType.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2ReferenceType.java
deleted file mode 100644
index 9d9b0fa..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/T2ReferenceType.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * The T2Reference interface is used to identify several different kinds of
- * information, namely ReferenceSet, IdentifiedList and ErrorDocument. Because
- * the top level reference service needs to determine which sub-service to
- * delegate to when resolving references we carry this information in each
- * T2Reference in the form of one of these enumerated types.
- * 
- * @author Tom Oinn
- * 
- */
-public enum T2ReferenceType {
-
-	/**
-	 * A reference to a ReferenceSet
-	 */
-	ReferenceSet,
-	
-	/**
-	 * A reference to an IdentifiedList of other T2References
-	 */
-	IdentifiedList,
-	
-	/**
-	 * A reference to an ErrorDocument
-	 */
-	ErrorDocument;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueCarryingExternalReference.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueCarryingExternalReference.java
deleted file mode 100644
index 2f19000..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueCarryingExternalReference.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Specialization of ExternalReferenceSPI for reference types which carry a
- * value type internally. Such references can be de-referenced to the specified
- * object type very cheaply. Note that this is not to be used to get an object
- * property of a reference, the returned object must correspond to the value of
- * the referenced data - this means that the HttpUrlReference does not use this
- * to return a java.net.URL, but that the InlineStringReference does use it to
- * return a java.lang.String
- * 
- * @author Tom Oinn
- * 
- */
-public interface ValueCarryingExternalReference<T> extends ExternalReferenceSPI {
-
-	/**
-	 * Returns the type of the inlined value
-	 */
-	public Class<T> getValueType();
-
-	/**
-	 * Returns the value
-	 */
-	public T getValue();
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueToReferenceConversionException.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueToReferenceConversionException.java
deleted file mode 100644
index 2c7417a..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueToReferenceConversionException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * Thrown by instances of ValueToReferenceConvertor when trying to convert an
- * object to an instance of ExternalReferenceSPI if the conversion process fails
- * for some reason.
- * 
- * @author Tom Oinn
- * 
- */
-public class ValueToReferenceConversionException extends RuntimeException {
-
-	private static final long serialVersionUID = 3259959719223191820L;
-
-	public ValueToReferenceConversionException() {
-		// 
-	}
-
-	public ValueToReferenceConversionException(String message) {
-		super(message);
-	}
-
-	public ValueToReferenceConversionException(Throwable cause) {
-		super(cause);
-	}
-
-	public ValueToReferenceConversionException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueToReferenceConverterSPI.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueToReferenceConverterSPI.java
deleted file mode 100644
index de8f480..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/ValueToReferenceConverterSPI.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference;
-
-/**
- * SPI for components that can convert an arbitrary object to an
- * ExternalReferenceSPI representing the value of that object. Used by
- * implementations of {@link ReferenceService#register(Object, int, boolean)} to
- * map arbitrary objects to ExternalReferenceSPI instances if encountered during
- * the registration process. This SPI is only used if the boolean
- * useConverterSPI parameter is set to true on that method.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ValueToReferenceConverterSPI {
-
-	/**
-	 * Can this SPI implementation convert the specified object to an
-	 * ExternalReferenceSPI? This test should be as lightweight as possible, and
-	 * will usually be based on the Class of the object supplied.
-	 * 
-	 * @param context
-	 *            a ReferenceContext to use if required by the plugin, the
-	 *            ability to convert should be interpreted in the scope of this
-	 *            context. In general the context probably not used by most
-	 *            implementations but it's here if required.
-	 * 
-	 * @return whether this converter is applicable to the specified object
-	 */
-	public boolean canConvert(Object o, ReferenceContext context);
-
-	/**
-	 * Construct and return a new ExternalReferenceSPI implementation which is
-	 * in some way equivalent to the supplied object. This is not intended to be
-	 * a two-way process necessarily, although the conversion should attempt to
-	 * be conservative (so not actually changing the data!).
-	 * 
-	 * @param context
-	 *            a ReferenceContext to use, if required, during construction of
-	 *            the new external reference
-	 * @return A new instance of ExternalReferenceSPI which references, as far
-	 *         as possible, the value represented by the specified object
-	 * @throws ValueToReferenceConversionException
-	 *             if any problem occurs during the conversion
-	 */
-	public ExternalReferenceSPI convert(Object o, ReferenceContext context)
-			throws ValueToReferenceConversionException;
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/DeleteIdentifiedOperation.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/DeleteIdentifiedOperation.java
deleted file mode 100644
index f8e2477..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/DeleteIdentifiedOperation.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package net.sf.taverna.t2.reference.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Applied to methods in Dao implementations which delete data in the
- * backing store.
- * 
- * @author Stuart Owen
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface DeleteIdentifiedOperation {
-
-	//
-
-}
\ No newline at end of file
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/GetIdentifiedOperation.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/GetIdentifiedOperation.java
deleted file mode 100644
index c7cff36..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/GetIdentifiedOperation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-/**
- * Applied to methods in Dao implementations which fetch data from the backing
- * store by ID
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface GetIdentifiedOperation {
-
-	//
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/PutIdentifiedOperation.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/PutIdentifiedOperation.java
deleted file mode 100644
index 844a407..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/PutIdentifiedOperation.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-/**
- * Applied to methods in Dao implementations which store or update data in the
- * backing store.
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface PutIdentifiedOperation {
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/package.html b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/package.html
deleted file mode 100644
index 0d38e1e..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/annotations/package.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<body>
-Annotations to make methods in the data access object implementations
-for cache injection.
-</body>
\ No newline at end of file
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/HibernateComponentClass.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/HibernateComponentClass.java
deleted file mode 100644
index 531ed3f..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/HibernateComponentClass.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.h3;
-
-/**
- * A marker used to denote that the class should be pre-loaded into hibernate's
- * class mapping. Used for component classes which are not going to be mapped to
- * the RDBMS but which must be loadable for mapped classes to instantiate
- * correctly. Basically if you refer to a class that isn't itself going to be
- * mapped in hibernate within a mapping definition you'll need to add that
- * component class to this SPI or hibernate won't be able to find it as it won't
- * know that it should associate it with the appropriate class loader.
- * <p>
- * This should be used as an SPI marker, and set as the first SPI registry in
- * the preloadRegistries property of the SpiRegistryAwareLocalSessionFactoryBean
- * 
- * @author Tom Oinn
- * 
- */
-public interface HibernateComponentClass {
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/HibernateMappedEntity.java b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/HibernateMappedEntity.java
deleted file mode 100644
index 3b7e910..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/HibernateMappedEntity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.h3;
-
-/**
- * A marker interface used to denote that the component should be registered
- * with the Hibernate ORM system prior to any ExternalReferenceSPI
- * implementations. This is here to allow implementations of e.g. ReferenceSet
- * to be in the implementation package where they belong and still guarantee
- * that they are registered before any other plugins.
- * <p>
- * This should be used as an SPI marker, and set as the first SPI registry in
- * the spiRegistries property of the SpiRegistryAwareLocalSessionFactoryBean
- * 
- * @author Tom Oinn
- * 
- */
-public interface HibernateMappedEntity {
-
-}
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/package.html b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/package.html
deleted file mode 100644
index 4ffba14..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/h3/package.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<body>
-Contains the marker interfaces used by the implementation package to
-ensure that all appropriate classes are mapped in hibernate
-<em>before</em>
-implementations of classes that depend upon them, and to ensure that
-'static' classes such as the implementations of reference set etc are
-mapped correctly.
-</body>
\ No newline at end of file
diff --git a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/package.html b/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/package.html
deleted file mode 100644
index 378f20d..0000000
--- a/trunk/reference-api/src/main/java/net/sf/taverna/t2/reference/package.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<body>
-<p>Interfaces for the Taverna 2 reference manager. This replaces the
-(badly named) DataManager and is, in effect, a version 2 of that system.
-While these APIs are implementation neutral the intent is heavily
-towards the use of an object relational mapping (ORM) tool such as
-Hibernate backed by a relational database to hold the various
-collection, external reference and error documents managed by the
-reference manager.</p>
-<p>For those familiar with the previous DataManager code the table
-below shows the old class names and the equivalent (where appropriate)
-in the new code:
-<table>
-	<tr>
-		<td>DataDocument</td>
-		<td>{@link net.sf.taverna.t2.reference.ReferenceSet}</td>
-	</tr>
-	<tr>
-		<td>ReferenceScheme</td>
-		<td>{@link net.sf.taverna.t2.reference.ExternalReferenceSPI}</td>
-	</tr>
-	<tr>
-		<td>EntityIdentifier</td>
-		<td>{@link net.sf.taverna.t2.reference.T2Reference}</td>
-	</tr>
-	<tr>
-		<td colspan="2">...</td>
-	</tr>
-</table>
-</p>
-<p>One fundamental change is a move to runtime exceptions rather
-than checked exceptions. This follows the pattern used by Spring and
-Hibernate. The rationale is the same as in those systems - in general
-checked exceptions are not handled properly by client code. The loss of
-compiler level functionality from moving to runtime exceptions is
-countered by much higher readability of code which in itself leads to
-more robust and reliable systems.</p>
-<p>A second change is the availability of asynchronous versions of
-all the critical APIs. Reference construction or translation in
-particular can be a costly process taking substantial time to complete.
-Synchronous versions of the get methods still exist but in general the
-simple callback based asynchronous ones are recommended over them for
-most applications.</p>
-</body>
\ No newline at end of file
diff --git a/trunk/reference-api/src/main/resources/net/sf/taverna/t2/reference/AbstractExternalReference.hbm.xml b/trunk/reference-api/src/main/resources/net/sf/taverna/t2/reference/AbstractExternalReference.hbm.xml
deleted file mode 100644
index e8851e9..0000000
--- a/trunk/reference-api/src/main/resources/net/sf/taverna/t2/reference/AbstractExternalReference.hbm.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for the abstract superclass of -->
-<!-- ExternalReferenceSPI implementations             -->
-<hibernate-mapping>
-	<class name="net.sf.taverna.t2.reference.AbstractExternalReference"
-		abstract="true">
-		<!-- Let hibernate choose the primary key generation strategy -->
-		<id name="primaryKey" unsaved-value="0" column="bean_id">
-			<generator class="native" />
-		</id>
-	</class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/trunk/reference-impl/pom.xml b/trunk/reference-impl/pom.xml
deleted file mode 100644
index 71ef238..0000000
--- a/trunk/reference-impl/pom.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>net.sf.taverna.t2</groupId>
-        <artifactId>core</artifactId>
-        <version>0.9</version>
-    </parent>
-    <groupId>net.sf.taverna.t2.core</groupId>
-    <artifactId>reference-impl</artifactId>
-    <name>Implementation package for the T2 reference manager</name>
-    <description>
-		Implementations of the core APIs, not including extension point
-		implementations. The extension point implementations that can be
-		considered as core functionality (files, URLs etc) are held in
-		the t2reference-core-extensions package. This package contains
-		implementations of the data access objects, translator
-		infrastructure etc.
-    </description>
-    <properties>
-        <spring.version>2.5.4</spring.version>
-        <aspectj.version>1.6.0</aspectj.version>
-    </properties>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>net.sf.taverna.t2.core</groupId>
-            <artifactId>reference-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>net.sf.taverna.t2.infrastructure</groupId>
-            <artifactId>raven</artifactId>
-            <version>${t2.infrastructure.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>net.sf.taverna.t2.infrastructure</groupId>
-            <artifactId>appconfig</artifactId>
-            <version>${t2.infrastructure.version}</version>
-        </dependency>        
-
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derby</artifactId>
-            <version>10.5.3.0_1</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.hibernate</groupId>
-            <artifactId>hibernate</artifactId>
-            <version>3.2.5.ga.raven</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>javax.transaction</groupId>
-                    <artifactId>jta</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>net.sf.ehcache</groupId>
-                    <artifactId>ehcache</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>asm</groupId>
-                    <artifactId>asm-attrs</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>antlr</groupId>
-                    <artifactId>antlr</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-            <version>1.1.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>geronimo-spec</groupId>
-            <artifactId>geronimo-spec-jta</artifactId>
-            <version>1.0-M1</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-orm</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-aop</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-jdbc</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjrt</artifactId>
-            <version>${aspectj.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-            <version>${aspectj.version}</version>
-        </dependency>
-        
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        
-
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/ArtifactDefinitionDecorator.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/ArtifactDefinitionDecorator.java
deleted file mode 100644
index 93de073..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/ArtifactDefinitionDecorator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import static net.sf.taverna.platform.spring.RavenConstants.ARTIFACT_BEAN_ATTRIBUTE_NAME;
-import static net.sf.taverna.platform.spring.RavenConstants.ARTIFACT_XML_ATTRIBUTE_NAME;
-import static net.sf.taverna.platform.spring.RavenConstants.REPOSITORY_BEAN_ATTRIBUTE_NAME;
-import static net.sf.taverna.platform.spring.RavenConstants.REPOSITORY_XML_ATTRIBUTE_NAME;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.config.BeanDefinitionHolder;
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
-import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
-import org.springframework.beans.factory.xml.ParserContext;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-
-/**
- * Pulls artifact attributes out of beans and decorates the bean definitions
- * with an artifact property, this can then be used to intervene in the
- * classloading strategy in the modified raven aware application context
- * implementation.
- * 
- * @author Tom Oinn
- * 
- */
-public class ArtifactDefinitionDecorator implements BeanDefinitionDecorator {
-
-	private Log log = LogFactory.getLog(ArtifactDefinitionDecorator.class);
-	
-	public BeanDefinitionHolder decorate(Node source,
-			BeanDefinitionHolder holder, ParserContext context) {
-		AbstractBeanDefinition definition = ((AbstractBeanDefinition) holder
-				.getBeanDefinition());
-		Attr attribute = (Attr) source;
-		if (attribute.getLocalName().equals(ARTIFACT_XML_ATTRIBUTE_NAME)) {
-			String artifactSpecifier = attribute.getValue();
-			definition.setAttribute(ARTIFACT_BEAN_ATTRIBUTE_NAME,
-					artifactSpecifier);
-		} else if (attribute.getLocalName().equals(
-				REPOSITORY_XML_ATTRIBUTE_NAME)) {
-			String repositoryBeanName = attribute.getValue();
-			definition.setAttribute(REPOSITORY_BEAN_ATTRIBUTE_NAME,
-					repositoryBeanName);
-			String[] dependsOn = definition.getDependsOn();
-			if (dependsOn == null) {
-				dependsOn = new String[] { repositoryBeanName };
-			} else {
-				List<String> dependencies = new ArrayList<String>(Arrays
-						.asList(dependsOn));
-				dependencies.add(repositoryBeanName);
-				dependsOn = dependencies.toArray(new String[0]);
-			}
-			definition.setDependsOn(dependsOn);
-		}
-		log.debug("Decorated bean '"+holder.getBeanName()+"'");
-		return holder;
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/ArtifactSupportNamespaceHandler.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/ArtifactSupportNamespaceHandler.java
deleted file mode 100644
index b98227c..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/ArtifactSupportNamespaceHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import static net.sf.taverna.platform.spring.RavenConstants.ARTIFACT_XML_ATTRIBUTE_NAME;
-import static net.sf.taverna.platform.spring.RavenConstants.REPOSITORY_XML_ATTRIBUTE_NAME;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
-
-/**
- * Namespace handler to associate the artifact definition decorator with the
- * raven attributes, specifically the 'repository' and 'artifact' attributes on
- * raven-enabled bean definitions.
- * 
- * @author Tom Oinn
- * 
- */
-public class ArtifactSupportNamespaceHandler extends NamespaceHandlerSupport {
-
-	private Log log = LogFactory.getLog(ArtifactSupportNamespaceHandler.class);
-
-	public void init() {
-		ArtifactDefinitionDecorator decorator = new ArtifactDefinitionDecorator();
-		registerBeanDefinitionDecoratorForAttribute(
-				ARTIFACT_XML_ATTRIBUTE_NAME, decorator);
-		registerBeanDefinitionDecoratorForAttribute(
-				REPOSITORY_XML_ATTRIBUTE_NAME, decorator);
-		registerBeanDefinitionParser("repository",
-				new RepositoryBeanDefinitionParser());
-		log.debug("Registered handlers for raven support namespace");
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/InstanceRegistryFactoryBean.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/InstanceRegistryFactoryBean.java
deleted file mode 100644
index 556ce23..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/InstanceRegistryFactoryBean.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import java.util.List;
-
-import net.sf.taverna.raven.spi.InstanceRegistry;
-import net.sf.taverna.raven.spi.SpiRegistry;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.FactoryBean;
-
-/**
- * Factory bean for the SPI instance registry functionality in Raven. Inject an
- * SpiRegistry and a list of constructor arguments to initialize.
- * 
- * @author Tom Oinn
- * 
- */
-public class InstanceRegistryFactoryBean implements FactoryBean {
-
-	private SpiRegistry classRegistry = null;
-	private List<Object> constructorArgs = null;
-	private Log log = LogFactory.getLog(InstanceRegistryFactoryBean.class);
-
-	/**
-	 * Return a newly constructed InstanceRegistry. If the spi registry property
-	 * isn't defined this method throws a runtime exception and logs the problem
-	 * to the logging system.
-	 */
-	@SuppressWarnings("unchecked")
-	public Object getObject() throws Exception {
-		if (classRegistry != null) {
-			Object[] args;
-			if (constructorArgs != null) {
-				args = constructorArgs.toArray();
-			} else {
-				args = new Object[0];
-			}
-			return new InstanceRegistry(classRegistry, args);
-		} else {
-			log.error("Must specify spiRegistry property"
-					+ " to construct an InstanceRegistry");
-			throw new RuntimeException();
-		}
-	}
-
-	/**
-	 * Inject an SpiRegistry instance to provide classes to instantiate objects
-	 * from within the instance registry
-	 */
-	public void setSpiRegistry(SpiRegistry registry) {
-		this.classRegistry = registry;
-	}
-
-	/**
-	 * Optionally specify a list of arguments to the constructors of classes in
-	 * the spi registry. If this property is undefined it defaults to using an
-	 * empty constructor list, in general this is the required behaviour when
-	 * constructing beans as they'll always have a default constructor.
-	 */
-	public void setConstructorArgs(List<Object> args) {
-		this.constructorArgs = args;
-	}
-
-	/**
-	 * @return InstanceRegistry.class
-	 */
-	@SuppressWarnings("unchecked")
-	public Class getObjectType() {
-		return InstanceRegistry.class;
-	}
-
-	/**
-	 * Singleton by default
-	 */
-	public boolean isSingleton() {
-		return true;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/LoggingConfigurer.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/LoggingConfigurer.java
deleted file mode 100644
index b347a0e..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/LoggingConfigurer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A simple bean that can be used to set logging options - not really worth
- * bothering with at the moment, use the log4j.xml instead.
- * 
- * @author Tom Oinn
- * 
- */
-public class LoggingConfigurer {
-
-	@SuppressWarnings("unchecked")
-	public LoggingConfigurer(Properties props) {
-		Iterator i = props.keySet().iterator();
-		while (i.hasNext()) {
-			String loggerName = (String) i.next();
-			String levelName = props.getProperty(loggerName);
-			try {
-				Level level = Level.parse(levelName);
-				Logger l = Logger.getLogger(loggerName);
-				l.setLevel(level);
-			} catch (IllegalArgumentException e) {
-				System.err.println("WARNING: Unable to parse '" + levelName
-						+ "' as a java.util.Level for logger " + loggerName
-						+ "; ignoring...");
-			}
-		}
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/PropertyInterpolator.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/PropertyInterpolator.java
deleted file mode 100644
index 54695a0..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/PropertyInterpolator.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Static utility to insert string properties from a Properties object in place
- * of ${property.name} parts of the supplied string.
- * 
- * @author Tom Oinn
- * 
- */
-public final class PropertyInterpolator {
-
-	private static String regex = "\\$\\{([\\w\\.]+)\\}";
-	private static Pattern pattern;
-	private static Log log = LogFactory.getLog(PropertyInterpolator.class);
-
-	static {
-		pattern = Pattern.compile(regex);
-	}
-
-	/**
-	 * Perform property interpolation using the system properties object
-	 * 
-	 * @param sourceString
-	 *            a string containing zero or more ${...} elements corresponding
-	 *            to properties to insert
-	 * @return the sourceString with property values inserted in place of
-	 *         variables *
-	 * @throws RuntimeException
-	 *             if a referenced property does not exist in the system
-	 *             properties
-	 */
-	public static String interpolate(String sourceString) {
-		return interpolate(sourceString, System.getProperties());
-	}
-
-	/**
-	 * Perform property interpolation using the supplied properties object
-	 * 
-	 * @param sourceString
-	 *            a string containing zero or more ${...} elements corresponding
-	 *            to properties to insert
-	 * @param props
-	 *            the properties object from which property values should be
-	 *            extracted
-	 * @return the sourceString with property values inserted in place of
-	 *         variables
-	 * @throws RuntimeException
-	 *             if a referenced property does not exist in the supplied
-	 *             properties object
-	 */
-	public static String interpolate(String sourceString, Properties props) {
-		Matcher matcher = pattern.matcher(sourceString);
-		StringBuffer sb = new StringBuffer();
-		int cursor = 0;
-		while (matcher.find()) {
-			String propertyValue = props.getProperty(matcher.group(1));
-			if (propertyValue == null) {
-				log.warn("Attempt to interpolate an undefined property '"
-						+ matcher.group(1) + "'");
-				throw new RuntimeException("Can't locate property '"
-						+ matcher.group(1) + "'");
-			}
-			sb.append(sourceString.substring(cursor, matcher.start()));
-			sb.append(propertyValue);
-			cursor = matcher.end();
-		}
-		sb.append(sourceString.substring(cursor));
-		return sb.toString();
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenAwareClassPathXmlApplicationContext.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenAwareClassPathXmlApplicationContext.java
deleted file mode 100644
index c35df48..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenAwareClassPathXmlApplicationContext.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import org.springframework.beans.factory.support.DefaultListableBeanFactory;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-/**
- * A subclass of the ClassPathXmlApplicationContext which uses the raven aware
- * bean factory and therefore can cope with the presence of raven repository and
- * artifact attributes correctly on beans within the configuration file. Use in
- * place of ClassPathXmlApplicationContext to magically enable raven support.
- * 
- * @author Tom Oinn
- * 
- */
-public class RavenAwareClassPathXmlApplicationContext extends
-		ClassPathXmlApplicationContext {
-
-	private static DefaultListableBeanFactory factory = new RavenAwareListableBeanFactory();
-
-	public RavenAwareClassPathXmlApplicationContext(String param) {
-		super(param);
-	}
-
-	@Override
-	protected DefaultListableBeanFactory createBeanFactory() {
-		return factory;
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenAwareListableBeanFactory.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenAwareListableBeanFactory.java
deleted file mode 100644
index acec806..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenAwareListableBeanFactory.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import static net.sf.taverna.platform.spring.RavenConstants.ARTIFACT_BEAN_ATTRIBUTE_NAME;
-import static net.sf.taverna.platform.spring.RavenConstants.REPOSITORY_BEAN_ATTRIBUTE_NAME;
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.ArtifactNotFoundException;
-import net.sf.taverna.raven.repository.ArtifactStateException;
-import net.sf.taverna.raven.repository.ArtifactStatus;
-import net.sf.taverna.raven.repository.BasicArtifact;
-import net.sf.taverna.raven.repository.Repository;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.CannotLoadBeanClassException;
-import org.springframework.beans.factory.support.DefaultListableBeanFactory;
-import org.springframework.beans.factory.support.RootBeanDefinition;
-import org.springframework.core.DecoratingClassLoader;
-import org.springframework.util.ClassUtils;
-
-/**
- * A subclass of DefaultListableBeanFactory which is aware of raven. Overrides
- * the class resolution mechanism within the bean factory to use raven's
- * artifact class loading if the appropriate attributes are defined on the bean
- * definition. These attributes are set by the ArtifactDefinitionDecorator,
- * which is in turn driven by a trivial extension to spring's XML based
- * configuration schema.
- * 
- * @author Tom Oinn
- * 
- */
-public class RavenAwareListableBeanFactory extends DefaultListableBeanFactory {
-
-	private Log log = LogFactory.getLog(RavenAwareListableBeanFactory.class);
-
-	@SuppressWarnings("unchecked")
-	@Override
-	protected Class resolveBeanClass(RootBeanDefinition rbd, String beanName,
-			Class[] typesToMatch) throws CannotLoadBeanClassException {
-
-		try {
-
-			if (rbd.hasBeanClass()) {
-				return rbd.getBeanClass();
-			}
-
-			if (typesToMatch != null && getTempClassLoader() != null) {
-				String className = rbd.getBeanClassName();
-				ClassLoader tempClassLoader = getTempClassLoader();
-				if (tempClassLoader instanceof DecoratingClassLoader) {
-					DecoratingClassLoader dcl = (DecoratingClassLoader) tempClassLoader;
-					for (int i = 0; i < typesToMatch.length; i++) {
-						dcl.excludeClass(typesToMatch[i].getName());
-					}
-				}
-				return (className != null ? ClassUtils.forName(className,
-						tempClassLoader) : null);
-			}
-
-			if (rbd.hasAttribute(REPOSITORY_BEAN_ATTRIBUTE_NAME)
-					&& rbd.hasAttribute(ARTIFACT_BEAN_ATTRIBUTE_NAME)) {
-				String repositoryBeanName = (String) rbd
-						.getAttribute(REPOSITORY_BEAN_ATTRIBUTE_NAME);
-				String artifact = (String) rbd
-						.getAttribute(ARTIFACT_BEAN_ATTRIBUTE_NAME);
-				Repository repository = (Repository) getBean(repositoryBeanName);
-				if (repository == null) {
-					log.error("No repository bean with name '"
-							+ repositoryBeanName + "' in this context");
-					throw new CannotLoadBeanClassException(rbd
-							.getResourceDescription(), beanName, rbd
-							.getBeanClassName(), new ClassNotFoundException(
-							"No such repository"));
-				}
-				synchronized (repository) {
-					String[] s = artifact.split(":");
-					if (s.length != 3) {
-						log.error("Artifact specifier '" + artifact
-								+ "' is badly formed for bean '" + beanName
-								+ "'");
-						throw new CannotLoadBeanClassException(rbd
-								.getResourceDescription(), beanName, rbd
-								.getBeanClassName(),
-								new ClassNotFoundException(
-										"Badly formed artifact specifier"));
-					}
-					Artifact a = new BasicArtifact(s[0], s[1], s[2]);
-					log.debug("Artifact " + a + " for bean name " + beanName);
-
-					if (repository.getStatus(a) != ArtifactStatus.Ready) {
-						log.debug("  has state " + repository.getStatus(a));
-						repository.addArtifact(a);
-						repository.update();
-					}
-					log.debug("  has state (2) " + repository.getStatus(a));
-					try {
-						// ClassLoader cl = repository.getLoader(a,
-						// this.getClass()
-						// .getClassLoader());
-						ClassLoader cl;
-						try {
-						cl = repository.getLoader(a, null);
-						}
-						catch (ArtifactStateException ex) {
-							try {
-								Thread.sleep(100);
-							} catch (InterruptedException e) {
-								// TODO Auto-generated catch block
-								log.error(e);
-							}
-							cl = repository.getLoader(a, null);
-						}
-						log.debug("Loading class " + rbd.getBeanClassName()
-								+ " from artifact " + a);
-
-						return rbd.resolveBeanClass(cl);
-
-					} catch (ArtifactNotFoundException ex) {
-						log
-								.error("No such artifact '" + a.toString()
-										+ "'", ex);
-						throw new CannotLoadBeanClassException(rbd
-								.getResourceDescription(), beanName, rbd
-								.getBeanClassName(),
-								new ClassNotFoundException(ex.getMessage(), ex));
-					} catch (ArtifactStateException ex) {
-						log.error("Artifact in incorrect state '"
-								+ a.toString() + "' is in state "
-								+ ex.getState()
-								+ " with reported state in repository "
-								+ repository.getStatus(a) + " for bean "
-								+ beanName, ex);
-						throw new CannotLoadBeanClassException(rbd
-								.getResourceDescription(), beanName, rbd
-								.getBeanClassName(),
-								new ClassNotFoundException(ex.getMessage(), ex));
-					}
-				}
-			} else {
-				return rbd.resolveBeanClass(getBeanClassLoader());
-			}
-		} catch (ClassNotFoundException ex) {
-			throw new CannotLoadBeanClassException(
-					rbd.getResourceDescription(), beanName, rbd
-							.getBeanClassName(), ex);
-		} catch (LinkageError err) {
-			throw new CannotLoadBeanClassException(
-					rbd.getResourceDescription(), beanName, rbd
-							.getBeanClassName(), err);
-		}
-
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenConstants.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenConstants.java
deleted file mode 100644
index 274ada5..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenConstants.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-/**
- * String constants used by the raven spring support package.
- * 
- * @author Tom Oinn
- * 
- */
-public class RavenConstants {
-
-	/**
-	 * The name of the property defined on raven-enabled BeanDefinition
-	 * instances to point to the name of the repository bean within the bean
-	 * factory
-	 */
-	public static String REPOSITORY_BEAN_ATTRIBUTE_NAME = "ravenRepositoryBean";
-
-	/**
-	 * The name of the property defined on raven-enabled BeanDefinition
-	 * instances specifying the artifact that should be used to load this bean
-	 * definition's associated bean class. The artifact is specified as a
-	 * group:artifact:version string.
-	 */
-	public static String ARTIFACT_BEAN_ATTRIBUTE_NAME = "ravenArtifact";
-
-	/**
-	 * The XML attribute name used to decorate the raven-enabled bean definition
-	 * in the application context configuration to point to the repository bean
-	 * id within that definition
-	 */
-	public static String REPOSITORY_XML_ATTRIBUTE_NAME = "repository";
-
-	/**
-	 * The XML attribute name used to specify the artifact to be used by a
-	 * particular raven-enabled bean within the configuration xml.
-	 */
-	public static String ARTIFACT_XML_ATTRIBUTE_NAME = "artifact";
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenEagerArtifactDownload.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenEagerArtifactDownload.java
deleted file mode 100644
index bd2dc21..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RavenEagerArtifactDownload.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import static net.sf.taverna.platform.spring.RavenConstants.ARTIFACT_BEAN_ATTRIBUTE_NAME;
-import static net.sf.taverna.platform.spring.RavenConstants.REPOSITORY_BEAN_ATTRIBUTE_NAME;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.BasicArtifact;
-import net.sf.taverna.raven.repository.Repository;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-
-/**
- * Include this bean in the application context to enumerate and force download
- * of any artifacts referenced by raven-enabled beans in the same context.
- * Doesn't do much other than print out the artifact list at the moment as it
- * appears the class definitions are loaded eagerly even if the beans themselves
- * aren't.
- * 
- * @author Tom Oinn
- * 
- */
-public class RavenEagerArtifactDownload implements BeanFactoryPostProcessor {
-
-	private Log log = LogFactory.getLog(RavenEagerArtifactDownload.class);
-
-	/**
-	 * Will use this method to automatically load all artifacts used by beans in
-	 * the repository prior to instantiation, more efficient than doing so on
-	 * initialization but something to leave for now.
-	 */
-	public void postProcessBeanFactory(ConfigurableListableBeanFactory factory)
-			throws BeansException {
-		log.debug("Eager load of raven artifacts enabled, loading...");
-		Map<String, Set<Artifact>> artifactsToLoad = new HashMap<String, Set<Artifact>>();
-		for (String beanName : factory.getBeanDefinitionNames()) {
-			BeanDefinition bd = factory.getBeanDefinition(beanName);
-			if (bd.hasAttribute(REPOSITORY_BEAN_ATTRIBUTE_NAME)
-					&& bd.hasAttribute(ARTIFACT_BEAN_ATTRIBUTE_NAME)) {
-				String repositoryBeanName = (String) bd
-						.getAttribute(REPOSITORY_BEAN_ATTRIBUTE_NAME);
-				String[] s = ((String) bd
-						.getAttribute(ARTIFACT_BEAN_ATTRIBUTE_NAME)).split(":");
-				Artifact a = new BasicArtifact(s[0], s[1], s[2]);
-				if (!artifactsToLoad.containsKey(repositoryBeanName)) {
-					artifactsToLoad.put(repositoryBeanName,
-							new HashSet<Artifact>());
-				}
-				artifactsToLoad.get(repositoryBeanName).add(a);
-			}
-		}
-		for (String repositoryBeanName : artifactsToLoad.keySet()) {
-			Repository r = (Repository) factory.getBean(repositoryBeanName);
-			log.debug("Repository : " + repositoryBeanName);
-			for (Artifact a : artifactsToLoad.get(repositoryBeanName)) {
-				r.addArtifact(a);
-				log.debug("  " + a.toString());
-			}
-			r.update();
-		}
-		log.debug("Raven artifacts loaded");
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RepositoryBeanDefinitionParser.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RepositoryBeanDefinitionParser.java
deleted file mode 100644
index 2eb02f8..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RepositoryBeanDefinitionParser.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
-import org.springframework.beans.factory.support.BeanDefinitionBuilder;
-import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
-import org.springframework.beans.factory.xml.ParserContext;
-import org.springframework.util.xml.DomUtils;
-import org.w3c.dom.Element;
-
-/**
- * Customized version of the configuration for the repository bean. This allows
- * a more compact form of the repository specification, and potentially error
- * checking through IDE schema support which is not available when we just
- * instantiate the helper factory bean directly.
- * 
- * @author Tom Oinn
- * 
- */
-public class RepositoryBeanDefinitionParser extends
-		AbstractBeanDefinitionParser {
-
-	/**
-	 * The overall intent here is to construct a bean definition to the
-	 * repository factory bean which will then allow it to produce a repository
-	 * object when fully instantiated. Really just a convenience method to avoid
-	 * having to set the bean manually. Not implemented yet!
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	protected AbstractBeanDefinition parseInternal(Element element,
-			ParserContext context) {
-		BeanDefinitionBuilder factory = BeanDefinitionBuilder
-				.rootBeanDefinition(RepositoryFactoryBean.class);
-		// Do the 'base' property
-		factory.addPropertyValue("base", element.getAttribute("base"));
-
-		Element systemArtifactElement = DomUtils.getChildElementByTagName(
-				element, "system");
-		List<Element> systemChildElements = DomUtils.getChildElementsByTagName(
-				systemArtifactElement, "sys");
-		if (systemChildElements != null && systemChildElements.size() > 0) {
-			List<String> systemArtifactList = new ArrayList<String>();
-			for (Element e : systemChildElements) {
-				systemArtifactList.add(e.getAttribute("artifact"));
-			}
-			factory.addPropertyValue("systemArtifacts", systemArtifactList);
-		}
-
-		Element repositoriesElement = DomUtils.getChildElementByTagName(
-				element, "repositories");
-		List<Element> repositoriesElements = DomUtils
-				.getChildElementsByTagName(repositoriesElement, "rep");
-		if (repositoriesElements != null && systemChildElements.size() > 0) {
-			List<String> repositoryList = new ArrayList<String>();
-			for (Element e : repositoriesElements) {
-				repositoryList.add(e.getAttribute("url"));
-			}
-			factory.addPropertyValue("remoteRepositoryList", repositoryList);
-		}
-
-		return factory.getBeanDefinition();
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RepositoryFactoryBean.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RepositoryFactoryBean.java
deleted file mode 100644
index 0f3a2a1..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/RepositoryFactoryBean.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import static net.sf.taverna.platform.spring.PropertyInterpolator.interpolate;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.BasicArtifact;
-import net.sf.taverna.raven.repository.Repository;
-import net.sf.taverna.raven.repository.impl.LocalRepository;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.FactoryBean;
-
-/**
- * A FactoryBean used to configure and instantiate a raven Repository object.
- * Allows construction of file base path, remote repository list and system
- * artifact list through setter injection from within spring and delegates to
- * LocalRepository.getRepository(File, ClassLoader, List&lt;Artifact&gt;) to
- * construct the Repository object.
- * <p>
- * Because this implements FactoryBean, spring will return the result of the
- * getObject method rather than the bean itself.
- * 
- * @author Tom Oinn
- */
-public class RepositoryFactoryBean implements FactoryBean {
-
-	private Log log = LogFactory.getLog(RepositoryFactoryBean.class);
-
-	private List<String> systemArtifactStrings = null;
-	private String baseLocation = null;
-	private List<String> remoteRepositories = null;
-
-	public Object getObject() throws Exception {
-		File base = new File(interpolate(baseLocation));
-		Set<Artifact> systemArtifacts = new HashSet<Artifact>();
-		for (String systemArtifactSpec : systemArtifactStrings) {
-			String[] s = interpolate(systemArtifactSpec).split(":");
-			Artifact a = new BasicArtifact(s[0], s[1], s[2]);
-			systemArtifacts.add(a);
-		}
-		Repository r = LocalRepository.getRepository(base, this.getClass()
-				.getClassLoader(), systemArtifacts);
-
-		for (String repositoryLocationString : remoteRepositories) {
-			try {
-				r.addRemoteRepository(new URL(
-						interpolate(repositoryLocationString)));
-			} catch (RuntimeException ex) {
-				// Don't add repositories which cause an error on instantiation,
-				// this can be because the URL is invalid but can also occur if
-				// the interpolation attempts to use a property that isn't
-				// defined. This can be used intentionally to add repositories
-				// only if a property is set.
-				log
-						.warn("Missing property in interpolation, ignoring remote repository entry "
-								+ repositoryLocationString);
-			} catch (MalformedURLException mue) {
-				log.error("Malformed remote repository URL",mue);
-			}
-		}
-		r.update();
-		log.info("Constructed raven repository at '" + base + "'");
-		return r;
-	}
-
-	public void setSystemArtifacts(List<String> systemArtifacts) {
-		this.systemArtifactStrings = systemArtifacts;
-	}
-
-	public void setBase(String baseLocation) {
-		this.baseLocation = baseLocation;
-	}
-
-	public void setRemoteRepositoryList(List<String> remoteRepositories) {
-		this.remoteRepositories = remoteRepositories;
-	}
-
-	@SuppressWarnings("unchecked")
-	public Class getObjectType() {
-		return Repository.class;
-	}
-
-	public boolean isSingleton() {
-		return true;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/SpiRegistryFactoryBean.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/SpiRegistryFactoryBean.java
deleted file mode 100644
index b4a07db..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/SpiRegistryFactoryBean.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import java.util.List;
-
-import net.sf.taverna.raven.repository.Repository;
-import net.sf.taverna.raven.spi.ArtifactFilter;
-import net.sf.taverna.raven.spi.SpiRegistry;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.beans.factory.FactoryBean;
-
-/**
- * Factory bean for the SpiRegistry functionality in Raven. Exposes the
- * repository, spi name and filter list properties. Initializes the spi registry
- * before returning it, constructed instances are ready to use.
- * 
- * @author Tom Oinn
- * 
- */
-public class SpiRegistryFactoryBean implements FactoryBean {
-
-	List<ArtifactFilter> filterList = null;
-	Repository repository = null;
-	String spiClassName = null;
-	private Log log = LogFactory.getLog(SpiRegistryFactoryBean.class);
-
-	public Object getObject() throws Exception {
-		if (repository != null && spiClassName != null) {
-			SpiRegistry registry = new SpiRegistry(repository, spiClassName,
-					null);
-			if (filterList != null) {
-				registry.setFilters(filterList);
-			}
-			registry.updateRegistry();
-			return registry;
-		}
-		log
-				.error("Must specify repository and spi class name for spi registry");
-		throw new RuntimeException();
-	}
-
-	public void setFilterList(List<ArtifactFilter> filterList) {
-		this.filterList = filterList;
-	}
-
-	public void setRepository(Repository repository) {
-		this.repository = repository;
-	}
-
-	public void setSpiClassName(String spiClassName) {
-		this.spiClassName = spiClassName;
-	}
-
-	/**
-	 * @return SpiRegistry.class
-	 */
-	@SuppressWarnings("unchecked")
-	public Class getObjectType() {
-		return SpiRegistry.class;
-	}
-
-	/**
-	 * Singleton by default
-	 */
-	public boolean isSingleton() {
-		return true;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/DriverProxy.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/DriverProxy.java
deleted file mode 100644
index a4014d4..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/DriverProxy.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.jdbc;
-
-import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.SQLException;
-import java.util.Properties;
-
-/**
- * A proxy implementation of the java.sql.Driver interface, used to act as a
- * proxy in the platform classloading environment to a 'real' JDBC driver
- * registered from a different class loader. We need to do this because the
- * DriverManager implementation uses native methods to hide drivers loaded by
- * other classloaders than the one used to construct the caller, this way we can
- * have a real JDBC driver loaded from a raven artifact and have an instance of
- * the proxy loaded through the platform acting as a view over it.
- * <p>
- * To use this you should use the {@link ProxyDriverManager}.
- * 
- * @author Tom Oinn
- * 
- */
-public class DriverProxy implements Driver {
-
-	/**
-	 * The driver being proxied
-	 */
-	private final Driver target;
-
-	/**
-	 * This is always constructed from ProxyDriverManager
-	 * 
-	 * @param target
-	 *            Driver to proxy
-	 */
-	DriverProxy(java.sql.Driver target) {
-		if (target == null) {
-			throw new NullPointerException();
-		}
-		this.target = target;
-	}
-
-	/**
-	 * Get the proxied driver instance
-	 */
-	public Driver getTarget() {
-		return target;
-	}
-
-	/**
-	 * Retrieves whether the target driver thinks that it can open a connection
-	 * to the given URL.
-	 */
-	public boolean acceptsURL(String url) throws SQLException {
-		return target.acceptsURL(url);
-	}
-
-	/**
-	 * Uses the target Driver to attempt to make a database connection to the
-	 * given URL.
-	 */
-	public Connection connect(String url, Properties info) throws SQLException {
-		return target.connect(url, info);
-	}
-
-	/**
-	 * Retrieves the target driver's major version number.
-	 */
-	public int getMajorVersion() {
-		return target.getMajorVersion();
-	}
-
-	/**
-	 * Gets the target driver's minor version number.
-	 */
-	public int getMinorVersion() {
-		return target.getMinorVersion();
-	}
-
-	/**
-	 * Gets information about the possible properties for the target driver.
-	 */
-	public java.sql.DriverPropertyInfo[] getPropertyInfo(String url,
-			java.util.Properties info) throws SQLException {
-		return target.getPropertyInfo(url, info);
-	}
-
-	/**
-	 * Reports whether the target driver is a genuine JDBC Compliant driver.
-	 */
-	public boolean jdbcCompliant() {
-		return target.jdbcCompliant();
-	}
-
-	/**
-	 * Wrap original string description to denote a proxy driver in debug output
-	 */
-	@Override
-	public String toString() {
-		return "Proxy JDBC driver for : " + target;
-	}
-
-	/**
-	 * Pretend to be the target as far as hashcode is concerned.
-	 */
-	@Override
-	public int hashCode() {
-		return target.hashCode();
-	}
-
-	/**
-	 * Equal if the other is also a DriverProxy and both have the same target
-	 */
-	@Override
-	public boolean equals(Object obj) {
-		if (!(obj instanceof DriverProxy)) {
-			return false;
-		}
-		DriverProxy other = (DriverProxy) obj;
-		return this.target.equals(other.target);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/InterpolatingDriverManagerDataSource.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/InterpolatingDriverManagerDataSource.java
deleted file mode 100644
index 98dcd70..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/InterpolatingDriverManagerDataSource.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.jdbc;
-
-import static net.sf.taverna.platform.spring.PropertyInterpolator.interpolate;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.Properties;
-
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.BasicArtifact;
-import net.sf.taverna.raven.repository.Repository;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.jdbc.datasource.DriverManagerDataSource;
-import org.springframework.util.ClassUtils;
-
-/**
- * Subclass of the DriverManagerDataSource so we can use interpolated properties
- * in e.g. database URLs from the spring configuration. Interpolation is applied
- * to all set-able string properties.
- * <p>
- * In addition this class can be used to register JDBC drivers loaded from Raven
- * artifacts. If the optional 'repository' and 'driverArtifact' properties are
- * injected (of type Repository and String respectively) the specified driver
- * will be loaded from the artifact, including any download or other activity
- * needed to resolve it properly. The driver will be loaded in a temporary
- * classloader and a proxy to it loaded in the platform classloader, making it
- * visible to systems which can't see inside the artifact class loaders such as
- * Hibernate. If these properties are undefined the data source reverts to
- * default behaviour for a DriverManagerDataSource
- * 
- * @author Tom Oinn
- * 
- */
-public class InterpolatingDriverManagerDataSource extends
-		DriverManagerDataSource {
-
-	private Log log = LogFactory
-			.getLog(InterpolatingDriverManagerDataSource.class);
-
-	@Override
-	public void setUrl(String newUrl) {
-		super.setUrl(interpolate(newUrl));
-	}
-
-	@Override
-	public void setUsername(String newUsername) {
-		super.setUsername(interpolate(newUsername));
-	}
-
-	@Override
-	public void setPassword(String newPassword) {
-		super.setPassword(interpolate(newPassword));
-	}
-
-	private String myDriverClassName = null;
-
-	@Override
-	public void setDriverClassName(String newDriverClassName) {
-		this.myDriverClassName = newDriverClassName.trim();
-	}
-
-	/**
-	 * Prevent automatic registration of class on load, defer until asked for so
-	 * we know whether we have an artifact specifier or not
-	 */
-	@Override
-	public String getDriverClassName() {
-		return this.myDriverClassName;
-	}
-
-	private Repository repository = null;
-	private Artifact driverArtifact = null;
-
-	/**
-	 * Inject a raven repository object to fetch the driver artifact from if
-	 * specified
-	 * 
-	 * @param rep
-	 */
-	public void setRepository(Repository rep) {
-		this.repository = rep;
-	}
-
-	/**
-	 * Inject a driver artifact specification, used if not null and as long as
-	 * there is an appropriate repository also injected.
-	 * 
-	 * @param a
-	 */
-	public void setDriverArtifact(String a) {
-		String[] parts = a.split(":");
-		driverArtifact = new BasicArtifact(parts[0], parts[1], parts[2]);
-	}
-
-	private boolean initialized = false;
-
-	@Override
-	protected synchronized Connection getConnectionFromDriverManager(
-			String url, Properties props) throws SQLException {
-		if (!initialized) {
-			if (repository == null || driverArtifact == null) {
-				// Perform regular style initialization through loading the
-				// class by name
-				try {
-					Class.forName(getDriverClassName(), true, ClassUtils
-							.getDefaultClassLoader());
-				} catch (ClassNotFoundException cnfe) {
-					log.error(
-							"Can't fine the regular (non raven) JDBC driver class "
-									+ getDriverClassName(), cnfe);
-					IllegalStateException ise = new IllegalStateException(
-							"Could not load JDBC driver class ["
-									+ getDriverClassName() + "]");
-					ise.initCause(cnfe);
-					throw ise;
-				}
-				logger.info("Loaded non raven JDBC driver: "
-						+ getDriverClassName());
-			} else {
-				// Loading through raven using the funky proxied drivers
-				ProxyDriverManager.registerDriver(repository, driverArtifact,
-						getDriverClassName());
-			}
-			initialized = true;
-		}
-		return DriverManager.getConnection(url, props);
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/ProxyDriverManager.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/ProxyDriverManager.java
deleted file mode 100644
index be5f3e6..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/ProxyDriverManager.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.jdbc;
-
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.sql.Driver;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.Enumeration;
-
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.ArtifactStatus;
-import net.sf.taverna.raven.repository.Repository;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Supports registration of JDBC drivers with the DriverManager through Raven
- * artifact specified and classname. This internally causes Raven to download
- * the appropriate artifact if required.
- * 
- * @author Tom Oinn
- * 
- */
-public class ProxyDriverManager {
-
-	private Log log = LogFactory.getLog(ProxyDriverManager.class);
-
-	private static String proxyHelperClassName = "net.sf.taverna.platform.spring.jdbc.ProxyHelper";
-
-	/**
-	 * Register a JDBC driver with the DriverManager, making it visible to the
-	 * platform's classloader.
-	 * 
-	 * @param repository
-	 *            a Raven repository to use when downloading and linking the
-	 *            driver
-	 * @param driverArtifact
-	 *            the maven artifact containing the JDBC driver
-	 * @param driverClassName
-	 *            the JDBC driver class name
-	 */
-	public static ProxyDriverManager registerDriver(Repository repository,
-			Artifact driverArtifact, String driverClassName) {
-		// First obtain the appropriate artifact...
-		try {
-			repository.addArtifact(driverArtifact);
-			repository.update();
-			if (repository.getStatus(driverArtifact).equals(
-					ArtifactStatus.Ready) == false) {
-				throw new RuntimeException("Cannot initialize artifact "
-						+ driverArtifact + " for JDBC driver "
-						+ driverClassName);
-			}
-			// Use the artifact class loader to infer the location of the
-			// downloaded jar file.
-			ClassLoader artifactLoader = repository.getLoader(driverArtifact,
-					null);
-
-			// URLs to use to populate the temporary class loader
-			URL rootJarUrl = getRootJarUrl(driverClassName, artifactLoader);
-			URL proxyHelperLocation = null;
-			try {
-				proxyHelperLocation = getProxyHelperLocation();
-			} catch(IndexOutOfBoundsException e) {
-				proxyHelperLocation = new URL(proxyHelperClassName);
-			}
-			ClassLoader loader;
-			if (proxyHelperLocation != null) {
-				loader = URLClassLoader.newInstance(new URL[] {rootJarUrl, proxyHelperLocation}, null);
-			} else {
-				loader = URLClassLoader.newInstance(new URL[] {rootJarUrl}, null);
-			}
-			URL[] loaderUrls = new URL[] {
-					rootJarUrl,
-					proxyHelperLocation };
-			return new ProxyDriverManager(loader, driverClassName);
-		} catch (Exception e) {
-			throw new RuntimeException("Failed to register driver", e);
-		}
-	}
-
-	private final ClassLoader loader;
-	private final Method getClassLoader;
-	private final Method deregisterDriver;
-	private final Method getDrivers;
-
-	private ProxyDriverManager(ClassLoader loader, String driverClassName)
-			throws SQLException, ClassNotFoundException {
-
-		this.loader = loader;
-		Class<?> proxyHelperClass = null;
-		// Get helper class
-		try {
-			proxyHelperClass = Class.forName(proxyHelperClassName, true, loader);
-		} catch (ClassNotFoundException cnfe) {
-			try {
-				proxyHelperClass = Class.forName(proxyHelperClassName);
-			}
-			catch (ClassNotFoundException e) {
-			log.error("Failed to locate proxy helper class", cnfe);
-			throw new RuntimeException(e);
-}
-		}
-		final Class<?> helperClass = proxyHelperClass;
-		// Find and store methods on helper class for later use
-		try {
-			this.deregisterDriver = helperClass.getMethod("deregisterDriver",
-					Driver.class);
-			this.getDrivers = helperClass.getMethod("getDrivers");
-			this.getClassLoader = helperClass.getMethod("getClassLoader",
-					Class.class);
-		} catch (SecurityException se) {
-			log.error("Can't access method in proxy helper", se);
-			throw new RuntimeException(se);
-		} catch (NoSuchMethodException nsme) {
-			log.error("Can't locate method in proxy helper", nsme);
-			throw new RuntimeException(nsme);
-		}
-		boolean registered = false;
-		try {
-			Class.forName(driverClassName, true, loader);
-			registerProxyDrivers();
-			registered = true;
-		} finally {
-			if (!registered) {
-				deregister();
-			}
-		}
-	}
-
-	/**
-	 * Iterate over the drivers visible to the private classloader and register
-	 * proxy drivers for each one which are therefore visible to <em>this</em>
-	 * classloader.
-	 * 
-	 * @throws SQLException
-	 */
-	private void registerProxyDrivers() throws SQLException {
-		for (Enumeration<?> en = getLoaderDrivers(); en.hasMoreElements();) {
-			Driver driver = (Driver) en.nextElement();
-			if (isLoaderClassLoader(driver.getClass())) {
-				DriverProxy proxy = new DriverProxy(driver);
-				DriverManager.registerDriver(proxy);
-			}
-		}
-	}
-
-	/**
-	 * De-register Drivers. Drivers in this context are de-registered. Some
-	 * cleanup of the dynamic class loader is required due to a memory leak in
-	 * JDBC.
-	 */
-	public void deregister() throws SQLException {
-		for (Enumeration<Driver> en = DriverManager.getDrivers(); en
-				.hasMoreElements();) {
-			Driver driver = en.nextElement();
-			// If this is a DriverProxy then unload it from the DriverManager on
-			// this side, also have to de-register the driver it's proxying on
-			// the other side!
-			if (driver instanceof DriverProxy) {
-				DriverProxy proxy = (DriverProxy) driver;
-				Driver target = proxy.getTarget();
-				if (isLoaderClassLoader(target.getClass())) {
-					DriverManager.deregisterDriver(proxy);
-				}
-			}
-		}
-		for (Enumeration<?> en = getLoaderDrivers(); en.hasMoreElements();) {
-			Driver driver = (Driver) en.nextElement();
-			try {
-				deregisterDriver.invoke(null, driver);
-			} catch (IllegalArgumentException exc) {
-				throw new Error(exc);
-			} catch (java.lang.reflect.InvocationTargetException exc) {
-				Throwable cause = exc.getCause();
-				if (cause instanceof SQLException) {
-					throw (SQLException) cause;
-				} else {
-					throw new Error(exc);
-				}
-			} catch (java.lang.IllegalAccessException exc) {
-				throw new Error(exc);
-			}
-		}
-	}
-
-	/**
-	 * Use reflection to call the DriverManager.getDrivers method through the
-	 * proxy helper. As this is in the same classloader as used to register the
-	 * JDBC driver from Raven we'll actually be able to see the registered
-	 * driver.
-	 * 
-	 * @return enumeration of drivers in the DriverManager visible to the newly
-	 *         created private classloader.
-	 */
-	private Enumeration<?> getLoaderDrivers() {
-		try {
-			return (Enumeration<?>) getDrivers.invoke(null);
-		} catch (IllegalArgumentException exc) {
-			throw new Error(exc);
-		} catch (java.lang.reflect.InvocationTargetException exc) {
-			throw new Error(exc);
-		} catch (java.lang.IllegalAccessException exc) {
-			throw new Error(exc);
-		}
-	}
-
-	/**
-	 * Indicates whether {@code clazz} was loaded by {@link #loader}.
-	 */
-	private boolean isLoaderClassLoader(Class<?> clazz) {
-		final ClassLoader clazzClassLoader;
-		try {
-			clazzClassLoader = (ClassLoader) getClassLoader.invoke(null, clazz);
-		} catch (IllegalArgumentException exc) {
-			throw new Error(exc);
-		} catch (java.lang.reflect.InvocationTargetException exc) {
-			Throwable cause = exc.getCause();
-			if (cause instanceof SecurityException) {
-				return false;
-			} else {
-				throw new Error(exc);
-			}
-		} catch (java.lang.IllegalAccessException exc) {
-			throw new Error(exc);
-		}
-		return clazzClassLoader == this.loader;
-	}
-
-	private static URL getProxyHelperLocation() throws MalformedURLException {
-		return getRootJarUrl(proxyHelperClassName, ProxyDriverManager.class
-				.getClassLoader());
-	}
-
-	public static URL getRootJarUrl(String className, ClassLoader loader)
-			throws MalformedURLException {
-		if (loader == null) {
-			loader = Thread.currentThread().getContextClassLoader();
-		}
-		String classAsResource = className.replaceAll("\\.", "/") + ".class";
-		URL resourceURL = loader.getResource(classAsResource);
-		String resourceFile = resourceURL.getFile();
-		String result = "";
-		if (resourceFile.contains(".jar")) {
-		result = resourceURL.getFile().substring(0,
-				resourceURL.getFile().indexOf(".jar"))
-				+ ".jar";
-		} else {
-			result = "file:" + resourceFile.substring(0, resourceFile.lastIndexOf("/")) + "/";
-		}
-		return new URL(result);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/ProxyHelper.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/ProxyHelper.java
deleted file mode 100644
index 860836e..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/ProxyHelper.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.jdbc;
-
-import java.sql.Driver;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-
-/**
- * Acts as the bridge to the anonymous temporary classloader used to register
- * the real JDBC drivers. The ProxyDriverManager uses this to mediate access to
- * that anonymous class world and proxy it with a DriverProxy
- * 
- * @author Tom Oinn
- */
-public class ProxyHelper {
-
-	/**
-	 * Used to check whether we can 'see' the specified class.
-	 * 
-	 * @throws SecurityException
-	 *             generally thrown if class loaded by a different class loader
-	 *             from us
-	 */
-	public static ClassLoader getClassLoader(Class<?> theClass) {
-		return theClass.getClassLoader();
-	}
-
-	/**
-	 * Calls the DriverManager.getDrivers method from the temporary classloader
-	 * environment.
-	 * 
-	 * @return an enumeration of JDBC drivers visible to the temporary
-	 *         classloader
-	 */
-	public static java.util.Enumeration<Driver> getDrivers() {
-		return DriverManager.getDrivers();
-	}
-
-	/**
-	 * Calls DriverManager.deregisterDriver on the DriverManager from the
-	 * temporary classloader environment, used along with deregistration of the
-	 * DriverProxy
-	 */
-	public static void deregisterDriver(Driver driver) throws SQLException {
-		DriverManager.deregisterDriver(driver);
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/TemporaryJDBC.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/TemporaryJDBC.java
deleted file mode 100644
index ee79739..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/TemporaryJDBC.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.jdbc;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Create JDBC connection strings for temporary use (ie. from tests)
- * <p>
- * {@link #getTemporaryDerbyJDBC()} creates a temporary directory that is used
- * to construct the JDBC connection string for a local Derby database.
- * </p>
- * <p>
- * This is most useful from a spring configuration, for example when using
- * {@link InterpolatingDriverManagerDataSource}:
- * </p>
- * 
- * <pre>
- * &lt;!-- Apache Derby rooted at a temporary directory --&gt;
- *  &lt;bean id=&quot;t2reference.jdbc.temporaryjdbc&quot;
- *  class=&quot;net.sf.taverna.platform.spring.jdbc.TemporaryJDBC&quot;&gt;
- *  &lt;/bean&gt;
- *  &lt;bean id=&quot;t2reference.jdbc.url&quot; class=&quot;java.lang.String&quot;
- *  factory-bean=&quot;t2reference.jdbc.temporaryjdbc&quot;
- *  factory-method=&quot;getTemporaryDerbyJDBC&quot; /&gt;
- *  &lt;bean id=&quot;t2reference.jdbc.datasource&quot;
- *  class=&quot;net.sf.taverna.platform.spring.jdbc.InterpolatingDriverManagerDataSource&quot;&gt;
- *  &lt;property name=&quot;driverClassName&quot;&gt;
- *  &lt;value&gt;org.apache.derby.jdbc.EmbeddedDriver&lt;/value&gt;
- *  &lt;/property&gt;
- *  &lt;property name=&quot;url&quot;&gt;
- *  &lt;ref bean=&quot;t2reference.jdbc.url&quot; /&gt;
- *  &lt;/property&gt;
- *  &lt;property name=&quot;repository&quot;&gt;
- *  &lt;ref bean=&quot;raven.repository&quot; /&gt;
- *  &lt;/property&gt;
- *  &lt;property name=&quot;driverArtifact&quot;&gt;
- *  &lt;value&gt;org.apache.derby:derby:10.4.1.3&lt;/value&gt;
- *  &lt;/property&gt;
- *  &lt;/bean&gt;
- * </pre>
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class TemporaryJDBC {
-	public String getTemporaryDerbyJDBC() throws IOException {
-		File tmpDir = File.createTempFile("t2platform-", ".db");
-		tmpDir.delete();
-		if (!tmpDir.mkdir()) {
-			throw new IOException("Could not create temporary directory "
-					+ tmpDir);
-		}
-		return "jdbc:derby:" + tmpDir.getPath() + "/database;create=true";
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/package.html b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/package.html
deleted file mode 100644
index 2355a14..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/jdbc/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<body>
-Extensions to the JDBC parts of Spring, and support for proxying of JDBC 
-drivers so we can load them dynamically from raven artifacts. The proxy 
-approach is inspired by http://www.jroller.com/tackline/entry/dynamically_loading_jdbc_drivers 
-with additions to build from raven rather than from existing jar files.
-</body>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/orm/hibernate3/SpiRegistryAwareLocalSessionFactoryBean.java b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/orm/hibernate3/SpiRegistryAwareLocalSessionFactoryBean.java
deleted file mode 100644
index 3495e00..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/orm/hibernate3/SpiRegistryAwareLocalSessionFactoryBean.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.orm.hibernate3;
-
-import java.util.List;
-
-import net.sf.taverna.raven.spi.SpiRegistry;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.util.ReflectHelper;
-import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
-
-/**
- * An extension to the regular spring hibernate session factory which allows an
- * additional property containing a list of SpiRegistry beans. If this is
- * defined then each SpiRegistry in the list is used to get a list of Class
- * objects and these are in turn used to add classes to the hibernate
- * configuration.
- * 
- * @author Tom Oinn
- */
-public class SpiRegistryAwareLocalSessionFactoryBean extends
-		LocalSessionFactoryBean {
-
-	private Log log = LogFactory
-			.getLog(SpiRegistryAwareLocalSessionFactoryBean.class);
-	private List<SpiRegistry> spiRegistries = null;
-	private List<SpiRegistry> preloadRegistries = null;
-
-	/**
-	 * Set the list of SPI registries from which to pull class definitions for
-	 * mapped beans.
-	 * 
-	 * @param spis
-	 */
-	public void setSpiRegistries(List<SpiRegistry> spis) {
-		log.debug("Set SPI registry list");
-		this.spiRegistries = spis;
-	}
-
-	/**
-	 * Set the list of preload registries - classes from these registries are
-	 * not mapped to hibernate but are registered with the customized classname ->
-	 * classloader linkage. This is therefore used for any classes which mapped
-	 * classes will depend upon but which don't have a mapping themselves such
-	 * as component classes
-	 */
-	public void setPreloadRegistries(List<SpiRegistry> spis) {
-		log.debug("Set preload list");
-		this.preloadRegistries = spis;
-	}
-
-	/**
-	 * Use any defined spiRegistries, adding any classes they contain to the
-	 * configuration before returning it. Initially delegates to the superclass,
-	 * so explicitly defined mappings will be mapped before those from the
-	 * SpiRegistry(s)
-	 */
-	@Override
-	protected Configuration newConfiguration() {
-		Configuration conf = super.newConfiguration();
-		log.trace("Starting SPI registry based configuration");
-		if (preloadRegistries != null) {
-			for (SpiRegistry spi : preloadRegistries) {
-				for (Class<?> theClass : spi.getClasses()) {
-					log.info("Preloading class '" + theClass.getCanonicalName()
-							+ "' from SPI to hibernate classloader mapping");
-					ReflectHelper.registerClass(theClass);
-				}
-			}
-		}
-		if (spiRegistries != null) {
-			for (SpiRegistry spi : spiRegistries) {
-				for (Class<?> theClass : spi.getClasses()) {
-					log.info("Added class '" + theClass.getCanonicalName()
-							+ "' from SPI to hibernate configuration");
-					ReflectHelper.registerClass(theClass);
-					conf.addClass(theClass);
-				}
-			}
-		} else {
-			log.info("No SPI registries defined");
-		}
-		log.trace("Done SPI registry based configuration");
-		return conf;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/orm/hibernate3/package.html b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/orm/hibernate3/package.html
deleted file mode 100644
index c25615f..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/orm/hibernate3/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-Extensions to Spring's support for Hibernate3 to allow it to interoperate with entities loaded through Raven. 
-</body>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/package.html b/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/package.html
deleted file mode 100644
index f932224..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/platform/spring/package.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<body>
-Extensions for Spring to allow it to access beans through Raven. When
-this extension is present and used through the
-RavenAwareClassPathXmlApplicationContext you can add artifact
-information to any bean definition in the spring application context.
-Provided you also define a reference to a raven repository through an
-instance of the RepositoryFactoryBean Spring will automatically handle
-the download of code to your specified repository cache and the various
-classloader management aspects involved.
-</body>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractEntityImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractEntityImpl.java
deleted file mode 100644
index fd67ec8..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractEntityImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Abstract superclass of ReferenceSetImpl, IdentifiedArrayList and
- * ErrorDocumentImpl, manages the T2Reference field for these types and their
- * hibernate backing.
- * 
- * @author Tom Oinn
- * 
- */
-public class AbstractEntityImpl {
-
-	private T2ReferenceImpl id;
-
-	private String compactId = null;
-
-	public T2Reference getId() {
-		return id;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate, and is used to
-	 * initialize the unique ID of this reference set.
-	 */
-	public void setTypedId(T2ReferenceImpl newId) {
-		this.id = newId;
-	}
-
-	/**
-	 * Used because technically you can't accept and return implementation types
-	 * in the methods on a bean which implements an interface, but Hibernate
-	 * needs to construct concrete input and output types!
-	 */
-	public T2ReferenceImpl getTypedId() {
-		return this.id;
-	}
-
-	public void setInternalId(String newId) {
-		this.compactId = newId;
-	}
-
-	public final String getInternalId() {
-		if (this.compactId == null) {
-			this.compactId = id.getCompactForm();
-		}
-		return this.compactId;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractErrorDocumentServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractErrorDocumentServiceImpl.java
deleted file mode 100644
index 1b93425..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractErrorDocumentServiceImpl.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentDao;
-import net.sf.taverna.t2.reference.ErrorDocumentService;
-import net.sf.taverna.t2.reference.ErrorDocumentServiceCallback;
-import net.sf.taverna.t2.reference.ErrorDocumentServiceException;
-import net.sf.taverna.t2.reference.ListServiceException;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceGenerator;
-
-/**
- * Abstract implementation of ErrorDocumentService, inject with an appropriate
- * ErrorDocumentDao and T2ReferenceGenerator to enable. Contains injectors for
- * id generation and dao along with other bookkeeping, leaving the
- * implementation of the actual service logic to the subclass.
- * 
- * @author Tom Oinn
- */
-public abstract class AbstractErrorDocumentServiceImpl extends
-		AbstractServiceImpl implements ErrorDocumentService {
-
-	protected ErrorDocumentDao errorDao = null;
-	protected T2ReferenceGenerator t2ReferenceGenerator = null;
-
-	/**
-	 * Inject the error document data access object.
-	 */
-	public final void setErrorDao(ErrorDocumentDao dao) {
-		this.errorDao = dao;
-	}
-
-	/**
-	 * Inject the T2Reference generator used to allocate new IDs when
-	 * registering ErrorDocuments
-	 */
-	public final void setT2ReferenceGenerator(T2ReferenceGenerator t2rg) {
-		this.t2ReferenceGenerator = t2rg;
-	}
-
-	/**
-	 * Check that the list dao is configured
-	 * 
-	 * @throws ListServiceException
-	 *             if the dao is still null
-	 */
-	protected final void checkDao() throws ErrorDocumentServiceException {
-		if (errorDao == null) {
-			throw new ErrorDocumentServiceException(
-					"ErrorDocumentDao not initialized, error document "
-							+ "service operations are not available");
-		}
-	}
-
-	/**
-	 * Check that the t2reference generator is configured
-	 * 
-	 * @throws ListServiceException
-	 *             if the generator is still null
-	 */
-	protected final void checkGenerator() throws ErrorDocumentServiceException {
-		if (t2ReferenceGenerator == null) {
-			throw new ErrorDocumentServiceException(
-					"T2ReferenceGenerator not initialized, error document "
-							+ "service operations not available");
-		}
-	}
-
-	public final void getErrorAsynch(final T2Reference id,
-			final ErrorDocumentServiceCallback callback)
-			throws ErrorDocumentServiceException {
-		checkDao();
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					ErrorDocument e = errorDao.get(id);
-					callback.errorRetrieved(e);
-				} catch (DaoException de) {
-					callback
-							.errorRetrievalFailed(new ErrorDocumentServiceException(
-									de));
-				}
-			}
-		};
-		executeRunnable(r);
-
-	}
-
-	public final ErrorDocument registerError(String message, int depth)
-			throws ErrorDocumentServiceException {
-		return registerError(message, (Throwable) null, depth);
-	}
-
-	public final ErrorDocument registerError(Throwable t, int depth)
-			throws ErrorDocumentServiceException {
-		return registerError("", t, depth);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractListServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractListServiceImpl.java
deleted file mode 100644
index 5fbbea8..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractListServiceImpl.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.ListService;
-import net.sf.taverna.t2.reference.ListServiceCallback;
-import net.sf.taverna.t2.reference.ListServiceException;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceGenerator;
-
-/**
- * Abstract implementation of ListService, inject with an appropriate ListDao
- * and T2ReferenceGenerator to enable. Contains injectors for id generation and
- * dao along with other bookkeeping, leaving the implementation of the actual
- * service logic to the subclass.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractListServiceImpl extends AbstractServiceImpl
-		implements ListService {
-
-	protected ListDao listDao = null;
-	protected T2ReferenceGenerator t2ReferenceGenerator = null;
-
-	/**
-	 * Inject the list data access object.
-	 */
-	public final void setListDao(ListDao dao) {
-		this.listDao = dao;
-	}
-
-	/**
-	 * Inject the T2Reference generator used to allocate new IDs when
-	 * registering lists of T2Reference
-	 */
-	public final void setT2ReferenceGenerator(T2ReferenceGenerator t2rg) {
-		this.t2ReferenceGenerator = t2rg;
-	}
-
-	/**
-	 * Check that the list dao is configured
-	 * 
-	 * @throws ListServiceException
-	 *             if the dao is still null
-	 */
-	protected final void checkDao() throws ListServiceException {
-		if (listDao == null) {
-			throw new ListServiceException("ListDao not initialized, list "
-					+ "service operations are not available");
-		}
-	}
-
-	/**
-	 * Check that the t2reference generator is configured
-	 * 
-	 * @throws ListServiceException
-	 *             if the generator is still null
-	 */
-	protected final void checkGenerator() throws ListServiceException {
-		if (t2ReferenceGenerator == null) {
-			throw new ListServiceException(
-					"T2ReferenceGenerator not initialized, list "
-							+ "service operations not available");
-		}
-	}
-
-	public final void getListAsynch(final T2Reference id,
-			final ListServiceCallback callback) throws ListServiceException {
-		checkDao();
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					callback.listRetrieved(getList(id));
-				} catch (ListServiceException lse) {
-					callback.listRetrievalFailed(lse);
-				}
-			}
-		};
-		executeRunnable(r);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractReferenceServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractReferenceServiceImpl.java
deleted file mode 100644
index 7657714..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractReferenceServiceImpl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Set;
-
-import net.sf.taverna.raven.spi.InstanceRegistry;
-import net.sf.taverna.t2.reference.ErrorDocumentService;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ListService;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.ReferenceServiceException;
-import net.sf.taverna.t2.reference.ReferenceServiceResolutionCallback;
-import net.sf.taverna.t2.reference.ReferenceSetService;
-import net.sf.taverna.t2.reference.StreamToValueConverterSPI;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.ValueToReferenceConverterSPI;
-
-/**
- * Implementation of ReferenceService, inject with ReferenceSetService,
- * ErrorDocumentService and ListService to enable. Inject with an instance
- * registry of ValueToReferenceConvertorSPI to enable on the fly registration of
- * otherwise illegal object types. This class contains the basic injection
- * functionality and the getters for the sub-services, mostly to isolate these
- * mundane bits of code from the more interesting actual implementation of the
- * reference service logic.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractReferenceServiceImpl extends AbstractServiceImpl
-		implements ReferenceService {
-
-	protected ErrorDocumentService errorDocumentService = null;
-	protected ReferenceSetService referenceSetService = null;
-	protected ListService listService = null;
-	protected InstanceRegistry<ValueToReferenceConverterSPI> converterRegistry = null;
-	@SuppressWarnings("unchecked")
-	protected InstanceRegistry<StreamToValueConverterSPI> valueBuilderRegistry = null;
-
-	/**
-	 * Inject value to reference convertor SPI
-	 */
-	public final void setConverterRegistry(
-			InstanceRegistry<ValueToReferenceConverterSPI> reg) {
-		this.converterRegistry = reg;
-	}
-
-	/**
-	 * Inject stream to value converter SPI
-	 */
-	@SuppressWarnings("unchecked")
-	public final void setValueBuilderRegistry(
-			InstanceRegistry<StreamToValueConverterSPI> reg) {
-		this.valueBuilderRegistry = reg;
-	}
-
-	/**
-	 * Inject error document service
-	 */
-	public final void setErrorDocumentService(ErrorDocumentService eds) {
-		this.errorDocumentService = eds;
-	}
-
-	/**
-	 * Inject reference set service
-	 */
-	public final void setReferenceSetService(ReferenceSetService rss) {
-		this.referenceSetService = rss;
-	}
-
-	/**
-	 * Inject list service
-	 */
-	public final void setListService(ListService ls) {
-		this.listService = ls;
-	}
-
-	/**
-	 * Throw a ReferenceServiceException if methods in ReferenceService are
-	 * called without the necessary sub-services configured.
-	 */
-	protected final void checkServices() throws ReferenceServiceException {
-		if (errorDocumentService == null) {
-			throw new ReferenceServiceException(
-					"Reference service must be configued with an "
-							+ "instance of ErrorDocumentService to function");
-		}
-		if (referenceSetService == null) {
-			throw new ReferenceServiceException(
-					"Reference service must be configued with an "
-							+ "instance of ReferenceSetService to function");
-		}
-		if (listService == null) {
-			throw new ReferenceServiceException(
-					"Reference service must be configued with an "
-							+ "instance of ListService to function");
-		}
-	}
-
-	/**
-	 * Check whether the converter registry has been defined, throw a
-	 * ReferenceServiceException if not
-	 */
-	protected final void checkConverterRegistry()
-			throws ReferenceServiceException {
-		if (converterRegistry == null) {
-			throw new ReferenceServiceException(
-					"Reference service must be configued with an "
-							+ "instance registry of ValueToReferenceConvertorSPI "
-							+ "to enable on the fly mapping of arbitrary objects "
-							+ "during compound registration");
-		}
-	}
-
-	public final ErrorDocumentService getErrorDocumentService() {
-		checkServices();
-		return this.errorDocumentService;
-	}
-
-	public final ListService getListService() {
-		checkServices();
-		return this.listService;
-	}
-
-	public final ReferenceSetService getReferenceSetService() {
-		checkServices();
-		return this.referenceSetService;
-	}
-
-	/**
-	 * Wraps the synchronous form, using the executeRunnable method to schedule
-	 * it.
-	 */
-	public void resolveIdentifierAsynch(final T2Reference id,
-			final Set<Class<ExternalReferenceSPI>> ensureTypes,
-			final ReferenceContext context,
-			final ReferenceServiceResolutionCallback callback)
-			throws ReferenceServiceException {
-		checkServices();
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					callback.identifierResolved(resolveIdentifier(id,
-							ensureTypes, context));
-				} catch (ReferenceServiceException rse) {
-					callback.resolutionFailed(rse);
-				}
-			}
-		};
-		executeRunnable(r);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractReferenceSetServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractReferenceSetServiceImpl.java
deleted file mode 100644
index fe8c0cc..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractReferenceSetServiceImpl.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetAugmentor;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-import net.sf.taverna.t2.reference.ReferenceSetService;
-import net.sf.taverna.t2.reference.ReferenceSetServiceCallback;
-import net.sf.taverna.t2.reference.ReferenceSetServiceException;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceGenerator;
-
-/**
- * Abstract implementation of ReferenceSetService, inject with an appropriate
- * ReferenceSetDao to enable. Implements translation functionality as long as an
- * appropriate ReferenceSetAugmentor implementation is injected. Contains
- * injectors for id generation and dao along with other bookkeeping, leaving the
- * implementation of the actual service logic to the subclass.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractReferenceSetServiceImpl extends
-		AbstractServiceImpl implements ReferenceSetService {
-
-	protected ReferenceSetDao referenceSetDao = null;
-	protected T2ReferenceGenerator t2ReferenceGenerator = null;
-	protected ReferenceSetAugmentor referenceSetAugmentor = null;
-
-	/**
-	 * Inject the reference set data access object.
-	 */
-	public final void setReferenceSetDao(ReferenceSetDao dao) {
-		this.referenceSetDao = dao;
-	}
-
-	/**
-	 * Inject the T2Reference generator used to allocate new IDs when
-	 * registering sets of ExternalReferenceSPI
-	 */
-	public final void setT2ReferenceGenerator(T2ReferenceGenerator t2rg) {
-		this.t2ReferenceGenerator = t2rg;
-	}
-
-	/**
-	 * Inject the ReferenceSetAugmentor used to translate or construct new
-	 * ExternalReferenceSPI instances within a ReferenceSet
-	 */
-	public final void setReferenceSetAugmentor(ReferenceSetAugmentor rse) {
-		this.referenceSetAugmentor = rse;
-	}
-
-	/**
-	 * Check that the reference set dao is configured
-	 * 
-	 * @throws ReferenceSetServiceException
-	 *             if the dao is still null
-	 */
-	protected final void checkDao() throws ReferenceSetServiceException {
-		if (referenceSetDao == null) {
-			throw new ReferenceSetServiceException(
-					"ReferenceSetDao not initialized, reference set "
-							+ "service operations are not available");
-		}
-	}
-
-	/**
-	 * Check that the t2reference generator is configured
-	 * 
-	 * @throws ReferenceSetServiceException
-	 *             if the generator is still null
-	 */
-	protected final void checkGenerator() throws ReferenceSetServiceException {
-		if (t2ReferenceGenerator == null) {
-			throw new ReferenceSetServiceException(
-					"T2ReferenceGenerator not initialized, reference "
-							+ "set service operations not available");
-		}
-	}
-
-	/**
-	 * Check that the reference set augmentor is configured
-	 * 
-	 * @throws ReferenceSetServiceException
-	 *             if the reference set augmentor is still null
-	 */
-	protected final void checkAugmentor() throws ReferenceSetServiceException {
-		if (referenceSetAugmentor == null) {
-			throw new ReferenceSetServiceException(
-					"ReferenceSetAugmentor not initialized, reference "
-							+ "set service operations not available");
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public final void getReferenceSetAsynch(final T2Reference id,
-			final ReferenceSetServiceCallback callback)
-			throws ReferenceSetServiceException {
-		checkDao();
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					ReferenceSet rs = referenceSetDao.get(id);
-					callback.referenceSetRetrieved(rs);
-				} catch (DaoException de) {
-					callback
-							.referenceSetRetrievalFailed(new ReferenceSetServiceException(
-									de));
-				}
-			}
-		};
-		executeRunnable(r);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public final void getReferenceSetWithAugmentationAsynch(
-			final T2Reference id,
-			final Set<Class<ExternalReferenceSPI>> ensureTypes,
-			final ReferenceContext context,
-			final ReferenceSetServiceCallback callback)
-			throws ReferenceSetServiceException {
-		checkDao();
-		checkAugmentor();
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					callback
-							.referenceSetRetrieved(getReferenceSetWithAugmentation(
-									id, ensureTypes, context));
-
-				} catch (ReferenceSetServiceException rsse) {
-					callback.referenceSetRetrievalFailed(rsse);
-				}
-			}
-		};
-		executeRunnable(r);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractServiceImpl.java
deleted file mode 100644
index d8a419b..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractServiceImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-/**
- * Abstract superclass for all service implementation objects, will be used to
- * allow injection of thread pooling logic as and when we implement it.
- * 
- * @author Tom Oinn
- */
-public class AbstractServiceImpl {
-
-	/**
-	 * Schedule a runnable for execution - current naive implementation uses a
-	 * new thread and executes immediately, but this is where any thread pool
-	 * logic would go if we wanted to add that.
-	 * 
-	 * @param r
-	 */
-	protected void executeRunnable(Runnable r) {
-		new Thread(r).start();
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractT2ReferenceGenerator.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractT2ReferenceGenerator.java
deleted file mode 100644
index 7cc965f..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/AbstractT2ReferenceGenerator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceGenerator;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-
-/**
- * An abstract class for implementing simple {@link T2ReferenceGenerator}s.
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public abstract class AbstractT2ReferenceGenerator implements
-		T2ReferenceGenerator {
-
-	public AbstractT2ReferenceGenerator() {
-		super();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public synchronized T2Reference nextReferenceSetReference() {
-		T2ReferenceImpl r = new T2ReferenceImpl();
-		r.setNamespacePart(getNamespace());
-		r.setLocalPart(getNextLocalPart());
-		r.setReferenceType(T2ReferenceType.ReferenceSet);
-		r.setDepth(0);
-		r.setContainsErrors(false);
-		return r;
-	}
-
-	/**
-	 * Generate a new local part for a new {@link T2Reference reference}. The
-	 * local part should be unique within this
-	 * {@link T2ReferenceGenerator#getNamespace() namespace}.
-	 * 
-	 * @return A new, unique local part to identify a new reference.
-	 */
-	protected abstract String getNextLocalPart();
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public T2Reference nextListReference(boolean containsErrors, int listDepth) {
-		T2ReferenceImpl r = new T2ReferenceImpl();
-		r.setNamespacePart(getNamespace());
-		r.setLocalPart(getNextLocalPart());
-		r.setReferenceType(T2ReferenceType.IdentifiedList);
-		r.setDepth(listDepth);
-		r.setContainsErrors(containsErrors);
-		return r;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public T2Reference nextErrorDocumentReference(int depth) {
-		T2ReferenceImpl r = new T2ReferenceImpl();
-		r.setNamespacePart(getNamespace());
-		r.setLocalPart(getNextLocalPart());
-		r.setReferenceType(T2ReferenceType.ErrorDocument);
-		r.setDepth(depth);
-		// This is an error document, it contains errors by definition
-		r.setContainsErrors(true);
-		return r;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/CacheAspect.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/CacheAspect.java
deleted file mode 100644
index 1231b6c..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/CacheAspect.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.Identified;
-import net.sf.taverna.t2.reference.ReferenceServiceCacheProvider;
-import net.sf.taverna.t2.reference.T2Reference;
-
-import org.aspectj.lang.ProceedingJoinPoint;
-
-/**
- * An aspect used to intercept calls to the various data access objects and
- * divert through a write-through cache provider
- * 
- * @author Tom Oinn
- */
-public class CacheAspect {
-
-	private ReferenceServiceCacheProvider cacheProvider;
-
-	/**
-	 * Return an injected ReferenceServiceCacheProvider
-	 */
-	private final ReferenceServiceCacheProvider getCacheProvider() {
-		return cacheProvider;
-	}
-
-	/**
-	 * Inject an instance of ReferenceServiceCacheProvider
-	 * 
-	 * @param cacheProvider
-	 *            the cache provider to use
-	 */
-	public final void setCacheProvider(
-			final ReferenceServiceCacheProvider cacheProvider) {
-		this.cacheProvider = cacheProvider;
-	}
-
-	/**
-	 * Handle a 'get by T2Reference' operation on a Dao
-	 * 
-	 * @param pjp
-	 *            the join point representing the ongoing method call to the dao
-	 * @return the entity identified by the T2Reference supplied to the method
-	 *         to which this advice applies
-	 * @throws DaoException
-	 *             if anything goes wrong
-	 */
-	public final Identified getObject(final ProceedingJoinPoint pjp)
-			throws DaoException {
-
-		Identified result = null;
-
-		// Get the T2Reference from the argument to the get method
-		T2Reference id = (T2Reference) pjp.getArgs()[0];
-		if (id != null) {
-			result = getCacheProvider().get(id);
-			if (result != null) {
-				return result;
-			}
-		}
-		// If we miss the cache then call the method as usual
-		try {
-			result = (Identified) pjp.proceed();
-		} catch (Throwable e) {
-			if (e instanceof DaoException) {
-				throw ((DaoException) e);
-			} else {
-				throw new DaoException(
-						"Unexpected exception type during aspect "
-								+ "based invocation", e);
-			}
-		}
-
-		// Write back to the cache
-		if (result != null) {
-			getCacheProvider().put(result);
-		}
-
-		return result;
-	}
-
-	/**
-	 * Called around a write or update operation on the backing store, writes
-	 * through to the cache after modifying the state of the backing store and
-	 * before returning from the dao method
-	 * 
-	 * @param pjp
-	 *            join point representing the ongoing method invocation to cache
-	 * @throws DaoException
-	 *             if anything goes wrong
-	 */
-	public void putObject(final ProceedingJoinPoint pjp) throws DaoException {
-
-		// Get the Identified being stored by the method we're advising
-		Identified storedObject = (Identified) pjp.getArgs()[0];
-
-		try {
-			// Run the store or update method
-			pjp.proceed();
-		} catch (Throwable e) {
-			if (e instanceof DaoException) {
-				throw ((DaoException) e);
-			} else {
-				throw new DaoException(
-						"Unexpected exception type during aspect "
-								+ "based invocation", e);
-			}
-		}
-
-		// Assuming the method isn't null and has an identifier (which it will
-		// if we haven't thrown an exception before now) write it back to the
-		// cache provider
-		if (storedObject != null && storedObject.getId() != null) {
-			getCacheProvider().put(storedObject);
-		}
-
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ContextualizedT2ReferenceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ContextualizedT2ReferenceImpl.java
deleted file mode 100644
index ef8e7cf..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ContextualizedT2ReferenceImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.ContextualizedT2Reference;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Simple implementation of ContextualizedT2Reference
- * 
- * @author Tom Oinn
- * 
- */
-public class ContextualizedT2ReferenceImpl implements ContextualizedT2Reference {
-
-	private T2Reference reference;
-	private int[] index;
-
-	public ContextualizedT2ReferenceImpl(T2Reference ref, int[] context) {
-		this.reference = ref;
-		this.index = context;
-	}
-
-	public int[] getIndex() {
-		return this.index;
-	}
-
-	public T2Reference getReference() {
-		return this.reference;
-	}
-
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("[");
-		boolean doneFirst = false;
-		for (int i = 0; i < index.length; i++) {
-			if (doneFirst) {
-				sb.append(",");
-			}
-			doneFirst = true;
-			sb.append(index[i]);
-		}
-		sb.append("]");
-		sb.append(reference.toString());		
-		return sb.toString();
-	}
-	
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/EmptyReferenceContext.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/EmptyReferenceContext.java
deleted file mode 100644
index a629719..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/EmptyReferenceContext.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.reference.ReferenceContext;
-
-/**
- * A trivial implementation of ReferenceContext, used if the context parameter
- * to any service method is null.
- * 
- * @author Tom Oinn
- * 
- */
-public class EmptyReferenceContext implements ReferenceContext {
-
-	/**
-	 * Return an empty entity set for all queries.
-	 */
-	public <T> List<? extends T> getEntities(Class<T> arg0) {
-		return new ArrayList<T>();
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.java
deleted file mode 100644
index c0f5d01..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.StackTraceElementBean;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.h3.HibernateMappedEntity;
-
-/**
- * Simple bean implementation of ErrorDocument
- * 
- * @author Tom Oinn
- * 
- */
-public class ErrorDocumentImpl extends AbstractEntityImpl implements
-		ErrorDocument, HibernateMappedEntity {
-
-	private String exceptionMessage = "";
-	private String message = "";
-	List<StackTraceElementBean> stackTrace;
-	Set<T2Reference> errorReferences = new HashSet<T2Reference>();
-	
-	public ErrorDocumentImpl() {
-		this.stackTrace = new ArrayList<StackTraceElementBean>();
-	}
-
-	public String getExceptionMessage() {
-		return this.exceptionMessage;
-	}
-
-	public void setExceptionMessage(String exceptionMessage) {
-		this.exceptionMessage = exceptionMessage;
-	}
-
-	public String getMessage() {
-		return this.message;
-	}
-
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	/**
-	 * From interface, not used by hibernate internally
-	 */
-	public List<StackTraceElementBean> getStackTraceStrings() {
-		return this.stackTrace;
-	}
-
-	/**
-	 * Used by Hibernate to bodge around problems with interface types in the
-	 * API
-	 */
-	@SuppressWarnings("unchecked")
-	public void setStackTraceList(List newList) {
-		this.stackTrace = newList;
-	}
-
-	/**
-	 * Used by Hibernate to bodge around problems with interface types in the
-	 * API
-	 */
-	@SuppressWarnings("unchecked")
-	public List getStackTraceList() {
-		return this.stackTrace;
-	}
-
-	public Set<T2Reference> getErrorReferences() {
-		return errorReferences;
-	}
-
-	/**
-	 * Used by Hibernate to bodge around problems with interface types in the
-	 * API
-	 */
-	@SuppressWarnings("unchecked")
-	public void setErrorReferenceSet(Set errorReferenceSet) {
-		this.errorReferences = errorReferenceSet;
-	}
-	
-	/**
-	 * Used by Hibernate to bodge around problems with interface types in the
-	 * API
-	 */
-	@SuppressWarnings("unchecked")
-	public Set getErrorReferenceSet() {
-		return this.errorReferences;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ErrorDocumentServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ErrorDocumentServiceImpl.java
deleted file mode 100644
index e911696..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ErrorDocumentServiceImpl.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentService;
-import net.sf.taverna.t2.reference.ErrorDocumentServiceException;
-import net.sf.taverna.t2.reference.ReferenceServiceException;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Implementation of ErrorDocumentService, inject with an appropriate
- * ErrorDocumentDao and T2ReferenceGenerator to enable.
- * 
- * @author Tom Oinn
- * 
- */
-public class ErrorDocumentServiceImpl extends AbstractErrorDocumentServiceImpl
-		implements ErrorDocumentService {
-
-	public ErrorDocument getError(T2Reference id)
-			throws ErrorDocumentServiceException {
-		checkDao();
-		try {
-			return errorDao.get(id);
-		} catch (Throwable t) {
-			throw new ErrorDocumentServiceException(t);
-		}
-	}
-
-	/**
-	 * Register the specified error and any child errors (which have the same
-	 * namespace and local part but a lower depth, down to depth of zero
-	 */
-	public ErrorDocument registerError(String message, Throwable t, int depth)
-			throws ErrorDocumentServiceException {
-		checkDao();
-		checkGenerator();
-
-		T2Reference ref = t2ReferenceGenerator
-				.nextErrorDocumentReference(depth);
-		T2ReferenceImpl typedId = T2ReferenceImpl.getAsImpl(ref);
-
-		ErrorDocument docToReturn = null;
-		while (depth >= 0) {
-			ErrorDocumentImpl edi = new ErrorDocumentImpl();
-			if (docToReturn == null) {
-				docToReturn = edi;
-			}
-			edi.setTypedId(typedId);
-			if (message != null) {
-				edi.setMessage(message);
-			} else {
-				edi.setMessage("");
-			}
-			if (t != null) {
-				edi.setExceptionMessage(t.toString());
-				for (StackTraceElement ste : t.getStackTrace()) {
-					StackTraceElementBeanImpl stebi = new StackTraceElementBeanImpl();
-					stebi.setClassName(ste.getClassName());
-					stebi.setFileName(ste.getFileName());
-					stebi.setLineNumber(ste.getLineNumber());
-					stebi.setMethodName(ste.getMethodName());
-					edi.stackTrace.add(stebi);
-				}
-			} else {
-				edi.setExceptionMessage("");
-			}
-			try {
-				errorDao.store(edi);
-			} catch (Throwable t2) {
-				throw new ErrorDocumentServiceException(t2);
-			}
-			if (depth > 0) {
-				typedId = typedId.getDeeperErrorReference();
-			}
-			depth--;
-		}
-		return docToReturn;
-
-	}
-
-	public ErrorDocument registerError(String message, Set<T2Reference> errors, int depth) 
-			throws ErrorDocumentServiceException {
-		checkDao();
-		checkGenerator();
-
-		T2Reference ref = t2ReferenceGenerator
-		.nextErrorDocumentReference(depth);
-		T2ReferenceImpl typedId = T2ReferenceImpl.getAsImpl(ref);
-
-		ErrorDocument docToReturn = null;
-		while (depth >= 0) {
-			ErrorDocumentImpl edi = new ErrorDocumentImpl();
-			if (docToReturn == null) {
-				docToReturn = edi;
-			}
-			edi.setTypedId(typedId);
-			if (message != null) {
-				edi.setMessage(message);
-			} else {
-				edi.setMessage("");
-			}
-			if (errors != null) {
-				edi.setErrorReferenceSet(errors);
-			}
-			edi.setExceptionMessage("");
-
-			try {
-				errorDao.store(edi);
-			} catch (Throwable t2) {
-				throw new ErrorDocumentServiceException(t2);
-			}
-			if (depth > 0) {
-				typedId = typedId.getDeeperErrorReference();
-			}
-			depth--;
-		}
-		return docToReturn;
-	}
-
-	public T2Reference getChild(T2Reference errorId)
-			throws ErrorDocumentServiceException {
-		T2ReferenceImpl refImpl = T2ReferenceImpl.getAsImpl(errorId);
-		try {
-			return refImpl.getDeeperErrorReference();
-		} catch (Throwable t) {
-			throw new ErrorDocumentServiceException(t);
-		}
-	}
-
-	public boolean delete(T2Reference reference)
-			throws ReferenceServiceException {
-		checkDao();
-		ErrorDocument doc = errorDao.get(reference);
-		if (doc==null) return false;
-		return errorDao.delete(doc);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateErrorDocumentDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateErrorDocumentDao.java
deleted file mode 100644
index 0e593ef..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateErrorDocumentDao.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.annotations.DeleteIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.GetIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.PutIdentifiedOperation;
-
-import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
-
-/**
- * An implementation of ErrorDocumentDao based on Spring's HibernateDaoSupport.
- * To use this in spring inject a property 'sessionFactory' with either a
- * {@link org.springframework.orm.hibernate3.LocalSessionFactoryBean LocalSessionFactoryBean}
- * or the equivalent class from the T2Platform module to add SPI based
- * implementation discovery and mapping. To use outside of Spring ensure you
- * call the setSessionFactory(..) method before using this (but really, use it
- * from Spring, so much easier).
- * 
- * @author Tom Oinn
- * 
- */
-public class HibernateErrorDocumentDao extends HibernateDaoSupport implements
-		ErrorDocumentDao {
-
-	/**
-	 * Fetch an ErrorDocument list by id
-	 * 
-	 * @param ref
-	 *            the T2Reference to fetch
-	 * @return a retrieved identified list of T2 references
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@GetIdentifiedOperation
-	public ErrorDocument get(T2Reference ref) throws DaoException {
-		if (ref == null) {
-			throw new DaoException(
-					"Supplied reference is null, can't retrieve.");
-		} else if (ref.getReferenceType().equals(T2ReferenceType.ErrorDocument) == false) {
-			throw new DaoException(
-					"This dao can only retrieve reference of type T2Reference.ErrorDocument");
-		}
-		if (ref instanceof T2ReferenceImpl) {
-			try {
-				return (ErrorDocumentImpl) getHibernateTemplate().get(
-						ErrorDocumentImpl.class,
-						((T2ReferenceImpl) ref).getCompactForm());
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Reference must be an instance of T2ReferenceImpl");
-		}
-	}
-
-	@PutIdentifiedOperation
-	public void store(ErrorDocument theDocument) throws DaoException {
-		if (theDocument.getId() == null) {
-			throw new DaoException(
-					"Supplied error document set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (theDocument.getId().getReferenceType().equals(
-				T2ReferenceType.ErrorDocument) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.ErrorDocument, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theDocument instanceof ErrorDocumentImpl) {
-			try {
-				getHibernateTemplate().save(theDocument);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied ErrorDocument not an instance of ErrorDocumentImpl");
-		}
-	}
-
-	@DeleteIdentifiedOperation
-	public boolean delete(ErrorDocument theDocument) throws DaoException {
-		if (theDocument.getId() == null) {
-			throw new DaoException(
-					"Supplied error document set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (theDocument.getId().getReferenceType().equals(
-				T2ReferenceType.ErrorDocument) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.ErrorDocument, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theDocument instanceof ErrorDocumentImpl) {
-			try {
-				getHibernateTemplate().delete(theDocument);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied ErrorDocument not an instance of ErrorDocumentImpl");
-		}
-		return true;
-	}
-	
-	
-		
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateListDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateListDao.java
deleted file mode 100644
index ecd3eb2..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateListDao.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.annotations.GetIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.PutIdentifiedOperation;
-
-import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
-
-/**
- * An implementation of ListDao based on Spring's HibernateDaoSupport. To use
- * this in spring inject a property 'sessionFactory' with either a
- * {@link org.springframework.orm.hibernate3.LocalSessionFactoryBean LocalSessionFactoryBean}
- * or the equivalent class from the T2Platform module to add SPI based
- * implementation discovery and mapping. To use outside of Spring ensure you
- * call the setSessionFactory(..) method before using this (but really, use it
- * from Spring, so much easier).
- * 
- * @author Tom Oinn
- * 
- */
-public class HibernateListDao extends HibernateDaoSupport implements ListDao {
-
-	/**
-	 * Fetch a t2reference list by id
-	 * 
-	 * @param ref
-	 *            the T2Reference to fetch
-	 * @return a retrieved identified list of T2 references
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@GetIdentifiedOperation
-	public IdentifiedList<T2Reference> get(T2Reference ref) throws DaoException {
-		if (ref == null) {
-			throw new DaoException(
-					"Supplied reference is null, can't retrieve.");
-		} else if (ref.getReferenceType()
-				.equals(T2ReferenceType.IdentifiedList) == false) {
-			throw new DaoException(
-					"This dao can only retrieve reference of type T2Reference.IdentifiedList");
-		}
-		if (ref instanceof T2ReferenceImpl) {
-			try {
-				return (T2ReferenceListImpl) getHibernateTemplate().get(
-						T2ReferenceListImpl.class,
-						((T2ReferenceImpl) ref).getCompactForm());
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Reference must be an instance of T2ReferenceImpl");
-		}
-	}
-
-	@PutIdentifiedOperation
-	public void store(IdentifiedList<T2Reference> theList) throws DaoException {
-		if (theList.getId() == null) {
-			throw new DaoException("Supplied list set has a null ID, allocate "
-					+ "an ID before calling the store method in the dao.");
-		} else if (theList.getId().getReferenceType().equals(
-				T2ReferenceType.IdentifiedList) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.IdentifiedList, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theList instanceof T2ReferenceListImpl) {
-			try {
-				getHibernateTemplate().save(theList);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied identifier list not an instance of T2ReferenceList");
-		}
-	}
-
-	public boolean delete(
-			IdentifiedList<T2Reference> theList) throws DaoException {
-		if (theList.getId() == null) {
-			throw new DaoException("Supplied list set has a null ID, allocate "
-					+ "an ID before calling the store method in the dao.");
-		} else if (theList.getId().getReferenceType().equals(
-				T2ReferenceType.IdentifiedList) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.IdentifiedList, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theList instanceof T2ReferenceListImpl) {
-			try {
-				getHibernateTemplate().delete(theList);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied identifier list not an instance of T2ReferenceList");
-		}
-		return true;
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateReferenceSetDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateReferenceSetDao.java
deleted file mode 100644
index 73da81c..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/HibernateReferenceSetDao.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.annotations.DeleteIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.GetIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.PutIdentifiedOperation;
-
-import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
-
-/**
- * An implementation of ReferenceSetDao based on Spring's HibernateDaoSupport.
- * To use this in spring inject a property 'sessionFactory' with either a
- * {@link org.springframework.orm.hibernate3.LocalSessionFactoryBean LocalSessionFactoryBean}
- * or the equivalent class from the T2Platform module to add SPI based
- * implementation discovery and mapping. To use outside of Spring ensure you
- * call the setSessionFactory(..) method before using this (but really, use it
- * from Spring, so much easier).
- * 
- * @author Tom Oinn
- * 
- */
-public class HibernateReferenceSetDao extends HibernateDaoSupport implements
-		ReferenceSetDao {
-
-	/**
-	 * Store the specified new reference set
-	 * 
-	 * @param rs
-	 *            a reference set, must not already exist in the database.
-	 * @throws DaoException
-	 *             if the entry already exists in the database, if the supplied
-	 *             reference set isn't an instance of ReferenceSetImpl or if
-	 *             something else goes wrong connecting to the database
-	 */
-	@PutIdentifiedOperation
-	public void store(ReferenceSet rs) throws DaoException {
-		if (rs.getId() == null) {
-			throw new DaoException(
-					"Supplied reference set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (rs.getId().getReferenceType().equals(
-				T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"Strangely the reference set ID doesn't have type "
-							+ "T2ReferenceType.ReferenceSet, something has probably "
-							+ "gone badly wrong somewhere earlier!");
-		}
-		if (rs instanceof ReferenceSetImpl) {
-			try {
-				getHibernateTemplate().save(rs);				
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied reference set not an instance of ReferenceSetImpl");
-		}		
-	}
-
-	/**
-	 * Update a pre-existing entry in the database
-	 * 
-	 * @param rs
-	 *            the reference set to update. This must already exist in the
-	 *            database
-	 * @throws DaoException
-	 */
-	@PutIdentifiedOperation
-	public void update(ReferenceSet rs) throws DaoException {
-		if (rs.getId() == null) {
-			throw new DaoException(
-					"Supplied reference set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (rs.getId().getReferenceType().equals(
-				T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"Strangely the reference set ID doesn't have type "
-							+ "T2ReferenceType.ReferenceSet, something has probably "
-							+ "gone badly wrong somewhere earlier!");
-		}
-		if (rs instanceof ReferenceSetImpl) {
-			try {
-				getHibernateTemplate().update(rs);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied reference set not an instance of ReferenceSetImpl");
-		}
-	}
-
-	/**
-	 * Fetch a reference set by id
-	 * 
-	 * @param ref
-	 *            the ReferenceSetT2ReferenceImpl to fetch
-	 * @return a retrieved ReferenceSetImpl
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@GetIdentifiedOperation
-	public ReferenceSetImpl get(T2Reference ref) throws DaoException {
-		if (ref == null) {
-			throw new DaoException(
-					"Supplied reference is null, can't retrieve.");
-		} else if (ref.getReferenceType().equals(T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"This dao can only retrieve reference of type T2Reference.ReferenceSet");
-		}
-		if (ref instanceof T2ReferenceImpl) {
-			try {
-				return (ReferenceSetImpl) getHibernateTemplate().get(
-						ReferenceSetImpl.class,
-						((T2ReferenceImpl) ref).getCompactForm());
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Reference must be an instance of T2ReferenceImpl");
-		}
-	}
-
-	@DeleteIdentifiedOperation
-	public boolean delete(ReferenceSet rs) throws DaoException {
-		if (rs.getId() == null) {
-			throw new DaoException(
-					"Supplied reference set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (rs.getId().getReferenceType().equals(
-				T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"Strangely the reference set ID doesn't have type "
-							+ "T2ReferenceType.ReferenceSet, something has probably "
-							+ "gone badly wrong somewhere earlier!");
-		}
-		if (rs instanceof ReferenceSetImpl) {
-			try {
-				getHibernateTemplate().delete(rs);				
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied reference set not an instance of ReferenceSetImpl");
-		}
-		return true;
-	}
-	
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/IdentifiedArrayList.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/IdentifiedArrayList.java
deleted file mode 100644
index 94139ef..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/IdentifiedArrayList.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import net.sf.taverna.t2.reference.IdentifiedList;
-
-/**
- * Implementation of IdentifiedList which delegates to an ArrayList for its
- * storage functionality.
- * 
- * @author Tom Oinn
- * 
- * @param <T>
- */
-public class IdentifiedArrayList<T> extends AbstractEntityImpl implements
-		IdentifiedList<T> {
-
-	protected List<T> listDelegate = null;
-
-	// Constructors copied from ArrayList for convenience
-	public IdentifiedArrayList() {
-		super();
-		this.listDelegate = new ArrayList<T>();
-	}
-
-	public IdentifiedArrayList(Collection<T> c) {
-		super();
-		this.listDelegate = new ArrayList<T>(c);
-	}
-
-	public IdentifiedArrayList(int initialCapacity) {
-		super();
-		this.listDelegate = new ArrayList<T>(initialCapacity);
-	}
-
-	private void checkUndefinedId() {
-		if (this.getId() != null) {
-			throw new IllegalStateException(
-					"Attempt made to modify a list which has already been named");
-		}
-	}
-
-	public boolean add(T e) {
-		checkUndefinedId();
-		return listDelegate.add(e);
-	}
-
-	public void add(int index, T element) {
-		checkUndefinedId();
-		listDelegate.add(index, element);
-	}
-
-	public boolean addAll(Collection<? extends T> c) {
-		checkUndefinedId();
-		return listDelegate.addAll(c);
-	}
-
-	public boolean addAll(int index, Collection<? extends T> c) {
-		checkUndefinedId();
-		return listDelegate.addAll(index, c);
-	}
-
-	public void clear() {
-		checkUndefinedId();
-		listDelegate.clear();
-	}
-
-	public boolean contains(Object o) {
-		return listDelegate.contains(o);
-	}
-
-	public boolean containsAll(Collection<?> c) {
-		return listDelegate.containsAll(c);
-	}
-
-	public T get(int index) {
-		return listDelegate.get(index);
-	}
-
-	public int indexOf(Object o) {
-		return listDelegate.indexOf(o);
-	}
-
-	public boolean isEmpty() {
-		return listDelegate.isEmpty();
-	}
-
-	public Iterator<T> iterator() {
-		return listDelegate.iterator();
-	}
-
-	public int lastIndexOf(Object o) {
-		return listDelegate.lastIndexOf(o);
-	}
-
-	/**
-	 * The ListIterator can modify the list contents, so wrap the delegate's
-	 * list iterator and use as a delegate itself, checking for null ID on
-	 * operations which set list properties.
-	 * 
-	 * @param iteratorDelegate
-	 *            ListIterator to wrap.
-	 * @return wrapped ListIterator which throws IllegalStateException on calls
-	 *         which modify the list if the ID has been set to a non-null value
-	 */
-	private ListIterator<T> getCheckedListIterator(
-			final ListIterator<T> iteratorDelegate) {
-		return new ListIterator<T>() {
-			public void add(T e) {
-				checkUndefinedId();
-				iteratorDelegate.add(e);
-			}
-
-			public boolean hasNext() {
-				return iteratorDelegate.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				return iteratorDelegate.hasPrevious();
-			}
-
-			public T next() {
-				return iteratorDelegate.next();
-			}
-
-			public int nextIndex() {
-				return iteratorDelegate.nextIndex();
-			}
-
-			public T previous() {
-				return iteratorDelegate.previous();
-			}
-
-			public int previousIndex() {
-				return iteratorDelegate.previousIndex();
-			}
-
-			public void remove() {
-				checkUndefinedId();
-				iteratorDelegate.remove();
-			}
-
-			public void set(T e) {
-				checkUndefinedId();
-				iteratorDelegate.set(e);
-			}
-		};
-	}
-
-	public ListIterator<T> listIterator() {
-		return getCheckedListIterator(listDelegate.listIterator());
-	}
-
-	public ListIterator<T> listIterator(int index) {
-		return getCheckedListIterator(listDelegate.listIterator(index));
-	}
-
-	public boolean remove(Object o) {
-		checkUndefinedId();
-		return listDelegate.remove(o);
-	}
-
-	public T remove(int index) {
-		checkUndefinedId();
-		return listDelegate.remove(index);
-	}
-
-	public boolean removeAll(Collection<?> c) {
-		checkUndefinedId();
-		return listDelegate.removeAll(c);
-	}
-
-	public boolean retainAll(Collection<?> c) {
-		checkUndefinedId();
-		return listDelegate.retainAll(c);
-	}
-
-	public T set(int index, T element) {
-		checkUndefinedId();
-		return listDelegate.set(index, element);
-	}
-
-	public int size() {
-		return listDelegate.size();
-	}
-
-	public List<T> subList(int fromIndex, int toIndex) {
-		return listDelegate.subList(fromIndex, toIndex);
-	}
-
-	public Object[] toArray() {
-		return listDelegate.toArray();
-	}
-
-	public <U> U[] toArray(U[] a) {
-		return listDelegate.toArray(a);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryErrorDocumentDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryErrorDocumentDao.java
deleted file mode 100644
index 58d7154..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryErrorDocumentDao.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentDao;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * A trivial in-memory implementation of ErrorDocumentDao for either testing or
- * very lightweight embedded systems. Uses a java Map as the backing store.
- * 
- * @author Tom Oinn
- * 
- */
-public class InMemoryErrorDocumentDao implements ErrorDocumentDao {
-
-	private Map<T2Reference, ErrorDocument> store;
-
-	public InMemoryErrorDocumentDao() {
-		this.store = new ConcurrentHashMap<T2Reference, ErrorDocument>();
-	}
-
-	public synchronized ErrorDocument get(T2Reference reference)
-			throws DaoException {
-		if (store.containsKey(reference)) {
-			return store.get(reference);
-		} else {
-			throw new DaoException("Key " + reference + " not found in store");
-		}
-	}
-
-	public synchronized void store(ErrorDocument theDoc) throws DaoException {
-		store.put(theDoc.getId(), theDoc);
-	}
-	
-	public synchronized boolean delete(ErrorDocument theDoc) throws DaoException {
-		return store.remove(theDoc.getId())!=null;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryListDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryListDao.java
deleted file mode 100644
index 37dfe38..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryListDao.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * A trivial in-memory implementation of ListDao for either testing or very
- * lightweight embedded systems. Uses a java Map as the backing store.
- * 
- * @author Tom Oinn
- * 
- */
-public class InMemoryListDao implements ListDao {
-
-	private Map<T2Reference, IdentifiedList<T2Reference>> store;
-
-	public InMemoryListDao() {
-		this.store = new ConcurrentHashMap<T2Reference, IdentifiedList<T2Reference>>();
-	}
-
-	public synchronized IdentifiedList<T2Reference> get(T2Reference reference)
-			throws DaoException {
-		if (store.containsKey(reference)) {
-			return store.get(reference);
-		} else {
-			throw new DaoException("Key " + reference + " not found in store");
-		}
-	}
-
-	public synchronized void store(IdentifiedList<T2Reference> theList) throws DaoException {
-		store.put(theList.getId(), theList);
-	}
-
-	public boolean delete(
-			IdentifiedList<T2Reference> theList) throws DaoException {
-		return (store.remove(theList.getId())!=null);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryReferenceSetDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryReferenceSetDao.java
deleted file mode 100644
index c4713c3..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/InMemoryReferenceSetDao.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * A trivial in-memory implementation of ReferenceSetDao for either testing or
- * very lightweight embedded systems. Uses a java Map as the backing store.
- * 
- * @author Tom Oinn
- * 
- */
-public class InMemoryReferenceSetDao implements ReferenceSetDao {
-
-	private Map<T2Reference, ReferenceSet> store;
-
-	public InMemoryReferenceSetDao() {
-		this.store = new ConcurrentHashMap<T2Reference, ReferenceSet>();
-	}
-
-	public synchronized ReferenceSet get(T2Reference reference)
-			throws DaoException {
-		if (store.containsKey(reference)) {
-			return store.get(reference);
-		} else {
-			throw new DaoException("Key " + reference + " not found in store");
-		}
-	}
-
-	public synchronized void store(ReferenceSet refSet) throws DaoException {
-		store.put(refSet.getId(), refSet);
-	}
-
-	public synchronized void update(ReferenceSet refSet) throws DaoException {
-		store.put(refSet.getId(), refSet);		
-	}
-	
-	public synchronized boolean delete(ReferenceSet refSet) throws DaoException {
-		return store.remove(refSet.getId())!=null;
-	}
-
-	
-	
-	
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ListServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ListServiceImpl.java
deleted file mode 100644
index 346c378..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ListServiceImpl.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.List;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListService;
-import net.sf.taverna.t2.reference.ListServiceException;
-import net.sf.taverna.t2.reference.ReferenceServiceException;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Implementation of ListService, inject with an appropriate ListDao and
- * T2ReferenceGenerator to enable.
- * 
- * @author Tom Oinn
- * 
- */
-public class ListServiceImpl extends AbstractListServiceImpl implements
-		ListService {
-
-	public IdentifiedList<T2Reference> getList(T2Reference id)
-			throws ListServiceException {
-		checkDao();
-		try {
-			return listDao.get(id);
-		} catch (DaoException de) {
-			throw new ListServiceException(de);
-		}
-	}
-
-	public IdentifiedList<T2Reference> registerEmptyList(int depth)
-			throws ListServiceException {
-		if (depth < 1) {
-			throw new ListServiceException("Can't register empty lists of depth " + depth);
-		}
-		checkDao();
-		checkGenerator();
-		T2ReferenceImpl newReference = T2ReferenceImpl
-				.getAsImpl(t2ReferenceGenerator.nextListReference(false, depth));
-		T2ReferenceListImpl newList = new T2ReferenceListImpl();
-		newList.setTypedId(newReference);
-		try {
-			listDao.store(newList);
-			return newList;
-		} catch (DaoException de) {
-			throw new ListServiceException(de);
-		}
-	}
-
-	public IdentifiedList<T2Reference> registerList(List<T2Reference> items)
-			throws ListServiceException {
-		checkDao();
-		checkGenerator();
-		if (items.isEmpty()) {
-			throw new ListServiceException(
-					"Can't register an empty list with this method,"
-							+ " use the registerEmptyList instead");
-		}
-		// Track whether there are any items in the collection which are or
-		// contain error documents.
-		boolean containsErrors = false;
-		// Track depth, ensure that all items have the same depth, fail if not.
-		int depth = items.get(0).getDepth();
-		if (depth < 0) {
-			throw new ListServiceException("Can't register list of depth less than 1, but first item " + items.get(0) + " has depth " + depth);
-		}
-		T2ReferenceListImpl newList = new T2ReferenceListImpl();
-		int counter = 0;
-		for (T2Reference ref : items) {
-			if (ref.getDepth() != depth) {
-				throw new ListServiceException(
-						"Mismatched depths in list registration; reference at index '"
-								+ counter + "' has depth " + ref.getDepth()
-								+ " but all preceeding items have depth "
-								+ depth);
-			}
-			if (ref.containsErrors()) {
-				// The collection's reference contains errors if any child does
-				containsErrors = true;
-			}
-			newList.add(ref);
-			counter++;
-		}
-		try {
-			T2ReferenceImpl newReference = T2ReferenceImpl
-					.getAsImpl(t2ReferenceGenerator.nextListReference(
-							containsErrors, depth + 1));
-			newList.setTypedId(newReference);
-			listDao.store(newList);
-			return newList;
-		} catch (Throwable t) {
-			throw new ListServiceException(t);
-		}
-	}
-
-	public boolean delete(T2Reference reference)
-			throws ReferenceServiceException {
-		checkDao();
-		IdentifiedList<T2Reference> list=listDao.get(reference);
-		if (list==null) return false;
-		return listDao.delete(list);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceServiceImpl.java
deleted file mode 100644
index 4f73e25..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceServiceImpl.java
+++ /dev/null
@@ -1,696 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.reference.ContextualizedT2Reference;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentServiceException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.Identified;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListServiceException;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.ReferenceServiceException;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetServiceException;
-import net.sf.taverna.t2.reference.StreamToValueConverterSPI;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.ValueCarryingExternalReference;
-import net.sf.taverna.t2.reference.ValueToReferenceConversionException;
-import net.sf.taverna.t2.reference.ValueToReferenceConverterSPI;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Implementation of ReferenceService, inject with ReferenceSetService,
- * ErrorDocumentService and ListService to enable.
- * 
- * @author Tom Oinn
- * @author Alan R Williams
- * @author Stuart Owen
- * @author Stian Soiland-Reyes
- */
-public class ReferenceServiceImpl extends AbstractReferenceServiceImpl
-		implements ReferenceService {
-
-	private final Log log = LogFactory.getLog(ReferenceServiceImpl.class);
-
-	/**
-	 * The top level registration method is used to register either as yet
-	 * unregistered ErrorDocuments and ReferenceSets (if these are passed in and
-	 * already have an identifier this call does nothing) and arbitrarily nested
-	 * Lists of the same. In addition any ExternalReferenceSPI instances found
-	 * will be wrapped in a single item ReferenceSet and registered, and any
-	 * Throwables will be wrapped in an ErrorDocument and registered. Lists will
-	 * be converted to IdentifiedList&lt;T2Reference&gt; and registered if all
-	 * children can be (or were already) appropriately named.
-	 * <p>
-	 * This method is only valid on parameters of the following type :
-	 * <ol>
-	 * <li>{@link ReferenceSet} - registered if not already registered,
-	 * otherwise returns existing T2Reference</li>
-	 * <li>{@link ErrorDocument} - same behaviour as ReferenceSet</li>
-	 * <li>{@link ExternalReferenceSPI} - wrapped in ReferenceSet, registered
-	 * and ID returned</li>
-	 * <li>Throwable - wrapped in ErrorDocument with no message, registered and
-	 * ID returned</li>
-	 * <li>List - all children are first registered, if this succeeds the list
-	 * is itself registered as an IdentifiedList of T2Reference and its
-	 * reference returned.</li>
-	 * </ol>
-	 * The exception to this is if the useConvertorSPI parameter is set to true
-	 * - in this case any objects which do not match the above allowed list will
-	 * be run through any available ValueToReferenceConvertorSPI instances in
-	 * turn until one succeeds or all fail, which may result in the creation of
-	 * ExternalReferenceSPI instances. As these can be registered such objects
-	 * will not cause an exception to be thrown.
-	 * 
-	 * @param o
-	 *            the object to register with the reference system, must comply
-	 *            with and will be interpreted as shown in the type list above.
-	 * @param targetDepth
-	 *            the depth of the top level object supplied. This is needed
-	 *            when registering empty collections and error documents,
-	 *            whether as top level types or as members of a collection
-	 *            within the top level type. If registering a collection this is
-	 *            the collection depth, so a List of ReferenceSchemeSPI would be
-	 *            depth 1. Failing to specify this correctly will result in
-	 *            serious problems downstream so be careful! We can't catch all
-	 *            potential problems in this method (although some errors will
-	 *            be trapped).
-	 * @param useConverterSPI
-	 *            whether to attempt to use the ValueToReferenceConvertorSPI
-	 *            registry (if defined and available) to map arbitrary objects
-	 *            to ExternalReferenceSPI instances on the fly. The registry of
-	 *            converters is generally injected into the implementation of
-	 *            this service.
-	 * @param context
-	 *            ReferenceContext to use if required by component services,
-	 *            this is most likely to be used by the object to reference
-	 *            converters if engaged.
-	 *            <p>
-	 *            If the context is null a new empty reference context is
-	 *            inserted.
-	 * @return a T2Reference to the registered object
-	 * @throws ReferenceServiceException
-	 *             if the object type (or, for collections, the recursive type
-	 *             of its contents) is not in the allowed list or if a problem
-	 *             occurs during registration. Also thrown if attempting to use
-	 *             the converter SPI without an attached registry.
-	 */
-	public T2Reference register(Object o, int targetDepth,
-			boolean useConverterSPI, ReferenceContext context)
-			throws ReferenceServiceException {
-		checkServices();
-		if (context == null) {
-			context = new EmptyReferenceContext();
-		}
-		if (useConverterSPI) {
-			checkConverterRegistry();
-		}
-		return getNameForObject(o, targetDepth, useConverterSPI, context);
-	}
-
-	private T2Reference getNameForObject(Object o, int currentDepth,
-			boolean useConverterSPI, ReferenceContext context)
-			throws ReferenceServiceException {
-		if (currentDepth < 0) {
-			throw new ReferenceServiceException("Cannot register at depth " + currentDepth + ": " + o);
-		}
-		// First check whether this is an Identified, and if so whether it
-		// already has an ID. If this is the case then return it, we assume that
-		// anything which has an identifier already allocated must have been
-		// registered (this is implicit in the contract for the various
-		// sub-services
-		if (o instanceof Identified) {
-			Identified i = (Identified) o;
-			if (i.getId() != null) {
-				return i.getId();
-			}
-		}
-		// Then check whether the item *is* a T2Reference, in which case we can
-		// just return it (useful for when registering lists of existing
-		// references)
-		if (o instanceof T2Reference) {
-			return (T2Reference) o;
-		}
-		
-		if (o.getClass().isArray()) {
-			Class<?> elementType = o.getClass().getComponentType();
-			if (elementType.getCanonicalName().equals("char")) {
-				char[] cArray = (char[]) o;
-				List<Character> cList = new ArrayList<Character>();
-				for (char c : cArray) {
-					cList.add(new Character(c));
-				}
-				o = cList;
-			} else if (elementType.getCanonicalName().equals("short")) {
-				short[] cArray = (short[]) o;
-				List<Short> cList = new ArrayList<Short>();
-				for (short c : cArray) {
-					cList.add(new Short(c));
-				}			
-				o = cList;
-			} else if (elementType.getCanonicalName().equals("int")) {
-				int[] cArray = (int[]) o;
-				List<Integer> cList = new ArrayList<Integer>();
-				for (int c : cArray) {
-					cList.add(new Integer(c));
-				}			
-				o = cList;
-			}  else if (elementType.getCanonicalName().equals("long")) {
-				long[] cArray = (long[]) o;
-				List<Long> cList = new ArrayList<Long>();
-				for (long c : cArray) {
-					cList.add(new Long(c));
-				}			
-				o = cList;
-			} else if (elementType.getCanonicalName().equals("float")) {
-				float[] cArray = (float[]) o;
-				List<Float> cList = new ArrayList<Float>();
-				for (float c : cArray) {
-					cList.add(new Float(c));
-				}			
-				o = cList;
-			} else if (elementType.getCanonicalName().equals("double")) {
-				double[] cArray = (double[]) o;
-				List<Double> cList = new ArrayList<Double>();
-				for (double c : cArray) {
-					cList.add(new Double(c));
-				}			
-				o = cList;
-			}  else if (elementType.getCanonicalName().equals("boolean")) {
-				boolean[] cArray = (boolean[]) o;
-				List<Boolean> cList = new ArrayList<Boolean>();
-				for (boolean c : cArray) {
-					cList.add(new Boolean(c));
-				}			
-				o = cList;
-			} else if (!elementType.getCanonicalName().equals("byte")){
-				// Covert arrays of objects
-				Object[] cArray = (Object[]) o;
-				List<Object> cList = new ArrayList<Object>();
-				for (Object c : cArray) {
-					cList.add(c);
-				}			
-				o = cList;
-			}
-		}
-		
-		// If a Collection but not a List
-		if ((o instanceof Collection) && !(o instanceof List)) {
-			List<Object> cList = new ArrayList<Object>();
-			cList.addAll((Collection)o);
-			o = cList;
-		}
-		// Next check lists.
-		if (o instanceof List) {
-			if (currentDepth < 1) {
-				throw new ReferenceServiceException("Cannot register list at depth " + currentDepth);
-			}
-			List<?> l = (List<?>) o;
-			// If the list is empty then register a new empty list of the
-			// appropriate depth and return it
-			if (l.isEmpty()) {
-				try {
-					IdentifiedList<T2Reference> newList = listService
-							.registerEmptyList(currentDepth);
-					return newList.getId();
-				} catch (ListServiceException lse) {
-					throw new ReferenceServiceException(lse);
-				}
-			}
-			// Otherwise construct a new list of T2Reference and register it,
-			// calling the getNameForObject method on all children of the list
-			// to construct the list of references
-			else {
-				List<T2Reference> references = new ArrayList<T2Reference>();
-				for (Object item : l) {
-					// Recursively call this method with a depth one lower than
-					// the current depth
-					references.add(getNameForObject(item, currentDepth - 1,
-							useConverterSPI, context));
-				}
-				try {
-					IdentifiedList<T2Reference> newList = listService
-							.registerList(references);
-					return newList.getId();
-				} catch (ListServiceException lse) {
-					throw new ReferenceServiceException(lse);
-				}
-			}
-		} else {
-			// Neither a list nor an already identified object, first thing is
-			// to engage the converters if enabled. Only engage if we don't
-			// already have a Throwable or an ExternalReferenceSPI instance
-			if (useConverterSPI && (o instanceof Throwable == false)
-					&& (o instanceof ExternalReferenceSPI == false)) {
-				if (currentDepth != 0) {
-					throw new ReferenceServiceException(
-							"Cannot register object " + o + " at depth "
-									+ currentDepth);
-				}
-				
-				for (ValueToReferenceConverterSPI converter : converterRegistry) {
-					if (converter.canConvert(o, context)) {
-						try {
-							ExternalReferenceSPI ers = converter.convert(o,
-									context);
-							o = ers;
-							break;
-						} catch (ValueToReferenceConversionException vtrce) {
-							// Fail, but that doesn't matter at the moment as
-							// there may be more converters to try. TODO - log
-							// this!
-						}
-					}
-				}
-			}
-			// If the object is neither a Throwable nor an ExternalReferenceSPI
-			// instance at this point we should fail the registration process,
-			// this means either that the conversion process wasn't enabled or
-			// that it failed to map the object type correctly.
-			if ((o instanceof Throwable == false)
-					&& (o instanceof ExternalReferenceSPI == false)) {
-				throw new ReferenceServiceException(
-						"Failed to register object " + o + ", found a type '"
-								+ o.getClass().getCanonicalName()
-								+ "' which cannot currently be registered with the reference manager");
-			}
-			// Have either a Throwable or an ExternalReferenceSPI
-			else {
-				if (o instanceof Throwable) {
-					// Wrap in an ErrorDocument and return the ID
-					try {
-						ErrorDocument doc = errorDocumentService.registerError(
-								(Throwable) o, currentDepth);
-						return doc.getId();
-					} catch (ErrorDocumentServiceException edse) {
-						throw new ReferenceServiceException(edse);
-					}
-				} else if (o instanceof ExternalReferenceSPI) {
-					if (currentDepth != 0) {
-						throw new ReferenceServiceException("Cannot register external references at depth " + currentDepth);
-					}
-					try {
-						Set<ExternalReferenceSPI> references = new HashSet<ExternalReferenceSPI>();
-						references.add((ExternalReferenceSPI) o);
-						ReferenceSet rs = referenceSetService
-								.registerReferenceSet(references);
-						return rs.getId();
-					} catch (ReferenceSetServiceException rsse) {
-						throw new ReferenceServiceException(rsse);
-					}
-				}
-			}
-		}
-		throw new ReferenceServiceException(
-				"Should never see this, reference registration"
-						+ " logic has fallen off the end of the"
-						+ " world, check the code!");
-	}
-
-	/**
-	 * Perform recursive identifier resolution, building a collection structure
-	 * of Identified objects, any collection elements being IdentifiedLists of
-	 * Identified subclasses. If the id has depth 0 this will just return the
-	 * Identified to which that id refers.
-	 * 
-	 * @param id
-	 *            the T2Reference to resolve
-	 * @param ensureTypes
-	 *            a set of ExternalReferenceSPI classes, this is used to augment
-	 *            any resolved ReferenceSet instances to ensure that each one
-	 *            has at least one of the specified types. If augmentation is
-	 *            not required this can be set to null.
-	 * @param context
-	 *            the ReferenceContext to use to resolve this and any
-	 *            recursively resolved identifiers
-	 *            <p>
-	 *            If the context is null a new EmptyReferenceContext is inserted
-	 *            in its place.
-	 * @return fully resolved Identified subclass - this is either a (recursive)
-	 *         IdentifiedList of Identified, a ReferenceSet or an ErrorDocument
-	 * @throws ReferenceServiceException
-	 *             if any problems occur during resolution
-	 */
-	public Identified resolveIdentifier(T2Reference id,
-			Set<Class<ExternalReferenceSPI>> ensureTypes,
-			ReferenceContext context) throws ReferenceServiceException {
-		checkServices();
-		if (context == null) {
-			context = new EmptyReferenceContext();
-		}
-		switch (id.getReferenceType()) {
-
-		case ReferenceSet:
-			try {
-				ReferenceSet rs;
-				if (ensureTypes == null) {
-					rs = referenceSetService.getReferenceSet(id);
-				} else {
-					rs = referenceSetService.getReferenceSetWithAugmentation(
-							id, ensureTypes, context);
-				}
-				return rs;
-			} catch (ReferenceSetServiceException rsse) {
-				throw new ReferenceServiceException(rsse);
-			}
-
-		case ErrorDocument:
-			try {
-				ErrorDocument ed = errorDocumentService.getError(id);
-				return ed;
-			} catch (ErrorDocumentServiceException edse) {
-				throw new ReferenceServiceException(edse);
-			}
-
-		case IdentifiedList:
-			try {
-				IdentifiedList<T2Reference> idList = listService.getList(id);
-				// Construct a new list, and populate with the result of
-				// resolving each ID in turn
-				IdentifiedArrayList<Identified> newList = new IdentifiedArrayList<Identified>();
-				for (T2Reference item : idList) {
-					newList.add(resolveIdentifier(item, ensureTypes, context));
-				}
-				newList.setTypedId(T2ReferenceImpl.getAsImpl(id));
-				return newList;
-			} catch (ListServiceException lse) {
-				throw new ReferenceServiceException(lse);
-			}
-
-		default:
-			throw new ReferenceServiceException("Unsupported ID type : "
-					+ id.getReferenceType());
-		}
-	}
-
-	public Object renderIdentifier(T2Reference id, Class<?> leafClass,
-			ReferenceContext context) throws ReferenceServiceException {
-		// Check we have the services installed
-		checkServices();
-
-		// Insert an empty context if context was null
-		if (context == null) {
-			context = new EmptyReferenceContext();
-		}
-
-		// Reject if the source reference contains errors
-		if (id.containsErrors()) {
-			throw new ReferenceServiceException(
-					"Can't render an identifier which contains errors to a POJO");
-		}
-
-		// Attempt to find an appropriate StreamToValueConverterSPI instance to
-		// build the specified class
-		StreamToValueConverterSPI<?> converter = null;
-		if (valueBuilderRegistry != null) {
-			for (StreamToValueConverterSPI<?> stvc : valueBuilderRegistry) {
-				Class<?> builtClass = stvc.getPojoClass();
-				if (leafClass.isAssignableFrom(builtClass)) {
-					converter = stvc;
-					break;
-				}
-			}
-		}
-		if (converter == null) {
-			log.warn("No stream->value converters found for type '"
-					+ leafClass.getCanonicalName() + "'");
-		}
-
-		// Render the identifier
-		return renderIdentifierInner(id, leafClass, context, converter);
-	}
-
-	private Object renderIdentifierInner(T2Reference id, Class<?> leafClass,
-			ReferenceContext context, StreamToValueConverterSPI<?> converter)
-			throws ReferenceServiceException {
-		checkServices();
-
-		switch (id.getReferenceType()) {
-
-		case IdentifiedList:
-			try {
-				IdentifiedList<T2Reference> idList = listService.getList(id);
-				List<Object> result = new ArrayList<Object>();
-				for (T2Reference child : idList) {
-					result.add(renderIdentifierInner(child, leafClass, context,
-							converter));
-				}
-				return result;
-			} catch (ListServiceException lse) {
-				throw new ReferenceServiceException(lse);
-			}
-
-		case ReferenceSet:
-			try {
-				ReferenceSet rs = referenceSetService.getReferenceSet(id);
-				// Check that there are references in the set
-				if (rs.getExternalReferences().isEmpty()) {
-					throw new ReferenceServiceException(
-							"Can't render an empty reference set to a POJO");
-				}
-				// If we can't directly map to an appropriate value keep track
-				// of the cheapest reference from which to try to build the pojo
-				// from a stream
-				ExternalReferenceSPI cheapestReference = null;
-				float cheapestReferenceCost = 10.0f;
-				for (ExternalReferenceSPI ers : rs.getExternalReferences()) {
-					if (ers instanceof ValueCarryingExternalReference<?>) {
-						ValueCarryingExternalReference<?> vcer = (ValueCarryingExternalReference<?>) ers;
-						if (leafClass.isAssignableFrom(vcer.getValueType())) {
-							return vcer.getValue();
-						}
-					}
-					// Got here so this wasn't an appropriate value type
-					if (cheapestReference == null
-							|| ers.getResolutionCost() < cheapestReferenceCost) {
-						cheapestReference = ers;
-						cheapestReferenceCost = ers.getResolutionCost();
-					}
-				}
-				if (converter != null) {
-					return converter.renderFrom(cheapestReference
-							.openStream(context));
-				}
-			} catch (Exception e) {
-				throw new ReferenceServiceException(e);
-			}
-			throw new ReferenceServiceException(
-					"No converter found, and reference set didn't contain"
-							+ " an appropriate value carrying reference, cannot render to POJO");
-
-		default:
-			throw new ReferenceServiceException("Unsupported ID type : "
-					+ id.getReferenceType());
-		}
-	}
-
-	/**
-	 * Initiates a traversal of the specified t2reference, traversing to
-	 * whatever level of depth is required such that all identifiers returned
-	 * within the iterator have the specified depth. The context (i.e. the index
-	 * path from the originally specified reference to each reference within the
-	 * iteration) is included through use of the ContextualizedT2Reference
-	 * wrapper class
-	 * 
-	 * @param source
-	 *            the T2Reference from which to traverse. In general this is the
-	 *            root of a collection structure.
-	 * @param desiredDepth
-	 *            the desired depth of all returned T2References, must be less
-	 *            than or equal to that of the source reference.
-	 * @throws ReferenceServiceException
-	 *             if unable to create the iterator for some reason. Note that
-	 *             implementations are free to lazily perform the iteration so
-	 *             this method may succeed but the iterator produced can fail
-	 *             when used. If the iterator fails it will do so by throwing
-	 *             one of the underlying sub-service exceptions.
-	 */
-	public Iterator<ContextualizedT2Reference> traverseFrom(T2Reference source,
-			int desiredDepth) throws ReferenceServiceException {
-		checkServices();
-		if (desiredDepth < 0) {
-			throw new ReferenceServiceException(
-					"Cannot traverse to a negative depth");
-		}
-		List<ContextualizedT2Reference> workingSet = new ArrayList<ContextualizedT2Reference>();
-		workingSet.add(new ContextualizedT2ReferenceImpl(source, new int[0]));
-		int currentDepth = source.getDepth();
-		while (currentDepth > desiredDepth) {
-			List<ContextualizedT2Reference> newSet = new ArrayList<ContextualizedT2Reference>();
-			for (ContextualizedT2Reference ci : workingSet) {
-				T2ReferenceImpl ref = (T2ReferenceImpl) ci.getReference();
-				switch (ref.getReferenceType()) {
-				case IdentifiedList:
-					try {
-						List<T2Reference> children = getListService().getList(
-								ref);
-						int position = 0;
-						for (T2Reference child : children) {
-							newSet.add(new ContextualizedT2ReferenceImpl(child,
-									addIndex(ci.getIndex(), position++)));
-						}
-					} catch (ListServiceException lse) {
-						throw new ReferenceServiceException(lse);
-					}
-					break;
-				case ReferenceSet:
-					throw new ReferenceServiceException(
-							"Should never be trying to drill inside a data document identifier");
-				case ErrorDocument:
-					newSet.add(new ContextualizedT2ReferenceImpl(ref
-							.getDeeperErrorReference(), addIndex(ci.getIndex(),
-							0)));
-					break;
-				default:
-					throw new ReferenceServiceException(
-							"Fallen off end of case statement, unknown reference type!");
-				}
-			}
-			currentDepth--;
-			workingSet = newSet;
-		}
-		return workingSet.iterator();
-	}
-
-	/**
-	 * Append to an int[]
-	 * 
-	 * @param current
-	 *            current int[]
-	 * @param head
-	 *            new int item to append to the current array
-	 * @return new array of int with the head added
-	 */
-	private static int[] addIndex(int[] current, int head) {
-		int[] result = new int[current.length + 1];
-		System.arraycopy(current, 0, result, 0, current.length);
-		result[current.length] = head;
-		return result;
-	}
-
-	/**
-	 * Parse the reference contained in the string and return a
-	 * {@link T2Reference} with the correct properties
-	 */
-	public T2Reference referenceFromString(String reference) {
-		T2ReferenceImpl newRef = new T2ReferenceImpl();
-		Map<String, String> parseRef = parseRef(reference);
-		newRef.setNamespacePart(parseRef.get("namespace"));
-		newRef.setLocalPart(parseRef.get("localPart"));
-		String type = parseRef.get("type");
-		if (type.equals("ref")) {
-			newRef.setReferenceType(T2ReferenceType.ReferenceSet);
-		} else if (type.equals("list")) {
-			newRef.setReferenceType(T2ReferenceType.IdentifiedList);
-			newRef.setContainsErrors(Boolean
-					.parseBoolean(parseRef.get("error")));
-			newRef.setDepth(Integer.parseInt(parseRef.get("depth")));
-		} else if (type.equals("error")) {
-			newRef.setReferenceType(T2ReferenceType.ErrorDocument);
-			newRef.setDepth(Integer.parseInt(parseRef.get("depth")));
-		} else {
-			return null;
-			// should throw an error
-		}
-
-		return newRef;
-	}
-
-	/**
-	 * Parse the reference and return a map with localPart, namespace, depth,
-	 * contains errors and the type
-	 * 
-	 * @param ref
-	 * @return
-	 */
-	private Map<String, String> parseRef(String ref) {
-		String[] split = ref.split("\\?");
-		// get the bit before and after the final '/' ie. the local part and the
-		// depth, there might not be a split1[1] since it might not be a list
-		String[] split2 = split[1].split("/");
-		// get the t2:abc:// and the namespace
-		String[] split3 = split[0].split("//");
-		// get the t2 bit and the reference type bit
-		String[] split4 = split3[0].split(":");
-
-		Map<String, String> refPartsMap = new HashMap<String, String>();
-		refPartsMap.put("type", split4[1]);
-		refPartsMap.put("namespace", split3[1]);
-		refPartsMap.put("localPart", split2[0]);
-
-		if (refPartsMap.get("type").equals("list")) {
-			refPartsMap.put("error", split2[1]);
-			refPartsMap.put("depth", split2[2]);
-		}
-		if (refPartsMap.get("type").equals("error")) {
-			refPartsMap.put("depth", split2[1]);
-		}
-
-		return refPartsMap;
-
-	}	
-	
-
-	public boolean delete(List<T2Reference> references)
-			throws ReferenceServiceException {
-		boolean result=true;
-		for (T2Reference reference : references) {
-			delete(reference);
-		}
-		return result;
-	}
-
-	public boolean delete(T2Reference reference)
-			throws ReferenceServiceException {
-		boolean result=false;
-		switch (reference.getReferenceType()) {
-		case IdentifiedList:
-			result=listService.delete(reference);
-			break;
-		case ReferenceSet:
-			result=referenceSetService.delete(reference);
-			break;
-		case ErrorDocument:
-			result=referenceSetService.delete(reference);
-			break;
-		default:
-			throw new ReferenceServiceException(
-					"Unknown reference type!");
-		}
-		return result;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetAugmentorImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetAugmentorImpl.java
deleted file mode 100644
index cbc2685..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetAugmentorImpl.java
+++ /dev/null
@@ -1,700 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.PriorityQueue;
-import java.util.Set;
-
-import net.sf.taverna.raven.spi.InstanceRegistry;
-import net.sf.taverna.raven.spi.InstanceRegistryListener;
-import net.sf.taverna.t2.reference.ExternalReferenceBuilderSPI;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ExternalReferenceTranslatorSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetAugmentationException;
-import net.sf.taverna.t2.reference.ReferenceSetAugmentor;
-import net.sf.taverna.t2.reference.ReferenceSetAugmentorCallback;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Implementation of ReferenceSetAugmentor using Dijkstra's shortest path
- * algorithm over a type graph built from SPI instance registries of reference
- * builders and reference translators.
- * 
- * @author Tom Oinn
- * 
- */
-public class ReferenceSetAugmentorImpl implements ReferenceSetAugmentor {
-
-	private final Log log = LogFactory.getLog(ReferenceSetAugmentorImpl.class);
-
-	// An instance registry of ExternalReferenceBuilderSPI instances used to
-	// construct ExternalReferenceSPI instances from byte streams
-	private InstanceRegistry<ExternalReferenceBuilderSPI<?>> builders;
-
-	// An instance registry of ExternalReferenceTranslatorSPI instances used to
-	// construct ExternalReferenceSPI instances from existing
-	// ExternalReferenceSPI instances.
-	private InstanceRegistry<ExternalReferenceTranslatorSPI<?, ?>> translators;
-
-	private boolean cacheValid = false;
-
-	// A private listener used to trigger re-compilation of the shortest paths
-	// from each node to each other node in the known types set
-	private InstanceRegistryListener registryListener = new InstanceRegistryListener() {
-		/**
-		 * Call the updateAdjacencyList on the enclosing type when any change
-		 * occurs in the SPIs
-		 */
-		@SuppressWarnings("unchecked")
-		public void instanceRegistryUpdated(InstanceRegistry theRegistry) {
-			cacheValid = false;
-		}
-	};
-
-	private final Set<Class<ExternalReferenceSPI>> knownReferenceTypes = new HashSet<Class<ExternalReferenceSPI>>();
-	@SuppressWarnings("unchecked")
-	private final Map<Class<ExternalReferenceSPI>, Set<ExternalReferenceTranslatorSPI>> adjacencySets = new HashMap<Class<ExternalReferenceSPI>, Set<ExternalReferenceTranslatorSPI>>();
-
-	private final Map<Class<ExternalReferenceSPI>, ShortestPathSolver> solvers = new HashMap<Class<ExternalReferenceSPI>, ShortestPathSolver>();
-
-	/**
-	 * Default constructor to make life easier when using Spring. To be
-	 * functional this implementation should be injected with InstanceRegistry
-	 * implementations containing lists of known implementations of the
-	 * ExternalReferenceBuilderSPI and ExternalReferenceTranslatorSPI
-	 * interfaces.
-	 */
-	public ReferenceSetAugmentorImpl() {
-		super();
-	}
-
-	/**
-	 * Inject an instance registry containing all known implementations of
-	 * ExternalReferenceBuilderSPI *
-	 * 
-	 * @throws IllegalStateException
-	 *             if this has already been set, the instance registries should
-	 *             only be set on bean construction.
-	 */
-	public synchronized void setBuilderRegistry(
-			InstanceRegistry<ExternalReferenceBuilderSPI<?>> theRegistry) {
-		if (this.builders == null) {
-			this.builders = theRegistry;
-			theRegistry.addRegistryListener(registryListener);
-			List<ExternalReferenceBuilderSPI<?>> erb = theRegistry
-					.getInstances();
-			log.debug("* Builder registry injected :");
-			int counter = 0;
-			for (ExternalReferenceBuilderSPI<?> builder : erb) {
-				log.debug("*   " + (++counter) + ") "
-						+ builder.getClass().getSimpleName() + ", builds "
-						+ builder.getReferenceType().getSimpleName());
-			}
-			cacheValid = false;
-		} else {
-			log.error("Builder registry already injected, invalid operation");
-			throw new IllegalStateException(
-					"Can't inject the external reference builder registry "
-							+ "multiple times.");
-		}
-	}
-
-	/**
-	 * Inject an instance registry containing all known implementations of
-	 * ExternalReferenceTranslatorSPI
-	 * 
-	 * @throws IllegalStateException
-	 *             if this has already been set, the instance registries should
-	 *             only be set on bean construction.
-	 */
-	public synchronized void setTranslatorRegistry(
-			InstanceRegistry<ExternalReferenceTranslatorSPI<?, ?>> theRegistry) {
-		if (this.translators == null) {
-			this.translators = theRegistry;
-			theRegistry.addRegistryListener(registryListener);
-			List<ExternalReferenceTranslatorSPI<?, ?>> ert = theRegistry
-					.getInstances();
-			log.debug("* Translator registry injected :");
-			int counter = 0;
-			for (ExternalReferenceTranslatorSPI<?, ?> translator : ert) {
-				log.debug("*   " + (++counter) + ") "
-						+ translator.getClass().getSimpleName()
-						+ ", translates "
-						+ translator.getSourceReferenceType().getSimpleName()
-						+ " to "
-						+ translator.getTargetReferenceType().getSimpleName());
-			}
-			theRegistry.getInstances();
-			cacheValid = false;
-		} else {
-			log
-					.error("Translator registry already injected, invalid operation");
-			throw new IllegalStateException(
-					"Can't inject the translator registry multiple times.");
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	protected synchronized final void update() {
-		if (builders == null || translators == null || cacheValid) {
-			return;
-		}
-		log.debug("# Refreshing shortest path cache");
-		knownReferenceTypes.clear();
-		solvers.clear();
-		adjacencySets.clear();
-		for (ExternalReferenceBuilderSPI erb : builders) {
-			knownReferenceTypes.add(erb.getReferenceType());
-		}
-		for (ExternalReferenceTranslatorSPI ert : translators) {
-			knownReferenceTypes.add(ert.getSourceReferenceType());
-			knownReferenceTypes.add(ert.getTargetReferenceType());
-			getNeighbours(ert.getTargetReferenceType()).add(ert);
-		}
-		for (Class<ExternalReferenceSPI> type : knownReferenceTypes) {
-			try {
-				solvers.put(type, new ShortestPathSolver(type));
-			} catch (Throwable t) {
-				log.error(t);
-				if (t instanceof RuntimeException) {
-					throw (RuntimeException) t;
-				}
-			}
-		}
-		log.debug("# Path cache refresh done");
-		cacheValid = true;
-	}
-
-	@SuppressWarnings("unchecked")
-	Set<ExternalReferenceTranslatorSPI> getNeighbours(
-			Class<ExternalReferenceSPI> node) {
-		Set<ExternalReferenceTranslatorSPI> adjacentTo = adjacencySets
-				.get(node);
-		if (adjacentTo != null) {
-			return adjacentTo;
-		} else {
-			HashSet<ExternalReferenceTranslatorSPI> neighbours = new HashSet<ExternalReferenceTranslatorSPI>();
-			adjacencySets.put(node, neighbours);
-			return neighbours;
-		}
-
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@SuppressWarnings("unchecked")
-	public final Set<ExternalReferenceSPI> augmentReferenceSet(
-			ReferenceSet references,
-			Set<Class<ExternalReferenceSPI>> targetReferenceTypes,
-			ReferenceContext context) throws ReferenceSetAugmentationException {
-
-		synchronized (this) {
-			if (!cacheValid) {
-				update();
-			}
-		}
-
-		// Synchronize on the reference set itself
-		synchronized (references) {
-			// First check whether we actually need to modify the reference set
-			// at
-			// all - it's perfectly valid to call the augmentor when nothing
-			// actually needs to be done (ideally you wouldn't do this, but it's
-			// likely to happen)
-			for (ExternalReferenceSPI er : references.getExternalReferences()) {
-				if (targetReferenceTypes.contains(er.getClass())) {
-					return new HashSet<ExternalReferenceSPI>();
-				}
-			}
-
-			// Need to perform augmentation if we reach this point
-			List<TranslationPath> candidatePaths = new ArrayList<TranslationPath>();
-			for (Class<ExternalReferenceSPI> target : targetReferenceTypes) {
-				ShortestPathSolver solver = solvers.get(target);
-				if (solver == null) {
-					solver = new ShortestPathSolver(target);
-					solvers.put(target, solver);
-				}
-				if (solver != null) {
-					for (TranslationPath path : solver.getTranslationPaths()) {
-						for (ExternalReferenceSPI er : references
-								.getExternalReferences()) {
-							if (er.getClass().equals(path.getSourceType())) {
-								candidatePaths.add(path);
-							}
-						}
-						for (TranslationPath dereferenceBasedPath : path
-								.getDereferenceBasedPaths(references)) {
-							candidatePaths.add(dereferenceBasedPath);
-						}
-					}
-				}
-			}
-			// Now add candidate paths to represent a no-translator 'direct from
-			// byte stream source' path for each target type compatible
-			// reference builder
-			for (ExternalReferenceBuilderSPI builder : builders) {
-				if (targetReferenceTypes.contains(builder.getReferenceType())) {
-					// The builder can construct one of the target types, add
-					// paths for all possible pairs of 'de-reference existing
-					// reference' and the builder
-					for (ExternalReferenceSPI er : references
-							.getExternalReferences()) {
-						TranslationPath newPath = new TranslationPath();
-						newPath.initialBuilder = builder;
-						newPath.sourceReference = er;
-						candidatePaths.add(newPath);
-					}
-				}
-			}
-
-			// Got a list of candidate paths sorted by estimated overall path
-			// cost
-			Collections.sort(candidatePaths);
-			log
-					.debug("Found "
-							+ candidatePaths.size()
-							+ " contextual translation path(s) including builder based :");
-			int counter = 0;
-			for (TranslationPath path : candidatePaths) {
-				log.debug("  " + (++counter) + ") " + path.toString());
-			}
-			
-			if (candidatePaths.isEmpty()) {
-				log.warn("No candidate paths found for augmentation");
-				throw new ReferenceSetAugmentationException(
-						"No candidate translation paths were found");
-			} else {
-				log.debug("Performing augmentation :");
-				counter = 0;
-				for (TranslationPath path : candidatePaths) {
-					try {
-						counter++;
-						Set<ExternalReferenceSPI> newReferences = path
-								.doTranslation(references, context);
-						log.debug("  Success ("+counter+"), created "+printRefSet(newReferences));
-						return newReferences;
-					} catch (Exception ex) {
-						log.debug("  Failed ("+counter+")");
-						log.trace(ex);
-						// Use next path...
-					}
-				}
-				log.warn("  No paths succeeded, augmentation failed");
-				throw new ReferenceSetAugmentationException(
-						"All paths threw exceptions, can't perform augmentation");
-			}
-
-		}
-	}
-
-	private String printRefSet(Set<ExternalReferenceSPI> set) {
-		StringBuffer sb = new StringBuffer();
-		sb.append("[");
-		int counter = 0;
-		for (ExternalReferenceSPI ref : set) {
-			sb.append(ref.toString());
-			counter++;
-			if (counter < set.size()) {
-				sb.append(",");
-			}
-		}
-		sb.append("]");
-		return sb.toString();
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public final void augmentReferenceSetAsynch(final ReferenceSet references,
-			final Set<Class<ExternalReferenceSPI>> targetReferenceTypes,
-			final ReferenceContext context,
-			final ReferenceSetAugmentorCallback callback)
-			throws ReferenceSetAugmentationException {
-		Runnable r = new Runnable() {
-			public void run() {
-				try {
-					callback.augmentationCompleted(augmentReferenceSet(
-							references, targetReferenceTypes, context));
-
-				} catch (ReferenceSetAugmentationException rsae) {
-					callback.augmentationFailed(rsae);
-				}
-			}
-		};
-		executeRunnable(r);
-	}
-
-	/**
-	 * Schedule a runnable for execution - current naive implementation uses a
-	 * new thread and executes immediately, but this is where any thread pool
-	 * logic would go if we wanted to add that.
-	 * 
-	 * @param r
-	 */
-	private void executeRunnable(Runnable r) {
-		new Thread(r).start();
-	}
-
-	/**
-	 * A path from one external reference to another along with a total
-	 * estimated path cost through one or more reference translators.
-	 */
-	class TranslationPath implements Comparable<TranslationPath>,
-			Iterable<ExternalReferenceTranslatorSPI<?, ?>> {
-
-		List<ExternalReferenceTranslatorSPI<?, ?>> translators = new ArrayList<ExternalReferenceTranslatorSPI<?, ?>>();
-		ExternalReferenceBuilderSPI<?> initialBuilder = null;
-		ExternalReferenceSPI sourceReference = null;
-
-		/**
-		 * Return a human readable representation of this translation path, used
-		 * by the logging methods to print trace information.
-		 */
-		@SuppressWarnings("unchecked")
-		@Override
-		public String toString() {
-			StringBuffer sb = new StringBuffer();
-			sb.append(getPathCost() + " ");
-			if (sourceReference != null && initialBuilder != null) {
-				sb.append(sourceReference.toString() + "->bytes("
-						+ sourceReference.getResolutionCost() + ")->");
-				String builderClassName = initialBuilder.getClass()
-						.getSimpleName();
-				String builtType = initialBuilder.getReferenceType()
-						.getSimpleName();
-				sb.append("builder:" + builderClassName + "("
-						+ initialBuilder.getConstructionCost() + "):<"
-						+ builtType + ">");
-			} else if (translators.isEmpty() == false) {
-				sb.append("<"
-						+ translators.get(0).getSourceReferenceType()
-								.getSimpleName() + ">");
-			}
-			for (ExternalReferenceTranslatorSPI translator : translators) {
-				sb.append("-" + translator.getClass().getSimpleName() + "("
-						+ translator.getTranslationCost() + ")" + "-");
-				sb.append("<"
-						+ translator.getTargetReferenceType().getSimpleName()
-						+ ">");
-			}
-			return sb.toString();
-		}
-
-		@SuppressWarnings("unchecked")
-		public Set<ExternalReferenceSPI> doTranslation(ReferenceSet rs,
-				ReferenceContext context) {
-			Set<ExternalReferenceSPI> results = new HashSet<ExternalReferenceSPI>();
-			// Firstly check whether we have an initial reference and builder
-			// defined
-			ExternalReferenceSPI currentReference = null;
-			if (initialBuilder != null && sourceReference != null) {
-				ExternalReferenceSPI builtReference = initialBuilder
-						.createReference(sourceReference.openStream(context),
-								context);
-				results.add(builtReference);
-				currentReference = builtReference;
-			}
-			if (translators.isEmpty() == false && currentReference == null) {
-				// If there are translators in the path (there may not be if
-				// this is a pure 'dereference and build' type path) and the
-				// currentReference hasn't been set then search the existing
-				// references for an appropriate starting point for the
-				// translation.
-				for (ExternalReferenceSPI er : rs.getExternalReferences()) {
-					if (er.getClass().equals(
-							translators.get(0).getSourceReferenceType())) {
-						currentReference = er;
-						break;
-					}
-				}
-			}
-			if (currentReference == null) {
-				throw new RuntimeException(
-						"Can't locate a starting reference for the"
-								+ " translation path");
-			} else {
-				for (ExternalReferenceTranslatorSPI translator : translators) {
-					ExternalReferenceSPI translatedReference = translator
-							.createReference(currentReference, context);
-					results.add(translatedReference);
-					currentReference = translatedReference;
-				}
-			}
-			return results;
-		}
-
-		/**
-		 * Sum of translation costs of all translators in path
-		 */
-		public float getPathCost() {
-			float cost = 0.0f;
-			for (ExternalReferenceTranslatorSPI<?, ?> ert : this) {
-				cost += ert.getTranslationCost();
-			}
-			// If the source reference and initial builder are non-null then
-			// we're going to start this translation path by downloading a byte
-			// stream from the specified (current) reference and using it to
-			// construct the starting point for the translation path via the
-			// specified builder.
-			if (sourceReference != null) {
-				cost += sourceReference.getResolutionCost();
-			}
-			if (initialBuilder != null) {
-				cost += initialBuilder.getConstructionCost();
-			}
-			return cost;
-		}
-
-		/**
-		 * Return a list of translation paths based on this one but which start
-		 * at an existing reference within the supplied reference set. Will only
-		 * function if there is a reference builder registered that can build
-		 * the initial reference type used by this translation path, otherwise
-		 * it returns an empty list.
-		 * 
-		 * @param rs
-		 * @return
-		 */
-		@SuppressWarnings("unchecked")
-		public List<TranslationPath> getDereferenceBasedPaths(ReferenceSet rs) {
-			List<TranslationPath> results = new ArrayList<TranslationPath>();
-			for (ExternalReferenceBuilderSPI erb : builders) {
-				// Check for each reference builder to see if it can build the
-				// source type for this path
-				if (erb.getReferenceType().equals(this.getSourceType())) {
-					// The builder can construct the type used by the start of
-					// this translation path, so we can in general create a path
-					// from a fooreference to the target by de-referencing the
-					// fooreference and building the start type from it.
-					for (ExternalReferenceSPI er : rs.getExternalReferences()) {
-						// For each external reference in the existing reference
-						// set, check whether that type is already going to be
-						// created in the translation path - if so then there's
-						// not much point in emiting the modified path, as you'd
-						// have something like bytes->a->b->a->result which
-						// wouldn't make any sense
-						boolean overlapsExistingType = false;
-						for (ExternalReferenceTranslatorSPI translationStep : this) {
-							if (translationStep.getSourceReferenceType()
-									.equals(er.getClass())) {
-								overlapsExistingType = true;
-								break;
-							}
-						}
-						if (!overlapsExistingType) {
-							// The type wasn't found anywhere within the
-							// translation path, so we're not generating
-							// obviously stupid candidate paths.
-							TranslationPath newPath = new TranslationPath();
-							newPath.translators = this.translators;
-							newPath.initialBuilder = erb;
-							newPath.sourceReference = er;
-							results.add(newPath);
-						}
-					}
-				}
-			}
-			return results;
-		}
-
-		public List<ExternalReferenceTranslatorSPI<?, ?>> pathSteps() {
-			return translators;
-		}
-
-		/**
-		 * Order by total path cost
-		 */
-		public int compareTo(TranslationPath tp) {
-			if (tp.getPathCost() > this.getPathCost()) {
-				return -1;
-			} else if (tp.getPathCost() < this.getPathCost()) {
-				return 1;
-			} else {
-				return 0;
-			}
-		}
-
-		/**
-		 * Wrap translator list iterator for convenience
-		 */
-		public Iterator<ExternalReferenceTranslatorSPI<?, ?>> iterator() {
-			return translators.iterator();
-		}
-
-		public Class<? extends ExternalReferenceSPI> getSourceType() {
-			if (translators.isEmpty() == false) {
-				return translators.get(0).getSourceReferenceType();
-			} else if (this.sourceReference != null) {
-				return this.sourceReference.getClass();
-			} else {
-				return null;
-			}
-		}
-
-		public Class<? extends ExternalReferenceSPI> getTargetType() {
-			if (translators.isEmpty() == false) {
-				return translators.get(translators.size() - 1)
-						.getTargetReferenceType();
-			} else if (this.initialBuilder != null) {
-				return this.initialBuilder.getReferenceType();
-			} else {
-				return null;
-			}
-		}
-
-	}
-
-	class ShortestPathSolver {
-
-		private Map<Class<ExternalReferenceSPI>, Class<ExternalReferenceSPI>> predecessors;
-		private Map<Class<ExternalReferenceSPI>, ExternalReferenceTranslatorSPI<?, ?>> translators;
-		private Map<Class<ExternalReferenceSPI>, Float> shortestDistances;
-		private final Comparator<Class<ExternalReferenceSPI>> shortestDistanceComparator = new Comparator<Class<ExternalReferenceSPI>>() {
-			public int compare(Class<ExternalReferenceSPI> left,
-					Class<ExternalReferenceSPI> right) {
-				float shortestDistanceLeft = shortestDistances.get(left);
-				float shortestDistanceRight = shortestDistances.get(right);
-				if (shortestDistanceLeft > shortestDistanceRight) {
-					return +1;
-				} else if (shortestDistanceLeft < shortestDistanceRight) {
-					return -1;
-				} else {
-					return left.getCanonicalName().compareTo(
-							right.getCanonicalName());
-				}
-			}
-		};
-		private final PriorityQueue<Class<ExternalReferenceSPI>> unsettledNodes = new PriorityQueue<Class<ExternalReferenceSPI>>(
-				10, shortestDistanceComparator);
-		private final Set<Class<ExternalReferenceSPI>> settledNodes = new HashSet<Class<ExternalReferenceSPI>>();
-
-		private final List<TranslationPath> translationPaths = new ArrayList<TranslationPath>();
-
-		public List<TranslationPath> getTranslationPaths() {
-			return this.translationPaths;
-		}
-
-		public ShortestPathSolver(Class<ExternalReferenceSPI> targetType) {
-			log.debug("# Constructing shortest paths to '"
-					+ targetType.getSimpleName() + "'");
-			predecessors = new HashMap<Class<ExternalReferenceSPI>, Class<ExternalReferenceSPI>>();
-			translators = new HashMap<Class<ExternalReferenceSPI>, ExternalReferenceTranslatorSPI<?, ?>>();
-			shortestDistances = new HashMap<Class<ExternalReferenceSPI>, Float>();
-			setShortestDistance(targetType, 0.0f);
-			unsettledNodes.add(targetType);
-			while (unsettledNodes.isEmpty() == false) {
-				Class<ExternalReferenceSPI> u = extractMin();
-				settledNodes.add(u);
-				relaxNeighbours(u);
-			}
-			for (Class<ExternalReferenceSPI> c : settledNodes) {
-				if (c.equals(targetType) == false) {
-					// Don't calculate a path to itself!
-					TranslationPath p = new TranslationPath();
-					Class<ExternalReferenceSPI> node = c;
-					while (predecessors.get(node) != null) {
-						p.pathSteps().add(translators.get(node));
-						// Recurse, should terminate at the target type
-						node = predecessors.get(node);
-					}
-					translationPaths.add(p);
-				}
-			}
-			Collections.sort(translationPaths);
-			if (translationPaths.isEmpty()) {
-				log
-						.debug("#   no paths discovered, type not reachable through translation");
-			} else {
-				log.debug("#   found " + translationPaths.size()
-						+ " distinct path(s) :");
-				int counter = 0;
-				for (TranslationPath path : translationPaths) {
-					log.debug("#     " + (++counter) + ") " + path.toString());
-				}
-			}
-		}
-
-		@SuppressWarnings("unchecked")
-		private void relaxNeighbours(Class<ExternalReferenceSPI> u) {
-			log.trace("#     relaxing node " + u.getSimpleName());
-			Set<Class<ExternalReferenceSPI>> alreadySeen = new HashSet<Class<ExternalReferenceSPI>>();
-			for (ExternalReferenceTranslatorSPI ert : getNeighbours(u)) {
-				// all the translators that translate *to* u
-				Class<ExternalReferenceSPI> v = ert.getSourceReferenceType();
-				log.trace("#     translator found from from '" + v + "' : "
-						+ ert.getClass().getSimpleName());
-				if (alreadySeen.contains(v) == false && isSettled(v) == false) {
-					// Avoid duplicate edges, always take the first one where
-					// such duplicates exist
-					alreadySeen.add(v);
-					if (getShortestDistance(v) > getShortestDistance(u)
-							+ ert.getTranslationCost()) {
-						setShortestDistance(v, getShortestDistance(u)
-								+ ert.getTranslationCost());
-						setPredecessor(v, u, ert);
-						unsettledNodes.add(v);
-					}
-				}
-			}
-		}
-
-		private boolean isSettled(Class<ExternalReferenceSPI> node) {
-			return settledNodes.contains(node);
-		}
-
-		private void setShortestDistance(Class<ExternalReferenceSPI> node,
-				float distance) {
-			shortestDistances.put(node, distance);
-		}
-
-		private float getShortestDistance(Class<ExternalReferenceSPI> node) {
-			Float d = shortestDistances.get(node);
-			return (d == null) ? Float.MAX_VALUE : d;
-		}
-
-		private Class<ExternalReferenceSPI> extractMin() {
-			return unsettledNodes.poll();
-		}
-
-		private void setPredecessor(Class<ExternalReferenceSPI> child,
-				Class<ExternalReferenceSPI> parent,
-				ExternalReferenceTranslatorSPI<?, ?> translator) {
-			predecessors.put(child, parent);
-			translators.put(child, translator);
-		}
-
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetImpl.java
deleted file mode 100644
index e627bc3..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.h3.HibernateMappedEntity;
-
-/**
- * An implementation of ReferenceSet with the additional methods and metadata
- * required by Hibernate3 to allow it to be persisted in a relational store. As
- * with everything else in this package you shouldn't be using this class
- * directly! Instead of this class you should use the registration methods on
- * {@link net.sf.taverna.t2.reference.ReferenceSetService}, implementations of
- * that interface will handle the construction of ReferenceSet implementations
- * (including this one).
- * 
- * @author Tom Oinn
- * 
- */
-public class ReferenceSetImpl extends AbstractEntityImpl implements
-		ReferenceSet, HibernateMappedEntity {
-
-	private Set<ExternalReferenceSPI> externalReferences;
-	
-	/**
-	 * Construct a new ReferenceSetImpl with the given set of external
-	 * references and identifier.
-	 * 
-	 * @param references
-	 *            the set of ExternalReferenceSPI which this reference set
-	 *            should contain initially
-	 * @param id
-	 *            the T2Reference to use, must be an instance of
-	 *            ReferenceSetT2ReferenceImpl so hibernate can make use of it as
-	 *            a compound primary key component
-	 */
-	public ReferenceSetImpl(Set<ExternalReferenceSPI> references,
-			T2ReferenceImpl id) {
-		setTypedId(id);
-		this.externalReferences = references;
-	}
-
-	/**
-	 * Default constructor, used by Hibernate when reconstructing this bean from
-	 * the database. If you call this directly from your code you must then call
-	 * both {@link #setExternalReferences(Set)} and
-	 * {@link #setId(T2ReferenceImpl)} before any use of the reference set. If
-	 * you're not writing the reference manager implementation you shouldn't be
-	 * using this class anyway.
-	 */
-	public ReferenceSetImpl() {
-		//
-	}
-
-	/**
-	 * For debugging purposes, prints a summary of the contents and identifier
-	 * of this reference set.
-	 * 
-	 * @return human readable string representation of this object. This is not
-	 *         regarded as 'stable' and should not be parsed for any reason!
-	 */
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append(getId() + " [" + externalReferences.size() + "]\n");
-
-		for (ExternalReferenceSPI ref : externalReferences) {
-			sb.append("  " + ref.toString() + "\n");
-		}
-		return sb.toString();
-
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Set<ExternalReferenceSPI> getExternalReferences() {
-		return this.externalReferences;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate, and is used to
-	 * initialize the set of external references.
-	 */
-	public void setExternalReferences(Set<ExternalReferenceSPI> newReferences) {
-		this.externalReferences = newReferences;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetServiceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetServiceImpl.java
deleted file mode 100644
index 485e9d7..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/ReferenceSetServiceImpl.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferenceServiceException;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetAugmentationException;
-import net.sf.taverna.t2.reference.ReferenceSetService;
-import net.sf.taverna.t2.reference.ReferenceSetServiceException;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Implementation of ReferenceSetService, inject with an appropriate
- * ReferenceSetDao to enable. Implements translation functionality as long as an
- * appropriate ReferenceSetAugmentor implementation is injected.
- * 
- * @author Tom Oinn
- * 
- */
-public class ReferenceSetServiceImpl extends AbstractReferenceSetServiceImpl
-		implements ReferenceSetService {
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ReferenceSet getReferenceSet(T2Reference id)
-			throws ReferenceSetServiceException {
-		checkDao();
-		try {
-			return referenceSetDao.get(id);
-		} catch (DaoException de) {
-			throw new ReferenceSetServiceException(de);
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ReferenceSet getReferenceSetWithAugmentation(T2Reference id,
-			Set<Class<ExternalReferenceSPI>> ensureTypes,
-			ReferenceContext context) throws ReferenceSetServiceException {
-		checkDao();
-		checkAugmentor();
-		if (context == null) {
-			context = new EmptyReferenceContext();
-		}
-		// Obtain the reference set
-
-		try {
-			// Synchronize on the reference set, should ensure that we don't
-			// have multiple concurrent translations assuming that Hibernate
-			// retrieves the same entity each time. To work around this
-			// potentially not being the case we can synchronize on the
-			// stringified form of the identifier.
-			synchronized (id.toString()) {
-				ReferenceSet rs = getReferenceSet(id);
-				Set<ExternalReferenceSPI> newReferences = referenceSetAugmentor
-						.augmentReferenceSet(rs, ensureTypes, context);
-				if (newReferences.isEmpty() == false) {
-					// Write back changes to the store if we got here, this can
-					// potentially throw an unsupported operation exception in
-					// which
-					// case we have to fail the augmentation.
-					try {
-						rs.getExternalReferences().addAll(newReferences);
-					} catch (RuntimeException re) {
-						throw new ReferenceSetAugmentationException(
-								"Can't add new references back into existing reference set instance");
-					}
-					referenceSetDao.update(rs);
-				}
-				return rs;
-			}
-
-		} catch (ReferenceSetAugmentationException rsae) {
-			throw new ReferenceSetServiceException(rsae);
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ReferenceSet registerReferenceSet(
-			Set<ExternalReferenceSPI> references)
-			throws ReferenceSetServiceException {
-		checkDao();
-		checkGenerator();
-		ReferenceSetImpl rsi = new ReferenceSetImpl();
-		rsi
-				.setExternalReferences(new HashSet<ExternalReferenceSPI>(
-						references));
-		T2Reference id = t2ReferenceGenerator.nextReferenceSetReference();
-		rsi.setTypedId(T2ReferenceImpl.getAsImpl(id));
-		try {
-			referenceSetDao.store(rsi);
-			return rsi;
-		} catch (DaoException de) {
-			throw new ReferenceSetServiceException(de);
-		}
-	}
-
-	public boolean delete(T2Reference reference)
-			throws ReferenceServiceException {
-		checkDao();
-		ReferenceSet set=referenceSetDao.get(reference);
-		if (set==null) return false;
-		return referenceSetDao.delete(set);
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/SimpleCacheProviderImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/SimpleCacheProviderImpl.java
deleted file mode 100644
index 1925ba3..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/SimpleCacheProviderImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.reference.Identified;
-import net.sf.taverna.t2.reference.ReferenceServiceCacheProvider;
-import net.sf.taverna.t2.reference.T2Reference;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Completely naive cache provider that just stores everything in a map. This
- * <em>will</em> run out of memory as it makes no attempt to evict old items,
- * it's really just here as a test!
- * 
- * @author Tom Oinn
- * 
- */
-public class SimpleCacheProviderImpl implements ReferenceServiceCacheProvider {
-
-	private final Log log = LogFactory.getLog(SimpleCacheProviderImpl.class);
-
-	private Map<T2Reference, Identified> cache = new HashMap<T2Reference, Identified>();
-
-	public Identified get(T2Reference id) {
-		log.debug("Get " + id.toString() + " (" + cache.containsKey(id) + ")");
-		return cache.get(id);
-	}
-
-	public void put(Identified i) {
-		log.debug("Put " + i.getId().toString());
-		cache.put(i.getId(), i);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/SimpleT2ReferenceGenerator.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/SimpleT2ReferenceGenerator.java
deleted file mode 100644
index c7428d8..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/SimpleT2ReferenceGenerator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.T2ReferenceGenerator;
-
-/**
- * Simple implementation of T2ReferenceGenerator intended to be injected into
- * the service layers for integration testing. Exposes a namespace property
- * which can be configured through spring and allocates local parts based on an
- * integer counter - this is only guaranteed to be unique within a single
- * instance of this object so isn't suitable for real production use. For proper
- * usage use an implementation tied to the backing store you're putting t2
- * reference objects into.
- * 
- * @author Tom Oinn
- * 
- */
-public class SimpleT2ReferenceGenerator extends AbstractT2ReferenceGenerator implements T2ReferenceGenerator {
-
-	private String namespace = "testNS";
-	private String localPrefix = "test";
-	private int counter = 0;
-
-	/**
-	 * Set the namespace for identifiers generated by this class as a string
-	 * 
-	 * @param newNamespace
-	 *            the namespace to use
-	 */
-	public void setNamespace(String newNamespace) {
-		this.namespace = newNamespace;
-	}
-
-	/**
-	 * Get the namespace for identifiers generated by this class
-	 */
-	public String getNamespace() {
-		return namespace;
-	}
-
-	@Override
-	protected synchronized String getNextLocalPart() {
-		return localPrefix + (counter++);
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/StackTraceElementBeanImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/StackTraceElementBeanImpl.java
deleted file mode 100644
index f316b74..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/StackTraceElementBeanImpl.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.StackTraceElementBean;
-import net.sf.taverna.t2.reference.h3.HibernateComponentClass;
-
-/**
- * Simple bean implementation of StackTraceElement for Hibernate
- * 
- * @author Tom Oinn
- * 
- */
-public class StackTraceElementBeanImpl implements StackTraceElementBean,
-		HibernateComponentClass {
-
-	private String className;
-	private String fileName;
-	private String methodName;
-	private int lineNumber;
-
-	public StackTraceElementBeanImpl() {
-		//
-	}
-
-	public String getClassName() {
-		return this.className;
-	}
-
-	public void setClassName(String className) {
-		this.className = className;
-	}
-
-	public String getFileName() {
-		return this.fileName;
-	}
-
-	public void setFileName(String fileName) {
-		this.fileName = fileName;
-	}
-
-	public int getLineNumber() {
-		return lineNumber;
-	}
-
-	public void setLineNumber(int lineNumber) {
-		this.lineNumber = lineNumber;
-	}
-
-	public String getMethodName() {
-		return this.methodName;
-	}
-
-	public void setMethodName(String methodName) {
-		this.methodName = methodName;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/T2ReferenceImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/T2ReferenceImpl.java
deleted file mode 100644
index 4a1e203..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/T2ReferenceImpl.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.io.Serializable;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.h3.HibernateComponentClass;
-
-import org.apache.log4j.Logger;
-
-/**
- * An implementation of T2Reference specific to the ReferenceSetImpl. This is
- * needed because ReferenceSetImpl uses a component based primary key driven
- * from the namespace and local parts of T2Reference. This in turn means we can
- * query hibernate directly with a T2Reference instance in the data access
- * object. Because this is only used as a component (i.e. a value type) we don't
- * need to define a hibernate mapping file for it.
- * 
- * @author Tom Oinn
- * 
- */
-public class T2ReferenceImpl implements T2Reference, Serializable,
-		HibernateComponentClass {
-
-	private static Logger logger = Logger
-	.getLogger(T2ReferenceImpl.class);
-
-	private static final long serialVersionUID = 8363330461158750319L;
-	private URI cachedUri = null;
-	private String localPart;
-	private String namespacePart;
-	private boolean containsErrors = false;
-	private T2ReferenceType referenceType = T2ReferenceType.ReferenceSet;
-	private int depth = 0;
-
-	public T2ReferenceImpl() {
-		// Default constructor for Hibernate et al
-	}
-
-	/**
-	 * Construct a deep copy of the given T2Reference
-	 * 
-	 * @param source
-	 *            T2Reference to copy
-	 */
-	private T2ReferenceImpl(T2Reference source) {
-		super();
-		setNamespacePart(source.getNamespacePart());
-		setLocalPart(source.getLocalPart());
-		setContainsErrors(source.containsErrors());
-		setReferenceType(source.getReferenceType());
-		setDepth(source.getDepth());
-	}
-
-	public static T2ReferenceImpl getAsImpl(T2Reference source) {
-		if (source instanceof T2ReferenceImpl) {
-			return (T2ReferenceImpl) source;
-		} else {
-			return new T2ReferenceImpl(source);
-		}
-	}
-
-	/**
-	 * Return whether the identified entity either is or contains errors
-	 */
-	public boolean containsErrors() {
-		return this.containsErrors;
-	}
-
-	/**
-	 * Property accessor for Hibernate, complies with java bean spec
-	 */
-	public boolean getContainsErrors() {
-		return this.containsErrors;
-	}
-
-	/**
-	 * Get the depth of the entity referred to by this reference
-	 */
-	public int getDepth() {
-		return this.depth;
-	}
-
-	/**
-	 * Get the local part of the URI for this reference
-	 */
-	public String getLocalPart() {
-		return this.localPart;
-	}
-
-	/**
-	 * Get the namespace part of the URI for this reference
-	 */
-	public String getNamespacePart() {
-		return namespacePart;
-	}
-
-	/**
-	 * Get the type of the entity to which this reference refers
-	 */
-	public T2ReferenceType getReferenceType() {
-		return this.referenceType;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate when
-	 * re-constructing the identifier component to set the namespace part of the
-	 * identifier.
-	 */
-	public synchronized void setNamespacePart(String namespacePart) {
-		this.namespacePart = namespacePart;
-		this.hashCode = -1;
-		cachedUri = null;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate when
-	 * re-constructing the identifier component to set the local part of the
-	 * identifier.
-	 */
-	public synchronized void setLocalPart(String localPart) {
-		this.localPart = localPart;
-		this.hashCode = -1;
-		cachedUri = null;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate when
-	 * re-constructing the identifier component to set the depth of the
-	 * identifier.
-	 */
-	public synchronized void setDepth(int depth) {
-		this.depth = depth;
-		this.hashCode = -1;
-		cachedUri = null;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate when
-	 * re-constructing the identifier component to set the error property of the
-	 * identifier.
-	 */
-	public synchronized void setContainsErrors(boolean containsErrors) {
-		this.containsErrors = containsErrors;
-		cachedUri = null;
-	}
-
-	/**
-	 * This method is only ever called from within Hibernate when
-	 * re-constructing the identifier component to set the reference type
-	 * property of the identifier.
-	 */
-	public synchronized void setReferenceType(T2ReferenceType type) {
-		this.referenceType = type;
-		cachedUri = null;
-	}
-
-	/**
-	 * By default when printing an identifier we use {@link #toUri()}.{@link java.net.URI#toASCIIString() toASCIIString()}
-	 */
-	@Override
-	public String toString() {
-		return toUri().toASCIIString();
-	}
-
-	/**
-	 * Drill inside an error document reference to get the error one deeper than
-	 * this as long as it is at least depth 1.
-	 */
-	T2ReferenceImpl getDeeperErrorReference() {
-		if (getReferenceType().equals(T2ReferenceType.ErrorDocument)) {
-			if (getDepth() == 0) {
-				throw new AssertionError(
-						"Error identifier already has depth 0, cannot decrease");
-			}
-			T2ReferenceImpl result = new T2ReferenceImpl();
-			result.setContainsErrors(true);
-			result.setDepth(getDepth() - 1);
-			result.setLocalPart(getLocalPart());
-			result.setNamespacePart(getNamespacePart());
-			result.setReferenceType(T2ReferenceType.ErrorDocument);
-			return result;
-		}
-		throw new AssertionError(
-				"Attempt to get a deeper reference on something that isn't an error ref");
-	}
-
-	/**
-	 * Returns the identifier expressed as a {@link java.net.URI URI},
-	 * constructed based on the reference type. For references to ReferenceSet
-	 * this is
-	 * <code>new URI("t2:ref//" + namespacePart + "?" + localPart)</code>
-	 * leading to URIs of the form <code>t2:ref//namespace?local</code>
-	 */
-	public synchronized URI toUri() {
-		if (cachedUri != null) {
-			return cachedUri;
-		} else if (referenceType.equals(T2ReferenceType.ReferenceSet)) {
-			try {
-				URI result = new URI("t2:ref//" + namespacePart + "?"
-						+ localPart);
-				cachedUri = result;
-				return result;
-			} catch (URISyntaxException e) {
-				logger.error("Unable to create URI", e);
-				return null;
-			}
-		} else if (referenceType.equals(T2ReferenceType.IdentifiedList)) {
-			try {
-				URI result = new URI("t2:list//" + namespacePart + "?"
-						+ localPart + "/" + containsErrors + "/" + depth);
-				cachedUri = result;
-				return result;
-			} catch (URISyntaxException e) {
-				logger.error("Unable to create URI", e);
-				return null;
-			}
-		} else if (referenceType.equals(T2ReferenceType.ErrorDocument)) {
-			try {
-				URI result = new URI("t2:error//" + namespacePart + "?"
-						+ localPart + "/" + depth);
-				cachedUri = result;
-				return result;
-			} catch (URISyntaxException e) {
-				logger.error("Unable to create URI", e);
-				return null;
-			}
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * Use the equality operator over the URI representation of this bean.
-	 */
-	@Override
-	public boolean equals(Object other) {
-		if (other == this) {
-			return true;
-		}
-		if (other instanceof T2ReferenceImpl) {
-			T2ReferenceImpl otherRef = (T2ReferenceImpl) other;
-			if (localPart.equals(otherRef.localPart)
-					&& namespacePart.equals(otherRef.namespacePart)
-					&& depth == otherRef.depth) {
-				return true;
-			} else {
-				return false;
-			}
-		} else {
-			return false;
-		}
-	}
-
-	private int hashCode = -1;
-
-	/**
-	 * Use hashcode method from the string representation of namespace, local
-	 * and depth parts
-	 */
-	@Override
-	public synchronized int hashCode() {
-		if (this.hashCode == -1) {
-			this.hashCode = getCompactForm().hashCode();
-		}
-		return this.hashCode;
-	}
-
-	private String compactForm = null;
-
-	public synchronized String getCompactForm() {
-		if (this.compactForm == null) {
-			this.compactForm = getNamespacePart() + ":" + getLocalPart() + ":"
-					+ getDepth();
-		}
-		return this.compactForm;
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.java
deleted file mode 100644
index 5cc5e0d..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.List;
-
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.h3.HibernateMappedEntity;
-
-/**
- * Simple extension of
- * <code>{@link IdentifiedArrayList IdentifiedArrayList&lt;T2Reference&gt;}</code>
- * exposing get and set methods for the list contents so we can map it in
- * hibernate.
- * 
- * @author Tom Oinn
- * 
- */
-public class T2ReferenceListImpl extends IdentifiedArrayList<T2Reference>
-		implements HibernateMappedEntity {
-
-	public T2ReferenceListImpl() {
-		super();
-	}
-
-	/**
-	 * This is only called from Hibernate, outside of test code, so is
-	 * relatively safe to leave unchecked.
-	 */
-	@SuppressWarnings("unchecked")
-	public List getListContents() {
-		return this.listDelegate;
-	}
-
-	/**
-	 * This is only called from Hibernate, outside of test code, so is
-	 * relatively safe to leave unchecked.
-	 */
-	@SuppressWarnings("unchecked")
-	public void setListContents(List newList) {
-		this.listDelegate = newList;
-	}
-
-	/**
-	 * Print the contents of this list for vaguely human readable debug
-	 * porpoises.
-	 */
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append(this.getId().toString() + "\n");
-		int counter = 0;
-		for (T2Reference ref : listDelegate) {
-			sb.append("  " + (++counter) + ") " + ref.toString() + "\n");
-		}
-		return sb.toString();
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateErrorDocumentDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateErrorDocumentDao.java
deleted file mode 100644
index ba8f876..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateErrorDocumentDao.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.annotations.DeleteIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.GetIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.PutIdentifiedOperation;
-
-import org.hibernate.SessionFactory;
-
-/**
- * An implementation of ErrorDocumentDao based on raw hibernate session factory
- * injection and running within a spring managed context through auto-proxy
- * generation. To use this in spring inject a property 'sessionFactory' with
- * either a
- * {@link org.springframework.orm.hibernate3.LocalSessionFactoryBean LocalSessionFactoryBean}
- * or the equivalent class from the T2Platform module to add SPI based
- * implementation discovery and mapping. To use outside of Spring ensure you
- * call the setSessionFactory(..) method before using this (but really, use it
- * from Spring, so much easier).
- * <p>
- * Methods in this Dao require transactional support
- * 
- * @author Tom Oinn
- * 
- */
-public class TransactionalHibernateErrorDocumentDao implements ErrorDocumentDao {
-
-	private SessionFactory sessionFactory;
-
-	public void setSessionFactory(SessionFactory sessionFactory) {
-		this.sessionFactory = sessionFactory;
-	}
-
-	/**
-	 * Fetch an ErrorDocument list by id
-	 * 
-	 * @param ref
-	 *            the T2Reference to fetch
-	 * @return a retrieved identified list of T2 references
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@GetIdentifiedOperation
-	public ErrorDocument get(T2Reference ref) throws DaoException {
-		if (ref == null) {
-			throw new DaoException(
-					"Supplied reference is null, can't retrieve.");
-		} else if (ref.getReferenceType().equals(T2ReferenceType.ErrorDocument) == false) {
-			throw new DaoException(
-					"This dao can only retrieve reference of type T2Reference.ErrorDocument");
-		}
-		if (ref instanceof T2ReferenceImpl) {
-			try {
-				return (ErrorDocumentImpl) sessionFactory.getCurrentSession()
-						.get(ErrorDocumentImpl.class,
-								((T2ReferenceImpl) ref).getCompactForm());
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Reference must be an instance of T2ReferenceImpl");
-		}
-	}
-
-	@PutIdentifiedOperation
-	public void store(ErrorDocument theDocument) throws DaoException {
-		if (theDocument.getId() == null) {
-			throw new DaoException(
-					"Supplied error document set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (theDocument.getId().getReferenceType().equals(
-				T2ReferenceType.ErrorDocument) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.ErrorDocument, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theDocument instanceof ErrorDocumentImpl) {
-			try {
-				sessionFactory.getCurrentSession().save(theDocument);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied ErrorDocument not an instance of ErrorDocumentImpl");
-		}
-	}
-
-	@DeleteIdentifiedOperation
-	public boolean delete(ErrorDocument theDocument) throws DaoException {
-		if (theDocument.getId() == null) {
-			throw new DaoException(
-					"Supplied error document set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (theDocument.getId().getReferenceType().equals(
-				T2ReferenceType.ErrorDocument) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.ErrorDocument, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theDocument instanceof ErrorDocumentImpl) {
-			try {
-				sessionFactory.getCurrentSession().delete(theDocument);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied ErrorDocument not an instance of ErrorDocumentImpl");
-		}
-		return true;
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateListDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateListDao.java
deleted file mode 100644
index 126f4c0..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateListDao.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.annotations.GetIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.PutIdentifiedOperation;
-
-import org.hibernate.SessionFactory;
-
-/**
- * An implementation of ListDao based on based on raw hibernate session factory
- * injection and running within a spring managed context through auto-proxy
- * generation. To use this in spring inject a property 'sessionFactory' with
- * either a
- * {@link org.springframework.orm.hibernate3.LocalSessionFactoryBean LocalSessionFactoryBean}
- * or the equivalent class from the T2Platform module to add SPI based
- * implementation discovery and mapping. To use outside of Spring ensure you
- * call the setSessionFactory(..) method before using this (but really, use it
- * from Spring, so much easier).
- * <p>
- * Methods in this Dao require transactional support
- * 
- * @author Tom Oinn
- * 
- */
-public class TransactionalHibernateListDao implements ListDao {
-
-	private SessionFactory sessionFactory;
-
-	public void setSessionFactory(SessionFactory sessionFactory) {
-		this.sessionFactory = sessionFactory;
-	}
-
-	/**
-	 * Fetch a t2reference list by id
-	 * 
-	 * @param ref
-	 *            the T2Reference to fetch
-	 * @return a retrieved identified list of T2 references
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@GetIdentifiedOperation
-	public IdentifiedList<T2Reference> get(T2Reference ref) throws DaoException {
-		if (ref == null) {
-			throw new DaoException(
-					"Supplied reference is null, can't retrieve.");
-		} else if (ref.getReferenceType()
-				.equals(T2ReferenceType.IdentifiedList) == false) {
-			throw new DaoException(
-					"This dao can only retrieve reference of type T2Reference.IdentifiedList");
-		}
-		if (ref instanceof T2ReferenceImpl) {
-			try {
-				return (T2ReferenceListImpl) sessionFactory.getCurrentSession()
-						.get(T2ReferenceListImpl.class,
-								((T2ReferenceImpl) ref).getCompactForm());
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Reference must be an instance of T2ReferenceImpl");
-		}
-	}
-
-	@PutIdentifiedOperation
-	public void store(IdentifiedList<T2Reference> theList) throws DaoException {
-		if (theList.getId() == null) {
-			throw new DaoException("Supplied list set has a null ID, allocate "
-					+ "an ID before calling the store method in the dao.");
-		} else if (theList.getId().getReferenceType().equals(
-				T2ReferenceType.IdentifiedList) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.IdentifiedList, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theList instanceof T2ReferenceListImpl) {
-			try {
-				sessionFactory.getCurrentSession().save(theList);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied identifier list not an instance of T2ReferenceList");
-		}
-	}
-
-	public boolean delete(
-			IdentifiedList<T2Reference> theList) throws DaoException {
-		if (theList.getId() == null) {
-			throw new DaoException("Supplied list set has a null ID, allocate "
-					+ "an ID before calling the store method in the dao.");
-		} else if (theList.getId().getReferenceType().equals(
-				T2ReferenceType.IdentifiedList) == false) {
-			throw new DaoException("Strangely the list ID doesn't have type "
-					+ "T2ReferenceType.IdentifiedList, something has probably "
-					+ "gone badly wrong somewhere earlier!");
-		}
-		if (theList instanceof T2ReferenceListImpl) {
-			try {
-				sessionFactory.getCurrentSession().delete(theList);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied identifier list not an instance of T2ReferenceList");
-		}
-		return true;
-	}
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateReferenceSetDao.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateReferenceSetDao.java
deleted file mode 100644
index d4118c5..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/TransactionalHibernateReferenceSetDao.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-import net.sf.taverna.t2.reference.annotations.DeleteIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.GetIdentifiedOperation;
-import net.sf.taverna.t2.reference.annotations.PutIdentifiedOperation;
-
-import org.hibernate.SessionFactory;
-
-/**
- * An implementation of ReferenceSetDao based on raw hibernate session factory
- * injection and running within a spring managed context through auto-proxy
- * generation. To use this in spring inject a property 'sessionFactory' with
- * either a
- * {@link org.springframework.orm.hibernate3.LocalSessionFactoryBean LocalSessionFactoryBean}
- * or the equivalent class from the T2Platform module to add SPI based
- * implementation discovery and mapping. To use outside of Spring ensure you
- * call the setSessionFactory(..) method before using this (but really, use it
- * from Spring, so much easier).
- * <p>
- * Methods in this Dao require transactional support
- * 
- * @author Tom Oinn
- * 
- */
-public class TransactionalHibernateReferenceSetDao implements ReferenceSetDao {
-
-	private SessionFactory sessionFactory;
-
-	public void setSessionFactory(SessionFactory sessionFactory) {
-		this.sessionFactory = sessionFactory;
-	}
-
-	/**
-	 * Store the specified new reference set
-	 * 
-	 * @param rs
-	 *            a reference set, must not already exist in the database.
-	 * @throws DaoException
-	 *             if the entry already exists in the database, if the supplied
-	 *             reference set isn't an instance of ReferenceSetImpl or if
-	 *             something else goes wrong connecting to the database
-	 */
-	@PutIdentifiedOperation
-	public void store(ReferenceSet rs) throws DaoException {
-		if (rs.getId() == null) {
-			throw new DaoException(
-					"Supplied reference set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (rs.getId().getReferenceType().equals(
-				T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"Strangely the reference set ID doesn't have type "
-							+ "T2ReferenceType.ReferenceSet, something has probably "
-							+ "gone badly wrong somewhere earlier!");
-		}
-		if (rs instanceof ReferenceSetImpl) {
-			try {
-				sessionFactory.getCurrentSession().save(rs);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied reference set not an instance of ReferenceSetImpl");
-		}
-	}
-
-	/**
-	 * Update a pre-existing entry in the database
-	 * 
-	 * @param rs
-	 *            the reference set to update. This must already exist in the
-	 *            database
-	 * @throws DaoException
-	 */
-	@PutIdentifiedOperation
-	public void update(ReferenceSet rs) throws DaoException {
-		if (rs.getId() == null) {
-			throw new DaoException(
-					"Supplied reference set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (rs.getId().getReferenceType().equals(
-				T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"Strangely the reference set ID doesn't have type "
-							+ "T2ReferenceType.ReferenceSet, something has probably "
-							+ "gone badly wrong somewhere earlier!");
-		}
-		if (rs instanceof ReferenceSetImpl) {
-			try {
-				sessionFactory.getCurrentSession().update(rs);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied reference set not an instance of ReferenceSetImpl");
-		}
-	}
-
-	/**
-	 * Fetch a reference set by id
-	 * 
-	 * @param ref
-	 *            the ReferenceSetT2ReferenceImpl to fetch
-	 * @return a retrieved ReferenceSetImpl
-	 * @throws DaoException
-	 *             if the supplied reference is of the wrong type or if
-	 *             something goes wrong fetching the data or connecting to the
-	 *             database
-	 */
-	@GetIdentifiedOperation
-	public ReferenceSetImpl get(T2Reference ref) throws DaoException {
-		if (ref == null) {
-			throw new DaoException(
-					"Supplied reference is null, can't retrieve.");
-		} else if (ref.getReferenceType().equals(T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"This dao can only retrieve reference of type T2Reference.ReferenceSet");
-		}
-		if (ref instanceof T2ReferenceImpl) {
-			try {
-				return (ReferenceSetImpl) sessionFactory.getCurrentSession()
-						.get(ReferenceSetImpl.class,
-								((T2ReferenceImpl) ref).getCompactForm());
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Reference must be an instance of T2ReferenceImpl");
-		}
-	}
-
-	@DeleteIdentifiedOperation
-	public boolean delete(ReferenceSet rs) throws DaoException {
-		if (rs.getId() == null) {
-			throw new DaoException(
-					"Supplied reference set has a null ID, allocate "
-							+ "an ID before calling the store method in the dao.");
-		} else if (rs.getId().getReferenceType().equals(
-				T2ReferenceType.ReferenceSet) == false) {
-			throw new DaoException(
-					"Strangely the reference set ID doesn't have type "
-							+ "T2ReferenceType.ReferenceSet, something has probably "
-							+ "gone badly wrong somewhere earlier!");
-		}
-		if (rs instanceof ReferenceSetImpl) {
-			try {
-				sessionFactory.getCurrentSession().delete(rs);
-			} catch (Exception ex) {
-				throw new DaoException(ex);
-			}
-		} else {
-			throw new DaoException(
-					"Supplied reference set not an instance of ReferenceSetImpl");
-		}
-		return true;
-	}
-	
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/UUIDT2ReferenceGenerator.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/UUIDT2ReferenceGenerator.java
deleted file mode 100644
index 78b302f..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/UUIDT2ReferenceGenerator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.UUID;
-
-import net.sf.taverna.t2.reference.T2ReferenceGenerator;
-
-/**
- * A T2ReferenceGenerator based on UUIDs. Not as fast as
- * {@link SimpleT2ReferenceGenerator}, but IDs will be globally unique.
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class UUIDT2ReferenceGenerator extends AbstractT2ReferenceGenerator
-		implements T2ReferenceGenerator {
-
-	private String namespace = "uuid";
-
-	/**
-	 * Set the namespace for identifiers generated by this class as a string
-	 * 
-	 * @param newNamespace
-	 *            the namespace to use
-	 */
-	public void setNamespace(String newNamespace) {
-		this.namespace = newNamespace;
-	}
-	
-	public String getNamespace() {
-		return namespace;
-	}
-
-	@Override
-	protected String getNextLocalPart() {
-		return UUID.randomUUID().toString();
-	}
-
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/WriteQueueAspect.java b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/WriteQueueAspect.java
deleted file mode 100644
index 51fbf08..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/WriteQueueAspect.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.lang.ref.SoftReference;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import net.sf.taverna.t2.reference.DaoException;
-import net.sf.taverna.t2.reference.Identified;
-import net.sf.taverna.t2.reference.T2Reference;
-
-import org.aspectj.lang.ProceedingJoinPoint;
-
-/**
- * An aspect used to intercept calls to the various data access objects and
- * execute data writes on a thread limited executer with an unbounded blocking queue.
- * 
- * @author David Withers
- */
-public class WriteQueueAspect {
-
-	private Map<T2Reference, Identified> store = new ConcurrentHashMap<T2Reference, Identified>();
-	
-	private Map<T2Reference, SoftReference<Identified>> cache = new ConcurrentHashMap<T2Reference, SoftReference<Identified>>();
-
-	private ThreadPoolExecutor executer;
-	
-	public WriteQueueAspect() {
-		this(5);
-	}
-	
-	public WriteQueueAspect(int threads) {
-		executer = new ThreadPoolExecutor(threads, threads, 60,
-				TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), Executors
-						.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
-	}
-	
-	
-	/**
-	 * Handle a 'get by T2Reference' operation on a Dao
-	 * 
-	 * @param pjp
-	 *            the join point representing the ongoing method call to the dao
-	 * @return the entity identified by the T2Reference supplied to the method
-	 *         to which this advice applies
-	 * @throws DaoException
-	 *             if anything goes wrong
-	 */
-	public final Identified getObject(final ProceedingJoinPoint pjp)
-			throws DaoException {
-
-		Identified result = null;
-
-		// Get the T2Reference from the argument to the get method
-		T2Reference id = (T2Reference) pjp.getArgs()[0];
-		if (id != null) {
-			// try the cache
-			SoftReference<Identified> ref = cache.get(id);
-			if (ref != null) {
-				result = ref.get();
-			}
-			if (result == null) {
-				// not in the cache, check if it's still in the write queue
-				result = store.get(id);				
-			}
-		}
-		// If we miss the cache then call the method as usual
-		if (result == null) {
-			try {
-				result = (Identified) pjp.proceed();
-				if (result != null) {
-					cache.put(id, new SoftReference<Identified>(result));
-				}
-			} catch (Throwable e) {
-				if (e instanceof DaoException) {
-					throw ((DaoException) e);
-				} else {
-					throw new DaoException(
-							"Unexpected exception type during aspect "
-							+ "based invocation", e);
-				}
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Called around a write or update operation on the backing store, writes
-	 * through to the cache after modifying the state of the backing store and
-	 * before returning from the dao method
-	 * 
-	 * @param pjp
-	 *            join point representing the ongoing method invocation to cache
-	 * @throws DaoException
-	 *             if anything goes wrong
-	 */
-	public void putObject(final ProceedingJoinPoint pjp) throws DaoException {
-
-		// Get the Identified being stored by the method we're advising
-		final Identified storedObject = (Identified) pjp.getArgs()[0];
-
-		Runnable task = new Runnable() {
-
-			public void run() {
-				try {
-					// Run the store or update method
-					pjp.proceed();
-					store.remove(storedObject.getId());
-				} catch (Throwable e) {
-					if (e instanceof DaoException) {
-						throw ((DaoException) e);
-					} else {
-						throw new DaoException(
-								"Unexpected exception type during aspect "
-										+ "based invocation", e);
-					}
-				}
-			}
-			
-		};
-		
-		cache.put(storedObject.getId(), new SoftReference<Identified>(storedObject));
-		store.put(storedObject.getId(), storedObject);
-		executer.execute(task);
-	}
-	
-	public int cacheSize() {
-		return executer.getActiveCount() + executer.getQueue().size();
-	}
-	
-}
diff --git a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/package.html b/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/package.html
deleted file mode 100644
index 79e0107..0000000
--- a/trunk/reference-impl/src/main/java/net/sf/taverna/t2/reference/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<body>
-Implementation of the reference manager APIs backed by Hibernate. These
-classes are intended to be used with Spring, so have their dependencies
-injected through set methods rather than constructor arguments.
-</body>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.h3.HibernateComponentClass b/trunk/reference-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.h3.HibernateComponentClass
deleted file mode 100644
index b7b5d58..0000000
--- a/trunk/reference-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.h3.HibernateComponentClass
+++ /dev/null
@@ -1,2 +0,0 @@
-net.sf.taverna.t2.reference.impl.T2ReferenceImpl
-net.sf.taverna.t2.reference.impl.StackTraceElementBeanImpl
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.h3.HibernateMappedEntity b/trunk/reference-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.h3.HibernateMappedEntity
deleted file mode 100644
index ddf2cc5..0000000
--- a/trunk/reference-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.h3.HibernateMappedEntity
+++ /dev/null
@@ -1,3 +0,0 @@
-net.sf.taverna.t2.reference.impl.ReferenceSetImpl
-net.sf.taverna.t2.reference.impl.T2ReferenceListImpl
-net.sf.taverna.t2.reference.impl.ErrorDocumentImpl
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/META-INF/spring.handlers b/trunk/reference-impl/src/main/resources/META-INF/spring.handlers
deleted file mode 100644
index 462f844..0000000
--- a/trunk/reference-impl/src/main/resources/META-INF/spring.handlers
+++ /dev/null
@@ -1 +0,0 @@
-http\://taverna.sf.net/schema/artifact-support=net.sf.taverna.platform.spring.ArtifactSupportNamespaceHandler
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/META-INF/spring.schemas b/trunk/reference-impl/src/main/resources/META-INF/spring.schemas
deleted file mode 100644
index a4a0513..0000000
--- a/trunk/reference-impl/src/main/resources/META-INF/spring.schemas
+++ /dev/null
@@ -1 +0,0 @@
-http\://taverna.sf.net/schema/artifact-support/artifact-support.xsd=artifact-support.xsd
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/artifact-support.xsd b/trunk/reference-impl/src/main/resources/artifact-support.xsd
deleted file mode 100644
index 9fd6891..0000000
--- a/trunk/reference-impl/src/main/resources/artifact-support.xsd
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<xsd:schema xmlns="http://taverna.sf.net/schema/artifact-support"
-	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-	xmlns:beans="http://www.springframework.org/schema/beans"
-	targetNamespace="http://taverna.sf.net/schema/artifact-support"
-	elementFormDefault="qualified">
-
-	<xsd:import namespace="http://www.springframework.org/schema/beans" />
-
-	<xsd:attribute name="artifact" type="xsd:string" />
-	<xsd:attribute name="repository" type="xsd:string" />
-
-	<xsd:element name="repository">
-		<xsd:complexType>
-			<xsd:complexContent>
-				<xsd:extension base="beans:identifiedType">
-					<xsd:all>
-						<xsd:element ref="system" />
-						<xsd:element ref="repositories" />
-					</xsd:all>
-					<xsd:attribute name="base" type="xsd:string"
-						use="required" />
-				</xsd:extension>
-			</xsd:complexContent>
-		</xsd:complexType>
-	</xsd:element>
-
-	<xsd:element name="system">
-		<xsd:complexType>
-			<xsd:sequence maxOccurs="unbounded" minOccurs="0">
-				<xsd:element ref="sys" />
-			</xsd:sequence>
-		</xsd:complexType>
-	</xsd:element>
-
-	<xsd:element name="sys">
-		<xsd:complexType>
-			<xsd:attribute name="artifact" type="xsd:string" use="required"/>
-		</xsd:complexType>
-	</xsd:element>
-
-	<xsd:element name="repositories">
-		<xsd:complexType>
-			<xsd:sequence maxOccurs="unbounded" minOccurs="0">
-				<xsd:element ref="rep" />
-			</xsd:sequence>
-		</xsd:complexType>
-	</xsd:element>
-
-	<xsd:element name="rep">
-		<xsd:complexType>
-			<xsd:attribute name="url" type="xsd:anyURI" use="required" />
-		</xsd:complexType>
-	</xsd:element>
-
-
-</xsd:schema>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.hbm.xml b/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.hbm.xml
deleted file mode 100644
index 0bf7bba..0000000
--- a/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.hbm.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for ErrorDocumentImpl -->
-<hibernate-mapping>
-	<class name="net.sf.taverna.t2.reference.impl.ErrorDocumentImpl"
-		abstract="false">
-		<id name="internalId" column="id" type="string"/>
-		<!--  Composite key constructed from the namespace and local -->
-		<!--  parts of the T2Reference implementation type           -->
-		<component name="typedId"
-			class="net.sf.taverna.t2.reference.impl.T2ReferenceImpl">
-			<property name="namespacePart" />
-			<property name="localPart" />
-			<property name="containsErrors"/>
-			<property name="depth"/>
-			<property name="referenceType"/>
-		</component>
-		<property name="message" length="10000"/>
-		<property name="exceptionMessage" length="10000"/>
-		<list name="stackTraceList" cascade="all" lazy="false">
-			<key column="id" not-null="true"/>
-			<list-index column="i" base="0" />
-			<composite-element
-				class="net.sf.taverna.t2.reference.impl.StackTraceElementBeanImpl">
-				<property name="fileName" />
-				<property name="className" />
-				<property name="methodName" />
-				<property name="lineNumber" />
-			</composite-element>
-		</list>
-		<set name="errorReferenceSet" cascade="all" lazy="false">
-			<key column="id" not-null="true"/>
-			<composite-element
-				class="net.sf.taverna.t2.reference.impl.T2ReferenceImpl">
-				<property name="namespacePart" />
-				<property name="localPart" />
-				<property name="containsErrors"/>
-				<property name="depth"/>
-				<property name="referenceType"/>
-			</composite-element>
-		</set>
-	</class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/ReferenceSetImpl.hbm.xml b/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/ReferenceSetImpl.hbm.xml
deleted file mode 100644
index 715f002..0000000
--- a/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/ReferenceSetImpl.hbm.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for ReferenceSetImpl -->
-<hibernate-mapping>
-	<class name="net.sf.taverna.t2.reference.impl.ReferenceSetImpl"
-		abstract="false" lazy="false">
-		<id name="internalId" column="id" type="string"
-			unsaved-value="null" />
-			
-		<!--  Composite key constructed from the namespace and local -->
-		<!--  parts of the T2Reference implementation type, used as  -->
-		<!--  the foreign key in the one to many relationship with   -->
-		<!--  extensions of AbstractExternalReference                -->
-		
-		<component name="typedId"
-			class="net.sf.taverna.t2.reference.impl.T2ReferenceImpl">
-			<property name="namespacePart" />
-			<property name="localPart" />
-			<property name="containsErrors" />
-			<property name="depth" />
-			<property name="referenceType" />
-		</component>
-		<set name="externalReferences" cascade="all" lazy="false">
-			<key column="id" />
-			<one-to-many
-				class="net.sf.taverna.t2.reference.AbstractExternalReference" />
-		</set>
-		
-	</class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.hbm.xml b/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.hbm.xml
deleted file mode 100644
index 3db2e9f..0000000
--- a/trunk/reference-impl/src/main/resources/net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.hbm.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for T2ReferenceListImpl, used by HibernateListDao -->
-<hibernate-mapping>
-	<class name="net.sf.taverna.t2.reference.impl.T2ReferenceListImpl"
-		abstract="false">
-		<id name="internalId" column="id" type="string"/>
-		<!--  Composite key constructed from the namespace and local -->
-		<!--  parts of the T2Reference implementation type, used as  -->
-		<!--  the foreign key in the one to many relationship with   -->
-		<!--  extensions of AbstractExternalReference                -->
-		<component name="typedId"
-			class="net.sf.taverna.t2.reference.impl.T2ReferenceImpl">
-			<property name="namespacePart" />
-			<property name="localPart" />
-			<property name="containsErrors" />
-			<property name="depth" />
-			<property name="referenceType" />
-		</component>
-		<list name="listContents" cascade="all" lazy="false">
-			<key column="id"/>
-			<list-index column="i" base="0" />
-			<composite-element
-				class="net.sf.taverna.t2.reference.impl.T2ReferenceImpl">
-				<!-- Explicit column mapping otherwise we colide with the implict -->
-				<!-- mapping used in the key columns. Oh the joys of composites.. -->
-				<property name="namespacePart" column="c_namespace" />
-				<property name="localPart" column="c_local" />
-				<property name="containsErrors" column="c_errors" />
-				<property name="depth" column="c_depth" />
-				<property name="referenceType" column="c_type" />
-			</composite-element>
-		</list>
-	</class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/platform/spring/PropertyInterpolatorTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/platform/spring/PropertyInterpolatorTest.java
deleted file mode 100644
index fd97074..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/platform/spring/PropertyInterpolatorTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring;
-
-import static net.sf.taverna.platform.spring.PropertyInterpolator.interpolate;
-import static org.junit.Assert.assertEquals;
-
-import java.util.Properties;
-
-import org.junit.Test;
-
-/**
- * Test case for the property interpolator, mostly because java regex is evil
- * 
- * @author Tom Oinn
- * 
- */
-public class PropertyInterpolatorTest {
-
-	static Properties exampleProperties() {
-		Properties props = new Properties();
-		props.put("a", "x");
-		props.put("a.b", "xy");
-		return props;
-	}
-
-	@Test
-	public void testInterpolation() {
-		assertEquals(interpolate("${a}", exampleProperties()), "x");
-		assertEquals(interpolate("foo ${a} bar", exampleProperties()),
-				"foo x bar");
-		assertEquals(interpolate("foo ${a}${a.b} bar", exampleProperties()),
-				"foo xxy bar");
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/platform/spring/jdbc/TemporaryJDBCTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/platform/spring/jdbc/TemporaryJDBCTest.java
deleted file mode 100644
index 449f2b6..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/platform/spring/jdbc/TemporaryJDBCTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.platform.spring.jdbc;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-
-import org.junit.Test;
-
-/**
- * Test {@link TemporaryJDBC}
- * 
- * @author Stian Soiland-Reyes
- *
- */
-public class TemporaryJDBCTest {
-
-	private static final String DB = ".db";
-	private static final String T2PLATFORM = "t2platform-";
-	private static final String CREATE_TRUE = ";create=true";
-	private static final String JDBC_DERBY = "jdbc:derby:";
-
-	@Test
-	public void getDerby() throws Exception {
-		TemporaryJDBC temporaryJDBC = new TemporaryJDBC();
-		String jdbcURL = temporaryJDBC.getTemporaryDerbyJDBC();
-		assertTrue("Not a Derby URL", jdbcURL.startsWith(JDBC_DERBY));
-		String url = jdbcURL.split(JDBC_DERBY)[1];
-		assertTrue("Did not end with " + CREATE_TRUE, url.endsWith(CREATE_TRUE));
-		String location = url.split(CREATE_TRUE)[0];
-		assertFalse("Location was an empty string", location.equals(""));
-		File locationFile = new File(location);
-		assertFalse("File already exists: " + locationFile, locationFile.exists());
-		File parentFile = locationFile.getParentFile();
-		assertTrue("Parent directory did not exist", parentFile.isDirectory());
-		assertTrue("Did not end with " + T2PLATFORM, parentFile.getName().startsWith(T2PLATFORM));
-		assertTrue("Did not start with " + DB , parentFile.getName().endsWith(DB));
-	}
-	
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/DatabaseSetupTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/DatabaseSetupTest.java
deleted file mode 100644
index cfbf51a..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/DatabaseSetupTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.reference.impl;
-
-import java.util.HashSet;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-/**
- * Tests initialization of the Derby database and Hibernate ORM system
- * 
- * @author Tom Oinn
- */
-public class DatabaseSetupTest {
-
-	@Test
-	public void testListStorage() {
-		ApplicationContext context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-		ListDao o = (ListDao) context.getBean("testListDao");
-		T2ReferenceImpl listReference = new T2ReferenceImpl();
-		listReference.setContainsErrors(false);
-		listReference.setDepth(1);
-		listReference.setLocalPart("list1");
-		listReference.setNamespacePart("testNamespace");
-		listReference.setReferenceType(T2ReferenceType.IdentifiedList);
-
-		T2ReferenceListImpl l = new T2ReferenceListImpl();
-
-		T2ReferenceImpl itemId1 = new T2ReferenceImpl();
-		itemId1.setNamespacePart("testNamespace");
-		itemId1.setLocalPart("item1");
-		T2ReferenceImpl itemId2 = new T2ReferenceImpl();
-		itemId2.setNamespacePart("testNamespace");
-		itemId2.setLocalPart("item2");
-
-		l.add(itemId1);
-		l.add(itemId2);
-
-		l.setTypedId(listReference);
-
-		System.out.println(l);
-
-		o.store(l);
-
-		T2ReferenceImpl listReference2 = new T2ReferenceImpl();
-		listReference2.setContainsErrors(false);
-		listReference2.setDepth(1);
-		listReference2.setLocalPart("list1");
-		listReference2.setNamespacePart("testNamespace");
-		listReference2.setReferenceType(T2ReferenceType.IdentifiedList);
-
-		System.out.println(o.get(listReference2));
-
-	}
-
-	@SuppressWarnings("serial")
-	@Test
-	public void testDatabaseReadWriteWithoutPlugins() {
-		ApplicationContext context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-		ReferenceSetDao o = (ReferenceSetDao) context
-				.getBean("testDao");
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setNamespacePart("testNamespace");
-		id.setLocalPart("testLocal");
-		ReferenceSetImpl rs = new ReferenceSetImpl(
-				new HashSet<ExternalReferenceSPI>(), id);
-		o.store(rs);
-		
-		
-		// Retrieve with a new instance of an anonymous subclass of
-		// ReferenceSetT2ReferenceImpl, just to check that hibernate can cope
-		// with this. It can, but this *must* be a subclass of the registered
-		// component type, which means we need to modify the component type to
-		// be the fully generic T2Reference with all fields accessed via
-		// properties.
-		T2Reference newReference = new T2ReferenceImpl() {
-
-			public boolean containsErrors() {
-				return false;
-			}
-
-			public int getDepth() {
-				return 0;
-			}
-
-			public String getLocalPart() {
-				return "testLocal";
-			}
-
-			public String getNamespacePart() {
-				return "testNamespace";
-			}
-
-		};
-
-		
-		ReferenceSet returnedset = o.get(newReference);
-		Assert.assertNotNull(returnedset.getId());
-
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ErrorDocumentDaoTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ErrorDocumentDaoTest.java
deleted file mode 100644
index b3a4235..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ErrorDocumentDaoTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package net.sf.taverna.t2.reference.impl;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.reference.ErrorDocumentDao;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class ErrorDocumentDaoTest {
-	
-	private ApplicationContext context;
-
-	@Before
-	public void setup() throws Exception {
-		context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-	}
-	
-	@Test
-	public void store() throws Exception {
-		ErrorDocumentDao dao = (ErrorDocumentDao) context.getBean("testErrorDao");
-		ErrorDocumentImpl doc = new ErrorDocumentImpl();
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setReferenceType(T2ReferenceType.ErrorDocument);
-		id.setDepth(0);
-		id.setContainsErrors(true);
-		id.setNamespacePart("testNamespace");		
-		id.setLocalPart("testLocal");
-		
-		doc.setExceptionMessage("An exception");		
-		
-		T2ReferenceImpl typedId = T2ReferenceImpl.getAsImpl(id);
-		
-		doc.setTypedId(typedId);
-		
-		dao.store(doc);
-		assertNotNull(dao.get(id));	
-	}
-	
-	/**
-	 * Tests that .get returns null when its missing, rather than throw an exception
-	 */
-	@Test
-	public void getMissingItemReturnsNull() {
-		ErrorDocumentDao dao = (ErrorDocumentDao) context.getBean("testErrorDao");
-		ErrorDocumentImpl doc = new ErrorDocumentImpl();
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setReferenceType(T2ReferenceType.ErrorDocument);
-		id.setDepth(0);
-		id.setContainsErrors(true);
-		id.setNamespacePart("testNamespace");		
-		id.setLocalPart("testLocal");
-		
-		doc.setExceptionMessage("An exception");		
-		
-		T2ReferenceImpl typedId = T2ReferenceImpl.getAsImpl(id);
-		
-		doc.setTypedId(typedId);
-		assertNull(dao.get(id));	
-	}
-	
-	@Test
-	public void delete() throws Exception {
-		ErrorDocumentDao dao = (ErrorDocumentDao) context.getBean("testErrorDao");
-		ErrorDocumentImpl doc = new ErrorDocumentImpl();
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setReferenceType(T2ReferenceType.ErrorDocument);
-		id.setDepth(0);
-		id.setContainsErrors(true);
-		id.setNamespacePart("testNamespace");		
-		id.setLocalPart("testLocal");
-		
-		doc.setExceptionMessage("An exception");		
-		
-		T2ReferenceImpl typedId = T2ReferenceImpl.getAsImpl(id);
-		
-		doc.setTypedId(typedId);
-		
-		dao.store(doc);
-		assertNotNull(dao.get(id));
-		
-		assertTrue(dao.delete(doc));		
-		assertNull(dao.get(id));	
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ErrorDocumentServiceTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ErrorDocumentServiceTest.java
deleted file mode 100644
index bce9d14..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ErrorDocumentServiceTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.sf.taverna.t2.reference.impl;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.reference.ErrorDocument;
-import net.sf.taverna.t2.reference.ErrorDocumentDao;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class ErrorDocumentServiceTest {
-	
-	private ApplicationContext context;
-	private ErrorDocumentServiceImpl service;
-
-	@Before
-	public void setup() throws Exception {
-		context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-		service = new ErrorDocumentServiceImpl();
-		service.setErrorDao((ErrorDocumentDao)context.getBean("testErrorDao"));
-		service.setT2ReferenceGenerator(new SimpleT2ReferenceGenerator());
-		
-	}
-	
-	@Test
-	public void delete() throws Exception {
-		ErrorDocument doc = service.registerError("Fred", 0);
-		assertNotNull(service.getError(doc.getId()));
-		assertTrue(service.delete(doc.getId()));
-		assertNull(service.getError(doc.getId()));
-		assertFalse(service.delete(doc.getId()));
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ListServiceTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ListServiceTest.java
deleted file mode 100644
index c7735df..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ListServiceTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.sf.taverna.t2.reference.impl;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.T2Reference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class ListServiceTest {
-	
-	private ApplicationContext context;
-	private ListServiceImpl service;
-
-	@Before
-	public void setup() throws Exception {
-		context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-		service = new ListServiceImpl();
-		service.setListDao((ListDao)context.getBean("testListDao"));
-		service.setT2ReferenceGenerator(new SimpleT2ReferenceGenerator());		
-	}
-	
-	@Test
-	public void delete() throws Exception {
-		IdentifiedList<T2Reference> list =service.registerEmptyList(1);
-		assertNotNull(service.getList(list.getId()));
-		assertTrue(service.delete(list.getId()));
-		assertNull(service.getList(list.getId()));
-		assertFalse(service.delete(list.getId()));
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ReferenceSetDaoTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ReferenceSetDaoTest.java
deleted file mode 100644
index 88c4949..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ReferenceSetDaoTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package net.sf.taverna.t2.reference.impl;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class ReferenceSetDaoTest {
-
-	private ApplicationContext context;
-
-	@Before
-	public void setup() throws Exception {
-		context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-	}
-
-	@Test
-	@Ignore
-	public void testStore() throws Exception {
-		ReferenceSetDao dao = (ReferenceSetDao) context.getBean("testDao");
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setNamespacePart("testNamespace");		
-		id.setLocalPart("testLocal");
-		ReferenceSetImpl rs = new ReferenceSetImpl(
-				new HashSet<ExternalReferenceSPI>(), id);
-		dao.store(rs);
-		assertNotNull(dao.get(id));
-	}
-	
-	@Test
-	@Ignore
-	public void testDelete() throws Exception {
-		ReferenceSetDao dao = (ReferenceSetDao) context.getBean("testDao");
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setNamespacePart("testNamespace");
-		id.setLocalPart("testLocal");
-		ReferenceSetImpl rs = new ReferenceSetImpl(
-				new HashSet<ExternalReferenceSPI>(), id);		
-		dao.store(rs);
-		assertNotNull(dao.get(id));
-		assertTrue(dao.delete(rs));
-		assertNull(dao.get(id));
-	}
-	
-	/**
-	 * Tests that .get returns null when its missing, rather than throw an exception
-	 */
-	@Test
-	@Ignore
-	public void getMissingItemReturnsNull() {
-		ReferenceSetDao dao = (ReferenceSetDao) context.getBean("testDao");
-		T2ReferenceImpl id = new T2ReferenceImpl();
-		id.setNamespacePart("testNamespace");		
-		id.setLocalPart("testLocal");
-		ReferenceSetImpl rs = new ReferenceSetImpl(
-				new HashSet<ExternalReferenceSPI>(), id);
-		assertNull(dao.get(id));
-		
-	}
-		
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ReferenceSetServiceTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ReferenceSetServiceTest.java
deleted file mode 100644
index bde4ccd..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/ReferenceSetServiceTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package net.sf.taverna.t2.reference.impl;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-
-import net.sf.taverna.t2.reference.ReferenceSet;
-import net.sf.taverna.t2.reference.ReferenceSetDao;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class ReferenceSetServiceTest {
-	
-	private ApplicationContext context;
-	private ReferenceSetServiceImpl service;
-
-	@Before
-	public void setup() throws Exception {
-		context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-		service = new ReferenceSetServiceImpl();
-		service.setReferenceSetDao((ReferenceSetDao)context.getBean("testDao"));
-		service.setT2ReferenceGenerator(new SimpleT2ReferenceGenerator());		
-	}
-	
-	@Test
-	public void delete() throws Exception {
-		ReferenceSet set = service.registerReferenceSet(new HashSet());
-		assertNotNull(service.getReferenceSet(set.getId()));
-		assertTrue(service.delete(set.getId()));
-		assertNull(service.getReferenceSet(set.getId()));
-		assertFalse(service.delete(set.getId()));
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/RefererenceListDaoTest.java b/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/RefererenceListDaoTest.java
deleted file mode 100644
index e526a88..0000000
--- a/trunk/reference-impl/src/test/java/net/sf/taverna/t2/reference/impl/RefererenceListDaoTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package net.sf.taverna.t2.reference.impl;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.reference.ListDao;
-import net.sf.taverna.t2.reference.T2ReferenceType;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class RefererenceListDaoTest {
-	
-	private ApplicationContext context;
-
-	@Before
-	public void setup() throws Exception {
-		context = new ClassPathXmlApplicationContext(
-				"vanillaHibernateAppContext.xml");
-	}
-	
-	@Test
-	public void store() throws Exception {
-		ListDao dao = (ListDao)context.getBean("testListDao");
-		T2ReferenceImpl r = new T2ReferenceImpl();
-		r.setNamespacePart("testNamespace");
-		r.setLocalPart("testLocal");
-		r.setReferenceType(T2ReferenceType.IdentifiedList);
-		r.setDepth(0);
-		r.setContainsErrors(false);
-		T2ReferenceListImpl newList = new T2ReferenceListImpl();
-		newList.setTypedId(r);
-		dao.store(newList);
-		assertNotNull(dao.get(r));		
-	}
-	
-	/**
-	 * Tests that .get returns null when its missing, rather than throw an exception
-	 */
-	@Test
-	public void getMissingItemReturnsNull() {
-		ListDao dao = (ListDao)context.getBean("testListDao");
-		T2ReferenceImpl r = new T2ReferenceImpl();
-		r.setNamespacePart("testNamespace");
-		r.setLocalPart("testLocal");
-		r.setReferenceType(T2ReferenceType.IdentifiedList);
-		r.setDepth(0);
-		r.setContainsErrors(false);
-		T2ReferenceListImpl newList = new T2ReferenceListImpl();
-		newList.setTypedId(r);
-		assertNull(dao.get(r));
-	}
-	
-	@Test
-	public void delete() throws Exception {
-		ListDao dao = (ListDao)context.getBean("testListDao");
-		T2ReferenceImpl r = new T2ReferenceImpl();
-		r.setNamespacePart("testNamespace");
-		r.setLocalPart("testLocal");
-		r.setReferenceType(T2ReferenceType.IdentifiedList);
-		r.setDepth(0);
-		r.setContainsErrors(false);
-		T2ReferenceListImpl newList = new T2ReferenceListImpl();
-		newList.setTypedId(r);
-		dao.store(newList);
-		assertNotNull(dao.get(r));	
-		assertTrue(dao.delete(newList));
-		assertNull(dao.get(r));		
-	}
-
-}
diff --git a/trunk/reference-impl/src/test/resources/commons-logging.properties b/trunk/reference-impl/src/test/resources/commons-logging.properties
deleted file mode 100644
index 9a27a97..0000000
--- a/trunk/reference-impl/src/test/resources/commons-logging.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# Force use of Log4J based logging
-org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
\ No newline at end of file
diff --git a/trunk/reference-impl/src/test/resources/log4j.xml b/trunk/reference-impl/src/test/resources/log4j.xml
deleted file mode 100644
index f1f4d5e..0000000
--- a/trunk/reference-impl/src/test/resources/log4j.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-
-<!-- Default Log4J configuration for integration test module -->
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern"
-				value="%p - %C{1}.%M(%L) | %m%n" />
-		</layout>
-	</appender>
-
-	<logger name="net.sf.taverna.platform.spring.orm">
-		<level value="TRACE" />
-	</logger>
-
-	<logger name="net.sf.taverna.platform.spring">
-		<level value="INFO" />
-	</logger>
-
-	<logger name="org.hibernate">
-		<level value="ERROR" />
-	</logger>
-	
-	<!-- 
-		<logger name="org.hibernate.SQL">
-		<level value="TRACE" />
-		</logger>
-		<logger name="org.hibernate.type">
-		<level value="DEBUG" />
-		</logger>
-	-->
-	
-	<logger name="org.springframework">
-		<level value="WARN" />
-	</logger>
-
-	<root>
-		<level value="ERROR" />
-		<appender-ref ref="CONSOLE" />
-	</root>
-
-</log4j:configuration>
\ No newline at end of file
diff --git a/trunk/reference-impl/src/test/resources/vanillaHibernateAppContext.xml b/trunk/reference-impl/src/test/resources/vanillaHibernateAppContext.xml
deleted file mode 100644
index a07897d..0000000
--- a/trunk/reference-impl/src/test/resources/vanillaHibernateAppContext.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- A test context with no raven aware components used by the DatabaseSetupTest -->
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:raven="http://taverna.sf.net/schema/artifact-support"
-	xmlns:aop="http://www.springframework.org/schema/aop"
-	xmlns:tx="http://www.springframework.org/schema/tx"
-	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
-		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
-        http://www.springframework.org/schema/context
-        http://www.springframework.org/schema/context/spring-context-2.5.xsd
-        http://www.springframework.org/schema/tx 
-        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
-
-	<!-- Transaction manager, commented out to use the regular dao implementations -->
-	<!-- 
-		<tx:annotation-driven transaction-manager="txManager" />
-		<bean id="txManager"
-		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
-		<property name="sessionFactory" ref="sessionFactoryBean" />
-		</bean>
-	-->
-
-
-	<!-- Apache Derby rooted at a temporary directory -->
-	<bean id="t2reference.jdbc.temporaryjdbc"
-		class="net.sf.taverna.platform.spring.jdbc.TemporaryJDBC">
-	</bean>
-	<bean id="t2reference.jdbc.url" class="java.lang.String"
-		factory-bean="t2reference.jdbc.temporaryjdbc"
-		factory-method="getTemporaryDerbyJDBC" />
-
-	<!-- At least for testing purposes we use Apache Derby -->
-	<bean id="exampleDataSource"
-		class="net.sf.taverna.platform.spring.jdbc.InterpolatingDriverManagerDataSource">
-		<property name="driverClassName">
-			<value>org.apache.derby.jdbc.EmbeddedDriver</value>
-		</property>
-		<property name="url">
-			<ref bean="t2reference.jdbc.url" />
-		</property>
-	</bean>
-
-	<!-- Configure hibernate to use dynamic schema update -->
-	<bean id="exampleHibernateProperties"
-		class="org.springframework.beans.factory.config.PropertiesFactoryBean">
-		<property name="properties">
-			<props>
-				<prop key="hibernate.hbm2ddl.auto">create</prop>
-				<prop key="hibernate.dialect">
-					org.hibernate.dialect.DerbyDialect
-				</prop>
-				<prop key="hibernate.query.substitutions">
-					true 'T', false 'F'
-				</prop>
-				<prop key="hibernate.show_sql">false</prop>
-				<prop key="hibernate.c3p0.minPoolSize">5</prop>
-				<prop key="hibernate.c3p0.maxPoolSize">20</prop>
-				<prop key="hibernate.c3p0.timeout">600</prop>
-				<prop key="hibernate.c3p0.max_statement">50</prop>
-				<prop key="hibernate.c3p0.testConnectionOnCheckout">
-					false
-				</prop>
-				<prop key="show_sql">true</prop>
-				<prop key="format_sql">true</prop>
-			</props>
-		</property>
-	</bean>
-
-	<!-- A regular hibernate session factory -->
-	<bean id="sessionFactoryBean"
-		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
-		<property name="dataSource">
-			<ref local="exampleDataSource" />
-		</property>
-		<property name="hibernateProperties">
-			<ref bean="exampleHibernateProperties" />
-		</property>
-		<property name="mappingResources">
-			<list>
-				<value>
-					net/sf/taverna/t2/reference/AbstractExternalReference.hbm.xml
-				</value>
-				<value>
-					net/sf/taverna/t2/reference/impl/ReferenceSetImpl.hbm.xml
-				</value>
-				<value>
-					net/sf/taverna/t2/reference/impl/T2ReferenceListImpl.hbm.xml
-				</value>
-				<value>
-					net/sf/taverna/t2/reference/impl/ErrorDocumentImpl.hbm.xml
-				</value>
-			</list>
-		</property>
-	</bean>
-
-	<!-- Test data access object -->
-	<bean id="testDao"
-		class="net.sf.taverna.t2.reference.impl.HibernateReferenceSetDao">
-		<property name="sessionFactory">
-			<ref local="sessionFactoryBean" />
-		</property>
-	</bean>
-
-	<!-- Test list data access object -->
-	<bean id="testListDao"
-		class="net.sf.taverna.t2.reference.impl.HibernateListDao">
-		<property name="sessionFactory">
-			<ref local="sessionFactoryBean" />
-		</property>
-	</bean>
-	
-	<!-- Test list data access object -->
-	<bean id="testErrorDao"
-		class="net.sf.taverna.t2.reference.impl.HibernateErrorDocumentDao">
-		<property name="sessionFactory">
-			<ref local="sessionFactoryBean" />
-		</property>
-	</bean>
-
-</beans>
\ No newline at end of file
diff --git a/trunk/reference-testhelpers/pom.xml b/trunk/reference-testhelpers/pom.xml
deleted file mode 100644
index 136b0f4..0000000
--- a/trunk/reference-testhelpers/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>net.sf.taverna.t2</groupId>
-		<artifactId>core</artifactId>
-		<version>0.9</version>
-	</parent>
-	<groupId>net.sf.taverna.t2.core</groupId>
-	<artifactId>reference-testhelpers</artifactId>
-
-	<name>T2reference dummy implementations for testing</name>
-
-	<description>
-		In order to properly test the raven-aware functionality within
-		the t2reference modules we need a module that is entire external
-		to t2reference and to the test cases. If the test
-		implementations are included in either the api, core
-		implementation or test modules they will be loaded by the root
-		classloader of the test runner - by putting them in an
-		independent artifact we allow them to be loaded through raven's
-		various SPI discovery mechanisms as they would be in a 'real'
-		environment.
-	</description>
-
-	<dependencies>
-		<!-- Only depend on the t2reference API package here -->
-		<dependency>
-			<groupId>net.sf.taverna.t2.core</groupId>
-			<artifactId>reference-api</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-		</dependency>
-	</dependencies>
-</project>
diff --git a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/BlueReference.java b/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/BlueReference.java
deleted file mode 100644
index 0622264..0000000
--- a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/BlueReference.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2referencetest;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import net.sf.taverna.t2.reference.AbstractExternalReference;
-import net.sf.taverna.t2.reference.DereferenceException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferencedDataNature;
-
-/**
- * BlueReferences carry their data as an internal String and have a resolution
- * cost of 1.0f whatever the value of that string.
- * 
- * @author Tom Oinn
- * 
- */
-public class BlueReference extends AbstractExternalReference implements
-		ExternalReferenceSPI {
-
-	// Hold the 'value' of this reference, probably the simplest backing store
-	// possible for an ExternalReferenceSPI implementation :)
-	private String contents;
-
-	public BlueReference() {
-		//
-	}
-
-	public BlueReference(String contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Set the 'value' of this reference as a string. It's not really a
-	 * reference type in any true sense of the word, but it'll do for testing
-	 * the augmentation system. This method is really here so you can configure
-	 * test beans from spring.
-	 */
-	public void setContents(String contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Get the 'value' of this reference as a string, really just returns the
-	 * internal string representation.
-	 */
-	public String getContents() {
-		return this.contents;
-	}
-
-	/**
-	 * Fakes a de-reference operation, returning a byte stream over the string
-	 * data.
-	 */
-	public InputStream openStream(ReferenceContext arg0) {
-		try {
-			return new ByteArrayInputStream(this.contents
-					.getBytes(getCharset()));
-		} catch (UnsupportedEncodingException e) {
-			throw new DereferenceException(e);
-		}
-	}
-
-	/**
-	 * Default resolution cost of 1.0f whatever the contents
-	 */
-	@Override
-	public float getResolutionCost() {
-		return 1.0f;
-	}
-
-	/**
-	 * Data nature set to 'ReferencedDataNature.TEXT'
-	 */
-	@Override
-	public ReferencedDataNature getDataNature() {
-		return ReferencedDataNature.TEXT;
-	}
-
-	/**
-	 * Character encoding set to 'UTF-8'
-	 */
-	@Override
-	public String getCharset() {
-		return "UTF-8";
-	}
-
-	/**
-	 * String representation for testing, returns <code>blue{CONTENTS}</code>
-	 */
-	@Override
-	public String toString() {
-		return "blue{" + contents + "}";
-	}
-
-}
diff --git a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenBuilder.java b/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenBuilder.java
deleted file mode 100644
index 14e9d63..0000000
--- a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenBuilder.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2referencetest;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-import net.sf.taverna.t2.reference.ExternalReferenceBuilderSPI;
-import net.sf.taverna.t2.reference.ExternalReferenceConstructionException;
-import net.sf.taverna.t2.reference.ReferenceContext;
-
-import org.apache.log4j.Logger;
-
-/**
- * Trivially build a GreenReference from an InputStream, implementing the
- * ExternalReferenceBuilderSPI interface. Used in the augmentation test cases.
- * 
- * @author Tom Oinn
- * 
- */
-public class GreenBuilder implements
-		ExternalReferenceBuilderSPI<GreenReference> {
-
-	private static Logger logger = Logger
-	.getLogger(GreenBuilder.class);
-
-	/**
-	 * Construct a new GreenReference from the given input stream, ignoring the
-	 * otherwise helpful context as we don't need any resources from it. We
-	 * assume UTF-8 encoding as that's what all the test reference types use,
-	 * again, with a real example this might have to be a bit smarter!
-	 * 
-	 * @throws ExternalReferenceConstructionException
-	 *             if there are any issues building the new GreenReference
-	 *             (which there won't be)
-	 */
-	public GreenReference createReference(InputStream is,
-			ReferenceContext context)
-			throws ExternalReferenceConstructionException {
-		GreenReference newReference = new GreenReference();
-		// Read input stream into the 'contents' property of the reference
-		BufferedReader in = new BufferedReader(new InputStreamReader(is));
-		try {
-			newReference.setContents(in.readLine());
-		} catch (IOException e) {
-			throw new ExternalReferenceConstructionException(e);
-		} finally {
-			try {
-				is.close();
-				in.close();
-			} catch (IOException e) {
-				logger.error("Unable to close streams", e);
-			}
-		}
-		return newReference;
-	}
-
-	/**
-	 * Construction cost fixed at 1.5f
-	 * 
-	 * @return <code>1.5f</code>
-	 */
-	public float getConstructionCost() {
-		return 1.5f;
-	}
-
-	/**
-	 * @return <code>{@link net.sf.taverna.t2referencetest.GreenReference GreenReference}.class</code>
-	 */
-	public Class<GreenReference> getReferenceType() {
-		return GreenReference.class;
-	}
-
-	/**
-	 * Doesn't use any context resources so is always enabled
-	 * 
-	 * @return <code>true</code>
-	 */
-	public boolean isEnabled(ReferenceContext arg0) {
-		return true;
-	}
-
-}
diff --git a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenReference.java b/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenReference.java
deleted file mode 100644
index f5fa1ad..0000000
--- a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenReference.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2referencetest;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import net.sf.taverna.t2.reference.AbstractExternalReference;
-import net.sf.taverna.t2.reference.DereferenceException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferencedDataNature;
-
-/**
- * GreenReferences carry their data as an internal String and have a resolution
- * cost of 1.1f whatever the value of that string.
- * 
- * @author Tom Oinn
- * 
- */
-public class GreenReference extends AbstractExternalReference implements
-		ExternalReferenceSPI {
-
-	// Hold the 'value' of this reference, probably the simplest backing store
-	// possible for an ExternalReferenceSPI implementation :)
-	private String contents;
-
-	public GreenReference() {
-		//
-	}
-	
-	public GreenReference(String contents) {
-		this.contents = contents;
-	}
-	
-	/**
-	 * Set the 'value' of this reference as a string. It's not really a
-	 * reference type in any true sense of the word, but it'll do for testing
-	 * the augmentation system. This method is really here so you can configure
-	 * test beans from spring. 
-	 */
-	public void setContents(String contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Get the 'value' of this reference as a string, really just returns the
-	 * internal string representation.
-	 */
-	public String getContents() {
-		return this.contents;
-	}
-
-	/**
-	 * Fakes a de-reference operation, returning a byte stream over the string
-	 * data.
-	 */
-	public InputStream openStream(ReferenceContext arg0) {
-		try {
-			return new ByteArrayInputStream(this.contents
-					.getBytes(getCharset()));
-		} catch (UnsupportedEncodingException e) {
-			throw new DereferenceException(e);
-		}
-	}
-
-	/**
-	 * Default resolution cost of 1.0f whatever the contents
-	 */
-	@Override
-	public float getResolutionCost() {
-		return 1.1f;
-	}
-
-	/**
-	 * Data nature set to 'ReferencedDataNature.TEXT'
-	 */
-	@Override
-	public ReferencedDataNature getDataNature() {
-		return ReferencedDataNature.TEXT;
-	}
-
-	/**
-	 * Character encoding set to 'UTF-8'
-	 */
-	@Override
-	public String getCharset() {
-		return "UTF-8";
-	}
-
-	/**
-	 * String representation for testing, returns <code>green{CONTENTS}</code>
-	 */
-	@Override
-	public String toString() {
-		return "green{" + contents + "}";
-	}
-
-
-}
diff --git a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenToRed.java b/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenToRed.java
deleted file mode 100644
index 52d9eb1..0000000
--- a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/GreenToRed.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2referencetest;
-
-import net.sf.taverna.t2.reference.ExternalReferenceTranslatorSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-
-public class GreenToRed implements
-		ExternalReferenceTranslatorSPI<GreenReference, RedReference> {
-
-	public RedReference createReference(GreenReference ref,
-			ReferenceContext context) {
-		RedReference newReference = new RedReference();
-		newReference.setContents(ref.getContents());
-		// Insert a two second pause to simulate reference translation and to
-		// test the behaviour of multiple concurrent translations
-		try {
-			Thread.sleep(2000);
-		} catch (InterruptedException ie) {
-			System.out
-					.println("Translation thread was interrupted, probably something wrong.");
-		}
-		return newReference;
-	}
-
-	public Class<GreenReference> getSourceReferenceType() {
-		return GreenReference.class;
-	}
-
-	public Class<RedReference> getTargetReferenceType() {
-		return RedReference.class;
-	}
-
-	public float getTranslationCost() {
-		return 0.4f;
-	}
-
-	public boolean isEnabled(ReferenceContext arg0) {
-		return true;
-	}
-
-}
diff --git a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/RedReference.java b/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/RedReference.java
deleted file mode 100644
index dbe2d5d..0000000
--- a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/RedReference.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2referencetest;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import net.sf.taverna.t2.reference.AbstractExternalReference;
-import net.sf.taverna.t2.reference.DereferenceException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferencedDataNature;
-
-/**
- * RedReferences carry their data as an internal String and have a resolution
- * cost of 0.9f whatever the value of that string.
- * 
- * @author Tom Oinn
- * 
- */
-public class RedReference extends AbstractExternalReference implements
-		ExternalReferenceSPI {
-
-	// Hold the 'value' of this reference, probably the simplest backing store
-	// possible for an ExternalReferenceSPI implementation :)
-	private String contents;
-
-	public RedReference() {
-		//
-	}
-
-	public RedReference(String contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Set the 'value' of this reference as a string. It's not really a
-	 * reference type in any true sense of the word, but it'll do for testing
-	 * the augmentation system. This method is really here so you can configure
-	 * test beans from spring.
-	 */
-	public void setContents(String contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Get the 'value' of this reference as a string, really just returns the
-	 * internal string representation.
-	 */
-	public String getContents() {
-		return this.contents;
-	}
-
-	/**
-	 * Fakes a de-reference operation, returning a byte stream over the string
-	 * data.
-	 */
-	public InputStream openStream(ReferenceContext arg0) {
-		try {
-			return new ByteArrayInputStream(this.contents
-					.getBytes(getCharset()));
-		} catch (UnsupportedEncodingException e) {
-			throw new DereferenceException(e);
-		}
-	}
-
-	/**
-	 * Default resolution cost of 1.0f whatever the contents
-	 */
-	@Override
-	public float getResolutionCost() {
-		return 0.9f;
-	}
-
-	/**
-	 * Data nature set to 'ReferencedDataNature.TEXT'
-	 */
-	@Override
-	public ReferencedDataNature getDataNature() {
-		return ReferencedDataNature.TEXT;
-	}
-
-	/**
-	 * Character encoding set to 'UTF-8'
-	 */
-	@Override
-	public String getCharset() {
-		return "UTF-8";
-	}
-
-	/**
-	 * String representation for testing, returns <code>red{CONTENTS}</code>
-	 */
-	@Override
-	public String toString() {
-		return "red{" + contents + "}";
-	}
-
-}
diff --git a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/YellowReference.java b/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/YellowReference.java
deleted file mode 100644
index 285d767..0000000
--- a/trunk/reference-testhelpers/src/main/java/net/sf/taverna/t2referencetest/YellowReference.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2referencetest;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import net.sf.taverna.t2.reference.AbstractExternalReference;
-import net.sf.taverna.t2.reference.DereferenceException;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferencedDataNature;
-
-
-/**
- * YellowReferences carry their data as an internal String and have a resolution
- * cost of 1.0f whatever the value of that string.
- * 
- * @author Tom Oinn
- * 
- */
-public class YellowReference extends AbstractExternalReference implements
-		ExternalReferenceSPI {
-
-	// Hold the 'value' of this reference, probably the simplest backing store
-	// possible for an ExternalReferenceSPI implementation :)
-	private String contents;
-
-	public YellowReference() {
-		//
-	}
-	
-	public YellowReference(String contents) {
-		this.contents = contents;
-	}
-	
-	/**
-	 * Set the 'value' of this reference as a string. It's not really a
-	 * reference type in any true sense of the word, but it'll do for testing
-	 * the augmentation system. This method is really here so you can configure
-	 * test beans from spring.
-	 */
-	public void setContents(String contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Get the 'value' of this reference as a string, really just returns the
-	 * internal string representation.
-	 */
-	public String getContents() {
-		return this.contents;
-	}
-
-	/**
-	 * Fakes a de-reference operation, returning a byte stream over the string
-	 * data.
-	 */
-	public InputStream openStream(ReferenceContext arg0) {
-		try {
-			return new ByteArrayInputStream(this.contents
-					.getBytes(getCharset()));
-		} catch (UnsupportedEncodingException e) {
-			throw new DereferenceException(e);
-		}
-	}
-
-	/**
-	 * Default resolution cost of 1.0f whatever the contents
-	 */
-	@Override
-	public float getResolutionCost() {
-		return 1.0f;
-	}
-
-	/**
-	 * Data nature set to 'ReferencedDataNature.TEXT'
-	 */
-	@Override
-	public ReferencedDataNature getDataNature() {
-		return ReferencedDataNature.TEXT;
-	}
-
-	/**
-	 * Character encoding set to 'UTF-8'
-	 */
-	@Override
-	public String getCharset() {
-		return "UTF-8";
-	}
-
-	/**
-	 * String representation for testing, returns <code>yellow{CONTENTS}</code>
-	 */
-	@Override
-	public String toString() {
-		return "yellow{" + contents + "}";
-	}
-
-}
diff --git a/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceBuilderSPI b/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceBuilderSPI
deleted file mode 100644
index 3f1a123..0000000
--- a/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceBuilderSPI
+++ /dev/null
@@ -1,2 +0,0 @@
-# Implementation classes of ExternalReferenceBuilderSPI go here, one per line
-net.sf.taverna.t2referencetest.GreenBuilder
\ No newline at end of file
diff --git a/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI b/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI
deleted file mode 100644
index 20a63d6..0000000
--- a/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI
+++ /dev/null
@@ -1,5 +0,0 @@
-# Implementation classes of ExternalReferenceSPI go here, one per line
-net.sf.taverna.t2referencetest.GreenReference
-net.sf.taverna.t2referencetest.BlueReference
-net.sf.taverna.t2referencetest.RedReference
-net.sf.taverna.t2referencetest.YellowReference
\ No newline at end of file
diff --git a/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceTranslatorSPI b/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceTranslatorSPI
deleted file mode 100644
index 7fff1a3..0000000
--- a/trunk/reference-testhelpers/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceTranslatorSPI
+++ /dev/null
@@ -1,2 +0,0 @@
-# Implementation classes of ExternalReferenceTranslatorSPI go here, one per line
-net.sf.taverna.t2referencetest.GreenToRed
\ No newline at end of file
diff --git a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/BlueReference.hbm.xml b/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/BlueReference.hbm.xml
deleted file mode 100644
index 9483784..0000000
--- a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/BlueReference.hbm.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for blue reference bean -->
-<hibernate-mapping>
-	<joined-subclass
-		name="net.sf.taverna.t2referencetest.BlueReference"
-		extends="net.sf.taverna.t2.reference.AbstractExternalReference">
-		<!-- Link to primary key from abstract superclass -->
-		<key column="bean_id" />
-		<!-- Dummy reference specific props -->
-		<property name="contents" type="string" />
-	</joined-subclass>
-</hibernate-mapping>
-
diff --git a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/GreenReference.hbm.xml b/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/GreenReference.hbm.xml
deleted file mode 100644
index dc65151..0000000
--- a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/GreenReference.hbm.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for green reference bean -->
-<hibernate-mapping>
-	<joined-subclass
-		name="net.sf.taverna.t2referencetest.GreenReference"
-		extends="net.sf.taverna.t2.reference.AbstractExternalReference">
-		<!-- Link to primary key from abstract superclass -->
-		<key column="bean_id" />
-		<!-- Dummy reference specific props -->
-		<property name="contents" type="string" />
-	</joined-subclass>
-</hibernate-mapping>
-
diff --git a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/RedReference.hbm.xml b/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/RedReference.hbm.xml
deleted file mode 100644
index 176f60d..0000000
--- a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/RedReference.hbm.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for red reference bean -->
-<hibernate-mapping>
-	<joined-subclass
-		name="net.sf.taverna.t2referencetest.RedReference"
-		extends="net.sf.taverna.t2.reference.AbstractExternalReference">
-		<!-- Link to primary key from abstract superclass -->
-		<key column="bean_id" />
-		<!-- Dummy reference specific props -->
-		<property name="contents" type="string" />
-	</joined-subclass>
-</hibernate-mapping>
-
diff --git a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/YellowReference.hbm.xml b/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/YellowReference.hbm.xml
deleted file mode 100644
index 6f357f8..0000000
--- a/trunk/reference-testhelpers/src/main/resources/net/sf/taverna/t2referencetest/YellowReference.hbm.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Hibernate mapping for yellow reference bean -->
-<hibernate-mapping>
-	<joined-subclass
-		name="net.sf.taverna.t2referencetest.YellowReference"
-		extends="net.sf.taverna.t2.reference.AbstractExternalReference">
-		<!-- Link to primary key from abstract superclass -->
-		<key column="bean_id" />
-		<!-- Dummy reference specific props -->
-		<property name="contents" type="string" />
-	</joined-subclass>
-</hibernate-mapping>
-
diff --git a/trunk/workflowmodel-api/docs/MobyCentralCurationUseCasAggregated.uxf b/trunk/workflowmodel-api/docs/MobyCentralCurationUseCasAggregated.uxf
deleted file mode 100644
index b4411e9..0000000
--- a/trunk/workflowmodel-api/docs/MobyCentralCurationUseCasAggregated.uxf
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><umlet_diagram><help_text>//Uncomment the following line to change the fontsize:
-//fontsize=14
-
-//Welcome to UMLet!
-
-// *Double-click on UML elements to add them to the diagram.
-// *Edit element properties by modifying the text in this panel.
-// *Edit the files in the 'palettes' directory to store your own element palettes.
-// *Press Del or Backspace to remove elements from the diagram.
-// *Hold down Ctrl key to select multiple elements.
-// *Press c to copy the UML diagram to the system clipboard.
-// * This text will be stored with each diagram. Feel free to use the area for notes.
-</help_text><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>470</y><w>170</w><h>80</h></coordinates><panel_attributes>AnnotationAssertion
---
-acceptsInput 'DNASeq'
-authority = "myGrid rep"
-person = "Franck"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>30</x><y>60</y><w>130</w><h>50</h></coordinates><panel_attributes>someMobyService
---
-id = "service1"
-bg=orange</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>320</x><y>470</y><w>160</w><h>80</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = true
-authority = "myGrid rep"
-person = "Franck"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>330</y><w>190</w><h>80</h></coordinates><panel_attributes>AnnotationAssertion
---
-someUntrueFact
-authority = "MobyCentral"
-person = "Service Author X"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>320</x><y>330</y><w>160</w><h>100</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = false
-reason = ....
-authority = "myGrid rep"
-person = "Franck"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>320</x><y>230</y><w>160</w><h>80</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = true
-authority = "myGrid rep"
-person = "Franck"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>230</y><w>190</w><h>80</h></coordinates><panel_attributes>AnnotationAssertion
---
-hasTextualDescription '.....'
-authority = "MobyCentral"
-person = "Service Author X"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>130</y><w>190</w><h>80</h></coordinates><panel_attributes>AnnotationAssertion
---
-performsTask 'Alignment'
-authority = "MobyCentral"
-person = "Service Author X"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>320</x><y>130</y><w>160</w><h>80</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = true
-authority = "myGrid rep"
-person = "Franck"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Package</type><coordinates><x>20</x><y>30</y><w>470</w><h>530</h></coordinates><panel_attributes>Aggregated Annotations
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>270</x><y>320</y><w>70</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>50;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>270</x><y>220</y><w>70</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>50;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>270</x><y>120</y><w>70</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>50;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>20</x><y>90</y><w>100</w><h>410</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>80;390;20;330;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>30</x><y>90</y><w>90</w><h>270</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>70;250;20;200;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>40</x><y>90</y><w>80</w><h>170</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>60;150;20;120;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>50</x><y>90</y><w>70</w><h>70</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>50;50;20;50;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>250</x><y>460</y><w>90</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>70;20;20;20</additional_attributes></element></umlet_diagram>
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/docs/MobyCentralCurationUseCase.uxf b/trunk/workflowmodel-api/docs/MobyCentralCurationUseCase.uxf
deleted file mode 100644
index d4845a2..0000000
--- a/trunk/workflowmodel-api/docs/MobyCentralCurationUseCase.uxf
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><umlet_diagram><help_text>//Uncomment the following line to change the fontsize:
-//fontsize=14
-
-//Welcome to UMLet!
-
-// *Double-click on UML elements to add them to the diagram.
-// *Edit element properties by modifying the text in this panel.
-// *Edit the files in the 'palettes' directory to store your own element palettes.
-// *Press Del or Backspace to remove elements from the diagram.
-// *Hold down Ctrl key to select multiple elements.
-// *Press c to copy the UML diagram to the system clipboard.
-// * This text will be stored with each diagram. Feel free to use the area for notes.
-</help_text><element><type>com.umlet.element.base.Class</type><coordinates><x>340</x><y>140</y><w>170</w><h>60</h></coordinates><panel_attributes>AnnotationAssertion
---
-acceptsInput 'DNASeq'
-applies to ID "service1"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>340</x><y>300</y><w>130</w><h>70</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = true
-applies to ID "2"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>340</x><y>210</y><w>130</w><h>80</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = false
-reason = ....
-applies to ID "3"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>490</x><y>130</y><w>70</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>50;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>540</x><y>140</y><w>130</w><h>50</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = true
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>340</x><y>60</y><w>130</w><h>70</h></coordinates><panel_attributes>CurationAssertion
---
-confirmed = true
-applies to ID "1"
-bg=green</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Package</type><coordinates><x>330</x><y>30</y><w>350</w><h>350</h></coordinates><panel_attributes>myGrid Annotation Store
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>30</x><y>100</y><w>90</w><h>210</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>70;190;20;190;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>280</y><w>190</w><h>70</h></coordinates><panel_attributes>AnnotationAssertion
---
-someUntrueFact
-id = "3"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>200</y><w>190</w><h>70</h></coordinates><panel_attributes>AnnotationAssertion
---
-hasTextualDescription '.....'
-id = "2"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>100</x><y>130</y><w>170</w><h>60</h></coordinates><panel_attributes>AnnotationAssertion
---
-performsTask 'Alignment'
-id = "1"
-bg=red</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>50</x><y>100</y><w>70</w><h>60</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>50;40;20;40;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>40</x><y>100</y><w>80</w><h>130</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>60;110;20;110;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>40</x><y>70</y><w>130</w><h>50</h></coordinates><panel_attributes>someMobyService
---
-id = "service1"
-bg=orange</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Package</type><coordinates><x>20</x><y>30</y><w>280</w><h>330</h></coordinates><panel_attributes>Moby Central Annotation Store
-bg=white</panel_attributes><additional_attributes/></element></umlet_diagram>
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/docs/annotationmodel.uxf b/trunk/workflowmodel-api/docs/annotationmodel.uxf
deleted file mode 100644
index 7207eb3..0000000
--- a/trunk/workflowmodel-api/docs/annotationmodel.uxf
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><umlet_diagram><help_text>//Uncomment the following line to change the fontsize:
-//fontsize=14
-
-//Welcome to UMLet!
-
-// *Double-click on UML elements to add them to the diagram.
-// *Edit element properties by modifying the text in this panel.
-// *Edit the files in the 'palettes' directory to store your own element palettes.
-// *Press Del or Backspace to remove elements from the diagram.
-// *Hold down Ctrl key to select multiple elements.
-// *Press c to copy the UML diagram to the system clipboard.
-// * This text will be stored with each diagram. Feel free to use the area for notes.
-</help_text><element><type>com.umlet.element.base.Class</type><coordinates><x>530</x><y>70</y><w>270</w><h>120</h></coordinates><panel_attributes>/Interface : Curateable/
---
-getCreationDate : Date
-getSources : List&lt;AnnotationSourceSPI&gt;
-getCreators : List&lt;Person&gt;
-getCurations : List&lt;Curateable&gt;
-getAuthority : AnnotationAuthority
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Note</type><coordinates><x>170</x><y>250</y><w>200</w><h>130</h></coordinates><panel_attributes>Defines the resource which
-holds the annotation or
-curation assertion i.e. a
-registry, the Moby central
-or a local workflow. This is
-also the resource responsible
-for storing the curateable
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Note</type><coordinates><x>60</x><y>480</y><w>290</w><h>180</h></coordinates><panel_attributes>This is a convenience used in T2,
-for ease of coding against the model
-we allow access to the root annotations
-from a method call but in fact this isn't
-required - the annotations could be
-gathered on the fly given the ID of the
-subject of the annotations.
-
-At a conceptual level though this holds, the
-annotated object has a number of root
-annotations which apply to it.</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Note</type><coordinates><x>180</x><y>0</y><w>190</w><h>100</h></coordinates><panel_attributes>Defines the resource
-from which this annotation
-or curation was produced,
-i.e. URL, publication or
-other source of information.
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>390</x><y>100</y><w>160</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>20;20;140;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>360</x><y>320</y><w>120</w><h>150</h></coordinates><panel_attributes>lt=&lt;-
-</panel_attributes><additional_attributes>100;20;60;20;50;130;20;130</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>60</x><y>420</y><w>320</w><h>50</h></coordinates><panel_attributes>/Interface : Annotated/
---
-getRootAnnotations : List&lt;AnnotationAssertion&gt;
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>390</x><y>150</y><w>160</w><h>90</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>20;70;60;70;140;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>230</x><y>210</y><w>180</w><h>30</h></coordinates><panel_attributes>/SPI : AnnotationAuthority/
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>230</x><y>110</y><w>180</w><h>30</h></coordinates><panel_attributes>/SPI : AnnotationSourceSPI/
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>390</x><y>120</y><w>160</w><h>60</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>20;40;70;40;90;20;140;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>740</x><y>20</y><w>340</w><h>270</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>20;50;20;20;320;20;320;250;230;250</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>760</x><y>30</y><w>150</w><h>140</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>20;40;20;20;130;20;130;120;40;120</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>870</x><y>880</y><w>110</w><h>30</h></coordinates><panel_attributes>HostInstitution</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>860</x><y>800</y><w>70</w><h>100</h></coordinates><panel_attributes>lt=&lt;&lt;-</panel_attributes><additional_attributes>50;80;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>680</x><y>800</y><w>90</w><h>100</h></coordinates><panel_attributes>lt=&lt;&lt;-</panel_attributes><additional_attributes>20;80;70;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>620</x><y>880</y><w>140</w><h>30</h></coordinates><panel_attributes>FreeTextDescription</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>800</x><y>800</y><w>40</w><h>100</h></coordinates><panel_attributes>lt=&lt;&lt;-</panel_attributes><additional_attributes>20;80;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>770</x><y>880</y><w>90</w><h>30</h></coordinates><panel_attributes>MimeType</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>930</x><y>740</y><w>210</w><h>80</h></coordinates><panel_attributes>/AbstractTripleAssertion/
---
-getObjectLocalName : String
-getOntologyURI : URI
-getPredicateLocalName : String
-bg=red
-</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Note</type><coordinates><x>510</x><y>500</y><w>220</w><h>100</h></coordinates><panel_attributes>Encapsulates the information
-contained by this annotation,
-i.e. free text description, mapping
-to a specified ontology, tagging,
-MIME type association
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>870</x><y>480</y><w>120</w><h>280</h></coordinates><panel_attributes>lt=&lt;&lt;.</panel_attributes><additional_attributes>100;260;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>710</x><y>770</y><w>210</w><h>50</h></coordinates><panel_attributes>/AbstractTextualValueAssertion/
---
-getText : String
-bg=red
-</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>760</x><y>480</y><w>150</w><h>250</h></coordinates><panel_attributes>lt=&lt;&lt;.</panel_attributes><additional_attributes>20;230;130;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>700</x><y>480</y><w>210</w><h>180</h></coordinates><panel_attributes>lt=&lt;&lt;.</panel_attributes><additional_attributes>20;160;190;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>870</x><y>480</y><w>40</w><h>310</h></coordinates><panel_attributes>lt=&lt;&lt;.</panel_attributes><additional_attributes>20;290;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>390</x><y>640</y><w>350</w><h>60</h></coordinates><panel_attributes>/AbstractNumericRangeAssertion &lt;T extends Number&gt;/
---
-getLowerNumericValue : T
-getUpperNumericValue : T
-bg=red
-</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>1030</x><y>380</y><w>190</w><h>30</h></coordinates><panel_attributes>/SPI : CurationEventBeanSPI/
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>740</x><y>470</y><w>170</w><h>30</h></coordinates><panel_attributes>/SPI : AnnotationBeanSPI/
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>740</x><y>240</y><w>230</w><h>90</h></coordinates><panel_attributes>/Interface : CurationEvent/
---
-getTarget : Curateable
-getType : CurationEventType
-getDetail : CurationEventBeanSPI
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>460</x><y>330</y><w>230</w><h>70</h></coordinates><panel_attributes>/Interface : AnnotationAssertion/
---
-getRole : AnnotationRole
-getDefinition : AnnotationBeanSPI
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>240</x><y>150</y><w>170</w><h>50</h></coordinates><panel_attributes>/Person/
---
-TODO - get from myExp
-bg=white</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Note</type><coordinates><x>1030</x><y>420</y><w>190</w><h>80</h></coordinates><panel_attributes>Any additional information
-associated with the
-curation event, such as a
-free text comment field
-bg=blue</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>950</x><y>270</y><w>100</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>80;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>950</x><y>290</y><w>100</w><h>120</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>80;100;50;100;50;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>670</x><y>340</y><w>90</w><h>40</h></coordinates><panel_attributes>lt=&lt;-</panel_attributes><additional_attributes>70;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>670</x><y>360</y><w>90</w><h>140</h></coordinates><panel_attributes>lt=&lt;-
-</panel_attributes><additional_attributes>70;120;50;120;50;20;20;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>740</x><y>350</y><w>160</w><h>80</h></coordinates><panel_attributes>Enum : AnnotationRole
---
-INITIAL_ASSERTION
-REFINEMENT
-REPLACEMENT
-bg=orange</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Class</type><coordinates><x>1030</x><y>280</y><w>190</w><h>80</h></coordinates><panel_attributes>Enum : CurationEventType
---
-NEUTRAL
-REPUDIATION
-VALIDATION
-bg=orange</panel_attributes><additional_attributes/></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>720</x><y>170</y><w>90</w><h>90</h></coordinates><panel_attributes>lt=&lt;&lt;.</panel_attributes><additional_attributes>70;70;20;20</additional_attributes></element><element><type>com.umlet.element.base.Relation</type><coordinates><x>490</x><y>170</y><w>90</w><h>180</h></coordinates><panel_attributes>lt=&lt;&lt;.</panel_attributes><additional_attributes>20;160;70;20</additional_attributes></element><element><type>com.umlet.element.base.Class</type><coordinates><x>500</x><y>710</y><w>350</w><h>50</h></coordinates><panel_attributes>/AbstractNumericValueAssertion &lt;T extends Number&gt;/
---
-getNumericValue : T
-bg=red
-</panel_attributes><additional_attributes/></element></umlet_diagram>
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/pom.xml b/trunk/workflowmodel-api/pom.xml
deleted file mode 100644
index 6a9ce33..0000000
--- a/trunk/workflowmodel-api/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>net.sf.taverna.t2</groupId>
-		<artifactId>core</artifactId>
-		<version>0.9</version>
-	</parent>
-	<groupId>net.sf.taverna.t2.core</groupId>
-	<artifactId>workflowmodel-api</artifactId>
-	<name>Workflow Model API</name>
-	<description>
-		Core workflow object model for Taverna 2 workflows. Depends on
-		the data layer but nothing else, intended as lightweight
-		platform for applications using Taverna APIs as well as the core
-		for the new enactor and model.
-	</description>
-	<dependencies>
-		<dependency>
-			<groupId>net.sf.taverna.t2.core</groupId>
-			<artifactId>reference-api</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>net.sf.taverna.t2.infrastructure</groupId>
-			<artifactId>spi-discovery-api</artifactId>
-			<version>${t2.infrastructure.version}</version>
-		</dependency>
-                <dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>jdom</groupId>
-			<artifactId>jdom</artifactId>
-		</dependency>
-	</dependencies>
-</project>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AbstractAnnotatedThing.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AbstractAnnotatedThing.java
deleted file mode 100644
index d4b5328..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AbstractAnnotatedThing.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Convenient abstract superclass for annotated things, manages edits.
- * Subclasses of this must implement the Annotated interface with their own
- * interface type as the parameter, so for example Processor subclasses would
- * implement Annotated&lt;Processor&gt;
- * 
- * @author Tom Oinn
- * @author Alan R Williams
- * 
- */
-public abstract class AbstractAnnotatedThing<T> implements Annotated<T> {
-
-	private Set<AnnotationChain> annotations = new HashSet<AnnotationChain>();
-
-	/**
-	 * Return the set of annotations bound to this annotated object, the set
-	 * returned is an unmodifiable copy of the internal annotation set, if you
-	 * need to modify the annotations you should use the get methods for Edit
-	 * objects to do so.
-	 * 
-	 * @see net.sf.taverna.t2.annotation.Annotated#getAnnotations()
-	 */
-	public final Set<AnnotationChain> getAnnotations() {
-		return Collections.unmodifiableSet(annotations);
-	}
-
-	/**
-	 * Set the annotation chains associated with this annotated object. This is
-	 * only needed for deserialization and could almost certainly be done in a
-	 * better way.
-	 * 
-	 * @param annotations
-	 */
-	public final void setAnnotations(Set<AnnotationChain> annotations) {
-		this.annotations = annotations;
-	}
-
-	/**
-	 * Superclass of edits to remove, add and replace annotations on instances
-	 * of the enclosing AbstractAnnotatedThing class
-	 * 
-	 * @author Tom
-	 * 
-	 * @param <TargetType>
-	 */
-	private static abstract class AbstractAnnotationEdit<TargetType> implements
-			Edit<TargetType> {
-
-		private AbstractAnnotatedThing<TargetType> subject;
-
-		private boolean applied = false;
-
-		protected AbstractAnnotationEdit(
-				AbstractAnnotatedThing<TargetType> subject) {
-			this.subject = subject;
-		}
-
-		@SuppressWarnings("unchecked")
-		public final TargetType doEdit() throws EditException {
-			synchronized (subject) {
-				if (applied) {
-					throw new EditException("Edit already applied!");
-				}
-				doEditAction(subject);
-				this.applied = true;
-				return (TargetType) subject;
-			}
-		}
-
-		protected abstract void doEditAction(AbstractAnnotatedThing<?> subject)
-				throws EditException;
-
-		protected abstract void undoEditAction(AbstractAnnotatedThing<?> subject);
-
-		@SuppressWarnings("unchecked")
-		public final TargetType getSubject() {
-			return (TargetType) subject;
-		}
-
-		public final boolean isApplied() {
-			return this.applied;
-		}
-
-		public final void undo() {
-			synchronized (subject) {
-				if (!applied) {
-					throw new RuntimeException(
-							"Attempt to undo edit that was never applied");
-				}
-				undoEditAction(subject);
-				applied = false;
-			}
-		}
-
-	}
-
-	/**
-	 * @see net.sf.taverna.t2.annotation.Annotated#getAddAnnotationEdit(net.sf.taverna.t2.annotation.WorkflowAnnotation)
-	 */
-	public final Edit<T> getAddAnnotationEdit(
-			final AnnotationChain newAnnotation) {
-		return new AbstractAnnotationEdit<T>(this) {
-			@Override
-			protected void doEditAction(AbstractAnnotatedThing<?> subject)
-					throws EditException {
-				annotations.add(newAnnotation);
-			}
-
-			@Override
-			protected void undoEditAction(AbstractAnnotatedThing<?> subject) {
-				annotations.remove(newAnnotation);
-			}
-		};
-	}
-
-	/**
-	 * @see net.sf.taverna.t2.annotation.Annotated#getRemoveAnnotationEdit(net.sf.taverna.t2.annotation.WorkflowAnnotation)
-	 */
-	public final Edit<T> getRemoveAnnotationEdit(
-			final AnnotationChain annotationToRemove) {
-		return new AbstractAnnotationEdit<T>(this) {
-			@Override
-			protected void doEditAction(AbstractAnnotatedThing<?> subject)
-					throws EditException {
-				annotations.remove(annotationToRemove);
-			}
-
-			@Override
-			protected void undoEditAction(AbstractAnnotatedThing<?> subject) {
-				annotations.add(annotationToRemove);
-			}
-		};
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Annotated.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Annotated.java
deleted file mode 100644
index ab7ed2c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Annotated.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-
-/**
- * Denotes that the object carries workflow object level annotation. Rather than
- * defining specific annotation types for each workflow entity we work on the
- * basis that multiple annotations of different types may apply, so free text
- * description is one example, semantic annotation of the internal function of a
- * processor might be another.
- * <p>
- * Where annotations are conceptually editable such as free text descriptions
- * the editing framework should internally remove the original annotation and
- * add the replacement rather than modifying the previous annotation in place.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Annotated<TargetType> {
-
-	/**
-	 * Each annotated object contains a bag of metadata object instances
-	 * 
-	 * @return set of metadata objects that apply to the annotated object
-	 */
-	Set<? extends AnnotationChain> getAnnotations();
-	
-	void setAnnotations(Set<AnnotationChain> annotations);
-
-	/**
-	 * Add new workflow object metadata to this annotated entity
-	 * 
-	 * @param <TargetType>
-	 *            the type of the object being annotated
-	 * @param newAnnotation
-	 *            metadata object to add to the annotated object
-	 * @return edit object to perform and undo the metadata assignment
-	 */
-	public Edit<? extends TargetType> getAddAnnotationEdit(
-			AnnotationChain newAnnotation);
-
-	/**
-	 * Remove an annotation object from the this annotated entity
-	 * 
-	 * @param <TargetType>
-	 *            type of the workflow object from which the annotation is
-	 *            removed
-	 * @param annotationToRemove
-	 *            metadata object to remove
-	 * @param objectToAnnotate
-	 *            object from which the metadata is removed
-	 * @return edit object to perform and undo the metadata removal
-	 */
-	public Edit<? extends TargetType> getRemoveAnnotationEdit(
-			AnnotationChain annotationToRemove);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationAssertion.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationAssertion.java
deleted file mode 100644
index 6f68c35..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationAssertion.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * Represents a single assertion of information, providing access to a bean
- * containing the information in the assertion and one specifying the source of
- * the information contained.
- * 
- * @author Tom Oinn
- * 
- */
-public interface AnnotationAssertion<AnnotationBeanType extends AnnotationBeanSPI>
-		extends Curateable {
-
-	/**
-	 * Each annotation assertion contains a bean specifying the actual
-	 * annotation, varying from a simple string for a free text description to
-	 * more sophisticated semantic annotations or controlled vocabularies.
-	 * 
-	 * @return the annotation bean specifying this annotation assertion
-	 */
-	public AnnotationBeanType getDetail();
-
-	/**
-	 * The annotation assertion plays one of several roles within the annotation
-	 * chain, either an initial assertion, a refinement of a previous assertion
-	 * or a replacement of a previous assertion.
-	 * 
-	 * @return the annotation role of this annotation
-	 */
-	public AnnotationRole getRole();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationBeanSPI.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationBeanSPI.java
deleted file mode 100644
index a754148..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationBeanSPI.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * Marker interface to denote that a bean class is a container for the
- * information encapsulated by an InformationAssertion object
- * 
- * @author Tom Oinn
- * 
- */
-public interface AnnotationBeanSPI {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationChain.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationChain.java
deleted file mode 100644
index 6f70faa..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationChain.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.List;
-
-/**
- * A fact about an annotated entity is expressed in terms of an annotation
- * chain. The annotation chain contains one or more information assertions in a
- * list ordered by the creation date of each assertion. Annotation chains are
- * then interpreted by an AnnotationPerspective which is responsible for
- * reasoning over the information in the chain and extracting the set of
- * information assertions that are valid according to the rules in the
- * particular AnnotationPerspective.
- * 
- * @author Tom Oinn
- * 
- */
-public interface AnnotationChain {
-
-	/**
-	 * Returns the ordered list of AnnotationAssertions. This is the 'raw' set
-	 * of annotations in creation order - this order is not necessarily the
-	 * order they were curated, and may include refuted or otherwise wrong
-	 * annotations. Consumers of this API are recommended to use an
-	 * AnnotationPerspective to resolve any such conflicts appropriately.
-	 * 
-	 * @return read only copy of the ordered list of AnnotationAssertion
-	 *         instances
-	 */
-	List<AnnotationAssertion<?>> getAssertions();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationPerspective.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationPerspective.java
deleted file mode 100644
index 656b026..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationPerspective.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.List;
-
-/**
- * Responsible for the interpretation of an AnnotationChain (which may contain
- * conflicting or disputed information) into a set of AnnotationAssertion
- * instances from that chain which are valid given the chain and some
- * interpretation rule.
- * 
- * @author Tom Oinn
- * 
- */
-public interface AnnotationPerspective {
-
-	/**
-	 * Evaluate the annotations and their curation events in the specified
-	 * chain, resolve conflicts if possible and return the resultant set of
-	 * annotations
-	 * 
-	 * @param chain
-	 *            the annotation chain to evaluate
-	 * @return the set of annotations which are valid within this chain
-	 */
-	public List<? extends AnnotationAssertion<?>> getAnnotations(
-			AnnotationChain chain);
-
-	/**
-	 * Annotation chains may be in a disputed state if there are conflicting
-	 * mutually exclusive events within them under the interpretation imposed by
-	 * the annotation perspective and the perspective is unable to sensibly
-	 * reconcile them. For example, if the perspective is configured to trust
-	 * two parties equally and they disagree.
-	 * 
-	 * @param chain
-	 *            the annotation chain to check for conflict
-	 * @return true if there are conflicts under the interpretation of this
-	 *         annotation perspective
-	 */
-	public boolean isDisputed(AnnotationChain chain);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationRole.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationRole.java
deleted file mode 100644
index 06b37b1..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationRole.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * Specifies the role of an AnnotationAssertion within an AnnotationChain
- * 
- * @author Tom Oinn
- */
-public enum AnnotationRole {
-
-	/**
-	 * The information assertion is the first in the chain (if this is applied
-	 * to an annotation that isn't the earliest in its chain it should be
-	 * treated as a validation failure)
-	 */
-	INITIAL_ASSERTION,
-
-	/**
-	 * The information assertion was added to the chain to refine the existing
-	 * annotation assertion or assertions, such as cases where a generic
-	 * description exists which can be specialized in a particular instance but
-	 * where the original more generic form is still correct
-	 */
-	REFINEMENT,
-
-	/**
-	 * The information assertion was added to the chain in order to override an
-	 * earlier information assertion which was regarded as incorrect.
-	 */
-	REPLACEMENT;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationSourceSPI.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationSourceSPI.java
deleted file mode 100644
index 1f7a74d..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AnnotationSourceSPI.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * A marker interface that specified that the implementation is a bean
- * containing information about a source of annotations. These might be
- * publications, web URIs, a free text container, a person (etc). We should be
- * able to use existing schemes for identification of sources, publications etc
- * here.
- * 
- * @author Tom Oinn
- * 
- */
-public interface AnnotationSourceSPI {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AppliesTo.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AppliesTo.java
deleted file mode 100644
index 94293e3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/AppliesTo.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.lang.annotation.*;
-
-/**
- * Annotation to be used on metadata objects to denote which workflow objects
- * they apply to
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-public @interface AppliesTo {
-
-	/**
-	 * The class of the metadata object allowed by this annotation
-	 */
-	Class<?>[] targetObjectType();
-
-	/**
-	 * Can you have more than one of these metadata objects in the resolved set?
-	 */
-	boolean many() default true;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Curateable.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Curateable.java
deleted file mode 100644
index 006a59c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Curateable.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * Implemented by objects which can have curation assertions attached to them.
- * In our model this includes the AnnotationAssertion but also includes the
- * CurationEvent itself, in this way we allow curation of curation assertions
- * and thence a conversational model of annotation.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Curateable {
-
-	/**
-	 * Curateable instances have a list of curation events which are used to
-	 * determine whether the implementing object is valid given a particular
-	 * interpretive context. If this list is empty the event is unchallenged.
-	 * 
-	 * @return
-	 */
-	public List<CurationEvent<?>> getCurationAssertions();
-
-	/**
-	 * All curation events are marked with their creation date, this is the date
-	 * at which the curation event was associated with its target.
-	 * 
-	 * @return
-	 */
-	public Date getCreationDate();
-
-	/**
-	 * Each curateable has a list of people associated with it, frequently one
-	 * person and in some cases none, although this should be avoided if
-	 * possible.
-	 * 
-	 * @return
-	 */
-	public List<? extends Person> getCreators();
-
-	/**
-	 * Each annotation or curation has a resource from which the event is
-	 * inherently derived, for example if the annotation was created manually
-	 * after reading a paper the source would unambiguously specify the
-	 * publication.
-	 * 
-	 * @return
-	 */
-	public AnnotationSourceSPI getSource();
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEvent.java
deleted file mode 100644
index 173cf57..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEvent.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * Represents a single act of curation, parameterized on a bean encapsulating
- * the necessary and sufficient information to describe the specifics of the
- * curation event.
- * 
- * @author Tom Oinn
- * 
- * @param <T>
- */
-public interface CurationEvent<CurationType extends CurationEventBeanSPI> {
-
-	public CurationType getDetail();
-
-	/**
-	 * The curation event type specifies whether this curation event is a
-	 * validation, repudiation or neither of its target.
-	 * 
-	 * @return
-	 */
-	public CurationEventType getType();
-
-	/**
-	 * The curation event applies to a specific other event, either another
-	 * curation event or an annotation assertion.
-	 * 
-	 * @return the event which this event is curating
-	 */
-	public Curateable getTarget();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEventBeanSPI.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEventBeanSPI.java
deleted file mode 100644
index 2316cde..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEventBeanSPI.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * Contains the detail for a single curation event. In many cases this will be a
- * plain base curation object with very little information but it allows for us
- * to specify additional parameters to the curation event which can then be used
- * by the AnnotationPerspective instance to determine whether it believes the
- * curator.
- * 
- * @author Tom Oinn
- * 
- */
-public interface CurationEventBeanSPI {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEventType.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEventType.java
deleted file mode 100644
index 5b21201..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/CurationEventType.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-public enum CurationEventType {
-
-	/**
-	 * The curation event asserts that the event it is attached to was correct,
-	 * effectively signing off an approval on the attached event.
-	 */
-	VALIDATION,
-
-	/**
-	 * The curation event repudiates the information in the attached event,
-	 * denying its validity.
-	 */
-	REPUDIATION,
-
-	/**
-	 * The curation event neither validates nor repudiates the information in
-	 * the attached event.
-	 */
-	NEUTRAL;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/HierarchyRole.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/HierarchyRole.java
deleted file mode 100644
index 1c46033..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/HierarchyRole.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * Possible relationships between entities in a hierarchical context. This is
- * used as a property of the HierarchyTraversal annotation on members which
- * traverse a conceptual object hierarchy such as a parent-child containment
- * relationship. As an example the getProcessors() method in Dataflow is
- * annotated with <code>&amp;HierarchyRole(role=CHILD)</code> to indicate that
- * it accesses child members of the workflow model containment hierarchy.
- * 
- * @author Tom Oinn
- * 
- */
-public enum HierarchyRole {
-
-	CHILD,
-
-	PARENT;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/HierarchyTraversal.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/HierarchyTraversal.java
deleted file mode 100644
index cbcbbaa..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/HierarchyTraversal.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Applied to getFoo methods to indicate that the returned type is related to
- * the annotated type by some hierarchical relationship, either parent or child.
- * This can then be used by annotation tools to determine the structure of an
- * object under annotation in order to find any child objects without
- * accidentally traversing outside of the bound of the object to be annotated.
- * <p>
- * As annotations are not inherited any annotation tool should traverse up the
- * type structure of an object under annotation to determine the possible
- * child-parent relationships from superclasses and implemented interfaces.
- * <p>
- * There is no guarantee that the return types from annotated members implement
- * Annotated, in these cases traversal should still be followed to cover cases
- * where a grandchild of an object is annotatable even though all children are
- * not.
- * <p>
- * This should only be applied to method with no arguments, if this is not the
- * case an annotation tool is free to not follow such methods (as it has no way
- * to determine what should be applied as arguments)
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Documented
-public @interface HierarchyTraversal {
-
-	/**
-	 * The role the return type of the annotated method plays in the named
-	 * hierarchy relative to the containing type.
-	 * 
-	 * @return role in hierarchy at corresponding index in the Hierarchies
-	 *         property, currently either CHILD or PARENT
-	 */
-	HierarchyRole[] role();
-
-	/**
-	 * It is possible for multiple orthogonal containment hierarchies to exist,
-	 * to allow for this the hierarchies are named using this field.
-	 * 
-	 * @return name of the hierarchy to which this relationship applies
-	 */
-	String[] hierarchies();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Person.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Person.java
deleted file mode 100644
index 88de1cd..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/Person.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-/**
- * All metadata assertions and curation assertions have a person who is
- * ultimately responsible for the assertion (although this may not necessarily
- * imply that the assertion was created interactively).
- * 
- * TODO this needs to have some members! Cross reference with myExperiment user
- * model I suspect.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Person {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractNumericRangeAssertion.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractNumericRangeAssertion.java
deleted file mode 100644
index 76583af..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractNumericRangeAssertion.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AppliesTo;
-
-/**
- * Generic annotation containing a pair of numeric values with precision
- * determined by the type parameter which form a bound.
- * 
- * @author Tom Oinn
- * 
- */
-@AppliesTo(targetObjectType = { Object.class }, many = true)
-public abstract class AbstractNumericRangeAssertion<NumericType extends Number>
-		implements AnnotationBeanSPI {
-
-	private NumericType upperNumericValue;
-
-	private NumericType lowerNumericValue;
-	
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	protected AbstractNumericRangeAssertion() {
-		//
-	}
-
-	public NumericType getUpperNumericValue() {
-		return upperNumericValue;
-	}
-
-	public void setUpperNumericValue(NumericType upperNumericValue) {
-		this.upperNumericValue = upperNumericValue;
-	}
-
-	public NumericType getLowerNumericValue() {
-		return lowerNumericValue;
-	}
-
-	public void setLowerNumericValue(NumericType lowerNumericValue) {
-		this.lowerNumericValue = lowerNumericValue;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractNumericValueAssertion.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractNumericValueAssertion.java
deleted file mode 100644
index 3688b12..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractNumericValueAssertion.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AppliesTo;
-
-/**
- * Generic annotation containing a single number of precision specified by the
- * type variable
- * 
- * @author Tom Oinn
- * 
- */
-@AppliesTo(targetObjectType = { Object.class }, many = true)
-public abstract class AbstractNumericValueAssertion<NumericType extends Number>
-		implements AnnotationBeanSPI {
-
-	private NumericType numericValue;
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	protected AbstractNumericValueAssertion() {
-		//
-	}
-
-	public NumericType getNumericValue() {
-		return numericValue;
-	}
-
-	public void setNumericValue(NumericType numericValue) {
-		this.numericValue = numericValue;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractTextualValueAssertion.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractTextualValueAssertion.java
deleted file mode 100644
index 5270979..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractTextualValueAssertion.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AppliesTo;
-
-/**
- * Generic bit of free text that can be stuck to anything, subclass for more
- * specific uses
- * 
- * @author Tom Oinn
- * 
- */
-@AppliesTo(targetObjectType = { Object.class }, many = true)
-public abstract class AbstractTextualValueAssertion implements AnnotationBeanSPI {
-
-	private String text;
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	protected AbstractTextualValueAssertion() {
-		//
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	public void setText(String text) {
-		this.text = text;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractTripleAssertion.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractTripleAssertion.java
deleted file mode 100644
index 9b15f04..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/AbstractTripleAssertion.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import java.net.URI;
-
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AppliesTo;
-
-/**
- * A metadata bean containing a predicate and object part of a triple - it is
- * assumed that the entity to which this is bound is the subject part of the
- * triple.
- * <p>
- * This then forms a triple where sense is <em>bound object</em> 'predicate'
- * 'object' for example 'Activity hasRole globalAlignment'.
- * <p>
- * This is a relatively simplistic mapping into an ontology as it only allows
- * for a single predicate and object, but in reality that captures the vast
- * majority of our current usage in myGrid. As this is entirely non-specific in
- * its default form it can be applied to anything, although obviously not all
- * combinations of ontologies and target subjects will make sense! We expect
- * this to be subclassed for specific cases to make annotators etc more user
- * friendly (i.e. have a specific 'hasRole' annotation which delegates to this
- * as its superclass)
- * 
- * @author Tom Oinn
- * 
- */
-@AppliesTo(targetObjectType = { Object.class }, many = true)
-public abstract class AbstractTripleAssertion implements AnnotationBeanSPI {
-
-	private URI ontologyURI;
-
-	private String predicateLocalName;
-
-	private String objectLocalName;
-
-	/**
-	 * Default public constructor as required by java bean specification
-	 */
-	protected AbstractTripleAssertion() {
-		// Default constructor, not much to do here.
-	}
-
-	/**
-	 * @return URI of the ontology which contains both object and predicate
-	 *         local names.
-	 */
-	public URI getOntologyURI() {
-		return ontologyURI;
-	}
-
-	/**
-	 * @param ontologyURI
-	 *            URI of the ontology which contains both object and predicate
-	 *            local names.
-	 */
-	public void setOntologyURI(URI ontologyURI) {
-		this.ontologyURI = ontologyURI;
-	}
-
-	/**
-	 * @return Local name of the predicate used in this assignment, the fully
-	 *         qualified name is the URI of the ontology plus this local name,
-	 *         i.e. uri:full.ontology.name#localName
-	 */
-	public String getPredicateLocalName() {
-		return predicateLocalName;
-	}
-
-	/**
-	 * @param predicateLocalName
-	 *            local name of the predicate
-	 */
-	public void setPredicateLocalName(String predicateLocalName) {
-		this.predicateLocalName = predicateLocalName;
-	}
-
-	/**
-	 * @return Local name of the object used in this assignment, the fully
-	 *         qualified name is the URI of the ontology plus this local name,
-	 *         i.e. uri:full.ontology.name#localName
-	 */
-	public String getObjectLocalName() {
-		return objectLocalName;
-	}
-
-	/**
-	 * @param objectLocalName
-	 *            local name within the ontology of the object for this triple
-	 */
-	public void setObjectLocalName(String objectLocalName) {
-		this.objectLocalName = objectLocalName;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/Author.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/Author.java
deleted file mode 100644
index b0839da..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/Author.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-/**
- * The name of an author of a dataflow held as a String
- * 
- * It should allow many but currently only allows one
- * 
- * @author Alan R Williams
- * 
- */
-@AppliesTo(targetObjectType = { Dataflow.class }, many = false)
-public class Author extends AbstractTextualValueAssertion {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public Author() {
-		//
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/DescriptiveTitle.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/DescriptiveTitle.java
deleted file mode 100644
index f9defd6..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/DescriptiveTitle.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-/**
- * The descriptive title of a dataflow held as a String
- * 
- * @author Alan R Williams
- * 
- */
-@AppliesTo(targetObjectType = { Dataflow.class }, many = false)
-public class DescriptiveTitle extends AbstractTextualValueAssertion {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public DescriptiveTitle() {
-		//
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/DocumentationUrl.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/DocumentationUrl.java
deleted file mode 100644
index 96fe397..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/DocumentationUrl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import java.net.URL;
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Port;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * A link to documentation for the target element contained at a particular
- * Uniform Resource Locator (URL)
- * 
- * @author Tom Oinn
- * @author Alan Williams
- */
-@AppliesTo(targetObjectType = { Port.class, Activity.class, Processor.class, Dataflow.class }, many = true)
-public class DocumentationUrl implements AnnotationBeanSPI {
-
-	private URL documentationURL;
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public DocumentationUrl() {
-		//
-	}
-
-	public URL getDocumentationURL() {
-		return documentationURL;
-	}
-
-	public void setDocumentationURL(URL documentationURL) {
-		this.documentationURL = documentationURL;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/ExampleValue.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/ExampleValue.java
deleted file mode 100644
index dd8540c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/ExampleValue.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-
-/**
- * A String containing an example or a description of an example
- * 
- * @author Alan R Williams
- * 
- */
-@AppliesTo(targetObjectType = { DataflowInputPort.class , DataflowOutputPort.class }, many = false)
-public class ExampleValue extends AbstractTextualValueAssertion {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public ExampleValue() {
-		//
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/FreeTextDescription.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/FreeTextDescription.java
deleted file mode 100644
index 04393b8..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/FreeTextDescription.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Port;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * An unconstrained textual description held as a String
- * 
- * @author Tom Oinn
- * 
- */
-@AppliesTo(targetObjectType = { Dataflow.class, Processor.class,
-		Activity.class, Port.class, Datalink.class, Condition.class }, many = false)
-public class FreeTextDescription extends AbstractTextualValueAssertion {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public FreeTextDescription() {
-		//
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/HostInstitution.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/HostInstitution.java
deleted file mode 100644
index db35cd3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/HostInstitution.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-/**
- * 
- */
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * The host institution for an activity implementation
- * 
- * @author Tom Oinn
- * @author Alan Williams
- */
-@AppliesTo(targetObjectType = { Activity.class }, many = false)
-public class HostInstitution extends AbstractTextualValueAssertion {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public HostInstitution() {
-		super();
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/MimeType.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/MimeType.java
deleted file mode 100644
index b318943..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/MimeType.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.workflowmodel.Port;
-
-/**
- * A single MIME type, intended to be used to annotate an input or output port
- * within the workflow to denote the type within that system of data produced or
- * consumed by the port.
- * 
- * @author Tom Oinn
- * 
- */
-// @AppliesTo(targetObjectType = { Port.class })
-public class MimeType extends AbstractTextualValueAssertion {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public MimeType() {
-		super();
-	}
-
-	/**
-	 * Return the MIME type as a string, mime types look like 'part/part'. We
-	 * may want to consider whether it's possible to make this a genuine
-	 * enumeration driven off a canonical list of MIME types or whether it's
-	 * best kept as the current (free) string. The advantage of an enumerated
-	 * type is that we could attach description to the MIME types which would
-	 * help with the UI construction but maybe this isn't the place to put it
-	 * (should this link be in the UI layer? probably)
-	 * 
-	 * @return the MIME type as a string.
-	 */
-	@Override
-	public String getText() {
-		return super.getText();
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/Optional.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/Optional.java
deleted file mode 100644
index 3f18282..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/annotationbeans/Optional.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.annotationbeans;
-
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.workflowmodel.InputPort;
-
-/**
- * A declaration that the bound input port is optional, if this annotation is
- * refuted then the interpretation should be that the input port is required.
- * 
- * @author Tom Oinn
- * @author Alan Williams
- */
-@AppliesTo(targetObjectType = { InputPort.class }, many = false)
-public class Optional implements AnnotationBeanSPI {
-
-	/**
-	 * Default constructor as mandated by java bean specification
-	 */
-	public Optional() {
-		//
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/package.html
deleted file mode 100644
index 99a5a4f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/package.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<body>
-Entities within the workflow object model may be marked as annotated.
-When marked as such they contract to provide one or more of a variety of
-forms of metadata, whether generic or specific to the type of object
-within the model. This description is deliberately kept vague for now
-because we haven't yet enumerated what classes of annotation exist on
-each entity.
-<p>From this point in we will use the term 'metadata' to distinguish
-between annotations in terms of properties of the workflow and
-annotations in terms of the Java 5 language feature. This is
-particularly important we we use Java Annotations to implement the
-workflow annotations. Yay.
-<p>In keeping with the read-only model of the API package all
-metadata interfaces only specify the get methods for their respective
-contents. Modification of metadata instances is performed through Edit
-objects.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/AnnotationBeanRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/AnnotationBeanRegistry.java
deleted file mode 100644
index a2c5af9..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/AnnotationBeanRegistry.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.spi;
-
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-public class AnnotationBeanRegistry extends SPIRegistry<AnnotationBeanSPI>{
-
-	public AnnotationBeanRegistry() {
-		super(AnnotationBeanSPI.class);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/AnnotationSourceRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/AnnotationSourceRegistry.java
deleted file mode 100644
index 4786a78..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/AnnotationSourceRegistry.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.spi;
-
-import net.sf.taverna.t2.annotation.AnnotationSourceSPI;
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-public class AnnotationSourceRegistry extends SPIRegistry<AnnotationSourceSPI>{
-
-	public AnnotationSourceRegistry() {
-		super(AnnotationSourceSPI.class);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/CurationEventBeanRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/CurationEventBeanRegistry.java
deleted file mode 100644
index dc1f190..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/annotation/spi/CurationEventBeanRegistry.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation.spi;
-
-import net.sf.taverna.t2.annotation.CurationEventBeanSPI;
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-public class CurationEventBeanRegistry extends SPIRegistry<CurationEventBeanSPI>{
-
-	public CurationEventBeanRegistry() {
-		super(CurationEventBeanSPI.class);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/FailureListener.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/FailureListener.java
deleted file mode 100644
index f6fa118..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/FailureListener.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.facade;
-
-/**
- * Used to communicate a failure of the overall workflow to interested parties.
- * 
- * @author Tom Oinn
- */
-public interface FailureListener {
-
-	/**
-	 * Called if the workflow fails in a critical and fundamental way. Most
-	 * internal failures of individual process instances will not trigger this,
-	 * being handled either by the per processor dispatch stack through retry,
-	 * failover etc or by being converted into error tokens and injected
-	 * directly into the data stream. This therefore denotes a catastrophic and
-	 * unrecoverable problem.
-	 * 
-	 * @param message
-	 * @param t
-	 */
-	public void workflowFailed(String message, Throwable t);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/ResultListener.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/ResultListener.java
deleted file mode 100644
index ae33e43..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/ResultListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.facade;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-
-/**
- * Implement and use with the WorkflowInstanceFacade to listen for data
- * production events from the underlying workflow instance
- * 
- * @author Tom Oinn
- * 
- */
-public interface ResultListener {
-
-	/**
-	 * Called when a new result token is produced by the workflow instance.
-	 * 
-	 * @param token
-	 *            the WorkflowDataToken containing the result.
-	 * @param portName
-	 *            The name of the output port on the workflow from which this
-	 *            token is produced, this now folds in the owning process which
-	 *            was part of the signature for this method
-	 */
-	public void resultTokenProduced(WorkflowDataToken token, String portName);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/WorkflowInstanceFacade.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/WorkflowInstanceFacade.java
deleted file mode 100644
index e8a1e21..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/WorkflowInstanceFacade.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.facade;
-
-import java.util.WeakHashMap;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.TokenOrderException;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.monitor.MonitorNode;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.utility.TypedTreeModel;
-import net.sf.taverna.t2.workflowmodel.ControlBoundary;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-/**
- * The interaction point with a workflow instance. Technically there is no such
- * thing as a workflow instance in Taverna2, at least not in any real sense in
- * the code itself. The instance is more literally an identifier used as the
- * root of all data and error objects within this workflow and by which the top
- * level DataFlow or similar object is identified in the state tree. The
- * implementation of this interface should hide this though, automatically
- * prepending the internally stored (and hidden) identifier to all data push
- * messages and providing a subtree of the state model rooted at the internal
- * ID.
- * <p>
- * TODO - we should probably have callbacks for failure states here, but that
- * would need a decent definition (and maybe even ontology of) what failure
- * means. It's less obvious in a data streaming world what a failure is. At the
- * moment the dispatch stack can potentially treat unhandled error messages as
- * failing the processor, how do we get this exception information back up to
- * the workflow level?
- * 
- * @author Tom Oinn
- * 
- */
-@ControlBoundary
-public interface WorkflowInstanceFacade {
-
-	/**
-	 * A weak hash map of all workflow run IDs mapped against the corresponding WorkflowInstanceFacadeS.
-	 * This is needed for activities with dependencies (such as beanshell and API consumer) to gain access
-	 * to the current workflow via the WorkflowInstanceFacade.
-	 */
-	public static final WeakHashMap<String, WorkflowInstanceFacade> workflowRunFacades = new WeakHashMap<String, WorkflowInstanceFacade>();
-	
-	/**
-	 * Push a data token into the specified port. If the token is part of a
-	 * stream the index contains the index of this particular token. If not the
-	 * index should be the empty integer array.
-	 * 
-	 * @param token
-	 *            A WorkflowDataToken containing the data to be pushed to the
-	 *            workflow along with its current owning process identifier and
-	 *            index
-	 * @param portName
-	 *            Port name to use
-	 * @throws TokenOrderException
-	 *             if ordering constraints on the token stream to each input
-	 *             port are violated
-	 */
-	public void pushData(WorkflowDataToken token, String portName)
-			throws TokenOrderException;
-
-	/**
-	 * Where a workflow has no inputs this method will cause it to start
-	 * processing. Any processors within the workflow with no inputs are fired.
-	 * 
-	 * @throws IllegalStateException
-	 *             if the workflow has already been fired or has had data pushed
-	 *             to it.
-	 */
-	public void fire() throws IllegalStateException;
-
-	/**
-	 * The result listener is used to handle data tokens produced by the
-	 * workflow.
-	 * <p>
-	 * If the listener is registered after the workflow has already produced
-	 * results it will be immediately called with any results previously
-	 * produced. Where the workflow has completed a stream of results it may
-	 * only message the listener with the highest level one, so for a case where
-	 * a list of results is emited one at a time the listener may either get the
-	 * individual items followed by the list token or if registered after the
-	 * list token has been emited only receive the list token.
-	 * 
-	 * @param listener
-	 */
-	public void addResultListener(ResultListener listener);
-
-	/**
-	 * Remove a previously registered result listener
-	 * 
-	 * @param listener
-	 */
-	public void removeResultListener(ResultListener listener);
-
-	/**
-	 * A failure listener reports on overall workflow failure. It is not
-	 * triggered by the failure of individual processors unless that processor
-	 * is marked as critical. In fact in T2 all processors are marked as
-	 * critical by default as there are ways of handling errors within the data
-	 * stream, if the processor actually fails something really bad has
-	 * happened.
-	 * <p>
-	 * As with the result listener a failure listener registered after the
-	 * workflow has already failed will be immediately called with the failure
-	 * data.
-	 */
-	public void addFailureListener(FailureListener listener);
-
-	/**
-	 * Remove a previously registered failure listener
-	 */
-	public void removeFailureListener(FailureListener listener);
-
-	/**
-	 * Workflow state is available through a sub-tree of the monitor tree. For
-	 * security reasons the full monitor tree is never accessible through this
-	 * interface but the sub-tree rooted at the node representing this workflow
-	 * instance is and can be used for both monitoring and steering functions.
-	 * <p>
-	 * Uses the standard TreeModel-like mechanisms for registering change events
-	 * and can be plugged into a JTree for display purposes through the
-	 * TreeModelAdapter class.
-	 * 
-	 * @return Typed version of TreeModel representing the state of this
-	 *         workflow. Nodes in the tree are instances of MonitorNode
-	 */
-	public TypedTreeModel<MonitorNode> getStateModel();
-
-	/**
-	 * Return the dataflow this facade facades
-	 */
-	public Dataflow getDataflow();
-	
-	/**
-     * Return the invocation context used by this facade
-     */
-	public InvocationContext getContext();
-	
-	/**
-	 * Return a map of the data pushed on the named port
-	 */
-	public WeakHashMap<String, T2Reference> getPushedDataMap();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/package.html
deleted file mode 100644
index 898ccdf..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/facade/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<body>
-Facade interfaces to represent a workflow instance within the enactor.
-<p>Although T2 has no 'real' concept of a workflow instance, using
-identifiers on data instead, it is useful to treat it as if it does. The
-facade classes are the external 'invoke only' interface to the enactment
-system, providing wrappers around the actual single instance model. This
-also hides the shared state tree, exposing only the sub-tree rooted at
-the base ID internal to the facade layer. The state tree acts both as
-monitoring and steering infrastructure, the facade therefore prevents a
-process accessing the state of another workflow either maliciously or
-inadvertently.
-<p>The construction of these facade objects is not defined here, a
-factory method in the implementation package is the most likely
-candidate but there are other options, for example a peer to peer cloud
-may expose services to create new facades and allow access as might a
-web service based interface. The interfaces here are intended to be as
-easy to access remotely as possible.
-<p>For the same reasons there are no methods in the workflow facade
-concerning security or the management of data access - it is assumed
-that the constructor of the facade layer has embedded such concerns
-within it. There is therefore a clear split between initiation of the
-workflow session and manipulation of it with this package only
-addressing the latter of the two.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/Completion.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/Completion.java
deleted file mode 100644
index c9f84f2..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/Completion.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-/**
- * Contains a (possibly partial) completion event. The completion event is a
- * statement that no further events will occur on this channel with an index
- * prefixed by the completion index. As with Job events completion events have
- * an owning process with the same semantics as that of the Job class
- * <p>
- * The conceptual depth of a completion is the sum of the length of index array
- * for any data tokens the completion shares a stream with and the depth of
- * those tokens. This should be constant for any given token stream.
- * 
- * @author Tom Oinn
- * 
- */
-public class Completion extends IterationInternalEvent<Completion> {
-
-	/**
-	 * Construct a new optionally partial completion event with the specified
-	 * owner and completion index
-	 * 
-	 * @param owningProcess
-	 * @param completionIndex
-	 */
-	public Completion(String owningProcess, int[] completionIndex,
-			InvocationContext context) {
-		super(owningProcess, completionIndex, context);
-	}
-
-	/**
-	 * Construct a new final completion event, equivalent to calling new
-	 * Completion(owningProcess, new int[0]);
-	 * 
-	 * @param owningProcess
-	 */
-	public Completion(String owningProcess, InvocationContext context) {
-		super(owningProcess, new int[0], context);
-	}
-
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Cmp(" + owner + ")[");
-		for (int i = 0; i < index.length; i++) {
-			if (i > 0) {
-				sb.append(",");
-			}
-			sb.append(index[i] + "");
-		}
-		sb.append("]");
-		return sb.toString();
-	}
-
-	/**
-	 * Push the index array onto the owning process name and return the new Job
-	 * object. Does not modify this object, the method creates a new Job with
-	 * the modified index array and owning process
-	 * 
-	 * @return
-	 */
-	@Override
-	public Completion pushIndex() {
-		return new Completion(getPushedOwningProcess(), new int[] {}, context);
-	}
-
-	/**
-	 * Pull the index array previous pushed to the owning process name and
-	 * prepend it to the current index array
-	 */
-	@Override
-	public Completion popIndex() {
-		return new Completion(owner.substring(0, owner.lastIndexOf(':')),
-				getPoppedIndex(), context);
-	}
-
-	@Override
-	public Completion popOwningProcess() throws ProcessIdentifierException {
-		return new Completion(popOwner(), index, context);
-	}
-
-	@Override
-	public Completion pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new Completion(pushOwner(localProcessName), index, context);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/Event.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/Event.java
deleted file mode 100644
index f0706a3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/Event.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-/**
- * Abstract superclass of all 'event' types within a workflow invocation. These
- * are the Job and Completion events which are used internally within a
- * Processor, in particular by the dispatch stack and iteration system, and the
- * WorkflowDataToken which is the only event class that can exist outside of a
- * Processor boundary (and is therefore the most significant one for users of
- * the API)
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class Event<EventType extends Event<?>> {
-
-	protected String owner;
-
-	protected InvocationContext context;
-
-	protected int[] index;
-
-	protected Event(String owner, int[] index, InvocationContext context) {
-		this.owner = owner;
-		this.index = index;
-		this.context = context;
-		if (index == null) {
-			throw new RuntimeException("Job index cannot be null");
-		}
-		if (owner == null) {
-			throw new RuntimeException("Owning process cannot be null");
-		}
-		if (context == null) {
-			throw new RuntimeException("Invocation context cannot be null");
-		}
-	}
-
-	/**
-	 * An event is final if its index array is zero length
-	 * 
-	 * @return true if indexarray.length==0
-	 */
-	public final boolean isFinal() {
-		return (index.length == 0);
-	}
-
-	/**
-	 * The event has an owner, this is represented as a String object but the
-	 * ownership is hierarchical in nature. The String is a colon separated list
-	 * of alphanumeric process identifiers, with identifiers being pushed onto
-	 * this list on entry to a process and popped off on exit.
-	 * 
-	 * @return String of colon separated process identifiers owning this Job
-	 */
-	public final String getOwningProcess() {
-		return this.owner;
-	}
-
-	public final InvocationContext getContext() {
-		return this.context;
-	}
-
-	/**
-	 * Return a copy of the event subclass with the last owning process removed
-	 * from the owning process list. For example, if the event had owner
-	 * 'foo:bar' this would return a duplicate event with owner 'foo'. If the
-	 * owning process is the empty string this is invalid and will throw a
-	 * ProcessIdentifierException
-	 * 
-	 * @return a copy of the event with the parent process identifier
-	 */
-	public abstract EventType popOwningProcess()
-			throws ProcessIdentifierException;
-
-	/**
-	 * Return a copy of the event subclass with the specified local process name
-	 * appended to the owning process identifier field. If the original owner
-	 * was 'foo' and this was called with 'bar' you'd end up with a copy of the
-	 * subclass with owner 'foo:bar'
-	 * 
-	 * @param localProcessName
-	 *            name to add
-	 * @return the modified event
-	 * @throws ProcessIdentifierException
-	 *             if the local process name contains the ':' character
-	 */
-	public abstract EventType pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException;
-
-	/**
-	 * Events have an index placing them in a conceptual tree structure. This
-	 * index is carried along with the event and used at various points to drive
-	 * iteration and ensure that separate jobs are kept that way
-	 */
-	public final int[] getIndex() {
-		return this.index;
-	}
-
-	/**
-	 * Helper method for implementations of popOwningProcess, this constructs
-	 * the appropriate process identifier after the leaf has been removed and
-	 * returns it. If there is no leaf to remove, i.e. the current process
-	 * identifier is the empty string, then ProcessIdentifierException is thrown
-	 * 
-	 * @return
-	 * @throws ProcessIdentifierException
-	 */
-	protected final String popOwner() throws ProcessIdentifierException {
-		// Empty string already, can't pop from here, throw exception
-		if (owner.equals("")) {
-			throw new ProcessIdentifierException(
-					"Attempt to pop a null owning process (empty string)");
-		}
-		// A single ID with no colon in, return the empty string
-		if (owner.lastIndexOf(':') < 0) {
-			return "";
-		}
-		return owner.substring(0, owner.lastIndexOf(':'));
-	}
-
-	/**
-	 * Helper method for implementations of pushOwningProcess, appends the
-	 * specified local name to the current owning process identifier and returns
-	 * the new id. This doesn't change the current process identifier. If there
-	 * is a colon ':' in the specified name this is invalid and will throw
-	 * ProcessIdentifierException at you.
-	 * 
-	 * @param newLocalProcess
-	 * @return
-	 * @throws ProcessIdentifierException
-	 */
-	protected final String pushOwner(String newLocalProcess)
-			throws ProcessIdentifierException {
-		if (newLocalProcess.contains(":")) {
-			throw new ProcessIdentifierException("Can't push '"
-					+ newLocalProcess + "' as it contains a ':' character");
-		}
-		if (owner.equals("")) {
-			// If the owner was the empty string we don't need to append the
-			// colon
-			return newLocalProcess;
-		} else {
-			return owner + ":" + newLocalProcess;
-		}
-	}
-	
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		sb.append(getClass().getSimpleName());
-		sb.append(' ');
-		sb.append(owner);
-		sb.append('[');
-		for (int i : index) {
-			sb.append(i);
-			sb.append(" ");
-		}
-		sb.append(']');
-		return sb.toString();
-	};
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/InvocationContext.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/InvocationContext.java
deleted file mode 100644
index 2170eb1..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/InvocationContext.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-import net.sf.taverna.t2.provenance.reporter.ProvenanceReporter;
-import net.sf.taverna.t2.reference.ReferenceContext;
-import net.sf.taverna.t2.reference.ReferenceService;
-
-/**
- * Carries the context of a workflow invocation, the necessary data manager,
- * security agents and any other resource shared across the invocation such as
- * provenance injectors.
- * 
- * @author Tom Oinn
- * 
- */
-public interface InvocationContext extends ReferenceContext {
-
-	/**
-	 * Return the reference service to be used within this invocation context
-	 * 
-	 * @return a configured instance of ReferenceService to be used to resolve
-	 *         and register references to data in the workflow
-	 */
-	public ReferenceService getReferenceService();
-	
-	public ProvenanceReporter getProvenanceReporter();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/IterationInternalEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/IterationInternalEvent.java
deleted file mode 100644
index 7986260..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/IterationInternalEvent.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-/**
- * Abstract superclass for event types which have to pass through the iteration
- * system. For this they need the ability to push and pull the iteration index
- * to and from the process identifier, this is done through the popIndex and
- * pushIndex methods. Subclasses of this may be used outside the iteration
- * system but anything which is passed into the iteration system must provide
- * this functionality.
- * 
- * @author Tom Oinn
- * 
- * @param <EventType>
- *            reflexive self type
- */
-public abstract class IterationInternalEvent<EventType extends IterationInternalEvent<?>>
-		extends Event<EventType> {
-
-	/**
-	 * Protected constructor for the minimum fields required by all Event
-	 * subclasses
-	 * 
-	 * @param owner
-	 * @param index
-	 * @param context
-	 */
-	protected IterationInternalEvent(String owner, int[] index,
-			InvocationContext context) {
-		super(owner, index, context);
-	}
-
-	/**
-	 * Pop a previously pushed index array off the process name and append the
-	 * current index array to create the new index array. This is applied to a
-	 * new instance of an Event subclass and does not modify the target.
-	 * 
-	 * @return new Event subclass with modified owning process and index
-	 */
-	public abstract IterationInternalEvent<EventType> popIndex();
-
-	/**
-	 * Push the index array onto the owning process name and return the new
-	 * Event subclass object. Does not modify this object, the method creates a
-	 * new Event subclass with the modified index array and owning process.
-	 * 
-	 */
-	public abstract IterationInternalEvent<EventType> pushIndex();
-
-	/**
-	 * Helper method for the pushIndex operation
-	 * 
-	 * @return
-	 */
-	protected final String getPushedOwningProcess() {
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < index.length; i++) {
-			if (i != 0) {
-				sb.append(",");
-			}
-			sb.append(index[i]);
-		}
-		String indexArrayAsString = sb.toString();
-		return (owner + ":" + indexArrayAsString);
-	}
-
-	/**
-	 * Helper method for the popIndex operation, returns the modified index
-	 * array. Subclasses must still implement logic to get the modified owning
-	 * process but that's relatively easy : <code>
-	 * return new <Event subclass>(owner.substring(0, owner.lastIndexOf(':')),getPoppedIndex(), dataMap);
-	 * </code>
-	 * 
-	 * @return
-	 */
-	protected final int[] getPoppedIndex() {
-		int lastLocation = owner.lastIndexOf(':');
-		String indexArrayAsString = owner.substring(lastLocation + 1);
-		String[] parts = indexArrayAsString.split(",");
-		int[] newIndexArray = new int[index.length + parts.length];
-		int pos = 0;
-		for (String part : parts) {
-			newIndexArray[pos++] = Integer.parseInt(part);
-		}
-		for (int i : index) {
-			newIndexArray[pos++] = i;
-		}
-		return newIndexArray;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/ProcessIdentifierException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/ProcessIdentifierException.java
deleted file mode 100644
index 8bf9053..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/ProcessIdentifierException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-/**
- * Thrown when attempting to create an invalid process identifier, either by
- * popping an empty one (this by definition has no parents) or by pushing a
- * local name including a colon ':' character.
- * 
- * @author Tom Oinn
- * 
- */
-public class ProcessIdentifierException extends RuntimeException {
-
-	private static final long serialVersionUID = -221443591753067425L;
-
-	public ProcessIdentifierException() {
-		super();
-	}
-
-	public ProcessIdentifierException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	public ProcessIdentifierException(String message) {
-		super(message);
-	}
-
-	public ProcessIdentifierException(Throwable cause) {
-		super(cause);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/TokenOrderException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/TokenOrderException.java
deleted file mode 100644
index 1ecf866..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/TokenOrderException.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-/**
- * Thrown when tokens are supplied in an invalid order. Examples of this are
- * where duplicate indices are supplied in the same token stream or where list
- * items are emitted at a point where the individual members haven't been fully
- * populated.
- * 
- * @author Tom Oinn
- * 
- */
-public class TokenOrderException extends Exception {
-
-	public TokenOrderException() {
-		super();
-	}
-
-	public TokenOrderException(String arg0, Throwable arg1) {
-		super(arg0, arg1);
-	}
-
-	public TokenOrderException(String arg0) {
-		super(arg0);
-	}
-
-	public TokenOrderException(Throwable arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -7870614853928171878L;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/TreeCache.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/TreeCache.java
deleted file mode 100644
index 0491502..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/TreeCache.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Tree cache for jobs waiting to be combined and dispatched down the iteration
- * system
- * 
- * @author Tom Oinn
- * 
- */
-public class TreeCache {
-
-	private NamedNode root = null;
-
-	private int indexDepth = -1;
-
-	/**
-	 * Show the tree structure, printing each node recursively
-	 */
-	@Override
-	public synchronized String toString() {
-		StringBuffer sb = new StringBuffer();
-		if (root != null) {
-			printNode(root, sb, "");
-		}
-		else {
-			sb.append("No root node defined.");
-		}
-		return sb.toString();
-	}
-	
-	private synchronized void printNode(NamedNode node, StringBuffer sb, String indent) {
-		sb.append(indent+"Node ("+node.contents+")\n");
-		String newIndent = indent + "  ";
-		for (NamedNode child : node.children) {
-			if (child == null) {
-				sb.append(newIndent+"null\n");
-			}
-			else {
-				printNode(child, sb, newIndent);
-			}
-		}
-	}
-	
-	public class NamedNode {
-
-		public Job contents = null;
-
-		public List<NamedNode> children = new ArrayList<NamedNode>();
-
-		public void insertJob(Job j) {
-			insertJobAt(j, j.getIndex());
-		}
-
-		private void insertJobAt(Job j, int[] position) {
-			if (position.length == 0) {
-				this.contents = j;
-				return;
-			}
-			int firstIndex = position[0];
-			if (firstIndex >= children.size()) {
-				// Pad with blank NamedNode objects
-				for (int i = children.size(); i <= firstIndex; i++) {
-					children.add(null);
-				}
-			}
-			NamedNode child = children.get(firstIndex);
-			if (child == null) {
-				child = new NamedNode();
-				children.set(firstIndex, child);
-			}
-
-			int[] newTarget = new int[position.length - 1];
-			for (int i = 1; i < position.length; i++) {
-				newTarget[i - 1] = position[i];
-			}
-			child.insertJobAt(j, newTarget);
-		}
-
-		public NamedNode childAt(int i) {
-			if (i >= children.size()) {
-				return null;
-			} else {
-				return children.get(i);
-			}
-		}
-
-	}
-
-	/**
-	 * The length of index arrays of jobs within the TreeCache. This assumes
-	 * that all jobs have the same index array length, this is true when the
-	 * cache is used by the iteration strategy but may not be in other
-	 * scenarios, use with caution!
-	 * <p>
-	 * If no jobs have been submitted this method returns -1
-	 */
-	public int getIndexLength() {
-		return this.indexDepth;
-	}
-
-	/**
-	 * Add a job to the cache, the job is inserted at a position corresponding
-	 * to its index array property
-	 * 
-	 * @param j
-	 */
-	public synchronized void insertJob(Job j) {
-		if (root == null) {
-			root = new NamedNode();
-		}
-		indexDepth = j.getIndex().length;
-		root.insertJob(j);
-	}
-
-	protected synchronized NamedNode nodeAt(int[] position) {
-		if (root == null) {
-			return null;
-		}
-		NamedNode result = root;
-		int index = 0;
-		while (index < position.length && result != null) {
-			result = result.childAt(position[index++]);
-		}
-		return result;
-	}
-
-	/**
-	 * Chop the cache off at the specified index
-	 * 
-	 * @param indexArray
-	 */
-	public synchronized void cut(int[] indexArray) {
-		if (indexArray.length > 0) {
-			int[] newIndex = tail(indexArray);
-			NamedNode node = nodeAt(newIndex);
-			if (node != null) {
-				if (node.children.size() >= indexArray[indexArray.length - 1]) {
-					node.children.set(indexArray[indexArray.length - 1], null);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Recursively fetch contents of all nodes under the specified index array,
-	 * used by the prefix matching iteration strategy
-	 */
-	public synchronized List<Job> jobsWithPrefix(int[] prefix) {
-		List<Job> jobs = new ArrayList<Job>();
-		NamedNode prefixNode = nodeAt(prefix);
-		if (prefixNode != null) {
-			getJobsUnder(prefixNode, jobs);
-		}
-		return jobs;
-	}
-
-	private synchronized void getJobsUnder(NamedNode node, List<Job> jobs) {
-		if (node.contents != null) {
-			jobs.add(node.contents);
-		} else {
-			for (NamedNode child : node.children) {
-				getJobsUnder(child, jobs);
-			}
-		}
-	}
-
-	/**
-	 * Does the location exist?
-	 * 
-	 * @param location
-	 * @return whether the contents of the location are non null
-	 */
-	public synchronized boolean containsLocation(int[] location) {
-		return (get(location) != null);
-	}
-
-	/**
-	 * Get the job object at the specified index array
-	 * 
-	 * @param location
-	 * @return Job at the specified location or null if no such job was found
-	 */
-	public synchronized Job get(int[] location) {
-		NamedNode n = nodeAt(location);
-		if (n == null) {
-			return null;
-		}
-		return n.contents;
-	}
-
-	/**
-	 * Chop the last index off an int[]
-	 * 
-	 * @param arg
-	 * @return
-	 */
-	private static int[] tail(int[] arg) {
-		int result[] = new int[arg.length - 1];
-		for (int i = 0; i < arg.length - 1; i++) {
-			result[i] = arg[i];
-		}
-		return result;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/WorkflowDataToken.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/WorkflowDataToken.java
deleted file mode 100644
index 102de29..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/WorkflowDataToken.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.invocation;
-
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * A single data token passed between processors in a workflow. This is distinct
- * from the Job in that it contains a single (unnamed) data reference whereas
- * the Job holds a map of arbitrarily many named data references in a bundle.
- * 
- * @author Tom Oinn
- * 
- */
-public class WorkflowDataToken extends Event<WorkflowDataToken> {
-
-	private T2Reference dataRef;
-	
-	/**
-	 * Construct a new data token with the specified owning process, conceptual
-	 * index array and data reference
-	 * 
-	 * @param owningProcess
-	 * @param index
-	 * @param dataRef
-	 */
-	public WorkflowDataToken(String owningProcess, int[] index, T2Reference dataRef, InvocationContext context) {
-		super(owningProcess, index, context);
-		this.dataRef = dataRef;
-	}
-
-	@Override
-	public WorkflowDataToken popOwningProcess()
-			throws ProcessIdentifierException {
-		return new WorkflowDataToken(popOwner(), index, dataRef, context);
-	}
-
-	@Override
-	public WorkflowDataToken pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new WorkflowDataToken(pushOwner(localProcessName), index, dataRef, context);
-	}
-
-	
-	/**
-	 * Return the ID of the data this event represents
-	 * 
-	 * @return
-	 */
-	public T2Reference getData() {
-		return this.dataRef;
-	}
-	
-	/**
-	 * Show the owner, index array and data map in textual form for debugging
-	 * and any other purpose. Jobs appear in the form :
-	 * 
-	 * <pre>
-	 * Job(Process1)[2,0]{Input2=dataID4,Input1=dataID3}
-	 * </pre>
-	 */
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Token(" + owner + ")[");
-		for (int i = 0; i < index.length; i++) {
-			if (i > 0) {
-				sb.append(",");
-			}
-			sb.append(index[i] + "");
-		}
-		sb.append("]{");
-		sb.append(dataRef.toString());
-		sb.append("}");
-		return sb.toString();
-	}
-
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/package.html
deleted file mode 100644
index 8b3c49a..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/invocation/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<body>
-Contains classes supporting workflow invocation. Other packages may have
-dependencies on this one but classes here will only be accessed by
-non-taverna code in an invocation context. Nothing in here should be
-critical to the definition and manipulation of the workflow defintion.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorManager.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorManager.java
deleted file mode 100644
index d24ad6c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorManager.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.lang.observer.MultiCaster;
-import net.sf.taverna.t2.lang.observer.Observable;
-import net.sf.taverna.t2.lang.observer.Observer;
-import net.sf.taverna.t2.monitor.MonitorManager.MonitorMessage;
-
-/**
- * Manages a list of monitors implementations that get notified to register and
- * deregister nodes (ie. {@link{net.sf.taverna.t2.monitor.MonitorNode}s), in
- * addition to the addition of
- * {@link MonitorableProperty monitorable properties} of such nodes.
- * <p>
- * Nodes are identified by their owning process, which is an array of strings,
- * for instance ["dataflow2", "processor5", "fish"]
- * <p>
- * To notify the (by default 0) monitors, use any of the
- * {@link #addPropertiesToNode(String[], Set)},
- * {@link #registerNode(Object, String[], Set)},
- * {@link #deregisterNode(String)} methods and variants.
- * <p>
- * To register a monitor, use {@link #addObserver(Observer)}.
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class MonitorManager implements Observable<MonitorMessage> {
-
-	private static MonitorManager instance;
-
-	/**
-	 * Get the MonitorManager singleton instance.
-	 * 
-	 * @return The MonitorManager singleton
-	 */
-	public synchronized static MonitorManager getInstance() {
-		if (instance == null) {
-			setInstance(new MonitorManager());
-		}
-		return instance;
-	}
-
-	/**
-	 * Set the MonitorManager singleton instance. Only to be used by overriding
-	 * super classes at initialisation time.
-	 * 
-	 * @param instance
-	 *            MonitorManager singleton to be returned by
-	 *            {@link #getInstance()}.
-	 */
-	protected synchronized static void setInstance(MonitorManager instance) {
-		MonitorManager.instance = instance;
-	}
-
-	protected MultiCaster<MonitorMessage> multiCaster = new MultiCaster<MonitorMessage>(
-			this);
-
-	/**
-	 * Protected constructor, use singleton access
-	 * {@link MonitorManager#getInstance()} instead.
-	 * 
-	 */
-	protected MonitorManager() {
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void addObserver(Observer<MonitorMessage> observer) {
-		multiCaster.addObserver(observer);
-	}
-
-	/**
-	 * Push new property get / set methods into the specified node. This is used
-	 * for monitor-able activities where we have to create the node in the state
-	 * tree before we have the set of monitor-able properties for it.
-	 * 
-	 * @param owningProcess
-	 *            the node path to add properties, this must already be
-	 *            registered in the state model, if not then this method fails
-	 *            silently and does nothing.
-	 * @param newProperties
-	 *            the set of properties to add to the specified node in the
-	 *            state model
-	 */
-	public void addPropertiesToNode(String[] owningProcess,
-			Set<MonitorableProperty<?>> newProperties) {
-		multiCaster.notify(new AddPropertiesMessage(owningProcess,
-				newProperties));
-	}
-
-	/**
-	 * Remove the specified node from the monitor. This must be called when the
-	 * final data or completion event leaves a boundary of control. The monitor
-	 * is free to delay the actual removal of state, in which case the node may
-	 * choose to throw exceptions when properties are accessed. The monitor
-	 * should eventually release all references to work-flow objects and process
-	 * identifiers - typically this is used to allow a UI a few seconds delay on
-	 * de-registration so that very fast register / de-register cycles are
-	 * visible to a user.
-	 * <p>
-	 * The specified process identifier must exist within the monitor.
-	 * 
-	 * @param owningProcess
-	 *            the identifier of the node to remove as a :-separated string
-	 */
-	public void deregisterNode(String owningProcessIdentifier) {
-		deregisterNode(owningProcessIdentifier.split(":"));
-	}
-
-	/**
-	 * Remove the specified node from the monitor. This must be called when the
-	 * final data or completion event leaves a boundary of control. The monitor
-	 * is free to delay the actual removal of state, in which case the node may
-	 * choose to throw exceptions when properties are accessed. The monitor
-	 * should eventually release all references to work-flow objects and process
-	 * identifiers - typically this is used to allow a UI a few seconds delay on
-	 * de-registration so that very fast register / de-register cycles are
-	 * visible to a user.
-	 * <p>
-	 * The specified process identifier must exist within the monitor.
-	 * 
-	 * @param owningProcess
-	 *            the identifier of the node to remove.
-	 */
-	public void deregisterNode(String[] owningProcess) {
-		multiCaster.notify(new DeregisterNodeMessage(owningProcess));
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public List<Observer<MonitorMessage>> getObservers() {
-		return multiCaster.getObservers();
-	}
-
-	/**
-	 * Register a new node with this monitor. New nodes can only be registered
-	 * when a new process identifier is allocated to data corresponding to entry
-	 * to a boundary of control in the data-flow. For cases where extensions
-	 * such as dispatch layers wish to augment existing state the plug-in point
-	 * is responsible for the aggregation of appropriate properties.
-	 * <p>
-	 * The process identifier must not already exist within the state tree, if
-	 * it does it will be ignored. Similarly the parent of the process
-	 * identifier must exist, you cannot specify orphan nodes with no parent.
-	 * 
-	 * @param workflowObject
-	 *            an object within the work-flow model which has received the
-	 *            data stream and caused this node to be created. This may or
-	 *            may not be a top level work-flow entity such as a processor or
-	 *            data-flow. It may be empty in which case null can be used but
-	 *            this is not recommended (there's almost always something you
-	 *            can put here, in general the code to create a new node is
-	 *            contained within something that's just received a data stream
-	 *            so a default approach would be to use the 'this'
-	 *            meta-variable)
-	 * @param owningProcess
-	 *            the :-separated process identifier as a string which has been
-	 *            assigned to data moving through the workflow object. The list
-	 *            of IDs must contain the new identifier as the last element.
-	 */
-	public void registerNode(Object workflowObject,
-			String owningProcessIdentifier) {
-		registerNode(workflowObject, owningProcessIdentifier.split(":"), null);
-	}
-
-	/**
-	 * Register a new node with this monitor. New nodes can only be registered
-	 * when a new process identifier is allocated to data corresponding to entry
-	 * to a boundary of control in the data-flow. For cases where extensions
-	 * such as dispatch layers wish to augment existing state the plug-in point
-	 * is responsible for the aggregation of appropriate properties.
-	 * <p>
-	 * The process identifier must not already exist within the state tree, if
-	 * it does it will be ignored. Similarly the parent of the process
-	 * identifier must exist, you cannot specify orphan nodes with no parent.
-	 * 
-	 * @param workflowObject
-	 *            an object within the work-flow model which has received the
-	 *            data stream and caused this node to be created. This may or
-	 *            may not be a top level work-flow entity such as a processor or
-	 *            data-flow. It may be empty in which case null can be used but
-	 *            this is not recommended (there's almost always something you
-	 *            can put here, in general the code to create a new node is
-	 *            contained within something that's just received a data stream
-	 *            so a default approach would be to use the 'this'
-	 *            meta-variable)
-	 * @param owningProcess
-	 *            the :-separated process identifier as a string which has been
-	 *            assigned to data moving through the workflow object. The list
-	 *            of IDs must contain the new identifier as the last element. *
-	 * @param properties
-	 *            the set of monitor-able, and potentially steer-able,
-	 *            properties which can be monitored from this node. Properties
-	 *            may cache, may become invalid and may make no guarantee about
-	 *            timely updates.
-	 */
-	public void registerNode(Object workflowObject,
-			String owningProcessIdentifier,
-			Set<MonitorableProperty<?>> properties) {
-		registerNode(workflowObject, owningProcessIdentifier.split(":"),
-				properties);
-	}
-
-	/**
-	 * Register a new node with this monitor. New nodes can only be registered
-	 * when a new process identifier is allocated to data corresponding to entry
-	 * to a boundary of control in the data-flow. For cases where extensions
-	 * such as dispatch layers wish to augment existing state the plug-in point
-	 * is responsible for the aggregation of appropriate properties.
-	 * <p>
-	 * The process identifier must not already exist within the state tree, if
-	 * it does it will be ignored. Similarly the parent of the process
-	 * identifier must exist, you cannot specify orphan nodes with no parent.
-	 * 
-	 * @param workflowObject
-	 *            an object within the work-flow model which has received the
-	 *            data stream and caused this node to be created. This may or
-	 *            may not be a top level work-flow entity such as a processor or
-	 *            data-flow. It may be empty in which case null can be used but
-	 *            this is not recommended (there's almost always something you
-	 *            can put here, in general the code to create a new node is
-	 *            contained within something that's just received a data stream
-	 *            so a default approach would be to use the 'this'
-	 *            meta-variable)
-	 * @param owningProcess
-	 *            the process identifier which has been assigned to data moving
-	 *            through the work-flow object. The list of IDs must contain the
-	 *            new identifier as the last element.
-	 */
-	public void registerNode(Object workflowObject, String[] owningProcess) {
-		registerNode(workflowObject, owningProcess, null);
-	}
-
-	/**
-	 * Register a new node with this monitor. New nodes can only be registered
-	 * when a new process identifier is allocated to data corresponding to entry
-	 * to a boundary of control in the data-flow. For cases where extensions
-	 * such as dispatch layers wish to augment existing state the plug-in point
-	 * is responsible for the aggregation of appropriate properties.
-	 * <p>
-	 * The process identifier must not already exist within the state tree, if
-	 * it does it will be ignored. Similarly the parent of the process
-	 * identifier must exist, you cannot specify orphan nodes with no parent.
-	 * 
-	 * @param workflowObject
-	 *            an object within the work-flow model which has received the
-	 *            data stream and caused this node to be created. This may or
-	 *            may not be a top level work-flow entity such as a processor or
-	 *            data-flow. It may be empty in which case null can be used but
-	 *            this is not recommended (there's almost always something you
-	 *            can put here, in general the code to create a new node is
-	 *            contained within something that's just received a data stream
-	 *            so a default approach would be to use the 'this'
-	 *            meta-variable)
-	 * @param owningProcess
-	 *            the process identifier which has been assigned to data moving
-	 *            through the work-flow object. The list of IDs must contain the
-	 *            new identifier as the last element.
-	 * @param properties
-	 *            the set of monitor-able, and potentially steer-able,
-	 *            properties which can be monitored from this node. Properties
-	 *            may cache, may become invalid and may make no guarantee about
-	 *            timely updates.
-	 */
-	public void registerNode(Object workflowObject, String[] owningProcess,
-			Set<MonitorableProperty<?>> properties) {
-		if (properties == null) {
-			properties = new HashSet<MonitorableProperty<?>>();
-		}
-		multiCaster.notify(new RegisterNodeMessage(workflowObject,
-				owningProcess, properties));
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void removeObserver(Observer<MonitorMessage> observer) {
-		multiCaster.removeObserver(observer);
-	}
-
-	/**
-	 * Message indicating that {@link #getNewProperties() new properties} have
-	 * been added to a node identified by given
-	 * {@link #getOwningProcess() owning process}.
-	 * 
-	 */
-	public class AddPropertiesMessage extends MonitorMessage {
-		private final Set<MonitorableProperty<?>> newProperties;
-
-		public AddPropertiesMessage(String[] owningProcess,
-				Set<MonitorableProperty<?>> newProperties) {
-			super(owningProcess);
-			this.newProperties = newProperties;
-		}
-
-		public Set<MonitorableProperty<?>> getNewProperties() {
-			return newProperties;
-		}
-	}
-
-	/**
-	 * Message indicating that the node of the given
-	 * {@link #getOwningProcess() owning process} is to be deregistered.
-	 * 
-	 */
-	public class DeregisterNodeMessage extends MonitorMessage {
-		public DeregisterNodeMessage(String[] owningProcess) {
-			super(owningProcess);
-		}
-	}
-
-	/**
-	 * Common abstract superclass for all monitor messages. Identifies the
-	 * {@link #getOwningProcess() owning process}.
-	 * 
-	 */
-	public abstract class MonitorMessage {
-		private final String[] owningProcess;
-
-		public MonitorMessage(String[] owningProcess) {
-			this.owningProcess = owningProcess;
-		}
-
-		public String[] getOwningProcess() {
-			return owningProcess;
-		}
-	}
-
-	/**
-	 * Message indicating that the node of the given
-	 * {@link #getOwningProcess() owning process} is to be registered. The node
-	 * might have {@link #getProperties() a set of monitorable properties} and a
-	 * {@link #getWorkflowObject workflow object}.
-	 */
-	public class RegisterNodeMessage extends MonitorMessage {
-		private final Set<MonitorableProperty<?>> properties;
-		private final Object workflowObject;
-
-		public RegisterNodeMessage(Object workflowObject,
-				String[] owningProcess, Set<MonitorableProperty<?>> properties) {
-			super(owningProcess);
-			this.workflowObject = workflowObject;
-			this.properties = properties;
-		}
-
-		public Set<MonitorableProperty<?>> getProperties() {
-			return properties;
-		}
-
-		public Object getWorkflowObject() {
-			return workflowObject;
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorNode.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorNode.java
deleted file mode 100644
index d8abd0a..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorNode.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor;
-
-import java.util.Date;
-import java.util.Set;
-
-/**
- * A single node in the Monitor tree, containing an optional arbitrary workflow
- * object and a set of properties which may or may not be mutable. For tree
- * traversal operations the top level monitor tree must be used, instances of
- * this class are not aware of the surrounding tree structure.
- * 
- * @author Tom Oinn
- * 
- */
-public interface MonitorNode {
-
-	/**
-	 * Each monitor node can reference zero or one workflow object. This is the
-	 * object which is providing any properties the node exposes, so is likely
-	 * to be a workflow or processor but could be anything.
-	 * 
-	 * @return the workflow object providing this node's properties, or null if
-	 *         there is no directly corresponding workflow object. Note that
-	 *         this workflow object can be anything, and may not be a top level
-	 *         workflow object at all.
-	 */
-	public Object getWorkflowObject();
-
-	/**
-	 * Each monitor node has an identity corresponding to the identifier stack
-	 * of the data flowing through the workflow object that created it. This
-	 * string array also defines its position in the monitor tree.
-	 */
-	public String[] getOwningProcess();
-
-	/**
-	 * Each monitor node exposes a set of properties, which may or may not be
-	 * mutable
-	 */
-	public Set<? extends MonitorableProperty<?>> getProperties();
-
-	/**
-	 * Each node has a creation date
-	 */
-	public Date getCreationDate();
-
-	/**
-	 * Properties can be added to the monitor node after creation if required,
-	 * although this should be used only when necessary to avoid race conditions
-	 */
-	public void addMonitorableProperty(MonitorableProperty<?> newProperty);
-
-	/**
-	 * Nodes can persist in the tree after they have expired, in which case this
-	 * will return true.
-	 */
-	public boolean hasExpired();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorableProperty.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorableProperty.java
deleted file mode 100644
index d6c2e05..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/MonitorableProperty.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor;
-
-import java.util.Date;
-
-/**
- * A single readable property contained by a Monitorable. This is used to
- * express properties that are dynamic with respect to workflow invocation as
- * opposed to static properties defined by the workflow model. A typical example
- * of this might be dispatch stack queue size or number of jobs completed. All
- * properties are defined relative to a particular owning process identifier,
- * this is the same mechanism as used in the workflow model to isolate different
- * data streams.
- * 
- * @author Tom Oinn
- * 
- */
-public interface MonitorableProperty<T> {
-
-	/**
-	 * Return the value of this property
-	 */
-	public T getValue() throws NoSuchPropertyException;
-
-	/**
-	 * Return the name of this property, names are heirarchical in nature and
-	 * are defined as an array of String objects. This is to allow e.g. dispatch
-	 * layers to expose a set of related properties under the same root name.
-	 */
-	public String[] getName();
-
-	/**
-	 * Get the last update date for this property, if the property is immutable
-	 * then this should be set to the date at which the implementation is
-	 * created.
-	 */
-	public Date getLastModified();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/NoSuchPropertyException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/NoSuchPropertyException.java
deleted file mode 100644
index 670a81f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/NoSuchPropertyException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor;
-
-/**
- * Thrown when an attempt is made to access a monitorable property which is no
- * longer current. This is quite a common event as the properties can change
- * extremely quickly whereas the logic accessing them is expected not to.
- * Consumers of state data must cope with this disparity by handling this
- * exception where it is thrown.
- * 
- * @author Tom Oinn
- * 
- */
-public class NoSuchPropertyException extends Exception {
-
-	private static final long serialVersionUID = 6320919057517500603L;
-
-	public NoSuchPropertyException() {
-		super();
-	}
-
-	public NoSuchPropertyException(String arg0, Throwable arg1) {
-		super(arg0, arg1);
-	}
-
-	public NoSuchPropertyException(String arg0) {
-		super(arg0);
-	}
-
-	public NoSuchPropertyException(Throwable arg0) {
-		super(arg0);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/SteerableProperty.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/SteerableProperty.java
deleted file mode 100644
index 6eb9624..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/SteerableProperty.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor;
-
-/**
- * Some monitorable properties are mutable and can be written to by steering
- * agents or other clients.
- * 
- * @author Tom Oinn
- * 
- */
-public interface SteerableProperty<T> extends MonitorableProperty<T> {
-
-	/**
-	 * Set the property value
-	 * 
-	 * @param newValue
-	 * @throws NoSuchPropertyException
-	 */
-	public void setProperty(T newValue) throws NoSuchPropertyException;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/package.html
deleted file mode 100644
index 17ee572..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/monitor/package.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<body>
-Defines the API for the monitoring and steering system. As data flows
-through a workflow it passes through a succession of bounds of control.
-Each of these boundaries corresponds to a workflow, a nested process or
-some other contained entity where a new owning process identifier is
-pushed onto the process identifier stack for that data item. This
-modification to the owning process identifier implicitly creates a tree
-structure where the parent of a particular identifier can be obtained by
-popping the last component off its identifier stack (in general this
-means splitting into a list by the ':' character and removing the last
-item).
-<p>Any entity issuing a new identifier to data in this way must
-implement the Monitorable interface and should register itself with the
-Monitor before or at the point of assigning this new identifier. Some
-cases may register child items rather than delegating to the children
-themselves, for example a workflow definition may register all its
-processors as children and deregister on workflow completion rather than
-the process happening for each processor but however it is accomplished
-the result is the creation within the Monitor of a tree where nodes
-contain references to Monitorable objects within the workflow
-definition.
-<p>The Monitorable interface defines a simple contract - once
-registered the implementing class can return a list of
-MonitorableProperty instances defining the exposed dynamic state at this
-node in the context of a given process identifier. Any of these
-properties may be mutable in which case they will extend
-SteerableProperty, a sub-interface of MonitorableProperty which allows
-for the mutation of the property.
-<p>By design the Monitor is rather powerful - it has the ability to
-modify steerable properties in any running workflow. It is obviously
-desirable to restrict this, passing any given monitoring or steering
-agent a restricted subset of the monitor tree rooted at a specific
-process identifier and preventing direct access to the Monitor class.
-The Monitor interface defines methods to expose subsets of the
-monitorable state for this reason.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ActivityProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ActivityProvenanceItem.java
deleted file mode 100644
index c3be16f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ActivityProvenanceItem.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * Contains details for an enacted Activity. Parent is a
- * {@link ProcessorProvenanceItem}. Children are {@link IterationProvenanceItem}
- * s. There could be multiple {@link ActivityProvenanceItem}s for each
- * {@link ProcessorProvenanceItem}
- * 
- * @author Ian Dunlop
- * @author Stuart Owen
- * @author Paolo Missier
- * 
- */
-public class ActivityProvenanceItem implements ProvenanceItem {
-
-	private Activity<?> activity;
-	private IterationProvenanceItem iterationProvenanceItem;
-	private String processId;
-	private String identifier;
-	private String parentId;
-	private SharedVocabulary eventType = SharedVocabulary.ACTIVITY_EVENT_TYPE;
-	private String workflowId;
-
-	public ActivityProvenanceItem() {
-	}
-
-	private String getActivityID() {
-		return activity.getClass().getSimpleName();
-	}
-
-	public void setIterationProvenanceItem(
-			IterationProvenanceItem iterationProvenanceItem) {
-		this.iterationProvenanceItem = iterationProvenanceItem;
-	}
-
-	public IterationProvenanceItem getIterationProvenanceItem() {
-		return iterationProvenanceItem;
-	}
-
-	public String getAsString() {
-		return null;
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public Activity<?> getActivity() {
-		return activity;
-	}
-
-	public void setActivity(Activity<?> activity) {
-		this.activity = activity;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-	
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-
-	}
-
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/DataProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/DataProvenanceItem.java
deleted file mode 100644
index 4687726..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/DataProvenanceItem.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Contains references to data which a workflow has used or created. Parent is
- * an {@link IterationProvenanceItem}
- * 
- * @author Ian Dunlop
- * @auhor Stuart Owen
- * @author Paolo Missier
- * 
- */
-public abstract class DataProvenanceItem implements ProvenanceItem {
-	/** A map of port name to data reference */
-	private Map<String, T2Reference> dataMap;
-	private ReferenceService referenceService;
-	private String workflowId;
-
-	/**
-	 * Is this {@link ProvenanceItem} for input or output data
-	 * 
-	 * @return
-	 */
-	protected abstract boolean isInput();
-
-	public DataProvenanceItem() {
-
-	}
-
-	/* (non-Javadoc)
-	 * @see net.sf.taverna.t2.provenance.item.DataProvenanceItemInterface#getDataMap()
-	 */
-	public Map<String, T2Reference> getDataMap() {
-		return dataMap;
-	}
-
-	/* (non-Javadoc)
-	 * @see net.sf.taverna.t2.provenance.item.DataProvenanceItemInterface#setDataMap(java.util.Map)
-	 */
-	public void setDataMap(Map<String, T2Reference> dataMap) {
-		this.dataMap = dataMap;
-	}
-
-	public abstract String getIdentifier();
-
-	public abstract String getParentId();
-
-	public abstract String getProcessId();
-
-	public void setReferenceService(ReferenceService referenceService) {
-		this.referenceService = referenceService;
-	}
-
-	public ReferenceService getReferenceService() {
-		return referenceService;
-	}
-	
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/DataflowRunComplete.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/DataflowRunComplete.java
deleted file mode 100644
index d50384a..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/DataflowRunComplete.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-
-/**
- * Informs the {@link ProvenanceConnector} that a workflow has been run to
- * completion. If a {@link ProvenanceConnector} receives this event then it
- * means that there are no further events to come and that the workflow has been
- * enacted to completion
- * 
- * @author Ian Dunlop
- * 
- */
-public class DataflowRunComplete implements ProvenanceItem {
-
-	private String processId;
-	private String parentId;
-	private String identifier;
-	private SharedVocabulary eventType = SharedVocabulary.END_WORKFLOW_EVENT_TYPE;
-	private String workflowId;
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;		
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ErrorProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ErrorProvenanceItem.java
deleted file mode 100644
index a025d11..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ErrorProvenanceItem.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-
-/**
- * When an error is received in the dispatch stack, one of these is created and
- * sent across to the {@link ProvenanceConnector}. Parent is an
- * {@link IterationProvenanceItem}
- * 
- * @author Ian Dunlop
- * @author Stuart Owen
- * @author Paolo Missier
- * 
- */
-public class ErrorProvenanceItem implements ProvenanceItem {
-
-	private Throwable cause;
-	private String message;
-	private String errorType;
-	private String processId;
-	private String parentId;
-	private String identifier;
-	private SharedVocabulary eventType = SharedVocabulary.ERROR_EVENT_TYPE;
-	private String workflowId;
-
-	public ErrorProvenanceItem() {
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public Throwable getCause() {
-		return cause;
-	}
-
-	public void setCause(Throwable cause) {
-		this.cause = cause;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	public String getErrorType() {
-		return errorType;
-	}
-
-	public void setErrorType(String errorType) {
-		this.errorType = errorType;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-	
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getParentId() {
-		return parentId;
-	}
-
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-	
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/InputDataProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/InputDataProvenanceItem.java
deleted file mode 100644
index 06b375e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/InputDataProvenanceItem.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-
-/**
- * Contains details of port names and the input data they receive. Parent is an
- * {@link IterationProvenanceItem}
- * 
- * @author Paolo Missier
- * @author Stuart Owen
- * @author Ian Dunlop
- * 
- */
-public class InputDataProvenanceItem extends DataProvenanceItem {
-
-	private String processId;
-	private String identifier;
-	private String parentId;
-	private SharedVocabulary eventType = SharedVocabulary.INPUTDATA_EVENT_TYPE;
-
-	/**
-	 * Used when generating the xml version by the {@link DataProvenanceItem}.
-	 * Identifies this {@link DataProvenanceItem} as containing input
-	 */
-	protected boolean isInput() {
-		return true;
-	}
-
-	public InputDataProvenanceItem() {
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getParentId() {
-		// TODO Auto-generated method stub
-		return parentId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-		// TODO Auto-generated method stub
-
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-		// TODO Auto-generated method stub
-
-	}
-
-	public String getProcessId() {
-		// TODO Auto-generated method stub
-		return processId;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/IterationProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/IterationProvenanceItem.java
deleted file mode 100644
index c1475bb..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/IterationProvenanceItem.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-
-/**
- * One of these is created for each iteration inside an enacted activity.
- * Contains both the input and output data and port names contained inside
- * {@link DataProvenanceItem}s. The actual iteration number is contained inside
- * an int array eg [1]
- * 
- * @author Ian Dunlop
- * @author Paolo Missier
- * @author Stuart Owen
- * 
- */
-public class IterationProvenanceItem implements ProvenanceItem {
-	private int[] iteration;
-	private InputDataProvenanceItem inputDataItem;
-	private OutputDataProvenanceItem outputDataItem;
-	private ErrorProvenanceItem errorItem;
-	private String processId;
-	private String parentId;
-	private String identifier;
-	private SharedVocabulary eventType = SharedVocabulary.ITERATION_EVENT_TYPE;
-	private String workflowId;
-
-	public IterationProvenanceItem() {
-	}
-
-	public void setInputDataItem(InputDataProvenanceItem inputDataItem) {
-		this.inputDataItem = inputDataItem;
-	}
-
-	public void setOutputDataItem(OutputDataProvenanceItem outputDataItem) {
-		this.outputDataItem = outputDataItem;
-	}
-
-	public void setErrorItem(ErrorProvenanceItem errorItem) {
-		this.errorItem = errorItem;
-	}
-
-	public ErrorProvenanceItem getErrorItem() {
-		return errorItem;
-	}
-
-	public int[] getIteration() {
-		return iteration;
-	}
-
-	public void setIteration(int[] iteration) {
-		this.iteration = iteration;
-	}
-	
-	public InputDataProvenanceItem getInputDataItem() {
-		return inputDataItem;
-	}
-
-	public OutputDataProvenanceItem getOutputDataItem() {
-		return outputDataItem;
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-	
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-	
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-
-	public void setWorklfowId(String workflowId) {
-		this.setWorkflowId(workflowId);
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;
-	}
-
-	public String getWorkflowId() {
-		return workflowId;
-	}
-	
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/OutputDataProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/OutputDataProvenanceItem.java
deleted file mode 100644
index 2a2be08..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/OutputDataProvenanceItem.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-/**
- * Contains details of port names and the output data they receive. Parent is an
- * {@link IterationProvenanceItem}
- * 
- * @author Paolo Missier
- * @author Stuart Owen
- * @author Ian Dunlop
- * 
- */
-public class OutputDataProvenanceItem extends DataProvenanceItem {
-
-	private String processId;
-	private String parentId;
-	private String identifier;
-	private SharedVocabulary eventType = SharedVocabulary.OUTPUTDATA_EVENT_TYPE;
-	/**
-	 * Used when generating the xml version by the {@link DataProvenanceItem}.
-	 * Identifies this {@link DataProvenanceItem} as containing output
-	 */
-	protected boolean isInput() {
-		return false;
-	}
-	
-	public OutputDataProvenanceItem() {
-		super();
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-	
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-	
-	public String getProcessId() {
-		return processId;
-	}
-	
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;		
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;		
-	}
-
-
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProcessProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProcessProvenanceItem.java
deleted file mode 100644
index d1d4e45..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProcessProvenanceItem.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-
-/**
- * Each time a job is received by the dispatch stack one of these will be
- * created. It has a {@link ProcessorProvenanceItem} as its child. Its parent is
- * a {@link WorkflowProvenanceItem} which in turn knows the unique id of the
- * workflow the provenance is being stored for. NOTE: May be superfluous since
- * it essentially mimics the behaviour of its child item but may be more hastle
- * than it is worth to remove it
- * 
- * @author Stuart owen
- * @author Paolo Missier
- * @author Ian Dunlop
- * 
- */
-public class ProcessProvenanceItem implements ProvenanceItem {
-	private String owningProcess;
-	private ProcessorProvenanceItem processorProvenanceItem;
-	private String parentId;
-	private String identifier;
-	private String facadeID;
-	private String processId;
-	private String dataflowID;
-	private SharedVocabulary eventType = SharedVocabulary.PROCESS_EVENT_TYPE;
-	private String workflowId;
-
-	public ProcessProvenanceItem() {
-		
-	}
-
-	/**
-	 * As {@link WorkflowInstanceFacade}s are created for a Processor the
-	 * details are appended to the owning process identifier. This is in the
-	 * form facadeX:dataflowY:ProcessorZ etc.  This method returns the facadeX part.
-	 * 
-	 * @return
-	 */
-	public String getFacadeID() {
-		return facadeID;
-	}
-
-	public void setProcessorProvenanceItem(
-			ProcessorProvenanceItem processorProvenanceItem) {
-		this.processorProvenanceItem = processorProvenanceItem;
-	}
-
-	public ProcessorProvenanceItem getProcessorProvenanceItem() {
-		return processorProvenanceItem;
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public String getOwningProcess() {
-		return owningProcess;
-	}
-
-	public void setOwningProcess(String owningProcess) {
-		this.owningProcess = owningProcess;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-
-	public void setFacadeID(String facadeID) {
-		this.facadeID = facadeID;
-	}
-
-	public void setDataflowID(String dataflowID) {
-		this.dataflowID = dataflowID;
-	}
-	
-	public String getDataflowID() {
-		return dataflowID;
-	}
-	
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProcessorProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProcessorProvenanceItem.java
deleted file mode 100644
index b23017c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProcessorProvenanceItem.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.reference.ReferenceService;
-
-import org.jdom.Element;
-
-/**
- * Each Processor inside a workflow will have one of these for each provenance
- * run. Its parent is a {@link ProcessProvenanceItem} and child is an
- * {@link ActivityProvenanceItem}. In theory there could be more than one
- * {@link ActivityProvenanceItem} per processor to cope with failover etc
- * 
- * @author Ian Dunlop
- * @author Stuart Owen
- * @author Paolo Missier
- * 
- */
-public class ProcessorProvenanceItem implements ProvenanceItem {
-
-	private ActivityProvenanceItem activityProvenanceItem;
-	private String processId;
-	private String parentId;
-	private String identifier;
-	private SharedVocabulary eventType = SharedVocabulary.PROCESSOR_EVENT_TYPE;
-	private String workflowId;
-
-	public ProcessorProvenanceItem() {
-	}
-
-
-	public void setActivityProvenanceItem(
-			ActivityProvenanceItem activityProvenanceItem) {
-		this.activityProvenanceItem = activityProvenanceItem;
-	}
-
-	public ActivityProvenanceItem getActivityProvenanceItem() {
-		return activityProvenanceItem;
-	}
-
-	public String getProcessorID() {
-		return identifier;
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-	
-	public String getProcessId() {
-		return processId;
-	}
-	
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-	
-	public void setIdentifier(String identifier) {
-		// FIXME this used to be the code below but not really sure why so have
-		// changed it
-//		String facadeId = processId.split(":")[0];
-//		this.identifier = facadeId + "(" + identifier + ")";
-		this.identifier = identifier;
-	}
-	
-	public String getIdentifier() {
-		return identifier;
-	}
-	
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProvenanceItem.java
deleted file mode 100644
index 8a852b3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/ProvenanceItem.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-
-/**
- * Used to store some enactment information during a workflow run
- * 
- * @author Ian Dunlop
- * 
- */
-public interface ProvenanceItem {
-
-	/**
-	 * What type of information does the item contain. The
-	 * {@link SharedVocabulary} can be used to identify it
-	 * 
-	 * @return
-	 */
-	public SharedVocabulary getEventType();
-
-	/**
-	 * The unique identifier for this item
-	 * 
-	 * @return
-	 */
-	public String getIdentifier();
-
-	/**
-	 * A unique id for this event. Any children would use this as their parentId
-	 * 
-	 * @param identifier
-	 */
-	public void setIdentifier(String identifier);
-
-	/**
-	 * The workflow model id that is supplied during enactment eg
-	 * facade0:dataflow2:processor1
-	 * 
-	 * @param processId
-	 */
-	public void setProcessId(String processId);
-
-	/**
-	 * Get the enactor supplie identifier
-	 * 
-	 * @return
-	 */
-	public String getProcessId();
-
-	/**
-	 * The parent of this provenance Item. The model is
-	 * WorkflowProvenanceItem>ProcessProvenanceItem
-	 * >ProcessorProvenanceItem>ActivityProvenanceITem
-	 * >IterationProvenanceItem>DataProvenanceItem
-	 * 
-	 * Additionally there is a WorkflowDataProvenanceItem that is sent when the
-	 * facade receives a completion event and a ErrorProvenanceItem when things
-	 * go wrong
-	 * 
-	 * @param parentId
-	 */
-	public void setParentId(String parentId);
-
-	/**
-	 * Who is the parent of this item?
-	 * 
-	 * @return
-	 */
-	public String getParentId();
-	
-	/**
-	 * The uuid that belongs to the actual dataflow
-	 * @param workflowId
-	 */
-	public void setWorkflowId(String workflowId);
-	
-	/**
-	 * The uuid that belongs to the actual dataflow
-	 * @return a string representation of a uuid
-	 */
-	public String getWorkflowId();
-
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/WorkflowDataProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/WorkflowDataProvenanceItem.java
deleted file mode 100644
index ffd0772..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/WorkflowDataProvenanceItem.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * When the {@link WorkflowInstanceFacade} for a processor receives a data token
- * one of these is created. This is especially important for data which flows
- * straight through a facade without going into the dispatch stack (a rare event
- * but it can happen)
- * 
- * @author Ian Dunlop
- * 
- */
-public class WorkflowDataProvenanceItem implements ProvenanceItem {
-
-	private String identifier;
-	private String parentId;
-	private String processId;
-	private ReferenceService referenceService;
-	/** The output port name that the data is for */
-	private String portName;
-	/** A reference to the data token received in the facade */
-	private T2Reference data;
-	private SharedVocabulary eventType = SharedVocabulary.WORKFLOW_DATA_EVENT_TYPE;
-	private boolean isFinal;
-	private int[] index;
-	private String workflowId;
-
-	public WorkflowDataProvenanceItem() {
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public String getParentId() {
-		return parentId;
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public void setPortName(String portName) {
-		this.portName = portName;
-	}
-
-	public String getPortName() {
-		return portName;
-	}
-
-	public void setData(T2Reference data) {
-		this.data = data;
-	}
-
-	public T2Reference getData() {
-		return data;
-	}
-
-	public void setReferenceService(ReferenceService referenceService) {
-		this.referenceService = referenceService;
-	}
-
-	public ReferenceService getReferenceService() {
-		return referenceService;
-	}
-
-	public void setIndex(int[] index) {
-		this.index = index;
-	
-	}
-	
-	public int[] getIndex() {
-		return index;
-	}
-
-	public void setFinal(boolean isFinal) {
-		this.isFinal = isFinal;
-	}
-	
-	public boolean isFinal() {
-		return isFinal;
-	}
-	
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/WorkflowProvenanceItem.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/WorkflowProvenanceItem.java
deleted file mode 100644
index 98b2289..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/item/WorkflowProvenanceItem.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.item;
-
-import net.sf.taverna.t2.facade.WorkflowInstanceFacade;
-import net.sf.taverna.t2.provenance.vocabulary.SharedVocabulary;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-import org.apache.log4j.Logger;
-
-/**
- * The first {@link ProvenanceItem} that the {@link ProvenanceConnector} will
- * receive for a workflow run. Contains the {@link Dataflow} itself as well as
- * the process id for the {@link WorkflowInstanceFacade} (facadeX:dataflowY).
- * Its child is a {@link ProcessProvenanceItem} and parent is the UUID of the
- * {@link Dataflow} itself
- * 
- * @author Ian Dunlop
- * @author Paolo Missier
- * @author Stuart Owen
- * 
- */
-public class WorkflowProvenanceItem implements ProvenanceItem {
-
-	private static Logger logger = Logger
-			.getLogger(WorkflowProvenanceItem.class);
-
-	private Dataflow dataflow;
-	private String processId;
-	private String parentId;
-	private String identifier;
-	private SharedVocabulary eventType  = SharedVocabulary.WORKFLOW_EVENT_TYPE;
-	private int[] index;
-	private boolean isFinal;
-
-	private String workflowId;
-	
-	public WorkflowProvenanceItem() {
-		
-	}
-
-	public Dataflow getDataflow() {
-		return dataflow;
-	}
-
-	public void setDataflow(Dataflow dataflow) {
-		this.dataflow = dataflow;
-	}
-
-	public SharedVocabulary getEventType() {
-		return eventType;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public void setProcessId(String processId) {
-		this.processId = processId;
-	}
-
-	public String getParentId() {
-		return parentId;
-	}
-
-	public void setIdentifier(String identifier) {
-		this.identifier = identifier;
-	}
-
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-
-	public String getProcessId() {
-		return processId;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int[] getIndex() {
-		return index;
-	}
-
-	/**
-	 * @param index the index to set
-	 */
-	public void setIndex(int[] index) {
-		this.index = index;
-	}
-
-	/**
-	 * @return the isFinal
-	 */
-	public boolean isFinal() {
-		return isFinal;
-	}
-
-	/**
-	 * @param isFinal the isFinal to set
-	 */
-	public void setFinal(boolean isFinal) {
-		this.isFinal = isFinal;
-	}
-	
-	public String getWorkflowId() {
-		return workflowId;
-	}
-
-	public void setWorkflowId(String workflowId) {
-		this.workflowId = workflowId;	
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/reporter/ProvenanceReporter.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/reporter/ProvenanceReporter.java
deleted file mode 100644
index 5cb3fbd..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/reporter/ProvenanceReporter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package net.sf.taverna.t2.provenance.reporter;
-
-import java.util.List;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem;
-import net.sf.taverna.t2.reference.ReferenceService;
-
-public interface ProvenanceReporter {
-
-	/**
-	 * Add a {@link ProvenanceItem} to the connector
-	 * 
-	 * @param provenanceItem
-	 * @param invocationContext
-	 */
-	public void addProvenanceItem(ProvenanceItem provenanceItem);
-
-	// FIXME is this reference service really needed since we have the context?
-	/**
-	 * Tell the connector what {@link ReferenceService} it should use when
-	 * trying to dereference data items inside {@link ProvenanceItem}s
-	 * 
-	 * @param referenceService
-	 */
-	public void setReferenceService(ReferenceService referenceService);
-
-	/**
-	 * Get the {@link ReferenceService} in use by this connector
-	 * 
-	 * @return
-	 */
-	public ReferenceService getReferenceService();
-
-	/**
-	 * Get all the {@link ProvenanceItem}s that the connector currently knows
-	 * about
-	 * 
-	 * @return
-	 */
-	public List<ProvenanceItem> getProvenanceCollection();
-
-	/**
-	 * Set the {@link InvocationContext} that this reporter should be using
-	 * 
-	 * @param invocationContext
-	 */
-	public void setInvocationContext(InvocationContext invocationContext);
-
-	/**
-	 * Get the {@link InvocationContext} that this reporter should be using if
-	 * it needs to dereference any data
-	 * 
-	 * @return
-	 */
-	public InvocationContext getInvocationContext();
-	
-	/**
-	 * A unique identifier for this run of provenance, should correspond to the
-	 * initial {@link WorkflowProvenanceItem} idenifier that gets sent through
-	 * 
-	 * @param identifier
-	 */
-	public void setSessionID(String sessionID);
-
-	/**
-	 * What is the unique identifier used by this connector
-	 * 
-	 * @return
-	 */
-	public String getSessionID();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/vocabulary/SharedVocabulary.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/vocabulary/SharedVocabulary.java
deleted file mode 100644
index f222736..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/provenance/vocabulary/SharedVocabulary.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.provenance.vocabulary;
-
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-
-/**
- * Static strings which identify all the {@link ProvenanceItem}s and
- * {@link ProvenanceEventType}s
- * 
- * @author Paolo Missier
- * @author Ian Dunlop
- * 
- */
-public enum SharedVocabulary {
-
-	DATAFLOW_EVENT_TYPE, PROCESS_EVENT_TYPE, PROVENANCE_EVENT_TYPE, ACTIVITY_EVENT_TYPE, DATA_EVENT_TYPE, ERROR_EVENT_TYPE, INMEMORY_EVENT_TYPE, INPUTDATA_EVENT_TYPE, ITERATION_EVENT_TYPE, OUTPUTDATA_EVENT_TYPE, PROCESSOR_EVENT_TYPE, WEBSERVICE_EVENT_TYPE, WORKFLOW_DATA_EVENT_TYPE, WORKFLOW_EVENT_TYPE, END_WORKFLOW_EVENT_TYPE;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TreeModelAdapter.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TreeModelAdapter.java
deleted file mode 100644
index 96b14d4..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TreeModelAdapter.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.utility;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.swing.event.TreeModelEvent;
-import javax.swing.event.TreeModelListener;
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreePath;
-
-/**
- * Wraps a typed tree model up in a standard tree model for use with JTree and
- * friends.
- * 
- * @author Tom Oinn
- * 
- */
-public final class TreeModelAdapter {
-
-	private class TypedListenerPair {
-		@SuppressWarnings("unchecked")
-		TypedTreeModelListener typedListener;
-		
-		TreeModelListener untypedListener;
-		
-		@SuppressWarnings("unchecked")
-		TypedListenerPair(TypedTreeModelListener typedListener,
-				TreeModelListener untypedListener) {
-			this.typedListener = typedListener;
-			this.untypedListener = untypedListener;
-		}
-
-	}
-
-	private static Set<TypedListenerPair> mapping = new HashSet<TypedListenerPair>();
-
-	private static TreeModelAdapter instance = null;
-
-	private TreeModelAdapter() {
-		//
-	}
-
-	private synchronized static TreeModelAdapter getInstance() {
-		if (instance == null) {
-			instance = new TreeModelAdapter();
-		}
-		return instance;
-	}
-
-	/**
-	 * Return an untyped TreeModel wrapper around the specified TypedTreeModel
-	 * 
-	 * @param <NodeType>
-	 *            the node type of the typed model being wrapped
-	 * @param typedModel
-	 *            typed model to wrap
-	 * @return a TreeModel acting as an untyped view of the typed tree model
-	 */
-	public static <NodeType extends Object> TreeModel untypedView(
-			TypedTreeModel<NodeType> typedModel) {
-		return getInstance().removeType(typedModel);
-	}
-
-	private <NodeType extends Object> TreeModel removeType(
-			final TypedTreeModel<NodeType> typedModel) {
-
-		return new TreeModel() {
-
-			@SuppressWarnings("unchecked")
-			public void addTreeModelListener(final TreeModelListener arg0) {
-				TypedTreeModelListener typedListener = new TypedTreeModelListener<NodeType>() {
-
-					public void treeNodesChanged(TypedTreeModelEvent<NodeType> e) {
-						arg0.treeNodesChanged(unwrapType(e));
-					}
-
-					public void treeNodesInserted(
-							TypedTreeModelEvent<NodeType> e) {
-						arg0.treeNodesInserted(unwrapType(e));
-					}
-
-					public void treeNodesRemoved(TypedTreeModelEvent<NodeType> e) {
-						arg0.treeNodesRemoved(unwrapType(e));
-					}
-
-					public void treeStructureChanged(
-							TypedTreeModelEvent<NodeType> e) {
-						arg0.treeStructureChanged(unwrapType(e));
-					}
-
-					private TreeModelEvent unwrapType(
-							final TypedTreeModelEvent<NodeType> e) {
-						return new TreeModelEvent(e.getSource(), e
-								.getTreePath(), e.getChildIndices(), e
-								.getChildren());
-					}
-
-				};
-				synchronized (mapping) {
-					typedModel.addTreeModelListener(typedListener);
-					mapping.add(new TypedListenerPair(typedListener, arg0));
-				}
-
-			}
-
-			@SuppressWarnings("unchecked")
-			public Object getChild(Object arg0, int arg1) {
-				return typedModel.getChild((NodeType) arg0, arg1);
-			}
-
-			@SuppressWarnings("unchecked")
-			public int getChildCount(Object arg0) {
-				return typedModel.getChildCount((NodeType) arg0);
-			}
-
-			@SuppressWarnings("unchecked")
-			public int getIndexOfChild(Object arg0, Object arg1) {
-				return typedModel.getIndexOfChild((NodeType) arg0,
-						(NodeType) arg1);
-			}
-
-			public Object getRoot() {
-				return typedModel.getRoot();
-			}
-
-			@SuppressWarnings("unchecked")
-			public boolean isLeaf(Object arg0) {
-				return typedModel.isLeaf((NodeType) arg0);
-			}
-
-			@SuppressWarnings("unchecked")
-			public void removeTreeModelListener(TreeModelListener arg0) {
-				synchronized (mapping) {
-					TypedListenerPair toRemove = null;
-					for (TypedListenerPair tpl : mapping) {
-						if (tpl.untypedListener == arg0) {
-							toRemove = tpl;
-							typedModel
-									.removeTreeModelListener(tpl.typedListener);
-							break;
-						}
-					}
-					if (toRemove == null) {
-						return;
-					}
-					mapping.remove(toRemove);
-				}
-
-			}
-
-			public void valueForPathChanged(TreePath arg0, Object arg1) {
-				typedModel.valueForPathChanged(arg0, arg1);
-			}
-
-		};
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModel.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModel.java
deleted file mode 100644
index 6c74638..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModel.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.utility;
-
-import javax.swing.tree.TreePath;
-
-/**
- * A replacement for TreeModel where nodes are typed rather than being generic
- * objects. Because of the way interfaces and generics work this can't be
- * related in any inheritance heirarchy to the actual javax.swing.TreeModel
- * interface but is very similar (okay, identical) in operation. For cases where
- * you want to use a normal TreeModel such as using this as the backing data
- * model for a JTree you can use the TreeModelAdapter class to create an untyped
- * view over the typed version defined here.
- * 
- * @author Tom Oinn
- * 
- * @see javax.swing.tree.TreeModel
- * 
- * @param <NodeType>
- *            Each node in the tree is of this type
- */
-public interface TypedTreeModel<NodeType> {
-
-	/**
-	 * Adds a listener for the TreeModelEvent posted after the tree changes.
-	 */
-	void addTreeModelListener(TypedTreeModelListener<NodeType> l);
-
-	/**
-	 * Returns the child of parent at index 'index' in the parent's child array.
-	 * 
-	 * @param parent
-	 *            parent instance of typed node type
-	 * @param index
-	 *            index within parent
-	 * @return child node at the specified index
-	 */
-	NodeType getChild(NodeType parent, int index);
-
-	/**
-	 * Returns the number of children of parent.
-	 * 
-	 * @param parent
-	 *            node to count children for
-	 * @return number of children
-	 */
-	int getChildCount(NodeType parent);
-
-	/**
-	 * Returns the index of child in parent.
-	 * 
-	 * @param parent
-	 *            a node in the tree, obtained from this data source
-	 * @param child
-	 *            the node we are interested in
-	 * @return the index of the child in the parent, or -1 if either child or
-	 *         parent are null
-	 */
-	int getIndexOfChild(NodeType parent, NodeType child);
-
-	/**
-	 * Returns the root of the tree. Returns null only if the tree has no nodes.
-	 * 
-	 * @return the root of the tree
-	 */
-	NodeType getRoot();
-
-	/**
-	 * Returns true if node is a leaf. It is possible for this method to return
-	 * false even if node has no children. A directory in a filesystem, for
-	 * example, may contain no files; the node representing the directory is not
-	 * a leaf, but it also has no children.
-	 * 
-	 * @param node
-	 *            a node in the tree, obtained from this data source
-	 * @return true if node is a leaf
-	 */
-	boolean isLeaf(NodeType node);
-
-	/**
-	 * Removes a listener previously added with addTreeModelListener.
-	 * 
-	 * @param l
-	 *            typed tree model listener to remove
-	 */
-	void removeTreeModelListener(TypedTreeModelListener<NodeType> l);
-
-	/**
-	 * Messaged when the user has altered the value for the item identified by
-	 * path to newValue. If newValue signifies a truly new value the model
-	 * should post a treeNodesChanged event.
-	 * 
-	 * @param path
-	 *            path to the node that the user has altered
-	 * @param newValue
-	 *            the new value from the TreeCellEditor
-	 */
-	void valueForPathChanged(TreePath path, Object newValue);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModelEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModelEvent.java
deleted file mode 100644
index c3708c2..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModelEvent.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.utility;
-
-import javax.swing.tree.TreePath;
-
-/**
- * Type aware version of TreeModelEvent
- * 
- * @author Tom Oinn
- * 
- * @see javax.swing.tree.TreeModelEvent
- * 
- * @param <NodeType>
- *            the node type parameter of the TypedTreeModel to which this event
- *            applies
- */
-public class TypedTreeModelEvent<NodeType> {
-
-	protected int[] childIndices;
-
-	protected NodeType[] children;
-
-	protected TreePath path;
-
-	protected Object source;
-
-	/**
-	 * Used to create an event when the node structure has changed in some way,
-	 * identifying the path to the root of a modified subtree as an array of
-	 * Objects.
-	 * 
-	 * @param source
-	 * @param path
-	 */
-	public TypedTreeModelEvent(Object source, NodeType[] path) {
-		this.path = new TreePath(path);
-		this.source = source;
-		this.childIndices = new int[0];
-		//this.children = NodeType[].class.cast(java.lang.reflect.Array
-		//		.newInstance(NodeType[].class, 0));
-	}
-
-	/**
-	 * Used to create an event when the node structure has changed in some way,
-	 * identifying the path to the root of the modified subtree as a TreePath
-	 * object.
-	 * 
-	 * @param source
-	 * @param path
-	 */
-	public TypedTreeModelEvent(Object source, TreePath path) {
-		this.path = path;
-		this.source = source;
-		this.childIndices = new int[0];
-		//this.children = NodeType[].class.cast(java.lang.reflect.Array
-		//		.newInstance(NodeType[].class, 0));
-	}
-
-	/**
-	 * Used to create an event when nodes have been changed, inserted, or
-	 * removed, identifying the path to the parent of the modified items as a
-	 * TreePath object.
-	 * 
-	 * @param source
-	 * @param path
-	 * @param childIndices
-	 * @param children
-	 */
-	public TypedTreeModelEvent(Object source, TreePath path,
-			int[] childIndices, NodeType[] children) {
-		this.source = source;
-		this.path = path;
-		this.childIndices = childIndices;
-		this.children = children;
-	}
-
-	/**
-	 * Used to create an event when nodes have been changed, inserted, or
-	 * removed, identifying the path to the parent of the modified items as an
-	 * array of Objects.
-	 * 
-	 * @param source
-	 * @param path
-	 * @param childIndices
-	 * @param children
-	 */
-	public TypedTreeModelEvent(Object source, NodeType[] path,
-			int[] childIndices, NodeType[] children) {
-		this.path = new TreePath(path);
-		this.source = source;
-		this.childIndices = childIndices;
-		this.children = children;
-	}
-
-	/**
-	 * Returns the values of the child indexes.
-	 * 
-	 * @return
-	 */
-	public int[] getChildIndices() {
-		return this.childIndices;
-	}
-
-	/**
-	 * Returns the objects that are children of the node identified by getPath
-	 * at the locations specified by getChildIndices.
-	 * 
-	 * @return
-	 */
-	public NodeType[] getChildren() {
-		return this.children;
-	}
-
-	/**
-	 * The object on which the Event initially occurred.
-	 * 
-	 * @return
-	 */
-	public Object getSource() {
-		return this.source;
-	}
-
-	/**
-	 * For all events, except treeStructureChanged, returns the parent of the
-	 * changed nodes.
-	 * 
-	 * @return
-	 */
-	public TreePath getTreePath() {
-		return path;
-	}
-
-	/**
-	 * Returns a string that displays and identifies this object's properties.
-	 */
-	@Override
-	public String toString() {
-		return "Typed TreeModelEvent " + super.toString();
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModelListener.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModelListener.java
deleted file mode 100644
index 2b75bc4..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/TypedTreeModelListener.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.utility;
-
-/**
- * Equivalent to TreeModelListener for use with the TypedTreeModel
- * 
- * @author Tom
- * 
- * @see javax.swing.tree.TreeModelListener
- * 
- * @param <NodeType>
- *            Type of the node within the TypedTreeModel and used to
- *            parameterize the typed version of the tree model event.
- */
-public interface TypedTreeModelListener<NodeType> {
-
-	/**
-	 * Invoked after a node (or a set of siblings) has changed in some way. The
-	 * node(s) have not changed locations in the tree or altered their children
-	 * arrays, but other attributes have changed and may affect presentation.
-	 * Example: the name of a file has changed, but it is in the same location
-	 * in the file system.
-	 * <p>
-	 * To indicate the root has changed, childIndices and children will be null.
-	 * <p>
-	 * Use e.getPath() to get the parent of the changed node(s).
-	 * e.getChildIndices() returns the index(es) of the changed node(s).
-	 */
-	void treeNodesChanged(TypedTreeModelEvent<NodeType> e);
-
-	/**
-	 * Invoked after nodes have been inserted into the tree.
-	 * <p>
-	 * Use e.getPath() to get the parent of the new node(s). e.getChildIndices()
-	 * returns the index(es) of the new node(s) in ascending order.
-	 */
-	void treeNodesInserted(TypedTreeModelEvent<NodeType> e);
-
-	/**
-	 * Invoked after nodes have been removed from the tree. Note that if a
-	 * subtree is removed from the tree, this method may only be invoked once
-	 * for the root of the removed subtree, not once for each individual set of
-	 * siblings removed.
-	 * <p>
-	 * Use e.getPath() to get the former parent of the deleted node(s).
-	 * e.getChildIndices() returns, in ascending order, the index(es) the
-	 * node(s) had before being deleted.
-	 */
-	void treeNodesRemoved(TypedTreeModelEvent<NodeType> e);
-
-	/**
-	 * Invoked after the tree has drastically changed structure from a given
-	 * node down. If the path returned by e.getPath() is of length one and the
-	 * first element does not identify the current root node the first element
-	 * should become the new root of the tree.
-	 * <p>
-	 * Use e.getPath() to get the path to the node. e.getChildIndices() returns
-	 * null.
-	 */
-	void treeStructureChanged(TypedTreeModelEvent<NodeType> e);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/package.html
deleted file mode 100644
index 03fc4c0..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/utility/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<body>
-Utility classes, currently consists of a generic type safe alternative
-to TreeModel along with an adapter class to allow it to be used where a
-TreeModel is required (i.e. JTree)
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/AbstractOutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/AbstractOutputPort.java
deleted file mode 100644
index 131b45c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/AbstractOutputPort.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Simple implementation of OutputPort, extends AbstractPort and adds the
- * granular depth bean getter.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractOutputPort extends AbstractPort implements OutputPort {
-
-	protected int granularDepth;
-
-	protected AbstractOutputPort(String portName, int portDepth,
-			int granularDepth) {
-		super(portName, portDepth);
-		this.granularDepth = granularDepth;
-	}
-
-	public int getGranularDepth() {
-		return granularDepth;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/AbstractPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/AbstractPort.java
deleted file mode 100644
index f8daaa9..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/AbstractPort.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-
-/**
- * Port definition with depth and name
- * 
- * @author Tom Oinn
- *
- */
-public abstract class AbstractPort extends AbstractAnnotatedThing<Port> implements Port {
-
-	protected String name;
-	protected int depth;
-	
-	protected AbstractPort(String name, int depth) {
-		this.name = name;
-		this.depth = depth;
-	}
-	
-	public int getDepth() {
-		return this.depth;
-	}
-
-	public final String getName() {
-		return this.name;
-	}
-
-	@Override
-	public String toString() {
-		return getClass().getSimpleName() + " " + getName() + " (" + getDepth() + ")";
-	}
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/CompoundEdit.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/CompoundEdit.java
deleted file mode 100644
index acc4d9f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/CompoundEdit.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Implementation of Edit which contains an ordered list of child edits. Child
- * edits are applied collectively and in order, any failure in any child edit
- * causes an undo of previously applied children and a propogation of the edit
- * exception.
- * 
- * @author Tom Oinn
- * 
- */
-public class CompoundEdit implements Edit<Object> {
-
-	private final transient List<Edit<?>> childEdits;
-
-	private transient boolean applied = false;
-
-	/**
-	 * Create a new compound edit with no existing Edit objects.
-	 * 
-	 */
-	public CompoundEdit() {
-		this.childEdits = new ArrayList<Edit<?>>();
-	}
-
-	/**
-	 * Create a new compound edit with the specified edits as children.
-	 */
-	public CompoundEdit(List<Edit<?>> edits) {
-		this.childEdits = edits;
-	}
-
-	public List<Edit<?>> getChildEdits() {
-		return childEdits;
-	}
-
-	/**
-	 * Attempts to call the doEdit method of all child edits. If any of those
-	 * children throws an EditException any successful edits are rolled back and
-	 * the exception is rethrown as the cause of a new EditException from the
-	 * CompoundEdit
-	 */
-	public synchronized Object doEdit() throws EditException {
-		if (isApplied()) {
-			throw new EditException("Cannot apply an edit more than once!");
-		}
-		List<Edit<?>> doneEdits = new ArrayList<Edit<?>>();
-		try {
-			for (Edit<?> edit : childEdits) {
-				edit.doEdit();
-				// Insert the done edit at position 0 in the list so we can
-				// iterate over the list in the normal order if we need to
-				// rollback, this ensures that the most recent edit is first.
-				doneEdits.add(0, edit);
-			}
-			applied = true;
-		} catch (EditException ee) {
-			for (Edit<?> undoMe : doneEdits) {
-				undoMe.undo();
-			}
-			applied = false;
-			throw new EditException("Failed child of compound edit", ee);
-		}
-		return null;
-	}
-
-	/**
-	 * There is no explicit subject for a compound edit, so this method always
-	 * returns null.
-	 */
-	public Object getSubject() {
-		return null;
-	}
-
-	/**
-	 * Rolls back all child edits in reverse order
-	 */
-	public synchronized void undo() {
-		for (int i = (childEdits.size() - 1); i >= 0; i--) {
-			// Undo child edits in reverse order
-			childEdits.get(i).undo();
-		}
-		applied = false;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Condition.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Condition.java
deleted file mode 100644
index fd1c842..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Condition.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.annotation.Annotated;
-
-/**
- * Defines the base interface for a condition which must be satisfied before a
- * processor can commence invocation. Conditions are expressed in terms of a
- * relationship between a controlling and a target processor where the target
- * processor may not commence invocation until all conditions for which it is a
- * target are satisfied in the context of a particular owning process
- * identifier.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Condition extends Annotated<Condition> {
-
-	/**
-	 * @return the Processor constrained by this condition
-	 */
-	public Processor getControl();
-
-	/**
-	 * @return the Processor acting as the controller for this condition
-	 */
-	public Processor getTarget();
-
-	/**
-	 * @param owningProcess
-	 *            the context in which the condition is to be evaluated
-	 * @return whether the condition is satisfied
-	 */
-	public boolean isSatisfied(String owningProcess);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Configurable.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Configurable.java
deleted file mode 100644
index 255d816..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Configurable.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.workflowmodel.ConfigurationException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-
-/**
- * Interface for workflow items that can be configured from a bean.
- * 
- * @param <ConfigurationType>
- *            the ConfigurationType associated with the workflow item. This is
- *            an arbitrary java class that provides details on how the item is
- *            configured. To allow successful serialisation it's recommended to
- *            keep this configuration as a simple Java bean.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * @see ActivityConfigurationException
- * 
- */
-public interface Configurable<ConfigurationType> {
-
-	/**
-	 * Each item stores configuration within a bean of type ConfigurationType,
-	 * this method returns the configuration. This is used by the automatic
-	 * serialisation framework to store the item definition in the workflow XML.
-	 */
-	public abstract ConfigurationType getConfiguration();
-
-	/**
-	 * When the item is built from the workflow definition XML the object is
-	 * first constructed with a default constructor then this method is called,
-	 * passing in the configuration bean returned by getConfiguration().
-	 * 
-	 * @throws ConfigurationException
-	 *             if a problem occurs when configuring the item
-	 */
-	public abstract void configure(ConfigurationType conf)
-			throws ConfigurationException;
-
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ConfigurationException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ConfigurationException.java
deleted file mode 100644
index b3310e0..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ConfigurationException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Thrown when attempting to configure a
- * {@link net.sf.taverna.t2.workflowmodel.Configurable} with an invalid
- * configuration. Causes may include actual configuration errors, unavailable
- * implementations etc.
- * 
- * @author Stian Soiland-Reyes
- * @author Tom Oinn
- * 
- */
-public class ConfigurationException extends Exception {
-
-	private static final long serialVersionUID = -2841928064598107156L;
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ConfigurationException() {
-		super();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ConfigurationException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ConfigurationException(String message) {
-		super(message);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public ConfigurationException(Throwable cause) {
-		super(cause);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ControlBoundary.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ControlBoundary.java
deleted file mode 100644
index 2503224..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ControlBoundary.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the associated type creates a boundary of control within the
- * dataflow. Types marked with this annotation are those which can modify the
- * owning process of data tokens they consume and generally correspond to cases
- * where the control flow bifurcates in some fashion.
- * <p>
- * This annotation doesn't currently define this behaviour but serves as an easy
- * way for us to track which objects might potentially do this, something we
- * need to be able to do to guarantee that the monitor works correctly.
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-public @interface ControlBoundary {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Dataflow.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Dataflow.java
deleted file mode 100644
index 15ef129..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Dataflow.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import static net.sf.taverna.t2.annotation.HierarchyRole.CHILD;
-
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.HierarchyTraversal;
-import net.sf.taverna.t2.invocation.InvocationContext;
-
-/**
- * Top level definition object for a dataflow workflow. Currently Taverna only
- * supports dataflow workflows, this is equivalent to the Taverna 1 ScuflModel
- * class in role.
- * 
- * @author Tom Oinn
- * 
- */
-@ControlBoundary
-public interface Dataflow extends Annotated<Dataflow>, TokenProcessingEntity {
-
-	/**
-	 * A Dataflow consists of a set of named Processor instances. This method
-	 * returns an unmodifiable list of these processors. Equivalent to calling
-	 * getEntities(Processor.class).
-	 * 
-	 * @return list of all processors in the dataflow
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends Processor> getProcessors();
-
-	/**
-	 * Dataflows also contain a set of merge operations, this method returns an
-	 * unmodifiable copy of the set. Equivalent to calling
-	 * getEntities(Merge.class)
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends Merge> getMerges();
-
-	/**
-	 * Dataflows have a list of input ports. These are the input ports the world
-	 * outside the dataflow sees - each one contains an internal output port
-	 * which is used to forward events on to entities (mostly processors) within
-	 * the dataflow.
-	 * 
-	 * @return list of dataflow input port instances
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends DataflowInputPort> getInputPorts();
-
-	/**
-	 * Get all workflow entities with the specified type restriction, this
-	 * allows retrieval of Processor, Merge, a mix of the two or any other
-	 * future entity to be added to the workflow model without a significant
-	 * change in this part of the API.
-	 * 
-	 * @return an unmodifiable list of entities of the specified type
-	 * @param entityType
-	 *            a class of the type specified by the type variable T. All
-	 *            entities returned in the list can be cast to this type
-	 */
-	public <T extends NamedWorkflowEntity> List<? extends T> getEntities(
-			Class<T> entityType);
-
-	/**
-	 * Dataflows have a list of output ports. The output port in a dataflow is
-	 * the port visible to the outside world and from which the dataflow emits
-	 * events. Each dataflow output port also contains an instance of event
-	 * receiving input port which is used by entities within the dataflow to
-	 * push events to the corresponding external output port.
-	 * 
-	 * @return list of dataflow output port instances
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends DataflowOutputPort> getOutputPorts();
-
-	/**
-	 * The dataflow is largely defined by the links between processors and other
-	 * entities within its scope. This method returns them.
-	 * 
-	 * @return list of Datalink implementations
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends Datalink> getLinks();
-
-	/**
-	 * Triggers a check for various basic potential problems with the workflow,
-	 * in particular ones related to type checking. Returns a report object
-	 * containing the state of the workflow and any problems found.
-	 * 
-	 * @return validation report
-	 */
-	public DataflowValidationReport checkValidity();
-
-	/**
-	 * A dataflow with no inputs cannot be driven by the supply of data tokens
-	 * as it has nowhere to receive such tokens. This method allows a dataflow
-	 * to fire on an empty input set, in this case the owning process identifier
-	 * must be passed explicitly to the dataflow. This method then calls the
-	 * fire methods of any Processor instances with no input ports.
-	 */
-	public void fire(String owningProcess, InvocationContext context);
-
-	/**
-	 * The failure transmitter contains event listeners to be notified of
-	 * workflow level failures - these occur when an error bubbles up to the top
-	 * of the dispatch stack in a processor and is not handled by conversion to
-	 * an error token within the data stream.
-	 * <p>
-	 * Listeners are messaged after all clean-up has been performed on the
-	 * dataflow's internal state and that of any child operations within it,
-	 * guaranteeing that no tokens will be generated with the id of the failed
-	 * process after the message has been received by the listener
-	 */
-	public FailureTransmitter getFailureTransmitter();
-	
-	/**
-	 * An identifier that is unique to this dataflow and its current state.
-	 * The identifier will change whenever the dataflow is modified.
-	 * 
-	 * @return a String representing a unique internal identifier.
-	 */
-	public String getInternalIdentier();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowInputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowInputPort.java
deleted file mode 100644
index 143b9c3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowInputPort.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * An input port on a Dataflow contains a nested output port within it. This
- * internal output port is used when connecting an edge from the workflow input
- * to a processor or workflow output (which in turn has a nested input port).
- * The workflow ports are therefore effectively pairs of ports with a relay
- * mechanism between the external and internal in the case of the dataflow
- * input.
- * 
- * @author Tom Oinn
- * 
- */
-public interface DataflowInputPort extends EventHandlingInputPort, DataflowPort {
-
-	/**
-	 * Return the internal output port. Output ports have a granular depth
-	 * property denoting the finest grained output token they can possibly
-	 * produce, this is used to configure downstream filtering input ports. In
-	 * this case the finest depth item is determined by the input to the
-	 * workflow port and must be explicitly set.
-	 * 
-	 * @return the internal output port
-	 */
-	public EventForwardingOutputPort getInternalOutputPort();
-	
-	/**
-	 * Define the finest grained item that will be sent to this input port. As
-	 * all data are relayed through to the internal output port this is used to
-	 * denote output port granularity as well as to configure any downstream
-	 * connected filtering input ports.
-	 */
-	public int getGranularInputDepth();
-	
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowOutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowOutputPort.java
deleted file mode 100644
index e67e19d..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowOutputPort.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.facade.ResultListener;
-
-/**
- * Output port of a DataFlow, exposes an internal EventHandlingInputPort into
- * which the internal workflow logic pushes data to be exposed outside the
- * workflow boundary.
- * 
- * @author Tom Oinn
- * 
- */
-public interface DataflowOutputPort extends EventForwardingOutputPort, DataflowPort {
-
-	/**
-	 * Get the internal input port for this workflow output
-	 * 
-	 * @return port into which the workflow can push data for this output
-	 */
-	public EventHandlingInputPort getInternalInputPort();
-	
-	/**
-	 * Add a ResultListener, capable of listening to results being received by the output port
-	 * @param listener the ResultListener
-	 * 
-	 * @see ResultListener
-	 */
-	public void addResultListener(ResultListener listener);
-	
-	/**
-	 * Remove a ResultListener
-	 * @param listener the ResultListener
-	 * 
-	 * @see ResultListener
-	 */
-	public void removeResultListener(ResultListener listener);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowPort.java
deleted file mode 100644
index 9fb8d3e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowPort.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Defines that the implementing port belongs to a Dataflow
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public interface DataflowPort extends Port {
-
-	/**
-	 * Get the parent DataFlow to which this port belongs
-	 */
-	public Dataflow getDataflow();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowValidationReport.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowValidationReport.java
deleted file mode 100644
index 8958a9c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/DataflowValidationReport.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Contains a validation report from a dataflow validation check. Processors are
- * classified as failed, unsatisfied or valid depending on whether they directly
- * fail type validation, cannot be checked due to unsatisfied incoming links or
- * pass respectively.
- * 
- * @author Tom Oinn
- * 
- */
-public interface DataflowValidationReport {
-
-	/**
-	 * Overall validity - if the workflow is valid it can be run, otherwise there
-	 * are problems somewhere and a facade can't be created from it.
-	 * 
-	 * @return whether the workflow is valid (true) or not (false)
-	 */
-	public boolean isValid();
-
-	/**
-	 * Whether the workflow is incomplete, i.e. contains no processors and no connected output ports.
-	 * For example, it is empty or contains only input ports. Even though one can technically run such
-	 * a workflow it should be prohibited as it does not make any sense. If a workflow
-	 * is incomplete {@link DataflowValidationReport#isValid()} should return <code>false</code>.
-	 * 
-	 * @return whether the workflow is incomplete or not
-	 */
-	public boolean isWorkflowIncomplete();
-	
-	/**
-	 * The workflow will be marked as invalid if there are entities with
-	 * unlinked input ports or where there are cycles causing the type checking
-	 * algorithm to give up. In these cases offending processors or any
-	 * ancestors that are affected as a knock on effect will be returned in this
-	 * list.
-	 * 
-	 * @return list of TokenProcessingEntity instances within the Dataflow for
-	 *         which it is impossible to determine validity due to missing
-	 *         inputs or cyclic dependencies
-	 */
-	public List<? extends TokenProcessingEntity> getUnsatisfiedEntities();
-
-	/**
-	 * The workflow will be marked as invalid if any entity fails to type check.
-	 * 
-	 * @return list of TokenProcessingEntity instances within the Dataflow which
-	 *         caused explicit type check failures
-	 */
-	public List<? extends TokenProcessingEntity> getFailedEntities();
-
-	/**
-	 * The workflow will be marked as invalid if any of the dataflow output
-	 * ports can't be typed based on incoming links. This happens if the port
-	 * isn't linked (a common enough issue for new users in previous releases of
-	 * Taverna) or if the internal port is linked but the entity it links to
-	 * isn't validated.
-	 * 
-	 * @return a list of DataflowOutputPort implementations which are not typed
-	 *         correctly. These will have output depth of -1 indicating an
-	 *         unknown depth, they may or may not have a granular depth set but
-	 *         if the overall depth is -1 this isn't important as the thing
-	 *         won't run anyway.
-	 */
-	public List<? extends DataflowOutputPort> getUnresolvedOutputs();
-	
-	
-	/**
-	 * An entity will be marked invalid if it depends on a nested dataflow
-	 * which itself is invalid. If this is the case the entity will be
-	 * be present both in {@link #getFailedEntities()} and can be used as
-	 * a key with this method to get the DataflowValidationReport explaining
-	 * how the nested dataflow failed.
-	 * 
-	 */
-	public Map<TokenProcessingEntity, DataflowValidationReport> getInvalidDataflows();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Datalink.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Datalink.java
deleted file mode 100644
index d8b75d2..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Datalink.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.annotation.Annotated;
-
-/**
- * A single point to point data link from an instance of
- * EventForwardingOutputPort to an instance of EventHandlingInputPort
- * 
- * @author Tom Oinn
- * 
- */
-public interface Datalink extends Annotated<Datalink> {
-
-	/**
-	 * Get the sink for events flowing through this link
-	 * 
-	 * @return input port receiving events
-	 */
-	public EventHandlingInputPort getSink();
-
-	/**
-	 * Get the source for events flowing through this link
-	 * 
-	 * @return output port generating events
-	 */
-	public EventForwardingOutputPort getSource();
-
-	/**
-	 * Each datalink has a resolved depth, this being the constant sum of index
-	 * array length + item depth for all tokens exchanged along this link. Where
-	 * no iteration or data streaming is occuring this will evaluate to the
-	 * output port depth the link is from (as is always the case with the
-	 * internal output ports in dataflow inputs)
-	 * 
-	 * @return
-	 */
-	public int getResolvedDepth();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Edit.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Edit.java
deleted file mode 100644
index f60ebaa..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Edit.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * The workflow object model exposed by this API is read only. Properties of the
- * model can only be changed through implementations of this interface, this
- * ensures a consistant approach to grouped edits (transactions) and undo / redo
- * support within the UI. It also potentially allows for capture of editing
- * provenance where a workflow is repurposed or created from an aggregate of
- * several others.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Edit<TargetType> {
-
-	/**
-	 * Perform the edit
-	 * 
-	 * @throws EditException
-	 *             if the edit fails. If an edit throws EditException it should
-	 *             try to ensure the subject is unaltered. Where this is
-	 *             impossible consider breaking edits down into a compound edit.
-	 */
-	public TargetType doEdit() throws EditException;
-
-	/**
-	 * Undo the edit, reverting the subject to the state it was in prior to the
-	 * edit
-	 */
-	public void undo();
-
-	/**
-	 * Return the object to which this edit applies
-	 * 
-	 * @return
-	 */
-	public Object getSubject();
-
-	/**
-	 * Has the edit been applied yet?
-	 * 
-	 * @return true if and only if the edit has been successfully applied to the
-	 *         subject
-	 */
-	public boolean isApplied();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EditException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EditException.java
deleted file mode 100644
index f1dc474..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EditException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Superclass of all exceptions thrown when altering the workflow model through
- * the edit manager.
- * 
- * @author Tom Oinn
- * 
- */
-public class EditException extends Exception {
-
-	public EditException(String string) {
-		super(string);
-	}
-
-	public EditException(String string, Throwable cause) {
-		super(string, cause);
-	}
-	
-	public EditException(Throwable t) {
-		super(t);
-	}
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Edits.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Edits.java
deleted file mode 100644
index aa2b57e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Edits.java
+++ /dev/null
@@ -1,804 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.annotation.AnnotationRole;
-import net.sf.taverna.t2.annotation.AnnotationSourceSPI;
-import net.sf.taverna.t2.annotation.CurationEvent;
-import net.sf.taverna.t2.annotation.Person;
-import net.sf.taverna.t2.facade.WorkflowInstanceFacade;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-
-/**
- * Defines the set of all available edit actions over a workflow model. This is
- * the only point at which you can modify any of the entities in the workflow
- * object model, the rest of this API is purely read only.
- * <p>
- * In theory this would be some kind of static interface but Java doesn't have
- * this as a concept so the pattern here will be to discover an appropriate
- * implementation of this interface from whatever version of the implementation
- * package you want to use, instantiate it then use the methods defined here to
- * construct and manipulate the workflow model.
- * 
- * @author Tom Oinn
- * @author Stuart Owen
- * @author David Withers
- * @author Stian Soiland-Reyes
- * 
- */
-public interface Edits {
-
-	/**
-	 * Build a new Dataflow workflow
-	 * 
-	 * @return
-	 */
-	public Dataflow createDataflow();
-
-	/**
-	 * Builds a new DataflowInputPort.
-	 * 
-	 * @param name
-	 * @param depth
-	 * @param granularDepth
-	 * @param dataflow
-	 * @return a new DataflowInputPort
-	 */
-	public DataflowInputPort createDataflowInputPort(String name, int depth,
-			int granularDepth, Dataflow dataflow);
-
-	/**
-	 * Builds a new DataflowOutputPort.
-	 * 
-	 * @param name
-	 * @param dataflow
-	 * @return a new DataflowOutputPort
-	 */
-	public DataflowOutputPort createDataflowOutputPort(String name,
-			Dataflow dataflow);
-
-	/**
-	 * Builds a new Datalink with the given source and sink ports
-	 * 
-	 * @param source
-	 *            the source port
-	 * @param sink
-	 *            the sink port
-	 * @return a new Datalink instance
-	 */
-	public Datalink createDatalink(EventForwardingOutputPort source,
-			EventHandlingInputPort sink);
-
-	/**
-	 * @param dataflow
-	 * @return an instance of Merge
-	 * 
-	 * @see Merge
-	 */
-	public Merge createMerge(Dataflow dataflow);
-
-	/**
-	 * Builds a new MergeOutputPort.
-	 * 
-	 * @param merge
-	 *            the merge that the port eill be added to
-	 * @param name
-	 *            the name of the port
-	 * @param depth
-	 *            the depth of the port
-	 * @return a new MergeOutputPort
-	 */
-	public MergeInputPort createMergeInputPort(Merge merge, String name,
-			int depth);
-
-	/**
-	 * Builds a new instance of a Processor with the given name. The processor
-	 * is setup with a default dispatch stack.
-	 * 
-	 * @param the
-	 *            local name for the processor.
-	 */
-	public Processor createProcessor(String name);
-
-	/**
-	 * Build a new WorkflowInstanceFacade using the supplied Dataflow
-	 * 
-	 * @param dataflow
-	 * @param context
-	 * @return an instance of a WorkflowInstanceFacade
-	 * @throws InvalidDataflowException
-	 *             if the workflow was not valid
-	 * 
-	 * @see WorkflowInstanceFacade
-	 */
-	public WorkflowInstanceFacade createWorkflowInstanceFacade(
-			Dataflow dataflow, InvocationContext context, String parentProcess)
-			throws InvalidDataflowException;
-
-	/**
-	 * Add an Activity implementation to the set of activities within a
-	 * Processor
-	 * 
-	 * @param processor
-	 *            Processor to add the activity to
-	 * @param activity
-	 *            Activity to add
-	 */
-	public Edit<Processor> getAddActivityEdit(Processor processor,
-			Activity<?> activity);
-
-	/**
-	 * Returns an edit to add an ActivityInputPort to an Activity.
-	 * 
-	 * @param activity
-	 *            activity to add the port to
-	 * @param activityInputPort
-	 *            the port to add to the activity
-	 * @return an edit to add an ActivityInputPort to an Activity
-	 */
-	public Edit<Activity<?>> getAddActivityInputPortEdit(Activity<?> activity,
-			ActivityInputPort activityInputPort);
-
-	/**
-	 * Returns an edit to add a ProcessorInputPort to ActivityInputPort mapping
-	 * to an Activity.
-	 * 
-	 * @param activity
-	 *            activity to add the port mapping to
-	 * @param processorPortName
-	 *            the name of the processor port
-	 * @param activityPortName
-	 *            the name of the activity port
-	 * @return an edit to add a ProcessorInputPort to ActivityInputPort mapping
-	 *         to an Activity
-	 */
-	public Edit<Activity<?>> getAddActivityInputPortMappingEdit(
-			Activity<?> activity, String processorPortName,
-			String activityPortName);
-
-	/**
-	 * Returns an edit to add an OutputPort to an Activity.
-	 * 
-	 * @param activity
-	 *            activity to add the port to
-	 * @param activityOutputPort
-	 *            the port to add to the activity
-	 * @return an edit to add an OutputPort to an Activity
-	 */
-	public Edit<Activity<?>> getAddActivityOutputPortEdit(Activity<?> activity,
-			OutputPort activityOutputPort);
-
-	/**
-	 * Returns an edit to add a ProcessorOutputPort to OutputPort mapping to an
-	 * Activity.
-	 * 
-	 * @param activity
-	 *            activity to add the port mapping to
-	 * @param processorPortName
-	 *            the name of the processor port
-	 * @param activityPortName
-	 *            the name of the activity port
-	 * @return an edit to add a ProcessorOutputPort to OutputPort mapping to an
-	 *         Activity
-	 */
-	public Edit<Activity<?>> getAddActivityOutputPortMappingEdit(
-			Activity<?> activity, String processorPortName,
-			String activityPortName);
-
-	/**
-	 * Add an {@link AnnotationAssertion} to an {@link AnnotationChain}
-	 * 
-	 * @param annotationChain
-	 * @param annotationAssertion
-	 * @return an {@link Edit}able object with undo feature
-	 */
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationChain> getAddAnnotationAssertionEdit(
-			AnnotationChain annotationChain,
-			AnnotationAssertion annotationAssertion);
-
-	/**
-	 * Add an {@link AnnotationBeanSPI} to an {@link AnnotationAssertion}
-	 * 
-	 * @param annotationAssertion
-	 * @param annotationBean
-	 * @return the edit which has do/undo functionality
-	 */
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddAnnotationBean(
-			AnnotationAssertion annotationAssertion,
-			AnnotationBeanSPI annotationBean);
-
-	/**
-	 * Returnes an edit that creates an AnnotationAssertion, adds the
-	 * AnnotationAssertion to an AnnotationChain and adds the AnnotationChain to
-	 * the Annotated.
-	 * 
-	 * @param annotated
-	 *            the Annotated to add an AnnotationChain to
-	 * @param annotation
-	 *            the annotation to add to the chain
-	 * @return an edit that creates and adds an AnnotationChain to an Annotated
-	 */
-	public Edit<?> getAddAnnotationChainEdit(Annotated<?> annotated,
-			AnnotationBeanSPI annotation);
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddAnnotationRole(
-			AnnotationAssertion annotationAssertion,
-			AnnotationRole annotationRole);
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddAnnotationSource(
-			AnnotationAssertion annotationAssertion,
-			AnnotationSourceSPI annotationSource);
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddCreator(
-			AnnotationAssertion annotationAssertion, Person person);
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddCurationEvent(
-			AnnotationAssertion annotationAssertion, CurationEvent curationEvent);
-
-	/**
-	 * Returns an edit to add a DataflowInputPort to a Dataflow.
-	 * 
-	 * @param dataflow
-	 *            dataflow to add the port to
-	 * @param dataflowInputPort
-	 *            the port to add to the dataflow
-	 * @return an edit to add a DataflowInputPort to a Dataflow
-	 */
-	public Edit<Dataflow> getAddDataflowInputPortEdit(Dataflow dataflow,
-			DataflowInputPort dataflowInputPort);
-
-	/**
-	 * Returns an edit to add a DataflowOutputPort to a Dataflow.
-	 * 
-	 * @param dataflow
-	 *            dataflow to add the port to
-	 * @param dataflowOutputPort
-	 *            the port to add to the dataflow
-	 * @return an edit to add a DataflowOutputPort to a Dataflow
-	 */
-	public Edit<Dataflow> getAddDataflowOutputPortEdit(Dataflow dataflow,
-			DataflowOutputPort dataflowOutputPort);
-
-	/**
-	 * Returns an edit to change the depth of a DataflowInputPort.
-	 * 
-	 * @param dataflowInputPort
-	 *            the port to change the depth of
-	 * @param depth
-	 *            the new depth
-	 * @return an edit to change the depth of a Dataflow
-	 */
-	public Edit<DataflowInputPort> getChangeDataflowInputPortDepthEdit(
-			DataflowInputPort dataflowInputPort, int depth);
-
-	/**
-	 * Returns an edit to change the granular depth of a DataflowInputPort.
-	 * 
-	 * @param dataflowInputPort
-	 *            the port to change the granular depth of
-	 * @param granularDepth
-	 *            the new granular depth
-	 * @return an edit to change the granular depth of a Dataflow
-	 */
-	public Edit<DataflowInputPort> getChangeDataflowInputPortGranularDepthEdit(
-			DataflowInputPort dataflowInputPort, int granularDepth);
-
-	/**
-	 * Add a new layer to the specified dispatch stack
-	 * 
-	 * @param stack
-	 *            Stack to add to
-	 * @param layer
-	 *            New dispatch layer to add
-	 * @param position
-	 *            Where to add the new layer? 0 is at the top of the stack.
-	 */
-	public Edit<DispatchStack> getAddDispatchLayerEdit(DispatchStack stack,
-			DispatchLayer<?> layer, int position);
-
-	public Edit<Dataflow> getAddMergeEdit(Dataflow dataflow, Merge processor);
-	
-	/**
-	 * Returns an edit to add a MergeInputPort to a Merge.
-	 * 
-	 * @param merge
-	 *            merge to add the port to
-	 * @param mergeInputPort
-	 *            the port to add to the merge
-	 * @return an edit to add a MergeInputPort to a Merge
-	 */
-	public Edit<Merge> getAddMergeInputPortEdit(Merge merge,
-			MergeInputPort mergeInputPort);
-	
-	/**
-	 * Returns an edit to reorder the list of MergeInputPortS in a Merge.
-	 * 
-	 * @param merge
-	 *            merge to reorder the list of input ports to
-	 * @param reorderedMergeInputPortList
-	 *            a list of reordered input ports
-	 * @return an edit to reorder the list of MergeInputPortS to a Merge
-	 */
-	public Edit<Merge> getReorderMergeInputPortsEdit(Merge merge,
-			List<MergeInputPort> reorderedMergeInputPortList);
-
-	/**
-	 * Provides an edit object responsible for adding a Processor to a Dataflow
-	 * 
-	 * @param dataflow
-	 *            the dataflow to add this processor to
-	 * @param processor
-	 *            the processor to be added to the dataflow
-	 */
-	public Edit<Dataflow> getAddProcessorEdit(Dataflow dataflow,
-			Processor processor);
-
-	/**
-	 * Provides an Edit to add an input port a processor, creating matching
-	 * ports in the iteration strategy or strategies as a side effect.
-	 * 
-	 * @param processor
-	 *            processor to add the port to
-	 * 
-	 * @param port
-	 *            the input port to be added
-	 */
-	public Edit<Processor> getAddProcessorInputPortEdit(Processor processor,
-			ProcessorInputPort port);
-
-	/**
-	 * Provides an Edit to add a new output port on a processor
-	 * 
-	 * @param processor
-	 *            processor to add the new output port to
-	 * 
-	 * @param port
-	 *            the port to be added
-	 */
-	public Edit<Processor> getAddProcessorOutputPortEdit(Processor processor,
-			ProcessorOutputPort port);
-
-	/**
-	 * Returns an Edit that is responsible for configuring an Activity with a
-	 * given configuration bean.
-	 * 
-	 * @see #getConfigureEdit(Configurable, Object)
-	 * @param activity
-	 * @param configurationBean
-	 * @return
-	 */
-	public <ConfigurationBean> Edit<Activity<?>> getConfigureActivityEdit(
-			Activity<ConfigurationBean> activity,
-			ConfigurationBean configurationBean);
-
-	/**
-	 * Return an Edit that can configure a {@link Configurable} (such as an
-	 * {@link Activity} or {@link DispatchLayer} with a given configuration
-	 * bean.
-	 * 
-	 * @param <ConfigurationType>
-	 * @param configurable
-	 * @param configBean
-	 * @return 
-	 */
-	public <ConfigurationType> Edit<? extends Configurable<ConfigurationType>> getConfigureEdit(
-			Configurable<ConfigurationType> configurable,
-			ConfigurationType configBean);
-	
-
-	/**
-	 * Connect a datalink to its source and sink.
-	 * 
-	 * @param datalink
-	 *            the datalink to connect
-	 * @return a datalink edit
-	 */
-	public Edit<Datalink> getConnectDatalinkEdit(Datalink datalink);
-
-	/**
-	 * Creates and returns an instance of an Edit<Merge> that is responsible for
-	 * generating the links to an from the Merge instance to link together the
-	 * source and sink port via the merge instance.
-	 * 
-	 * @return a new instance of Edit<Merge> constructed from the provided
-	 *         parameters.
-	 * 
-	 * @param merge
-	 *            a Merge instance
-	 * @param sourcePort
-	 *            the source port from which a link is to be created.
-	 * @param sinkPort
-	 *            the sink port to which the link is to be created.
-	 * 
-	 * @see Merge
-	 */
-	public Edit<Merge> getConnectMergedDatalinkEdit(Merge merge,
-			EventForwardingOutputPort sourcePort,
-			EventHandlingInputPort sinkPort);
-
-	/**
-	 * Connect the output port of the specified processor to a target input
-	 * port. To connect multiple inputs use this method multiple times with
-	 * different targetPort arguments.
-	 * 
-	 * @param processor
-	 *            Processor to link from
-	 * @param outputPortName
-	 *            Name of the output port within the specified processor to link
-	 *            from
-	 * @param targetPort
-	 *            Input port (specifically an EventHandlingInputPort) to forward
-	 *            data events to.
-	 */
-	public Edit<Processor> getConnectProcessorOutputEdit(Processor processor,
-			String outputPortName, EventHandlingInputPort targetPort);
-
-	/**
-	 * Create a condition governing execution of the target processor. The
-	 * target will not consume jobs from any inputs until all control processors
-	 * linked through this edit have completed.
-	 * 
-	 * @param control
-	 *            Processor controlling execution - this must complete before
-	 *            the target can start.
-	 * @param target
-	 *            Processor controlled by this condition.
-	 */
-	public Edit<OrderedPair<Processor>> getCreateConditionEdit(
-			Processor control, Processor target);
-
-	/**
-	 * Add an input port to a dataflow.
-	 * 
-	 * @param dataflow
-	 *            dataflow to add the port to
-	 * @param portName
-	 *            name of the port, unique in the dataflow
-	 * @param portDepth
-	 *            the conceptual depth of collections consumed by this input
-	 *            port
-	 * @param granularDepth
-	 *            granular depth to copy to the internal output port
-	 */
-	public Edit<Dataflow> getCreateDataflowInputPortEdit(Dataflow dataflow,
-			String portName, int portDepth, int granularDepth);
-
-	/**
-	 * Add an output port to a dataflow.
-	 * 
-	 * @param dataflow
-	 *            dataflow to add the port to
-	 * @param portName
-	 *            name of the port, unique in the dataflow
-	 */
-	public Edit<Dataflow> getCreateDataflowOutputPortEdit(Dataflow dataflow,
-			String portName);
-
-	/**
-	 * Provides an edit that setup the default dispatch stack on a raw
-	 * processor.
-	 * 
-	 * @param processor
-	 * @return
-	 */
-	public Edit<Processor> getDefaultDispatchStackEdit(Processor processor);
-
-	/**
-	 * Remove a dispatch layer from its dispatch stack
-	 * 
-	 * @param stack
-	 *            The stack from which to remove the layer
-	 * @param layer
-	 *            The layer to remove
-	 */
-	public Edit<DispatchStack> getDeleteDispatchLayerEdit(DispatchStack stack,
-			DispatchLayer<?> layer);
-
-	/**
-	 * Disconnect a datalink from its source and sink.
-	 * 
-	 * @param datalink
-	 *            the datalink to disconnect
-	 * @return a datalink edit
-	 */
-	public Edit<Datalink> getDisconnectDatalinkEdit(Datalink datalink);
-
-	/**
-	 * Provides an edit that will configure the processors ports to map to those
-	 * of its internal Activity. If there is more than 1 activity then only
-	 * first activity is used. If there are zero then an EditException will be
-	 * thrown when using the Edit.
-	 * 
-	 * @param processor
-	 * @return
-	 */
-	public Edit<Processor> getMapProcessorPortsForActivityEdit(
-			Processor processor);
-
-	/**
-	 * Returns an edit to remove an ActivityInputPort from an Activity.
-	 * 
-	 * @param activity
-	 *            activity to remove the port from
-	 * @param activityInputPort
-	 *            the port to remove from the activity
-	 * @return an edit to remove an ActivityInputPort from an Activity
-	 */
-	public Edit<Activity<?>> getRemoveActivityInputPortEdit(
-			Activity<?> activity, ActivityInputPort activityInputPort);
-
-	/**
-	 * Returns an edit to remove a ProcessorInputPort to ActivityInputPort
-	 * mapping from an Activity.
-	 * 
-	 * @param activity
-	 *            activity to remove the port mapping from
-	 * @param processorPortName
-	 *            the name of the processor port to remove from the mapping
-	 * @return an edit to remove a ProcessorInputPort to ActivityInputPort
-	 *         mapping from an Activity
-	 */
-	public Edit<Activity<?>> getRemoveActivityInputPortMappingEdit(
-			Activity<?> activity, String processorPortName);
-
-	/**
-	 * Returns an edit to remove an OutputPort from an Activity.
-	 * 
-	 * @param activity
-	 *            activity to remove the port from
-	 * @param activityOutputPort
-	 *            the port to remove from the activity
-	 * @return an edit to remove an OutputPort from an Activity
-	 */
-	public Edit<Activity<?>> getRemoveActivityOutputPortEdit(
-			Activity<?> activity, OutputPort activityOutputPort);
-
-	/**
-	 * Returns an edit to remove a ProcessorOutputPort to OutputPort mapping
-	 * from an Activity.
-	 * 
-	 * @param activity
-	 *            activity to remove the port mapping from
-	 * @param processorPortName
-	 *            the name of the processor port to remove from the mapping
-	 * @return an edit to remove a ProcessorOutputPort to OutputPort mapping
-	 *         from an Activity
-	 */
-	public Edit<Activity<?>> getRemoveActivityOutputPortMappingEdit(
-			Activity<?> activity, String processorPortName);
-
-	/**
-	 * Remove a condition previously applied to the specified pair of Processor
-	 * instances
-	 * 
-	 * @param control
-	 *            Processor controlling execution - this must complete before
-	 *            the target can start.
-	 * @param target
-	 *            Processor controlled by this condition.
-	 * @return
-	 */
-	public Edit<OrderedPair<Processor>> getRemoveConditionEdit(
-			Processor control, Processor target);
-
-	/**
-	 * Returns an edit to remove a DataflowInputPort from a Dataflow.
-	 * 
-	 * @param dataflow
-	 *            the Dataflow to remove this DataflowInputPort from
-	 * @param dataflowInputPort
-	 *            the DataflowInputPort to be removed from the Dataflow
-	 */
-	public Edit<Dataflow> getRemoveDataflowInputPortEdit(Dataflow dataflow,
-			DataflowInputPort dataflowInputPort);
-
-	/**
-	 * Returns an edit to remove a DataflowOutputPort from a Dataflow.
-	 * 
-	 * @param dataflow
-	 *            the Dataflow to remove this DataflowOutputPort from
-	 * @param dataflowOutputPort
-	 *            the DataflowOutputPort to be removed from the Dataflow
-	 */
-	public Edit<Dataflow> getRemoveDataflowOutputPortEdit(Dataflow dataflow,
-			DataflowOutputPort dataflowOutputPort);
-
-	/**
-	 * Returns an edit to remove a Processor from a Dataflow.
-	 * 
-	 * @param dataflow
-	 *            the dataflow to remove the processor from
-	 * @param processor
-	 *            the processor to be removed from the dataflow
-	 */
-	public Edit<Dataflow> getRemoveProcessorEdit(Dataflow dataflow,
-			Processor processor);
-
-	/**
-	 * Removes a Processor input port.
-	 * 
-	 * @param processor
-	 * @param port
-	 * @return
-	 */
-	public Edit<Processor> getRemoveProcessorInputPortEdit(Processor processor,
-			ProcessorInputPort port);
-
-	/**
-	 * @param processor
-	 * @param port
-	 * @return
-	 */
-	public Edit<Processor> getRemoveProcessorOutputPortEdit(
-			Processor processor, ProcessorOutputPort port);
-
-	/**
-	 * Removes a merge from the dataflow.
-	 * 
-	 * @param dataflow
-	 * @param processor
-	 * @return
-	 */
-	public Edit<Dataflow> getRemoveMergeEdit(Dataflow dataflow, Merge merge);
-
-	/**
-	 * Rename a dataflow input port
-	 * 
-	 * @param dataflowInputPort
-	 *            the dataflow input port to rename
-	 * @param newName
-	 *            the new name, must be unique within the workflow enclosing the
-	 *            dataflow input port instance
-	 */
-	public Edit<DataflowInputPort> getRenameDataflowInputPortEdit(
-			DataflowInputPort dataflowInputPort, String newName);
-
-	/**
-	 * Rename a dataflow output port
-	 * 
-	 * @param dataflowOutputPort
-	 *            the dataflow output port to rename
-	 * @param newName
-	 *            the new name, must be unique within the workflow enclosing the
-	 *            dataflow output port instance
-	 */
-	public Edit<DataflowOutputPort> getRenameDataflowOutputPortEdit(
-			DataflowOutputPort dataflowOutputPort, String newName);
-
-	/**
-	 * Rename a processor
-	 * 
-	 * @param processor
-	 *            the processor to rename
-	 * @param newName
-	 *            the new name, must be unique within the workflow enclosing the
-	 *            processor instance
-	 */
-	public Edit<Processor> getRenameProcessorEdit(Processor processor,
-			String newName);
-
-	/**
-	 * Rename a merge
-	 * 
-	 * @param merge
-	 *            the merge to rename
-	 * @param newName
-	 *            the new name, must be unique within the workflow enclosing the
-	 *            merge instance
-	 */
-	public Edit<Merge> getRenameMergeEdit(Merge merge,
-			String newName);
-	
-	/**
-	 * Provide an edit that will configure a processors's iteration strategy
-	 * stack to the one provided.
-	 * 
-	 * @param processor
-	 *            Processor which iteration stack is to be set
-	 * @param iterationStrategyStack
-	 *            The new iteration strategy stack
-	 * @return An Edit that will set the iteration strategy stack of a processor
-	 */
-	public Edit<Processor> getSetIterationStrategyStackEdit(
-			Processor processor, IterationStrategyStack iterationStrategyStack);
-
-	public Edit<Dataflow> getUpdateDataflowInternalIdentifierEdit(
-			Dataflow dataflow, String newId);
-
-	public Edit<Dataflow> getUpdateDataflowNameEdit(Dataflow dataflow,
-			String newName);
-
-	/**
-	 * Builds an instance of an {@link InputPort} for an Activity.
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 * @param allowsLiteralValues
-	 *            whether the input port can cope with literal values
-	 * @param handledReferenceSchemes
-	 *            a list of the reference scheme types that can be legitimately
-	 *            pushed into this input port
-	 * @param translatedElementClass
-	 *            the class desired as result (or elements of collections of
-	 *            results) when interpreted by the data facade
-	 * @return an instance of InputPort
-	 */
-	ActivityInputPort createActivityInputPort(
-			String portName,
-			int portDepth,
-			boolean allowsLiteralValues,
-			List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes,
-			Class<?> translatedElementClass);
-
-	/**
-	 * Builds an instance of an {@link OutputPort} for an Activity.
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 * @param portGranularDepth
-	 * @return an instance of OutputPort
-	 */
-	OutputPort createActivityOutputPort(String portName, int portDepth,
-			int portGranularDepth);
-
-	/**
-	 * Creates a new ProcessorInputPort
-	 * 
-	 * @param processor
-	 *            the processor to with the port will be added
-	 * @param name
-	 * @param depth
-	 * @return
-	 */
-	ProcessorInputPort createProcessorInputPort(Processor processor,
-			String name, int depth);
-
-	/**
-	 * Creates a new ProcessorOutputPort
-	 * 
-	 * @param processor
-	 * @param name
-	 * @param depth
-	 * @param granularDepth
-	 * @return
-	 */
-	ProcessorOutputPort createProcessorOutputPort(Processor processor,
-			String name, int depth, int granularDepth);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EditsRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EditsRegistry.java
deleted file mode 100644
index f8db6f0..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EditsRegistry.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-/**
- * Registry for finding the {@link Edits} implementation.
- * 
- */
-public class EditsRegistry extends SPIRegistry<Edits> {
-
-	private static EditsRegistry instance;
-	
-	private static Logger logger = Logger.getLogger(EditsRegistry.class);
-
-	protected EditsRegistry() {
-		super(Edits.class);
-	}
-
-	public static synchronized EditsRegistry getInstance() {
-		if (instance == null) {
-			instance = new EditsRegistry();
-		}
-		return instance;
-	}
-
-	public static Edits getEdits() {
-		List<Edits> instances = getInstance().getInstances();
-		Edits result = null;
-		if (instances.size() == 0) {
-			logger.error("No Edits implementation defined");
-		} else {
-			if (instances.size() > 1)
-				logger.debug("More than 1 Edits implementation defined, using the first");
-			result = instances.get(0);
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EventForwardingOutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EventForwardingOutputPort.java
deleted file mode 100644
index ad98a00..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EventForwardingOutputPort.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.util.Set;
-
-/**
- * An extension of OutputPort defining a set of target EventReceivingInputPorts
- * to which internally generated events will be relayed. This is the interface
- * used by output ports on a workflow entity with internal logic generating or
- * relaying events.
- * 
- * @author Tom Oinn
- * 
- */
-public interface EventForwardingOutputPort extends OutputPort {
-
-	/**
-	 * The set of EventHandlingInputPort objects which act as targets for events
-	 * produced from this OutputPort
-	 * 
-	
-	public Set<EventHandlingInputPort> getTargets();
-*/
-
-	/**
-	 * The set of datalinks for which this output port is the source of events
-	 */
-	public Set<? extends Datalink> getOutgoingLinks();
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EventHandlingInputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EventHandlingInputPort.java
deleted file mode 100644
index b756250..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/EventHandlingInputPort.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-
-/**
- * Input port capable of receiving and reacting to workflow events.
- * 
- * @author Tom Oinn
- * 
- */
-public interface EventHandlingInputPort extends InputPort {
-
-	/**
-	 * Receive an arbitrary workflow event.
-	 */
-	public void receiveEvent(WorkflowDataToken t);
-
-	/**
-	 * If this port is connected to a Datalink return the link, otherwise return
-	 * null
-	 */
-	public Datalink getIncomingLink();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/FailureTransmitter.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/FailureTransmitter.java
deleted file mode 100644
index 2277996..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/FailureTransmitter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Used to message interested parties when a top level failure occurs within a
- * Dataflow
- * <p>
- * Not implemented in the curent code, this is a placeholder for the failure
- * handling system.
- * 
- * @author Tom Oinn
- * 
- */
-public interface FailureTransmitter {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/FilteringInputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/FilteringInputPort.java
deleted file mode 100644
index 993b29f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/FilteringInputPort.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * A filtering input port is one capable of filtering events to only pass
- * through data events at a certain depth. Other events are either ignored (in
- * the case of finer granularity) or converted to completion events (for
- * coarser). Where the filter depth and the port depth are distinct this port
- * type will filter on the filter depth then drill into the data to get down to
- * the port depth. Filter depth must always be equal to or greater than port
- * depth.
- * <p>
- * This is used as the interface for Processor input ports.
- * <p>
- * A condition to use this type is that the stream of events for a given process
- * ID must terminate with a top level (i.e. zero length index array) token. This
- * can be accomplished by use of the crystalizer (as found on the output of a
- * Processor instance) or some other mechanism but is required. Similarly it is
- * assumed that all intermediate collections are emited in the correct sequence,
- * if this is not the case the filtering may not function correctly.
- * 
- * @author Tom Oinn
- * 
- */
-public interface FilteringInputPort extends EventHandlingInputPort {
-
-	/**
-	 * Set the depth at which to filter events. Events at a lower depth than
-	 * this are ignored completely, those at exactly this depth are passed
-	 * through intact and those above are converted to completion events.
-	 * 
-	 * @param filterDepth
-	 */
-	public int getFilterDepth();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/InputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/InputPort.java
deleted file mode 100644
index f2f3304..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/InputPort.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Marker interface denoting that the instance is an input port.
- * 
- * @author Tom Oinn
- * 
- */
-public interface InputPort extends Port {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/InvalidDataflowException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/InvalidDataflowException.java
deleted file mode 100644
index 5aa75cb..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/InvalidDataflowException.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-
-/**
- * Thrown if attempting to use a workflow that
- * is not {@link Dataflow#checkValidity() valid}.
- * <p>
- * The {@link DataflowValidationReport} can be retrieved using
- * {@link #getDataflowValidationReport()} and will provide details on how the
- * dataflow is invalid. The {@link #getDataflow()} will provide the invalid
- * dataflow.
- * </p>
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class InvalidDataflowException extends Exception {
-	private static final long serialVersionUID = -8470683930687738369L;
-	private final DataflowValidationReport report;
-	private final Dataflow dataflow;
-
-	public InvalidDataflowException(Dataflow dataflow,
-			DataflowValidationReport report) {
-		this.report = report;
-		this.dataflow = dataflow;
-	}
-
-	/**
-	 * Get the {@link DataflowValidationReport validation report} for the
-	 * failing dataflow.
-	 * 
-	 * @return Dataflow validation report
-	 */
-	public DataflowValidationReport getDataflowValidationReport() {
-		return report;
-	}
-
-	/**
-	 * Get the {@link Dataflow} that is not valid.
-	 * 
-	 * @return Invalid Dataflow
-	 */
-	public Dataflow getDataflow() {
-		return dataflow;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Merge.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Merge.java
deleted file mode 100644
index 148e14c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Merge.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import java.util.List;
-
-/**
- * Allows multiple outputs to be routed to a single input within the dataflow.
- * The merge operation defines a total order over its input ports, this order is
- * used to modify the index array of all incoming events by adding the port
- * index as a prefix to that array. At a conceptual level this means that any
- * event coming in is 'binned' by port index creating a collection of whatever
- * the port type was. This also places a constraint that all input ports must
- * have the same cardinality (i.e. depth + length of index array must be equal
- * for all events on all ports). If this constraint is violated the merge
- * operation is free to throw a WorkflowStructureException at runtime although
- * it would be preferable if implementing classes were capable of static type
- * analysis to preclude this from happening.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Merge extends TokenProcessingEntity {
-
-	/**
-	 * The Merge object contains an ordered list of InputPort objects. Data and
-	 * completion events arriving at an input port have the index of that input
-	 * within the list prepended to their index array, effectively placing them
-	 * in a virtual collection the top level of which corresponds to the various
-	 * input ports defined within the Merge node. When final completion events
-	 * from all input ports are received the Merge object registers the top
-	 * level collection with the attached DataManager and emits it and the
-	 * completion event through the single output port.
-	 * 
-	 * @return Ordered list of InputPort objects
-	 */
-	List<? extends MergeInputPort> getInputPorts();
-
-	/**
-	 * The Merge object has a single output port through which modified events
-	 * are emitted as described in the javadoc for getInputPorts
-	 * 
-	 * @return OutputPort for this Merge object
-	 */
-	EventForwardingOutputPort getOutputPort();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergeInputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergeInputPort.java
deleted file mode 100644
index 4b96d5c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergeInputPort.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-
-/**
- * Input port on a Merge object
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public interface MergeInputPort extends EventHandlingInputPort, MergePort {
-
-	/**
-	 * Receive an arbitrary workflow event. The index of this port relative to
-	 * its parent Merge object is prepended to the event index and the event
-	 * forwarded through the Merge output port to any targets.
-	 * <p>
-	 * If this is a workflow data token and the first such received under a
-	 * given owning process ID the implementing method also must also store the
-	 * cardinality, i.e. length of index array + depth of token. Subsequent
-	 * events are matched to this, if they have unequal cardinality the parent
-	 * Merge operation will throw a WorkflowStructureException as the merge
-	 * would result in a collection which violated the constraints defined by
-	 * the Taverna 2 data model.
-	 * 
-	 * @param e
-	 *            arbitrary workflow event, will be forwarded unchanged other
-	 *            than an alteration of the index array by prefixing the index
-	 *            of this input port relative to the parent Merge object
-	 */
-	public void receiveEvent(WorkflowDataToken t);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergeOutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergeOutputPort.java
deleted file mode 100644
index 1e4f83d..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergeOutputPort.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * An EventForwardingOutputPort that is associated with Merge instances.
- * In particular it provides access to the Merge instance it is associated with.
- * 
- * @see Merge
- * @see MergePort
- * @see EventForwardingOutputPort
- * 
- * @author Stuart Owen
- * @author Stian Soiland-Reyes
- *
- */
-public interface MergeOutputPort extends EventForwardingOutputPort, MergePort {
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergePort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergePort.java
deleted file mode 100644
index 0e081c6..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/MergePort.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * An input or output {@link Port} for a {@link Merge}.
- * 
- * @see MergeInputPort
- * @see MergeOutputPort
- * @author Stian Soiland-Reyes
- *
- */
-public interface MergePort extends Port {
-	
-	/**
-	 * @return the Merge instance the port is associated with. 
-	 */
-	public Merge getMerge();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/NamedWorkflowEntity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/NamedWorkflowEntity.java
deleted file mode 100644
index 504fb05..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/NamedWorkflowEntity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Entities existing directly within a workflow such as Processors, Merge
- * operators and other potential future extensions exist within a naming scheme.
- * The local name of an entity is unique relative to the enclosing workflow.
- * Global names are not defined outside of the context of a given instance of a
- * workflow as the same workflow may be re-used in multiple other workflows,
- * there is therefore no single parent defined for some entities and the
- * approach of traversing the hierarchy to build a fully qualified name cannot
- * be applied. A given instance can be treated this way but this depends on
- * dataflow rather than inherent workflow structure.
- * <p>
- * All named workflow entities support the sticky note annotation type
- * 
- * @author Tom Oinn
- * 
- */
-public interface NamedWorkflowEntity {
-
-	/**
-	 * Every workflow level entity has a name which is unique within the
-	 * workflow in which it exists. This only applies to the immediate parent
-	 * workflow, names may be duplicated in child workflows etc.
-	 */
-	public String getLocalName();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/NamingException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/NamingException.java
deleted file mode 100644
index 2ce2f33..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/NamingException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Potentially thrown when an edit fails due to naming of entities created or
- * modified by the edit. This could be because there are duplicate names in e.g.
- * processor input ports or invalid characters in the name itself
- * 
- * @author Tom Oinn
- * 
- */
-public class NamingException extends EditException {
-
-	private static final long serialVersionUID = -6945542133180017313L;
-
-	public NamingException(String message) {
-		super(message);
-	}
-
-	public NamingException(Throwable cause) {
-		super(cause);
-	}
-
-	public NamingException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/OrderedPair.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/OrderedPair.java
deleted file mode 100644
index 584718c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/OrderedPair.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * A simple generic class to hold a pair of same type objects. Used by various
- * Edit implementations that operate on pairs of Processors amongst other
- * things.
- * 
- * @author Tom Oinn
- * 
- * @param <T>
- *            Type of the pair of contained objects
- */
-public class OrderedPair<T> {
-
-	private T a, b;
-
-	/**
-	 * Build a new ordered pair with the specified objects.
-	 * 
-	 * @throws RuntimeException
-	 *             if either a or b are null
-	 * @param a
-	 * @param b
-	 */
-	public OrderedPair(T a, T b) {
-		if (a == null || b == null) {
-			throw new RuntimeException(
-					"Cannot construct ordered pair with null arguments");
-		}
-		this.a = a;
-		this.b = b;
-	}
-
-	/**
-	 * Return object a
-	 */
-	public T getA() {
-		return this.a;
-	}
-
-	/**
-	 * Return object b
-	 */
-	public T getB() {
-		return this.b;
-	}
-
-	/**
-	 * A pair of objects (a,b) is equal to another pair (c,d) if and only if a,
-	 * b, c and d are all the same type and the condition (a.equals(c) &
-	 * b.equals(d)) is true.
-	 */
-	@Override
-	public boolean equals(Object other) {
-		if (other instanceof OrderedPair) {
-			OrderedPair<?> op = (OrderedPair<?>) other;
-			return (a.equals(op.getA()) && b.equals(op.getB()));
-		} else {
-			return false;
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/OutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/OutputPort.java
deleted file mode 100644
index 011a489..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/OutputPort.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Port representing the output of an activity, processor or workflow. In addition
- * to the name and port depth defined by the Port interface this includes a
- * granular depth property. The granular depth of an output is the depth of the
- * finest grained entity that can be emitted from that port. For example, if a
- * process conceptually returned a list of strings but was actually capable of
- * streaming strings as they were generated it would set a port depth of 1 and
- * granular depth of zero.
- * 
- * @author Tom Oinn
- * 
- */
-public interface OutputPort extends Port {
-
-	/**
-	 * The granular depth is the depth of the finest grained item that can be
-	 * emitted from this output port. A difference in this and the port depth
-	 * indicates that the entity this port is attached to is capable of
-	 * streaming data resulting from a single process invocation. The port depth
-	 * defines the conceptual depth, so a process returning a stream of single
-	 * items would set port depth to 1 and granular depth to zero.
-	 * 
-	 * @return granular depth of output port
-	 */
-	public int getGranularDepth();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Port.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Port.java
deleted file mode 100644
index 7b51ced..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Port.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import net.sf.taverna.t2.annotation.Annotated;
-
-/**
- * Named port which receives events from some other entity and handles them
- * appropriately.
- * 
- * @author Tom Oinn
- * 
- */
-public interface Port extends Annotated<Port> {
-
-	public String getName();
-
-	public int getDepth();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Processor.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Processor.java
deleted file mode 100644
index b98f24d..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/Processor.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import static net.sf.taverna.t2.annotation.HierarchyRole.CHILD;
-
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.HierarchyTraversal;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.lang.observer.Observable;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-
-/**
- * A single node within the dataflow digraph, the Processor is the basic
- * functional unit within a Taverna workflow. It should also notify interested
- * observers when it has finished execution (including all iterations of the processor).
- * 
- * @author Tom Oinn
- * @author Alex Nenadic
- * 
- */
-@ControlBoundary
-public interface Processor extends TokenProcessingEntity, Annotated<Processor>, Observable<ProcessorFinishedEvent>  {
-
-	/**
-	 * The iteration strategy is responsible for combining input data events
-	 * into jobs which are then queued for execution through the dispatch stack
-	 * 
-	 * @return IterationStrategyStack containing one or more IterationStrategy
-	 *         objects. In most cases this will only contain a single
-	 *         IterationStrategy but there are particular scenarios where
-	 *         staging partial iteration strategies together is the only way to
-	 *         get the desired combination of inputs
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public IterationStrategyStack getIterationStrategy();
-
-	/**
-	 * Each processor has a list of zero or more input ports. These are uniquely
-	 * named within the list. Any input port may have a default value associated
-	 * with it and may be attached to exactly one upstream output port. Where it
-	 * is necessary to connect a single input port to multiple output ports a
-	 * Merge object is used. Ordering within the list is not meaningful but we
-	 * use List rather than Set to preserve the ordering across serialisation
-	 * operations.
-	 * <p>
-	 * Processor inputs are instances of FilteringInputPort - they must have the
-	 * filter depth set before any data events arrive at the Processor. In
-	 * addition they assume that a full collection will be supplied, i.e. that
-	 * there will be exactly one event at the end of the list of events for a
-	 * given process ID with an index array of length zero.
-	 * 
-	 * @return List of named input ports
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends ProcessorInputPort> getInputPorts();
-
-	/**
-	 * Each processor has a list of zero or more output ports. Output ports are
-	 * uniquely named within the list and may be connected to arbitrarily many
-	 * downstream input ports or Merge objects. Ordering within the list is not
-	 * meaningful but we use List rather than Set to preserve the ordering
-	 * across serialisation operations.
-	 * 
-	 * @return List of named output ports
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends ProcessorOutputPort> getOutputPorts();
-
-	/**
-	 * The dispatch stack pulls jobs from the queue generated by the iteration
-	 * system and handles the dispatch of these jobs to appropriate activity
-	 * workers
-	 * 
-	 * @return the DispatchStackImpl for this processor
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public DispatchStack getDispatchStack();
-
-	/**
-	 * A processor contains zero or more activities in an ordered list. To be
-	 * any use in a workflow the processor should contain at least one activity
-	 * but it's technically valid to have none! Activities may be abstract or
-	 * concrete where an abstract activity is one with no invocation mechanism,
-	 * in these cases additional logic must be added to the dispatch stack of
-	 * the containing processor to convert these to concrete invokable
-	 * activities during the workflow invocation.
-	 * 
-	 * @return list of Activity instances
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends Activity<?>> getActivityList();
-
-	/**
-	 * A processor with no inputs cannot be driven by the supply of data tokens
-	 * as it has nowhere to receive such tokens. This method allows a processor
-	 * to fire on an empty input set, in this case the owning process identifier
-	 * must be passed explicitly to the processor. Internally this pushes a
-	 * single empty job event into the dispatch queue, bypassing the iteration
-	 * logic (which is entirely predicated on the existence of input ports).
-	 * Callers must ensure that an appropriate process identifier is specified,
-	 * the behaviour on missing or duplicate process identifiers is not defined.
-	 */
-	public void fire(String owningProcess, InvocationContext context);
-
-	/**
-	 * A processor has zero or more preconditions explicitly declared. All such
-	 * preconditions must be satisfied before any jobs are passed into the
-	 * dispatch stack. These preconditions replace and generalise the
-	 * coordination constraints from Taverna 1.
-	 * 
-	 * @return a List of Condition objects defining constraints on this
-	 *         processor's execution
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends Condition> getPreconditionList();
-
-	/**
-	 * A processor may control zero or more other processors within the same
-	 * level of the workflow through preconditions.
-	 * 
-	 * @return a List of Condition objects for which this is the controlling
-	 *         processor
-	 */
-	public List<? extends Condition> getControlledPreconditionList();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorFinishedEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorFinishedEvent.java
deleted file mode 100644
index c5de285..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorFinishedEvent.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * 
- * An event saying that a processor with a given owning process has finished with execution
- * (that includes the whole dispatch stack - iterations of the processor and all).
- * 
- * @author Alex Nenadic
- *
- */
-public class ProcessorFinishedEvent {
-
-	private Processor processor;
-	private String owningProcess;
-	
-	public ProcessorFinishedEvent(Processor processor, String owningProcess) {
-		this.setProcessor(processor);
-		this.setOwningProcess(owningProcess);
-	}
-
-	public void setOwningProcess(String owningProcess) {
-		this.owningProcess = owningProcess;
-	}
-
-	public String getOwningProcess() {
-		return owningProcess;
-	}
-
-	public void setProcessor(Processor processor) {
-		this.processor = processor;
-	}
-
-	public Processor getProcessor() {
-		return processor;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorInputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorInputPort.java
deleted file mode 100644
index 3207f9e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorInputPort.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Input port on a Processor, is both a filtering input port and a processor
- * port
- * 
- * @author Tom Oinn
- * 
- */
-public interface ProcessorInputPort extends FilteringInputPort, ProcessorPort {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorOutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorOutputPort.java
deleted file mode 100644
index 4292426..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorOutputPort.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Input port on a Processor, is both an event forwarding output port and a
- * processor port
- * 
- * @author Tom Oinn
- * 
- */
-public interface ProcessorOutputPort extends EventForwardingOutputPort,
-		ProcessorPort {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorPort.java
deleted file mode 100644
index 85c0e59..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/ProcessorPort.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * An {@link ProcessorInputPort} or {@link ProcessorOutputPort} belonging to a
- * {@link Processor}.
- * 
- */
-public interface ProcessorPort extends Port {
-
-	/**
-	 * Get the Processor to which this port belongs
-	 */
-	public Processor getProcessor();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/TokenProcessingEntity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/TokenProcessingEntity.java
deleted file mode 100644
index dbbf1d6..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/TokenProcessingEntity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-import static net.sf.taverna.t2.annotation.HierarchyRole.CHILD;
-
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.HierarchyTraversal;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-
-/**
- * Superinterface for all classes within the workflow model which consume and
- * emit workflow data tokens.
- * 
- * @author Tom Oinn
- * 
- */
-public interface TokenProcessingEntity extends NamedWorkflowEntity {
-
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends EventHandlingInputPort> getInputPorts();
-
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<? extends EventForwardingOutputPort> getOutputPorts();
-
-	/**
-	 * Run a collection level based type check on the token processing entity
-	 * 
-	 * @return true if the typecheck was successful or false if the check failed
-	 *         because there were preconditions missing such as unsatisfied
-	 *         input types
-	 * @throws IterationTypeMismatchException
-	 *             if the typing occurred but didn't match because of an
-	 *             iteration mismatch
-	 * @throws InvalidDataflowException 
-	 * 			 	if the entity depended on a dataflow that was not valid
-	 */
-	public boolean doTypeCheck() throws IterationTypeMismatchException, InvalidDataflowException;
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/WorkflowStructureException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/WorkflowStructureException.java
deleted file mode 100644
index 02afdc5..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/WorkflowStructureException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel;
-
-/**
- * Thrown predominantly at runtime under circumstances that suggest an
- * inconsistancy in the workflow model. This might include attempting to feed
- * data into a port that doesn't exist or has an unknown name or similar errors.
- * 
- * @author Tom OInn
- */
-public class WorkflowStructureException extends RuntimeException {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	public WorkflowStructureException(String string) {
-		super(string);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthChecker.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthChecker.java
deleted file mode 100644
index f46b8db..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthChecker.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-/**
- * An SPI interface whose implementation performs a health check on an arbitrary instance.
- * <br>
- * 
- * @author Stuart Owen
- * @author David Withers
- *
- * @param <Type> the type of the item being checked
- */
-public interface HealthChecker<Type extends Object> {
-	/**
-	 * Returns true if the HealthChecker implementation is targeted at the subject being
-	 * passed to this method.
-	 * @param subject
-	 * @return
-	 */
-	public boolean canHandle(Object subject);
-	
-	/**
-	 * Carries out a health check on the subject, which should already have been determined as being
-	 * suitable by a call to canHandle.
-	 * 
-	 * @param subject
-	 * @return a HealthReport giving a summary of the result of the health check.
-	 * @see HealthReport
-	 */
-	public HealthReport checkHealth(Type subject);
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerFactory.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerFactory.java
deleted file mode 100644
index 8b18d96..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * A factory class that performs a discovery of available HealthCheckers that can handle a given Object.
- * <br>
- * 
- * 
- * @author Stuart Owen
- * @see HealthReport
- * @see HealthChecker
- */
-public class HealthCheckerFactory {
-	
-	private static HealthCheckerFactory instance = new HealthCheckerFactory();
-	private HealthCheckerRegistry registry = new HealthCheckerRegistry(); 
-	
-	private HealthCheckerFactory() {
-		
-	}
-	
-	/**
-	 * @return a singleton instance of the HealthCheckerFactory.
-	 */
-	public static HealthCheckerFactory getInstance() {
-		return instance;
-	}
-
-	/**
-	 * 
-	 * @param subject the Object for which to discover HealthCheckers
-	 * @return a list of HealthCheckers that can handle the subject.
-	 */
-	public List<HealthChecker<?>> getHealthCheckersForObject(Object subject) {
-		List<HealthChecker<?>> result = new ArrayList<HealthChecker<?>>();
-		for (HealthChecker<?> checker : registry.getInstances()) {
-			if (checker.canHandle(subject)) {
-				result.add(checker);
-			}
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerRegistry.java
deleted file mode 100644
index 219e965..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerRegistry.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-/**
- * An SPI registry class for the discovery of known HealthCheckers.
- * <br>
- * This class is not normally used directly. To find a HealthChecker for a given Object then {@link HealthCheckerFactory} should be used instead.
- * 
- * @author Stuart Owen
- * @see HealthChecker
- * @see HealthReport
- */
-@SuppressWarnings("unchecked")
-public class HealthCheckerRegistry extends SPIRegistry<HealthChecker>{
-
-	public HealthCheckerRegistry() {
-		super(HealthChecker.class);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthReport.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthReport.java
deleted file mode 100644
index 45392c1..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/HealthReport.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Defines a summary of an individual health check.
- * <br>
- * A number of health checks are performed on a dataflow and its internal elements providing a sanity check before
- * invoking the dataflow itself. It can check such things as whether a service endpoint is accessible or whether a script parses.
- * <br>
- * A HealthReport can contain additional nested HealthReports to an unlimited depth, allowing multiple recursive tests to be performed as
- * part of an overall health check. If a HealthReport contains subreports then its overall status is taken as the most SEVERE of all its sub reports and itself.
- * 
- * @author Stuart Owen
- * @author David Withers
- *
- */
-public class HealthReport {
-	
-	/**
-	 * Enumeration of the possible status's in increasing severity: OK, WARNING,SEVERE 
-	 */
-	public enum Status {OK,WARNING,SEVERE};
-
-	private String message;
-	private Status status;
-	private String subject;
-	private List<HealthReport> subReports = new ArrayList<HealthReport>();
-	
-	/**
-	 * Constructs the Health Report. The sub reports default to an empty list.
-	 * @param subject - a String representing the thing being tested.
-	 * @param message - a summary of the result of the test.
-	 * @param status - the overall Status.
-	 */
-	public HealthReport(String subject, String message, Status status) {
-		this(subject,message,status,new ArrayList<HealthReport>());
-	}
-	
-	/**
-	 * Constructs the HealthReport
-	 * 
-	 * @param subject - a String representing the thing being tested.
-	 * @param message - a summary of the result of the test.
-	 * @param status - the overall Status.
-	 * @param subReports - a List of sub reports.
-	 */
-	public HealthReport(String subject, String message,Status status,  List<HealthReport> subReports) {
-		this.subject=subject;
-		this.status=status;
-		this.message=message;
-		this.subReports=subReports;
-	}
-	
-	/**
-	 * @return a message summarising the report
-	 */
-	public String getMessage() {
-		return message;
-	}
-	
-	/**
-	 * Sets the message
-	 * @param message a message summarising the report
-	 */
-	public void setMessage(String message) {
-		this.message = message;
-	}
-	
-	/**
-	 * Determines the overall Status. This is the most severe status of this report and all its sub reports.
-	 * @return the overall status
-	 */
-	public Status getStatus() {
-		Status result = status;
-		for (HealthReport report : subReports) {
-			if (report.getStatus().compareTo(result)>0) result=report.getStatus();
-		}
-		return result;
-	}
-	
-	/**
-	 * Sets the status of this report. Be aware that the overall status of this report may also be affected by its sub reports if they have a more severe Status.
-	 * @param status
-	 * @see #getStatus
-	 */
-	public void setStatus(Status status) {
-		this.status = status;
-	}
-	
-	/**
-	 * @return a String representing the subject of this health report
-	 */
-	public String getSubject() {
-		return subject;
-	}
-	
-	/**
-	 * @param subject a String representing the subject of this health report
-	 */
-	public void setSubject(String subject) {
-		this.subject = subject;
-	}
-	
-	/**
-	 * Provides a list of sub reports. This list defaults an empty list, so it is safe to add new reports through this method.
-	 * @return a list of sub reports associated with this HealthReport
-	 */
-	public List<HealthReport> getSubReports() {
-		return subReports;
-	}
-	/**
-	 * Replaces the List of sub reports with those provided.
-	 * @param subReports a list of sub reports
-	 */
-	public void setSubReports(List<HealthReport> subReports) {
-		this.subReports = subReports;
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/package.html
deleted file mode 100644
index 6cbc3b5..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/health/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<body>
-
-A package that contains a set of classes to be used in testing a Dataflow prior to invocation.<br>
-These can carry our various tests such as a service endpoint being accessible. HealthChecker provides an
-SPI extension point to allow 3rd party developers to implement their own Activity checkers.
-</body>
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/package.html
deleted file mode 100644
index abaa693..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-Defines classes and interfaces for workflow level entities and events.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AbstractActivity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AbstractActivity.java
deleted file mode 100644
index 0ad8cc1..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AbstractActivity.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.annotation.annotationbeans.MimeType;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EditsRegistry;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean;
-import net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean;
-import net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityPortsDefinitionBean;
-
-import org.apache.log4j.Logger;
-
-/**
- * Convenience abstract superclass for generic Activity instances. Parameterised
- * on the configuration type used by the Activity implementation - when this
- * object is serialised the getConfiguration method is used to store specific
- * details of the activity, this is then used immediately after a call to the
- * default constructor when deserialising from XML on a workflow load.
- * <p>
- * This class holds port sets and mappings, and returns references directly to
- * them rather than copies thereof.
- * <p>
- * If you're writing an abstract activity (one that cannot be directly invoked)
- * you should extend this class for convenience. This can be useful when you
- * wish to specify some kind of abstract definition of a process which will be
- * bound at workflow invocation time to a particular concrete activity through
- * the action of a custom dispatch stack layer (which you will also provide)
- * 
- * @author Tom Oinn
- * @author Stuart Owen
- * 
- * @param <ConfigType>
- *            type of configuration object to be used to hold configuration
- *            information
- */
-public abstract class AbstractActivity<ConfigType> extends
-		AbstractAnnotatedThing<Activity<?>> implements Activity<ConfigType> {
-
-	private static Logger logger = Logger
-	.getLogger(AbstractActivity.class);
-
-	protected Map<String, String> inputPortMapping = new HashMap<String, String>();
-
-	protected Map<String, String> outputPortMapping = new HashMap<String, String>();
-
-	protected Set<OutputPort> outputPorts = new HashSet<OutputPort>();
-
-	protected Set<ActivityInputPort> inputPorts = new HashSet<ActivityInputPort>();
-
-	/**
-	 * @see net.sf.taverna.t2.workflowmodel.processor.activity.Activity#configure(java.lang.Object)
-	 */
-	public abstract void configure(ConfigType conf)
-			throws ActivityConfigurationException;
-
-	/**
-	 * @see net.sf.taverna.t2.workflowmodel.processor.activity.Activity#getConfiguration()
-	 */
-	public abstract ConfigType getConfiguration();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see net.sf.taverna.t2.workflowmodel.processor.activity.Activity#getInputPortMapping()
-	 */
-	public final Map<String, String> getInputPortMapping() {
-		return this.inputPortMapping;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see net.sf.taverna.t2.workflowmodel.processor.activity.Activity#getInputPorts()
-	 */
-	public final Set<ActivityInputPort> getInputPorts() {
-		return inputPorts;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see net.sf.taverna.t2.workflowmodel.processor.activity.Activity#getOutputPortMapping()
-	 */
-	public final Map<String, String> getOutputPortMapping() {
-		return this.outputPortMapping;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see net.sf.taverna.t2.workflowmodel.processor.activity.Activity#getOutputPorts()
-	 */
-	public final Set<OutputPort> getOutputPorts() {
-		return outputPorts;
-	}
-
-	/**
-	 * Creates and adds a new input port with the provided properties.
-	 * 
-	 * @see #removeInputs()
-	 * @param portName -
-	 *            the name of the port to be created.
-	 * @param portDepth -
-	 *            the depth of the port to be created.
-	 */
-	protected void addInput(
-			String portName,
-			int portDepth,
-			boolean allowsLiteralValues,
-			List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes,
-			Class<?> translatedElementClass) {
-		if (handledReferenceSchemes == null) {
-			handledReferenceSchemes = Collections.emptyList();
-		}
-		inputPorts.add(EditsRegistry.getEdits().createActivityInputPort(
-				portName, portDepth, allowsLiteralValues,
-				handledReferenceSchemes, translatedElementClass));
-	}
-
-	/**
-	 * Creates and adds a new output port with the provided properties.
-	 * 
-	 * @see #removeOutputs()
-	 * @param portName -
-	 *            the name of the port to be created.
-	 * @param portDepth -
-	 *            the depth of the port to be created
-	 * @param granularDepth -
-	 *            the granular depth of the port to be created
-	 * @param mimeTypes -
-	 *            a List of String representations of the MIME type this port
-	 *            will emit as outputs.
-	 */
-	protected void addOutput(String portName, int portDepth, int granularDepth) {
-		outputPorts.add(EditsRegistry.getEdits().createActivityOutputPort(
-				portName, portDepth, granularDepth));
-	}
-
-	/**
-	 * Convenience method, creates a new output port with depth and granular
-	 * depth both set to the value for depth, i.e. no streaming behaviour.
-	 * <p>
-	 * 
-	 * @see #removeOutputs()
-	 * @param portName
-	 * @param portDepth
-	 */
-	protected void addOutput(String portName, int portDepth) {
-		addOutput(portName, portDepth, portDepth);
-	}
-
-	/**
-	 * <p>
-	 * Simplifies configuring the Activity input and output ports if its
-	 * ConfigType is an implementation of {@link ActivityPortsDefinitionBean}
-	 * </p>
-	 * <p>
-	 * For an Activity that has ports that are defined dynamically it is natural
-	 * that is ConfigType will not implement this interface.
-	 * </p>
-	 * 
-	 * @param configBean
-	 */
-	protected void configurePorts(ActivityPortsDefinitionBean configBean) {
-		removeInputs();
-		for (ActivityInputPortDefinitionBean inputDef : configBean
-				.getInputPortDefinitions()) {
-			addInput(inputDef.getName(), inputDef.getDepth(), inputDef
-					.getAllowsLiteralValues(), inputDef
-					.getHandledReferenceSchemes(), inputDef
-					.getTranslatedElementType());
-			// TODO - use the mime types from the config bean if required,
-			// probably best handled elsewhere though
-		}
-		removeOutputs();
-
-		for (ActivityOutputPortDefinitionBean outputDef : configBean
-				.getOutputPortDefinitions()) {
-			OutputPort createActivityOutputPort = EditsRegistry.getEdits().createActivityOutputPort(
-					outputDef.getName(), outputDef.getDepth(), outputDef
-					.getGranularDepth());
-//			addOutput(outputDef.getName(), outputDef.getDepth(), outputDef
-//					.getGranularDepth());
-			this.outputPorts.add(createActivityOutputPort);
-			//add the mime types as annotations
-			for (String mimeType:outputDef.getMimeTypes()) {
-				MimeType mimeTypeAnnotation = new MimeType();
-				mimeTypeAnnotation.setText(mimeType);
-				try {
-					EditsRegistry.getEdits().getAddAnnotationChainEdit(createActivityOutputPort, mimeTypeAnnotation).doEdit();
-				} catch (EditException e) {
-					logger.error(e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Remove existing output ports.
-	 * 
-	 */
-	protected void removeOutputs() {
-		outputPorts.clear();
-	}
-
-	/**
-	 * Remove existing input ports
-	 * 
-	 */
-	protected void removeInputs() {
-		inputPorts.clear();
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AbstractAsynchronousActivity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AbstractAsynchronousActivity.java
deleted file mode 100644
index a290312..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AbstractAsynchronousActivity.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Abstract superclass for asynchronous activities. Activity providers should only
- * have to implement the configuration and invocation methods to have a fully
- * functional activity - serialisation and deserialisation are handled
- * automatically.
- * 
- * @author Tom Oinn
- * 
- * @param <ConfigType>
- *            the configuration type used for this activity
- */
-public abstract class AbstractAsynchronousActivity<ConfigType> extends
-		AbstractActivity<ConfigType> implements AsynchronousActivity<ConfigType> {
-
-	/**
-	 * Called immediately after object construction by the deserialisation
-	 * framework with a configuration bean built from the auto-generated XML.
-	 * <p>
-	 * This method is responsible for the creation of input and output ports,
-	 * something that is currently done in the constructor of the Taverna 1
-	 * Processor class.
-	 */
-	@Override
-	public abstract void configure(ConfigType conf)
-			throws ActivityConfigurationException;
-
-	/**
-	 * Get a configuration bean representing the definition of the activity. This
-	 * bean should contain enough information to rebuild the input and output
-	 * port sets, mappings are explicitly handled by the serialisation framework
-	 * but the ports are assumed to be generated during the configuration stage
-	 * rather than explicitly stored.
-	 */
-	@Override
-	public abstract ConfigType getConfiguration();
-
-	/**
-	 * Request an asynchronous invocation of the activity on the specified data.
-	 * The data items are named relative to the input port names of the activity
-	 * (as opposed to the parent processor), the invocation layer is responsible
-	 * for translating these appropriately before this method is called. The
-	 * callback object provides access to a DataManager instance that can be
-	 * used to resolve the entity identifiers in the data map, push results up
-	 * and signal failure conditions.
-	 * <p>
-	 * This method must not block! However it happens this method must return
-	 * immediately after creating the new activity invocation. Do not do any
-	 * heavy lifting in the body of this method without creating a new thread
-	 * specifically for it.
-	 */
-	public abstract void executeAsynch(Map<String, T2Reference> data,
-			AsynchronousActivityCallback callback);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/Activity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/Activity.java
deleted file mode 100644
index 544b8de..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/Activity.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import static net.sf.taverna.t2.annotation.HierarchyRole.CHILD;
-
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.HierarchyTraversal;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Configurable;
-
-/**
- * Defines a single abstract or concrete invokable activity. Each Processor
- * contains at least one of these and may contain many, similarly the dispatch
- * stack may create new Activity instances from e.g. dynamic lookup or resolution
- * of an abstract activity to a concrete activity or set of activities.
- * 
- * @param <ConfigurationType> the ConfigurationType associated with the Activity. This is an arbitrary java class that provides details on how the Activity is configured..
- * @author Tom Oinn
- * 
- */
-public interface Activity<ConfigurationType> extends Annotated<Activity<?>>, Configurable<ConfigurationType> {
-
-	
-	
-	/**
-	 * An Activity contains a set of named input ports. Names must be unique
-	 * within this set.
-	 * 
-	 * @return the set of input ports for this activity
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public Set<ActivityInputPort> getInputPorts();
-
-	/**
-	 * A processor may have different input port names to the activity or
-	 * activities it contains. This map is keyed on the processor input port names
-	 * with the corresponding value being the activity port name.
-	 * 
-	 * @return mapping from processor input port names to activity input port
-	 *         names
-	 */
-	public Map<String, String> getInputPortMapping();
-
-	/**
-	 * An Activity contains a set of named output ports. As with input ports names
-	 * must be unique within the set.
-	 * 
-	 * @return
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public Set<OutputPort> getOutputPorts();
-
-	/**
-	 * Outputs of the activity may be named differently to those of the
-	 * processor. This map is keyed on an activity output port name with each
-	 * corresponding value being the processor output port name to which the
-	 * activity output is bound.
-	 * 
-	 * @return mapping from activity output port name to processor output port
-	 *         name
-	 */
-	public Map<String, String> getOutputPortMapping();
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public abstract void configure(ConfigurationType conf) throws ActivityConfigurationException;
-
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityAndBeanWrapper.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityAndBeanWrapper.java
deleted file mode 100644
index 0cedc45..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityAndBeanWrapper.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.awt.datatransfer.Transferable;
-
-/**
- * Used when dragging activities from the palette onto "something". Place it
- * inside a {@link Transferable} when doing a drag operation. Contains an
- * {@link Activity} and its configuration bean.
- * 
- * @author Ian Dunlop
- * 
- */
-public class ActivityAndBeanWrapper {
-	/** The Activity being dragged */
-	private Activity<?> activity;
-	/** The bean used to configure the activity */
-	private Object bean;
-	private String name;
-
-	public Activity<?> getActivity() {
-		return activity;
-	}
-
-	public void setActivity(Activity<?> activity) {
-		this.activity = activity;
-	}
-
-	public Object getBean() {
-		return bean;
-	}
-
-	public void setBean(Object bean) {
-		this.bean = bean;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityConfigurationException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityConfigurationException.java
deleted file mode 100644
index 96284b0..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityConfigurationException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import net.sf.taverna.t2.workflowmodel.ConfigurationException;
-
-/**
- * Thrown when attempting to configure an Activity instance with an invalid
- * configuration. Causes may include actual configuration errors, unavailable
- * activities etc.
- * 
- * @author Tom Oinn
- * 
- */
-public class ActivityConfigurationException extends ConfigurationException {
-
-	private static final long serialVersionUID = 6940385954331153900L;
-
-	/**
-	 * @param msg a message describing the reason for the exception.
-	 */
-	public ActivityConfigurationException(String msg) {
-		super(msg);
-	}
-
-	/**
-	 * @param cause a previous exception that caused this ActivityConfigurationException to be thrown.
-	 */
-	public ActivityConfigurationException(Throwable cause) {
-		super(cause);
-	}
-
-	/**
-	 * @param msg a message describing the reason for the exception.
-	 * @param cause a previous exception that caused this ActivityConfigurationException to be thrown.
-	 */
-	public ActivityConfigurationException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityInputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityInputPort.java
deleted file mode 100644
index 66e4de5..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityInputPort.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.List;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.workflowmodel.InputPort;
-
-/**
- * Specialisation of InputPort to capture the extra information required by
- * Activity instances.
- * 
- * @author Tom Oinn
- * 
- */
-public interface ActivityInputPort extends InputPort, ActivityPort {
-
-	/**
-	 * Declares that the DataDocument instances fed as input data (either
-	 * directly or as elements of a collection) to this input port must contain
-	 * at least one of the specified ReferenceScheme types. This is used to
-	 * specify that e.g. an activity can only accept URLs, values or similar.
-	 * 
-	 * @return Class objects representing the reference scheme types which this
-	 *         input can handle
-	 */
-	public List<Class<? extends ExternalReferenceSPI>> getHandledReferenceSchemes();
-
-	/**
-	 * Literal values are a special case as they are not represented by
-	 * reference schemes - in rare cases activities may choose to deny literal
-	 * values, forcing *all* their inputs to be in a particular reference
-	 * scheme. If this is the case then this method should return false, if the
-	 * activity is capable of handling literal types without any upconversion to
-	 * references (please do implement this!) then it returns false
-	 * 
-	 * @return true if the activity can cope with literal values, false if it
-	 *         requires them to be converted to an instance of a reference
-	 *         scheme class (as defined by getHandledReferenceSchemes)
-	 */
-	public boolean allowsLiteralValues();
-
-	/**
-	 * The Java object type desired when the input data reference is converted
-	 * to an object. This is only used by the parent Activity when invoking the
-	 * data facade. Where the input data is a list this returns the type of leaf
-	 * nodes within the collection structure - the instances of this type will
-	 * always be wrapped up in a Java collection rather than an array type
-	 * <p>
-	 * Note that this is not intended to allow activities to consume arbitrary
-	 * java classes, activities such as the API consumer should handle this
-	 * through the reference scheme mechanism backed by an appropriate store
-	 * (most likely an in-memory hash of active objects)
-	 * 
-	 * @return the desired class of the object returned by the data facade when
-	 *         converting the input data reference into a java object. This will
-	 *         almost always be String.class or byte[].class but other cases may
-	 *         exist.
-	 */
-	public Class<?> getTranslatedElementClass();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityOutputPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityOutputPort.java
deleted file mode 100644
index 3e10763..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityOutputPort.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-
-/**
- * The output port of an {@link Activity}.
- * 
- * @author Stian Soiland-Reyes
- *
- */
-public interface ActivityOutputPort extends OutputPort, ActivityPort {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityPort.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityPort.java
deleted file mode 100644
index 62f074f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/ActivityPort.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import net.sf.taverna.t2.workflowmodel.Port;
-
-/**
- * The input or output port of an {@link Activity}.
- * 
- * @see ActivityInputPort
- * @see ActivityOutputPort
- * @author Stian Soiland-Reyes
- *
- */
-public interface ActivityPort extends Port {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AsynchronousActivity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AsynchronousActivity.java
deleted file mode 100644
index d7c318a..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AsynchronousActivity.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * A concrete invokable activity with an asynchronous invocation API and no
- * knowledge of invocation context. This is the most common concrete activity
- * type in Taverna 2, it has no knowledge of any enclosing iteration or other
- * handling process. The activity may stream results in the sense that it can use
- * the AsynchronousActivityCallback object to push multiple results followed by a
- * completion event. If a completion event is received by the callback before
- * any data events the callback will insert a data event containing empty
- * collections of the appropriate depth.
- * 
- * @param <ConfigurationType> the ConfigurationType associated with the Activity.
- * @author Tom Oinn
- * 
- */
-public interface AsynchronousActivity<ConfigurationType> extends Activity<ConfigurationType> {
-
-	/**
-	 * Invoke the activity in an asynchronous manner. The activity uses the
-	 * specified ActivityCallback object to push results, errors and completion
-	 * events back to the dispatch stack.
-	 */
-	public void executeAsynch(Map<String, T2Reference> data,
-			AsynchronousActivityCallback callback);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AsynchronousActivityCallback.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AsynchronousActivityCallback.java
deleted file mode 100644
index 6dfc231..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/AsynchronousActivityCallback.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorType;
-
-/**
- * The callback interface used by instances of AsynchronousActivity to push
- * results and failure messages back to the invocation layer.
- * 
- * @author Tom Oinn
- * 
- */
-public interface AsynchronousActivityCallback {
-
-	/**
-	 * The invocation context contains resources such as data managers, security
-	 * agents and provenance consumers to be used by the Activity as it runs.
-	 * This replaces the getLocalDataManager and getLocalSecurityManager calls.
-	 */
-	public InvocationContext getContext();
-
-	/**
-	 * If an activity proxy wants to create a new thread of activity it should
-	 * use this method unless there is a very good reason not to. This allows
-	 * the workflow framework to control its own thread usage, possibly
-	 * implementing per user, per workflow or per processor thread limit
-	 * policies. Exceptions to this principle might include cases where the
-	 * activity proxy is capable of managing thread usage across all instances
-	 * of that activity type and therefore more efficiently (fewer threads) than
-	 * if it let the workflow manager perform this function.
-	 * 
-	 * @param runMe
-	 *            a Runnable to implement the activity proxy logic.
-	 */
-	public void requestRun(Runnable runMe);
-
-	/**
-	 * Push a map of named identifiers out to the invocation layer which is then
-	 * responsible for wrapping them up into an appropriate Job object and
-	 * sending it up the dispatch stack. The keys of the map are names local to
-	 * the activity, the callback object is responsible for rewriting them
-	 * according to the activity mapping rules (i.e. Activity.getXXXPortMapping)
-	 * 
-	 * @param data
-	 *            a single result data packet
-	 * @param index
-	 *            the index of the result in the context of this single process
-	 *            invocation. If there's no streaming involved this should be a
-	 *            zero length int[].
-	 */
-	public void receiveResult(Map<String, T2Reference> data, int[] index);
-
-	/**
-	 * If (and only if) the activity is streaming data then this method can be
-	 * called to signal a (possibly partial) completion of the stream. If this
-	 * is a total completion event, i.e. one with a zero length index array and
-	 * there have been no result data sent the callback object will create a
-	 * single job containing empty lists and send that instead otherwise it will
-	 * be passed straight through. The index array is relative to this
-	 * particular activity invocation as the invocation has no contextual
-	 * awareness.
-	 * 
-	 * @param completionIndex
-	 */
-	public void receiveCompletion(int[] completionIndex);
-
-	/**
-	 * If the job fails (as opposed to succeeding and sending an error for which
-	 * the receiveResult method is used) this method will cause an error to be
-	 * sent up the dispatch stack, triggering any appropriate handling methods
-	 * such as retry, failover etc. This particular method accepts both a free
-	 * text message and an instance of Throwable for additional information, in
-	 * addition to which it sends an error type which allows upstream layers to
-	 * determine whether they can handle the error or whether it should be
-	 * passed directly upwards.
-	 * 
-	 * @param message
-	 * @param t
-	 */
-	public void fail(String message, Throwable t, DispatchErrorType errorType);
-
-	/**
-	 * If the job fails (as opposed to succeeding and sending an error for which
-	 * the receiveResult method is used) this method will cause an error to be
-	 * sent up the dispatch stack, triggering any appropriate handling methods
-	 * such as retry, failover etc. This particular method accepts both a free
-	 * text message and an instance of Throwable for additional information.
-	 * 
-	 * @param message
-	 * @param t
-	 */
-	public void fail(String message, Throwable t);
-
-	/**
-	 * If the job fails (as opposed to succeeding and sending an error for which
-	 * the receiveResult method is used) this method will cause an error to be
-	 * sent up the dispatch stack, triggering any appropriate handling methods
-	 * such as retry, failover etc. This method just takes a free text message
-	 * for cases where a failure is properly described by an instance of
-	 * Throwable
-	 * 
-	 * @param message
-	 */
-	public void fail(String message);
-
-	/**
-	 * For activities which are going to establish state below the invoke node
-	 * in the monitor tree this method returns the owning process identifier
-	 * allocated to the invoke node. This is particularly necessary for nested
-	 * workflow activities.
-	 * <p>
-	 * Any calls to Monitor.register... must establish a state tree rooted at
-	 * this node, they may assume that this node already exists.
-	 */
-	public String getParentProcessIdentifier();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/Job.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/Job.java
deleted file mode 100644
index 02f6184..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/Job.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.invocation.ProcessIdentifierException;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * Contains a (possibly partial) job description. A job is the smallest entity
- * that can be enacted by the invocation layer of the dispatch stack within a
- * processor. Jobs are partial jobs if the set of keys in the data map is not
- * identical to the set of named input ports on the processor within which the
- * job is used. These objects are used internally within the processor to stage
- * data during iteration and within the dispatch stack, they do not appear
- * within the workflow itself.
- * 
- * @author Tom Oinn
- * 
- */
-public class Job extends IterationInternalEvent<Job> {
-
-	private Map<String, T2Reference> dataMap;
-
-	/**
-	 * Push the index array onto the owning process name and return the new Job
-	 * object. Does not modify this object, the method creates a new Job with
-	 * the modified index array and owning process
-	 * 
-	 * @return
-	 */
-	@Override
-	public Job pushIndex() {
-		return new Job(getPushedOwningProcess(), new int[] {}, dataMap, context);
-	}
-
-	/**
-	 * Pull the index array previous pushed to the owning process name and
-	 * prepend it to the current index array
-	 */
-	@Override
-	public Job popIndex() {
-		return new Job(owner.substring(0, owner.lastIndexOf(':')),
-				getPoppedIndex(), dataMap, context);
-	}
-
-	/**
-	 * The actual data carried by this (partial) Job object is in the form of a
-	 * map, where the keys of the map are Strings identifying the named input
-	 * and the values are Strings containing valid data identifiers within the
-	 * context of a visible DataManager object (see CloudOne specification for
-	 * further information on the DataManager system)
-	 * 
-	 * @return Map of name to data reference for this Job
-	 */
-	public Map<String, T2Reference> getData() {
-		return this.dataMap;
-	}
-
-	/**
-	 * Create a new Job object with the specified owning process (colon
-	 * separated 'list' of process identifiers), index array and data map
-	 * 
-	 * @param owner
-	 * @param index
-	 * @param data
-	 */
-	public Job(String owner, int[] index, Map<String, T2Reference> data,
-			InvocationContext context) {
-		super(owner, index, context);
-		this.dataMap = data;
-
-	}
-
-	/**
-	 * Show the owner, index array and data map in textual form for debugging
-	 * and any other purpose. Jobs appear in the form :
-	 * 
-	 * <pre>
-	 * Job(Process1)[2,0]{Input2=dataID4,Input1=dataID3}
-	 * </pre>
-	 */
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Job(" + owner + ")[");
-		for (int i = 0; i < index.length; i++) {
-			if (i > 0) {
-				sb.append(",");
-			}
-			sb.append(index[i] + "");
-		}
-		sb.append("]{");
-		boolean first = true;
-		for (String key : dataMap.keySet()) {
-			if (!first) {
-				sb.append(",");
-			}
-			sb.append(key + "=" + dataMap.get(key));
-			first = false;
-		}
-		sb.append("}");
-		return sb.toString();
-	}
-
-	@Override
-	public Job popOwningProcess() throws ProcessIdentifierException {
-		return new Job(popOwner(), index, dataMap, context);
-	}
-
-	@Override
-	public Job pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new Job(pushOwner(localProcessName), index, dataMap, context);
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/MonitorableAsynchronousActivity.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/MonitorableAsynchronousActivity.java
deleted file mode 100644
index 3f1afec..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/MonitorableAsynchronousActivity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.reference.T2Reference;
-
-/**
- * An extension of AsynchronousActivity with the additional stipulation that
- * implementing classes must return a set of monitorable properties for the
- * activity invocation instance when invoked. This allows for deep state
- * management, where the monitor state extends out from the workflow engine into
- * the remote resources themselves and is dependant on the resource proxied by
- * the activity implementation providing this information.
- * 
- * @author Tom Oinn
- * 
- */
-public interface MonitorableAsynchronousActivity<ConfigType> extends
-		AsynchronousActivity<ConfigType> {
-
-	/**
-	 * This has the same invocation semantics as
-	 * AsynchronousActivity.executeAsynch and all implementations should also
-	 * implement that method, with the difference that this one returns
-	 * immediately with a set of monitorable properties which represent
-	 * monitorable or steerable state within the invocation itself.
-	 * 
-	 * @param data
-	 * @param callback
-	 * @return a set of monitorable properties representing internal state of
-	 *         the invoked resource
-	 */
-	public Set<MonitorableProperty<?>> executeAsynchWithMonitoring(
-			Map<String, T2Reference> data,
-			AsynchronousActivityCallback callback);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/NestedDataflow.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/NestedDataflow.java
deleted file mode 100644
index 1c0016b..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/NestedDataflow.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-/**
- * Nested workflows/dataflows can come in many shapes and sizes - in-line, url
- * etc. However, they are all {@link Dataflow}s. Implement this in any
- * implementation of a Nested dataflow
- * 
- * @author Ian Dunlop
- * 
- */
-public interface NestedDataflow {
-
-	public Dataflow getNestedDataflow();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityInputPortDefinitionBean.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityInputPortDefinitionBean.java
deleted file mode 100644
index 7d6c17c..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityInputPortDefinitionBean.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity.config;
-
-import java.util.Collections;
-import java.util.List;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-
-/**
- * A bean that describes properties of an Input port.
- * 
- * @author Stuart Owen
- * @author Stian Soiland-Reyes
- * 
- */
-public class ActivityInputPortDefinitionBean extends ActivityPortDefinitionBean {
-
-	private List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes;
-
-	private Class<?> translatedElementType;
-
-	private boolean allowsLiteralValues;
-
-	public List<Class<? extends ExternalReferenceSPI>> getHandledReferenceSchemes() {
-		if (handledReferenceSchemes == null) {
-			return Collections
-					.<Class<? extends ExternalReferenceSPI>> emptyList();
-		}
-		return handledReferenceSchemes;
-	}
-
-	public void setHandledReferenceSchemes(
-			List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes) {
-		this.handledReferenceSchemes = handledReferenceSchemes;
-	}
-
-	public Class<?> getTranslatedElementType() {
-		return translatedElementType;
-	}
-
-	public void setTranslatedElementType(Class<?> translatedElementType) {
-		this.translatedElementType = translatedElementType;
-	}
-
-	public boolean getAllowsLiteralValues() {
-		return allowsLiteralValues;
-	}
-
-	public void setAllowsLiteralValues(boolean allowsLiteralValues) {
-		this.allowsLiteralValues = allowsLiteralValues;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityOutputPortDefinitionBean.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityOutputPortDefinitionBean.java
deleted file mode 100644
index d1c0e24..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityOutputPortDefinitionBean.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity.config;
-
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-
-/**
- * A bean that describes properties of an Output port.
- * 
- * @author Stuart Owen
- *
- */
-public class ActivityOutputPortDefinitionBean extends ActivityPortDefinitionBean {
-	private int granularDepth;
-
-	/**
-	 * @return the granular depth of the port
-	 * @see OutputPort#getGranularDepth()
-	 */
-	public int getGranularDepth() {
-		return granularDepth;
-	}
-
-	/**
-	 * @param granularDepth the granular depth of the port
-	 */
-	public void setGranularDepth(int granularDepth) {
-		this.granularDepth = granularDepth;
-	}	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityPortDefinitionBean.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityPortDefinitionBean.java
deleted file mode 100644
index 3fd3c7e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityPortDefinitionBean.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity.config;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A generic bean that describes the shared properties of input and output ports.
- * 
- * @author Stuart Owen
- *
- */
-public abstract class ActivityPortDefinitionBean {
-	private String name;
-	private int depth;
-	private List<String> mimeTypes;
-	
-	/**
-	 * @return the port name
-	 */
-	public String getName() {
-		return name;
-	}
-	
-	/**
-	 * @param name the port name
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-	
-	/**
-	 * @return the depth of the port
-	 */
-	public int getDepth() {
-		return depth;
-	}
-	
-	/**
-	 * @param depth the depth of the port
-	 */
-	public void setDepth(int depth) {
-		this.depth = depth;
-	}
-	
-	/**
-	 * @return a list a MIME types that describe the port
-	 */
-	public List<String> getMimeTypes() {
-		if (mimeTypes == null) {
-			return Collections.emptyList();
-		}
-		return mimeTypes;
-	}
-	
-	/**
-	 * @param mimeTypes the list of MIME-types that describe the port
-	 */
-	public void setMimeTypes(List<String> mimeTypes) {
-		this.mimeTypes = mimeTypes;
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityPortsDefinitionBean.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityPortsDefinitionBean.java
deleted file mode 100644
index 704db5f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/ActivityPortsDefinitionBean.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity.config;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * <p>
- * Defines a configuration type that relates directly to an {@link Activity} and in particular defines details its
- * input and output ports.<br>
- * An Activity that has its ports implicitly defined may define a ConfigType that extends this class, but this is not enforced. 
- * </p>
- * 
- * @author Stuart Owen
- *
- */
-public class ActivityPortsDefinitionBean {
-
-	private List<ActivityInputPortDefinitionBean> inputs = new ArrayList<ActivityInputPortDefinitionBean>();
-	private List<ActivityOutputPortDefinitionBean> outputs = new ArrayList<ActivityOutputPortDefinitionBean>();
-	
-	
-	/**
-	 * @return a list of {@link ActivityInputPortDefinitionBean} that describes each input port
-	 */
-	public List<ActivityInputPortDefinitionBean> getInputPortDefinitions() {
-		return inputs;
-	}
-
-	/**
-	 * @return a list of {@link ActivityOutputPortDefinitionBean} that describes each output port.
-	 */
-	public List<ActivityOutputPortDefinitionBean> getOutputPortDefinitions() {
-		return outputs;
-	}
-
-	/**
-	 * @param portDefinitions a list of {@link ActivityInputPortDefinitionBean} that describes each input port
-	 */
-	public void setInputPortDefinitions(
-			List<ActivityInputPortDefinitionBean> portDefinitions) {
-		inputs=portDefinitions;
-	}
-
-	/**
-	 * @param portDefinitions a list of {@link ActivityOutputPortDefinitionBean} that describes each output port
-	 */
-	public void setOutputPortDefinitions(
-			List<ActivityOutputPortDefinitionBean> portDefinitions) {
-		outputs=portDefinitions;
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/package.html
deleted file mode 100644
index fa104d7..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/config/package.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<body>
-A set of helper classes to aid in defining how Activities are configured.
-An Activity class is associated with a ConfigurationType, which is an arbitrary Java object defining
-how the Activity should be configured.<br>
-This package provides classes and interfaces that help in creating these ConfigurationTypes with details that are common
-across different Activities, but there use is in no way enforced.
-</body>
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/package.html
deleted file mode 100644
index 72a9076..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/package.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<body>
-Provides definitions for a single Activity to be contained within a
-Processor. Activity was previously called 'Service' but this was
-somewhat misleading as there wasn't always a service backing it. The
-Activity may be abstract, it may be synchronous or asynchronous in which
-case it uses a callback mechanism. It doesn't carry around annotation
-itself instead using an activity annotation container to handle this
-(this avoids third parties having to manage annotation containment
-themselves).
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/AbstractDispatchLayer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/AbstractDispatchLayer.java
deleted file mode 100644
index 0d66d67..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/AbstractDispatchLayer.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-import java.util.Timer;
-
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobQueueEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-/**
- * Convenience abstract implementation of DispatchLayer
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractDispatchLayer<ConfigurationType> implements
-		DispatchLayer<ConfigurationType> {
-
-	protected static Timer cleanupTimer = new Timer("Dispatch stack state cleanup", true);
-	
-	protected static final int CLEANUP_DELAY_MS = 1000;
-	
-	public void setDispatchStack(DispatchStack parentStack) {
-		this.dispatchStack = parentStack;
-	}
-
-	protected DispatchStack dispatchStack;
-
-	protected final DispatchLayer<?> getAbove() {
-		return this.dispatchStack.layerAbove(this);
-	}
-
-	protected final DispatchLayer<?> getBelow() {
-		return this.dispatchStack.layerBelow(this);
-	}
-
-	public void receiveError(DispatchErrorEvent errorEvent) {
-		DispatchLayer<?> above = dispatchStack.layerAbove(this);
-		if (above != null) {
-			above.receiveError(errorEvent);
-		}
-	}
-
-	public void receiveJob(DispatchJobEvent jobEvent) {
-		DispatchLayer<?> below = dispatchStack.layerBelow(this);
-		if (below != null) {
-			below.receiveJob(jobEvent);
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	public void receiveJobQueue(DispatchJobQueueEvent jobQueueEvent) {
-		DispatchLayer below = dispatchStack.layerBelow(this);
-		if (below != null) {
-			below.receiveJobQueue(jobQueueEvent);
-		}
-
-	}
-
-	public void receiveResult(DispatchResultEvent resultEvent) {
-		DispatchLayer<?> above = dispatchStack.layerAbove(this);
-		if (above != null) {
-			above.receiveResult(resultEvent);
-		}
-	}
-
-	public void receiveResultCompletion(DispatchCompletionEvent completionEvent) {
-		DispatchLayer<?> above = dispatchStack.layerAbove(this);
-		if (above != null) {
-			above.receiveResultCompletion(completionEvent);
-		}
-
-	}
-
-	public void finishedWith(String owningProcess) {
-		// Do nothing by default
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/AbstractErrorHandlerLayer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/AbstractErrorHandlerLayer.java
deleted file mode 100644
index 17043fc..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/AbstractErrorHandlerLayer.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-/**
- * Superclass of error handling dispatch layers (for example retry and
- * failover). Provides generic functionality required by this class of layers.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public abstract class AbstractErrorHandlerLayer<ConfigurationType> extends
-		AbstractDispatchLayer<ConfigurationType> {
-
-	private static Logger logger = Logger
-			.getLogger(AbstractErrorHandlerLayer.class);
-
-	/**
-	 * Compare two arrays of ints, return true if they are the same length and
-	 * if at every index the two integer values are equal
-	 * 
-	 * @param a
-	 * @param b
-	 * @return
-	 */
-	private static boolean identicalIndex(int[] a, int[] b) {
-		if (a.length != b.length) {
-			return false;
-		}
-		for (int i = 0; i < a.length; i++) {
-			if (a[i] != b[i]) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Map of process name -> list of state models. Note that all access to this
-	 * map must be synchronized on the stateMap, and access to the lists inside
-	 * it must be synchronized on the list.
-	 * 
-	 * @see #addJobToStateList(DispatchJobEvent)
-	 * @see #removeJob(String, JobState)
-	 * @see #getJobsDefault(String)
-	 * @see #getJobsCopy(String)
-	 */
-	private Map<String, List<JobState>> stateMap = new HashMap<String, List<JobState>>();
-
-	protected AbstractErrorHandlerLayer() {
-		super();
-	}
-
-	/**
-	 * Clear cached state for the specified process when notified by the
-	 * dispatch stack
-	 */
-	@Override
-	public void finishedWith(String owningProcess) {
-		synchronized (stateMap) {
-			stateMap.remove(owningProcess);
-		}
-	}
-
-	/**
-	 * If an error occurs we can either handle the error or send it to the layer
-	 * above for further processing.
-	 */
-	@Override
-	public void receiveError(DispatchErrorEvent errorEvent) {
-		String owningProcess = errorEvent.getOwningProcess();
-		List<JobState> activeJobs = getJobsCopy(owningProcess);
-
-		for (JobState rs : activeJobs) {
-			if (identicalIndex(rs.jobEvent.getIndex(), errorEvent.getIndex())) {
-				boolean handled = rs.handleError();
-				if (!handled) {
-					removeJob(owningProcess, rs);
-					getAbove().receiveError(errorEvent);
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Receive a job from the layer above, store it for later retries and pass
-	 * it down to the next layer
-	 */
-	@Override
-	public void receiveJob(DispatchJobEvent jobEvent) {
-		addJobToStateList(jobEvent);
-		getBelow().receiveJob(jobEvent);
-	}
-
-	/**
-	 * If we see a result with an index matching one of those in the current
-	 * retry state we can safely forget that state object
-	 */
-	@Override
-	public void receiveResult(DispatchResultEvent j) {
-		forget(j.getOwningProcess(), j.getIndex());
-		getAbove().receiveResult(j);
-	}
-
-	/**
-	 * If we see a completion event with an index matching one of those in the
-	 * current retry state we can safely forget that state object
-	 */
-	@Override
-	public void receiveResultCompletion(DispatchCompletionEvent c) {
-		forget(c.getOwningProcess(), c.getIndex());
-		getAbove().receiveResultCompletion(c);
-	}
-
-	/**
-	 * Remove the specified pending retry job from the cache
-	 * 
-	 * @param owningProcess
-	 *            Owning process identifier as returned by
-	 *            {@link DispatchJobEvent#getOwningProcess()}
-	 * @param index
-	 *            Index of the job as returned by
-	 *            {@link DispatchJobEvent#getIndex()}
-	 */
-	protected void forget(String owningProcess, int[] index) {
-		for (JobState jobState : getJobsCopy(owningProcess)) {
-			if (identicalIndex(jobState.jobEvent.getIndex(), index)) {
-				removeJob(owningProcess, jobState);
-				return;
-			}
-		}
-		// It could be due to pipelining activities like BioMart 
-		logger.debug("Could not forget " + owningProcess + " " + Arrays.toString(index));
-	}
-
-	protected void addJobToStateList(DispatchJobEvent jobEvent) {
-		List<JobState> stateList = null;
-		stateList = getJobsDefault(jobEvent.getOwningProcess());
-		synchronized (stateList) {
-			stateList.add(getStateObject(jobEvent));
-		}
-	}
-
-	/**
-	 * Get a copy of the list of {@link JobState}s for the owning process, or an
-	 * empty list if the owning process is unknown or have been
-	 * {@link #forget(String, int[]) forgotten}.
-	 * <p>
-	 * This list can safely be iterated over without synchronizing. If you need
-	 * to modify the list, either synchronize over the returned list from
-	 * {@link #getJobsDefault(String)} or use
-	 * {@link #removeJob(String, JobState)}.
-	 * 
-	 * @param owningProcess
-	 *            Owning process identifier as returned by
-	 *            {@link DispatchJobEvent#getOwningProcess()}
-	 * @return A copy of the list of known JobState {@link JobState}s for the
-	 *         owning process,
-	 */
-	protected List<JobState> getJobsCopy(String owningProcess) {
-		List<JobState> activeJobs;
-		synchronized (stateMap) {
-			activeJobs = stateMap.get(owningProcess);
-		}
-		if (activeJobs == null) {
-			logger.error("Could not find any active jobs for " + owningProcess);
-			return Collections.emptyList();
-		}
-		// Take a copy of the list so we don't modify it while iterating over it
-		List<JobState> activeJobsCopy;
-		synchronized (activeJobs) {
-			activeJobsCopy = new ArrayList<JobState>(activeJobs);
-		}
-		return activeJobsCopy;
-	}
-
-	/**
-	 * Get the list of {@link JobState}s for the owning process, creating and
-	 * adding it to the state map if necessary.
-	 * <p>
-	 * Note that all access to the returned list must be synchronized on the
-	 * list to avoid threading issues.
-	 * <p>
-	 * If you are going to iterate over the list, use
-	 * {@link #getJobsCopy(String)} instead.
-	 * 
-	 * @see #getJobsCopy(String)
-	 * @param owningProcess
-	 *            Owning process identifier as returned by
-	 *            {@link DispatchJobEvent#getOwningProcess()}
-	 * 
-	 * @return List of {@link JobState}s for the owning process
-	 */
-	protected List<JobState> getJobsDefault(String owningProcess) {
-		List<JobState> stateList;
-		synchronized (stateMap) {
-			stateList = stateMap.get(owningProcess);
-			if (stateList == null) {
-				stateList = new ArrayList<JobState>();
-				stateMap.put(owningProcess, stateList);
-			}
-		}
-		return stateList;
-	}
-
-	/**
-	 * Generate an appropriate state object from the specified job event. The
-	 * state object is a concrete subclass of JobState.
-	 * 
-	 * @return
-	 */
-	protected abstract JobState getStateObject(DispatchJobEvent jobEvent);
-
-	protected void removeJob(String owningProcess, JobState jobState) {
-		List<JobState> activeJobs;
-		synchronized (stateMap) {
-			activeJobs = stateMap.get(owningProcess);
-		}
-		if (activeJobs == null) {
-			logger.error("Could not find active jobs for " + owningProcess);
-			return;
-		}
-		synchronized (activeJobs) {
-			activeJobs.remove(jobState);
-		}
-	}
-
-	/**
-	 * Abstract superclass of all state models for pending failure handlers.
-	 * This object is responsible for handling failure messages if they occur
-	 * and represents the current state of the failure handling algorithm on a
-	 * per job basis.
-	 * 
-	 * @author Tom Oinn
-	 * 
-	 */
-	protected abstract class JobState {
-		protected DispatchJobEvent jobEvent;
-
-		protected JobState(DispatchJobEvent jobEvent) {
-			this.jobEvent = jobEvent;
-		}
-
-		/**
-		 * Called when the layer below pushes an error up and where the error
-		 * index and owning process matches that of this state object. The
-		 * implementation must deal with the error, either by handling it and
-		 * pushing a new job down the stack or by rejecting it. If this method
-		 * returns false the error has not been dealt with and MUST be pushed up
-		 * the stack by the active dispatch layer. In this case the layer will
-		 * be a subclass of AbstractErrorHandlerLayer and the logic to do this
-		 * is already included in the receive methods for results, errors and
-		 * completion events.
-		 * 
-		 * @return true if the error was handled.
-		 */
-		public abstract boolean handleError();
-
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DispatchLayer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DispatchLayer.java
deleted file mode 100644
index 292ca93..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DispatchLayer.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-import net.sf.taverna.t2.workflowmodel.Configurable;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobQueueEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-/**
- * Layers within the dispatch stack define a control flow to handle dispatch of
- * jobs from a queue (generated by the iteration system) to appropriate
- * activities.
- * <p>
- * A dispatch layer can receive a reference to the Queue and a set of
- * Activities, or a single Job and a set of Activities from the layer above it
- * (or from the DispatchStackImpl object itself if this is the top layer). It
- * can receive errors, results and partial or total completion events from the
- * layer immediately below it.
- * <p>
- * To assist in graphical representation of the dispatch configuration each
- * layer declares for each class of message whether it intercepts and alters,
- * intercepts and observes or ignores (forwards) the message onto the next layer
- * (either up or down depending on the message) and whether the layer is capable
- * of instigating the creation of each class of message.
- * 
- * @author Tom Oinn
- * 
- */
-public interface DispatchLayer<ConfigurationType> extends Configurable<ConfigurationType> {
-
-	/**
-	 * Receive a pointer to the job queue along with a set of activities, this
-	 * is received from the layer above in the dispatch stack or from the
-	 * DispatchStackImpl object itself if this is the top layer
-	 */
-	public void receiveJobQueue(DispatchJobQueueEvent queueEvent);
-
-	/**
-	 * Receive a single job and associated set of activities from the layer
-	 * above
-	 */
-	public void receiveJob(DispatchJobEvent jobEvent);
-
-	/**
-	 * Receive a single error reference from the layer below
-	 */
-	public void receiveError(DispatchErrorEvent errorEvent);
-
-	/**
-	 * Receive a result from the layer below
-	 */
-	public void receiveResult(DispatchResultEvent resultEvent);
-
-	/**
-	 * Receive a (possibly partial) completion event from the layer below. This
-	 * is only going to be used when the activities invocation is capable of
-	 * streaming partial data back up through the dispatch stack before the
-	 * activities has completed. Not all dispatch stack layers are compatible
-	 * with this mode of operation, for example retry and recursion do not play
-	 * well here!
-	 * 
-	 */
-	public void receiveResultCompletion(DispatchCompletionEvent completionEvent);
-
-	/**
-	 * Called when there will be no more events with the specified process
-	 * identifier, can be used to purge cached state from layers within the
-	 * stack
-	 */
-	public void finishedWith(String owningProcess);
-
-	/**
-	 * Set the parent dispatch stack of this layer, this is called when a layer
-	 * is added to the dispatch stack and can be safely ignored by end users of
-	 * this API
-	 */
-	public void setDispatchStack(DispatchStack stack);
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DispatchStack.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DispatchStack.java
deleted file mode 100644
index a764907..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DispatchStack.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-import static net.sf.taverna.t2.annotation.HierarchyRole.CHILD;
-import static net.sf.taverna.t2.annotation.HierarchyRole.PARENT;
-
-
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.HierarchyTraversal;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * The dispatch stack is responsible for consuming a queue of jobs from the
- * iteration strategy and dispatching those jobs through a stack based control
- * flow to an appropriate invocation target. Conceptually the queue and
- * description of activities enter the stack at the top, travel down to an
- * invocation layer at the bottom from which results, errors and completion
- * events rise back up to the top layer. Dispatch stack layers are stored as an
- * ordered list with index 0 being the top of the stack.
- * 
- * @author Tom Oinn
- * 
- */
-public interface DispatchStack extends Annotated<DispatchStack> {
-
-	/**
-	 * The DispatchStack consists of an ordered list of DispatchLayer instances
-	 * where the DispatchLayer at index zero is at the bottom of the stack and
-	 * is almost always an invocation layer of some kind (in any working
-	 * dispatch stack configuration)
-	 * 
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { CHILD })
-	public List<DispatchLayer<?>> getLayers();
-
-	/**
-	 * The dispatch stack is contained within a processor, this can be null if
-	 * the stack is being used out of this context but layers may be relying on
-	 * this link to get information about the processor input ports and their
-	 * annotations for various reasons.
-	 */
-	@HierarchyTraversal(hierarchies = { "workflowStructure" }, role = { PARENT })
-	public Processor getProcessor();
-
-	/**
-	 * Return the layer above (lower index!) the specified layer, or a reference
-	 * to the internal top layer dispatch layer if there is no layer above the
-	 * specified one. Remember - input data and activities go down, results,
-	 * errors and completion events bubble back up the dispatch stack.
-	 * <p>
-	 * The top layer within the dispatch stack is always invisible and is held
-	 * within the DispatchStackImpl object itself, being used to route data out
-	 * of the entire stack
-	 * 
-	 * @param layer
-	 * @return
-	 */
-	public DispatchLayer<?> layerAbove(DispatchLayer<?> layer);
-
-	/**
-	 * Return the layer below (higher index) the specified layer, or null if
-	 * there is no layer below this one.
-	 * 
-	 * @param layer
-	 * @return
-	 */
-	public DispatchLayer<?> layerBelow(DispatchLayer<?> layer);
-
-	/**
-	 * The dispatch stack acts as an aggregator for monitorable properties
-	 * exposed by the dispatch layers. This is distinct from layers which are
-	 * capable of rewriting the process idenfitier of tokens - these require
-	 * their own nodes in the monitor in addition to any contributed properties.
-	 * 
-	 * @param prop
-	 * @param processID
-	 */
-	public void receiveMonitorableProperty(MonitorableProperty<?> prop,
-			String processID);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/NotifiableLayer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/NotifiableLayer.java
deleted file mode 100644
index 65423dc..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/NotifiableLayer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-/**
- * If a layer requires notification of the arrival of new items to the event
- * queues within the dispatcher it should implement this interface.
- * 
- * @author Tom Oinn
- * 
- */
-public interface NotifiableLayer {
-
-	/**
-	 * Called when a new Job or Completion is added to a queue within the
-	 * dispatch stack
-	 * 
-	 * @param owningProcess
-	 */
-	public void eventAdded(String owningProcess);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/PropertyContributingDispatchLayer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/PropertyContributingDispatchLayer.java
deleted file mode 100644
index 06e73a9..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/PropertyContributingDispatchLayer.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-/**
- * Used by dispatch layers which can contribute property information to their
- * parent processor instance. This is distinct from dispatch layers which modify
- * the process identifier and therefore create their own nodes in the monitor
- * tree, although there's no reason a layer can't perform both functions. For
- * example, the fault tolerance layers create their own state subtrees for each
- * failure recovery but could also contribute aggregate fault information to the
- * parent processor's property set.
- * 
- * @author Tom Oinn
- * 
- * @param <ConfigType>
- *            configuration type for the dispatch layer
- */
-public interface PropertyContributingDispatchLayer<ConfigType> extends
-		DispatchLayer<ConfigType> {
-
-	/**
-	 * Inject properties for the specified owning process into the parent
-	 * dispatch stack. At some point prior to this call being made the
-	 * setDispatchStack will have been called, implementations of this method
-	 * need to use this DispatchStack reference to push properties in with the
-	 * specified key.
-	 * <p>
-	 * Threading - this thread must not fork, do all the work in this method in
-	 * the thread you're given by the caller. This is because implementations
-	 * may assume that they can collect properties from the dispatch stack
-	 * implementation (which will expose them through a private access method to
-	 * prevent arbitrary access to layer properties) once this call has
-	 * returned.
-	 * <p>
-	 * There is no guarantee that the layer will have seen an event with the
-	 * specified process, and in fact it's unlikely to in the general case as
-	 * any layers above it are free to modify the process identifier of tokens
-	 * as they go. Remember that this method is for aggregating properties into
-	 * the top level (processor) view so you may need to implement the property
-	 * getters such that they check prefixes of identifiers rather than
-	 * equality.
-	 * 
-	 * @param owningProcess
-	 */
-	void injectPropertiesFor(String owningProcess);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerErrorReaction.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerErrorReaction.java
deleted file mode 100644
index d6774a2..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerErrorReaction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Describes how a dispatch layer reacts to an error message
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-@ReactionTo(messageType = DispatchMessageType.ERROR)
-public @interface DispatchLayerErrorReaction {
-
-	public DispatchLayerStateEffect[] stateEffects();
-
-	public DispatchMessageType[] emits();
-
-	public boolean relaysUnmodified();
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerJobQueueReaction.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerJobQueueReaction.java
deleted file mode 100644
index b4b4fab..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerJobQueueReaction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Describes how a dispatch layer reacts to a Job Queue message
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-@ReactionTo(messageType = DispatchMessageType.JOB_QUEUE)
-public @interface DispatchLayerJobQueueReaction {
-
-	public DispatchLayerStateEffect[] stateEffects();
-
-	public DispatchMessageType[] emits();
-
-	public boolean relaysUnmodified();
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerJobReaction.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerJobReaction.java
deleted file mode 100644
index 5023aef..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerJobReaction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Describes how a dispatch layer reacts to a Job message
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-@ReactionTo(messageType = DispatchMessageType.JOB)
-public @interface DispatchLayerJobReaction {
-
-	public DispatchLayerStateEffect[] stateEffects();
-
-	public DispatchMessageType[] emits();
-	
-	public boolean relaysUnmodified();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerResultCompletionReaction.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerResultCompletionReaction.java
deleted file mode 100644
index f000d3a..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerResultCompletionReaction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Describes how a dispatch layer reacts to a result completion message
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-@ReactionTo(messageType = DispatchMessageType.RESULT_COMPLETION)
-public @interface DispatchLayerResultCompletionReaction {
-
-	public DispatchLayerStateEffect[] stateEffects();
-
-	public DispatchMessageType[] emits();
-
-	public boolean relaysUnmodified();
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerResultReaction.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerResultReaction.java
deleted file mode 100644
index d713a42..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerResultReaction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Describes how a dispatch layer responds to a result message
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-@ReactionTo(messageType = DispatchMessageType.RESULT)
-public @interface DispatchLayerResultReaction {
-
-	public DispatchLayerStateEffect[] stateEffects();
-
-	public DispatchMessageType[] emits();
-
-	public boolean relaysUnmodified();
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerStateEffect.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerStateEffect.java
deleted file mode 100644
index 59e8670..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchLayerStateEffect.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-/**
- * Describes the effect of a message on the state of a dispatch layer, used by
- * DispatchLayerReaction. If no message causes any of these actions the layer
- * can be described as state free.
- * 
- * @author Tom Oinn
- * 
- */
-public enum DispatchLayerStateEffect {
-
-	/**
-	 * The message causes a state object within the dispatch layer to be created
-	 * keyed on the process identifier and index
-	 */
-	CREATE_LOCAL_STATE,
-
-	/**
-	 * The message causes the removal of a state object within the dispatch
-	 * layer, the layer to be removed is keyed on process identifier and index
-	 * of the message
-	 */
-	REMOVE_LOCAL_STATE,
-
-	/**
-	 * The message causes the modification of a previously stored state object
-	 * within the dispatch layer, the state object modified is keyed on process
-	 * identifier and index of the message.
-	 */
-	UPDATE_LOCAL_STATE,
-
-	/**
-	 * The message causes a state object within the dispatch layer to be created
-	 * keyed only on the process identifier and not on the index of the message.
-	 */
-	CREATE_PROCESS_STATE,
-
-	/**
-	 * The message causes a state object to be removed from the dispatch layer,
-	 * the state object is identified only by the process identifier
-	 */
-	REMOVE_PROCESS_STATE,
-
-	/**
-	 * The message causes a state object to be modified, the state object is
-	 * identified by process identifier only
-	 */
-	UPDATE_PROCESS_STATE,
-
-	/**
-	 * The message causes global level state to be modified within the dispatch
-	 * layer
-	 */
-	UPDATE_GLOBAL_STATE,
-
-	/**
-	 * The message has no effect on state. This value is used when specifying
-	 * that a message might cause effect or it might not, the interpretation of
-	 * the various reaction annotations is that exactly one of the state effects
-	 * will take place, so if the state side effect array isn't empty you have
-	 * to insert this one to specify that it's possible that no state change
-	 * will occur
-	 */
-	NO_EFFECT;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchMessageType.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchMessageType.java
deleted file mode 100644
index 866a83b..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/DispatchMessageType.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-/**
- * Enumeration of the possible message types passed between layers of the
- * dispatch stack.
- * 
- * @author Tom Oinn
- * 
- */
-public enum DispatchMessageType {
-
-	/**
-	 * A reference to a queue of Job objects waiting to be used as input along
-	 * with a list of activities to process them.
-	 */
-	JOB_QUEUE,
-
-	/**
-	 * A Job object and list of activities to be used to process the data in the
-	 * Job. The Job will have been previously extracted from the JobQueue
-	 */
-	JOB,
-
-	/**
-	 * A Job object containing the result of a single activity invocation.
-	 */
-	RESULT,
-
-	/**
-	 * A (possibly partial) completion event from the layer below. This is only
-	 * going to be used when the activity invocation is capable of streaming
-	 * partial data back up through the dispatch stack before the activity has
-	 * completed. Not all dispatch stack layers are compatible with this mode of
-	 * operation, for example retry and recursion do not play well here!
-	 */
-	RESULT_COMPLETION,
-
-	/**
-	 * A failure message sent by the layer below to denote some kind of failure
-	 * (surprisingly)
-	 */
-	ERROR;
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/ReactionTo.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/ReactionTo.java
deleted file mode 100644
index 73f10d3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/ReactionTo.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Describes the type of message to which the various DispatchLayerFooReaction
- * classes are referring
- * 
- * @author Tom Oinn
- * 
- */
-@Documented
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ReactionTo {
-
-	public DispatchMessageType messageType();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/SupportsStreamedResult.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/SupportsStreamedResult.java
deleted file mode 100644
index aae32e6..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/SupportsStreamedResult.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.description;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Declares that a dispatch layer can handle streamed result data correctly, if
- * this annotation is attached to a DispatchLayer implementation that
- * implementation must be able to correctly handle the result completion message
- * type. By default dispatch layers are assumed to not handle this message type.
- * 
- * @author Tom Oinn
- * 
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Documented
-public @interface SupportsStreamedResult {
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/package.html
deleted file mode 100644
index f0629bb..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/description/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-Annotations and enumerations used to describe dispatch layers, specifically the types of messages they can consume and their reactions to those messages.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/AbstractDispatchEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/AbstractDispatchEvent.java
deleted file mode 100644
index 39327c5..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/AbstractDispatchEvent.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-import net.sf.taverna.t2.invocation.Event;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType;
-
-/**
- * Superclass of events within the dispatch stack
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractDispatchEvent<EventType extends AbstractDispatchEvent<EventType>>
-		extends Event<EventType> {
-
-	protected AbstractDispatchEvent(String owner, int[] index,
-			InvocationContext context) {
-		super(owner, index, context);
-	}
-
-	/**
-	 * Return the DispatchMessageType for this event object
-	 * 
-	 * @return instance of DispatchMessageType represented by this event
-	 */
-	public abstract DispatchMessageType getMessageType();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchCompletionEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchCompletionEvent.java
deleted file mode 100644
index 40cafda..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchCompletionEvent.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.ProcessIdentifierException;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType;
-
-/**
- * Dispatch event containing detailing a (potentially partial) completion of a
- * stream of streaming result events. Layers which do not support streaming by
- * definition can't cope with this event and the dispatch stack checker should
- * prevent them from ever seeing it.
- * 
- * @author Tom Oinn
- * 
- */
-public class DispatchCompletionEvent extends
-		AbstractDispatchEvent<DispatchCompletionEvent> {
-
-	/**
-	 * Construct a new dispatch result completion event
-	 * 
-	 * @param owner
-	 * @param index
-	 * @param context
-	 */
-	public DispatchCompletionEvent(String owner, int[] index,
-			InvocationContext context) {
-		super(owner, index, context);
-	}
-
-	@Override
-	public DispatchCompletionEvent popOwningProcess()
-			throws ProcessIdentifierException {
-		return new DispatchCompletionEvent(popOwner(), index, context);
-	}
-
-	@Override
-	public DispatchCompletionEvent pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new DispatchCompletionEvent(pushOwner(localProcessName), index,
-				context);
-	}
-
-	/**
-	 * DispatchMessageType.RESULT_COMPLETION
-	 */
-	@Override
-	public DispatchMessageType getMessageType() {
-		return DispatchMessageType.RESULT_COMPLETION;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchErrorEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchErrorEvent.java
deleted file mode 100644
index 76f967f..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchErrorEvent.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.ProcessIdentifierException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType;
-
-/**
- * Message within the dispatch stack representing a single error report. This
- * may then be handled by upstream layers to retry jobs etc. If it reaches the
- * top of the dispatch stack the behaviour is configurable but by default it
- * will abort that workflow instance, being treated as a catastrophic
- * unhandleable problem.
- * 
- * @author Tom Oinn
- * 
- */
-public class DispatchErrorEvent extends
-		AbstractDispatchEvent<DispatchErrorEvent> {
-
-	private Throwable cause;
-	private String message;
-	private DispatchErrorType failureType;
-	private Activity<?> failedActivity;
-
-	/**
-	 * Create a new error event
-	 * 
-	 * @param owningProcess
-	 * @param index
-	 * @param context
-	 * @param errorMessage
-	 * @param t
-	 */
-	public DispatchErrorEvent(String owningProcess, int[] index,
-			InvocationContext context, String errorMessage, Throwable t,
-			DispatchErrorType failureType, Activity<?> failedActivity) {
-		super(owningProcess, index, context);
-		this.message = errorMessage;
-		this.cause = t;
-		this.failureType = failureType;
-		this.failedActivity = failedActivity;
-	}
-
-	/**
-	 * Return the type of failure, this is used by upstream dispatch layers to
-	 * determine whether they can reasonably handle the error message
-	 */
-	public DispatchErrorType getFailureType() {
-		return this.failureType;
-	}
-
-	/**
-	 * Return the Activity instance which failed to produce this error message
-	 */
-	public Activity<?> getFailedActivity() {
-		return this.failedActivity;
-	}
-
-	/**
-	 * Return the throwable behind this error, or null if there was no exception
-	 * raised to create it.
-	 * 
-	 * @return
-	 */
-	public Throwable getCause() {
-		return this.cause;
-	}
-
-	/**
-	 * Return the textual message representing this error
-	 * 
-	 * @return
-	 */
-	public String getMessage() {
-		return this.message;
-	}
-
-	@Override
-	public DispatchErrorEvent popOwningProcess()
-			throws ProcessIdentifierException {
-		return new DispatchErrorEvent(popOwner(), index, context, message,
-				cause, failureType, failedActivity);
-	}
-
-	@Override
-	public DispatchErrorEvent pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new DispatchErrorEvent(pushOwner(localProcessName), index,
-				context, message, cause, failureType, failedActivity);
-	}
-
-	/**
-	 * DispatchMessageType.ERROR
-	 */
-	@Override
-	public DispatchMessageType getMessageType() {
-		return DispatchMessageType.ERROR;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchErrorType.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchErrorType.java
deleted file mode 100644
index 009ce43..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchErrorType.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-/**
- * A simple enumeration of possible failure classes, used to determine whether
- * fault handling dispatch layers should attempt to handle a given failure
- * message.
- * 
- * @author Tom Oinn
- * 
- */
-public enum DispatchErrorType {
-
-	/**
-	 * Indicates that the failure to invoke the activity was due to invalid
-	 * input data, in this case there is no point in trying to invoke the
-	 * activity again with the same data as it will always fail. Fault handling
-	 * layers such as retry should pass this error type through directly; layers
-	 * such as failover handlers should handle it as the input data may be
-	 * applicable to other activities within the processor.
-	 */
-	DATA,
-
-	/**
-	 * Indicates that the failure was related to the invocation of the resource
-	 * rather than the input data, and that an identical invocation at a later
-	 * time may succeed.
-	 */
-	INVOCATION,
-
-	/**
-	 * Indicates that the failure was due to missing or incorrect authentication
-	 * credentials and that retrying the activity invocation without modifying
-	 * the credential set is pointless.
-	 */
-	AUTHENTICATION;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchJobEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchJobEvent.java
deleted file mode 100644
index 7b0203e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchJobEvent.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.ProcessIdentifierException;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType;
-
-/**
- * An event within the dispatch stack containing a single job's worth of data
- * along with an ordered list of Activity instances.
- * 
- * @author Tom Oinn
- * 
- */
-public class DispatchJobEvent extends AbstractDispatchEvent<DispatchJobEvent> {
-
-	private Map<String, T2Reference> dataMap;
-
-	private List<? extends Activity<?>> activities;
-
-	/**
-	 * Create a new job event, specifying a complete set of input data and a
-	 * list of activities which could potentially consume this data
-	 * 
-	 * @param owningProcess
-	 * @param index
-	 * @param context
-	 * @param data
-	 * @param activities
-	 */
-	public DispatchJobEvent(String owningProcess, int[] index,
-			InvocationContext context, Map<String, T2Reference> data,
-			List<? extends Activity<?>> activities) {
-		super(owningProcess, index, context);
-		this.dataMap = data;
-		this.activities = activities;
-	}
-
-	/**
-	 * The actual data carried by this dispatch job event object is in the form
-	 * of a map, where the keys of the map are Strings identifying the named
-	 * input and the values are Strings containing valid data identifiers within
-	 * the context of a visible DataManager object (see CloudOne specification
-	 * for further information on the DataManager system)
-	 * 
-	 * @return Map of name to data reference for this Job
-	 */
-	public Map<String, T2Reference> getData() {
-		return this.dataMap;
-	}
-
-	/**
-	 * Returns a list of activity instances which can be applied to the data
-	 * contained by this job event.
-	 * 
-	 * @return ordered list of Activity instances
-	 */
-	public List<? extends Activity<?>> getActivities() {
-		return this.activities;
-	}
-
-	@Override
-	public DispatchJobEvent popOwningProcess()
-			throws ProcessIdentifierException {
-		return new DispatchJobEvent(popOwner(), index, context, dataMap, activities);
-	}
-
-	@Override
-	public DispatchJobEvent pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new DispatchJobEvent(pushOwner(localProcessName), index, context, dataMap, activities);
-	}
-
-	/**
-	 * DispatchMessageType.JOB
-	 */
-	@Override
-	public DispatchMessageType getMessageType() {
-		return DispatchMessageType.JOB;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchJobQueueEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchJobQueueEvent.java
deleted file mode 100644
index 5caec06..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchJobQueueEvent.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.invocation.ProcessIdentifierException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType;
-
-/**
- * A message within the dispatch stack containing a single reference to the job
- * queue from the iteration system along with an ordered list of Activity
- * instances.
- * 
- * @author Tom Oinn
- * 
- */
-public class DispatchJobQueueEvent extends
-		AbstractDispatchEvent<DispatchJobQueueEvent> {
-
-	private BlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>> queue;
-	private List<? extends Activity<?>> activities;
-
-	/**
-	 * Create a new job queue event, specifying the queue of Completion and Job
-	 * objects and the list of activities which will be used to process the
-	 * corresponding dispatch events
-	 * 
-	 * @param owner
-	 * @param context
-	 * @param queue
-	 * @param activities
-	 */
-	public DispatchJobQueueEvent(String owner, InvocationContext context,
-			BlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>> queue,
-			List<? extends Activity<?>> activities) {
-		super(owner, new int[] {}, context);
-		this.queue = queue;
-		this.activities = activities;
-	}
-
-	public BlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>> getQueue() {
-		return this.queue;
-	}
-
-	public List<? extends Activity<?>> getActivities() {
-		return this.activities;
-	}
-
-	@Override
-	public DispatchJobQueueEvent popOwningProcess()
-			throws ProcessIdentifierException {
-		return new DispatchJobQueueEvent(popOwner(), context, queue, activities);
-	}
-
-	@Override
-	public DispatchJobQueueEvent pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new DispatchJobQueueEvent(pushOwner(localProcessName), context,
-				queue, activities);
-	}
-
-	/**
-	 * DispatchMessageType.JOB_QUEUE
-	 */
-	@Override
-	public DispatchMessageType getMessageType() {
-		return DispatchMessageType.JOB_QUEUE;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchResultEvent.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchResultEvent.java
deleted file mode 100644
index a289318..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/events/DispatchResultEvent.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.events;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.ProcessIdentifierException;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType;
-
-/**
- * Dispatch event containing the results from an invocation. If the event is
- * part of a stream of such events from a single job invocation the streaming
- * flag will be set to true - when set layers that do not support streaming
- * should either disable any related functionality or complain bitterly. They
- * should never see such an event as the type checker will in the future catch
- * such cases before they occur but for now it's something to watch for.
- * 
- * @author Tom Oinn
- * 
- */
-public class DispatchResultEvent extends
-		AbstractDispatchEvent<DispatchResultEvent> {
-
-	private Map<String, T2Reference> dataMap;
-	private boolean streaming;
-
-	/**
-	 * Construct a new dispatch result event, specifying the data and whether
-	 * the result is part of a stream of multiple results events from a single
-	 * invocation
-	 * 
-	 * @param owner
-	 * @param index
-	 * @param context
-	 * @param data
-	 * @param streaming
-	 */
-	public DispatchResultEvent(String owner, int[] index,
-			InvocationContext context, Map<String, T2Reference> data,
-			boolean streaming) {
-		super(owner, index, context);
-		this.dataMap = data;
-		this.streaming = streaming;
-	}
-
-	/**
-	 * If this result is part of a stream, that is to say multiple result events
-	 * from a single job event, then return true otherwise return false.
-	 * 
-	 * @return whether this is part of a streamed result set
-	 */
-	public boolean isStreamingEvent() {
-		return this.streaming;
-	}
-
-	/**
-	 * The result contains a map of named EntityIdentifier instances
-	 * corresponding to the result data.
-	 * 
-	 * @return the result data for this event
-	 */
-	public Map<String, T2Reference> getData() {
-		return this.dataMap;
-	}
-
-	@Override
-	public DispatchResultEvent popOwningProcess()
-			throws ProcessIdentifierException {
-		return new DispatchResultEvent(popOwner(), index, context, dataMap,
-				streaming);
-	}
-
-	@Override
-	public DispatchResultEvent pushOwningProcess(String localProcessName)
-			throws ProcessIdentifierException {
-		return new DispatchResultEvent(pushOwner(localProcessName), index,
-				context, dataMap, streaming);
-	}
-
-	/**
-	 * DispatchMessageType.RESULT
-	 */
-	@Override
-	public DispatchMessageType getMessageType() {
-		return DispatchMessageType.RESULT;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/package.html
deleted file mode 100644
index d4dc0d4..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/package.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<body>
-Definition and support classes for the Dispatch Stack. Each processor in
-a workflow contains a stack of dispatch layers with each layer being
-responsible for a particular aspect of the invocation. At a high level
-the stack consumes a queue of events from the iteration system along
-with an initial set of service proxy objects and is repsonsible for
-taking jobs from the queue and matching them to appropriate invocation
-targets.
-<p>Taverna 1 has in effect a single hardcoded dispatch stack for
-each processor with little control over it aside from a few basic
-properties. To replicate the same behaviour within Taverna 2 there are
-dispatch layers for parallelism, retry, failover and invocation. As the
-dispatch layer is an extension point we or others can provide other
-aspects such as recursive invocation and dynamic (runtime) binding from
-abstract service proxies to concrete instances. The last is possible
-because the service list is passed through the stack along with the
-queue or individual job events and can be rewritten or filtered by
-dispatch layer implementations.
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/AbstractIterationStrategyNode.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/AbstractIterationStrategyNode.java
deleted file mode 100644
index bd93be5..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/AbstractIterationStrategyNode.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.tree.MutableTreeNode;
-import javax.swing.tree.TreeNode;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Abstract superclass for implementations of IterationStrategyNode, adds logic
- * to connect nodes together and convenience methods to push jobs and completion
- * events up to the parent node.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public abstract class AbstractIterationStrategyNode implements
-		IterationStrategyNode {
-
-	private List<IterationStrategyNode> children = new ArrayList<IterationStrategyNode>();
-
-	private IterationStrategyNode parent = null;
-
-	/**
-	 * Implement TreeNode
-	 */
-	public final synchronized Enumeration<IterationStrategyNode> children() {
-		return new Vector<IterationStrategyNode>(children).elements();
-	}
-
-	/**
-	 * Clear the child list and parent of this node
-	 */
-	public final synchronized void clear() {
-		for (IterationStrategyNode child : children) {
-			child.setParent(null);
-		}
-		children.clear();
-		this.parent = null;
-	}
-
-	/**
-	 * Implement TreeNode
-	 */
-	public boolean getAllowsChildren() {
-		return true;
-	}
-
-	/**
-	 * Implement TreeNode
-	 */
-	public final synchronized IterationStrategyNode getChildAt(int position) {
-		return children.get(position);
-	}
-
-	/**
-	 * Implement TreeNode
-	 */
-	public final int getChildCount() {
-		return children.size();
-	}
-
-	/**
-	 * Implements IterationStrategyNode
-	 */
-	public final synchronized List<IterationStrategyNode> getChildren() {
-		return new ArrayList<IterationStrategyNode>(this.children);
-	}
-
-	/**
-	 * Implement TreeNode
-	 */
-	public final synchronized int getIndex(TreeNode node) {
-		return children.indexOf(node);
-	}
-
-	/**
-	 * Implement TreeNode
-	 */
-	public final IterationStrategyNode getParent() {
-		return parent;
-	}
-
-	public synchronized void insert(MutableTreeNode child) {
-		insert(child, getChildCount());
-	}
-
-	public synchronized void insert(MutableTreeNode child, int index) {
-		if (!getAllowsChildren()) {
-			throw new IllegalStateException("Node does not allow children");
-		}
-		if (!(child instanceof IterationStrategyNode)) {
-			throw new IllegalArgumentException(
-					"Child not an instance of IterationStrategyNode: " + child);
-		}
-		if (child == this) {
-			throw new IllegalArgumentException("Can't be it's own parent");
-		}
-		// Check if it is already there (in case we'll just move it)
-		int alreadyExistsIndex = children.indexOf(child);
-
-		children.add(index, (IterationStrategyNode) child);
-
-		if (alreadyExistsIndex > -1) {
-			// Remove it from the old position
-			if (index < alreadyExistsIndex
-					&& alreadyExistsIndex + 1 < children.size()) {
-				alreadyExistsIndex++;
-			}
-			children.remove(alreadyExistsIndex);
-		}
-		if (child.getParent() != this) {
-			child.setParent(this);
-		}
-	}
-
-	/**
-	 * Implement TreeNode
-	 */
-	public boolean isLeaf() {
-		return children.isEmpty();
-	}
-
-	public void remove(int index) {
-		if (!getAllowsChildren()) {
-			throw new IllegalStateException("Node does not allow children");
-		}
-		children.remove(index);
-
-	}
-
-	public synchronized void remove(MutableTreeNode node) {
-		if (!getAllowsChildren()) {
-			throw new IllegalStateException("Node does not allow children");
-		}
-		children.remove(node);
-		if (node.getParent() == this) {
-			node.setParent(null);
-		}
-	}
-
-	public void removeFromParent() {
-		if (parent != null) {
-			IterationStrategyNode oldParent = parent;
-			parent = null;
-			oldParent.remove(this);
-		}
-	}
-
-	/**
-	 * Implements IterationStrategyNode
-	 */
-	public final synchronized void setParent(MutableTreeNode newParent) {
-		if (newParent != null && !(newParent instanceof IterationStrategyNode)) {
-			throw new IllegalArgumentException(
-					"Parent not a IterationStrategyNode instance: " + newParent);
-		}
-		if (newParent != null && !newParent.getAllowsChildren()) {
-			throw new IllegalStateException(
-					"New parent does not allow children");
-		}
-		if (newParent == this) {
-			throw new IllegalArgumentException("Can't be it's own parent");
-		}
-		removeFromParent();
-		parent = (IterationStrategyNode) newParent;
-		if (parent != null) {
-			if (!parent.getChildren().contains(this)) {
-				parent.insert(this);
-			}
-		}
-	}
-
-	public void setUserObject(Object object) {
-		throw new UnsupportedOperationException("Can't set user object");
-	}
-
-	/**
-	 * Push the specified completion event to the parent node
-	 */
-	protected final void pushCompletion(Completion completion) {
-		if (parent != null) {
-			parent.receiveCompletion(parent.getIndex(this), completion);
-		}
-	}
-
-	/**
-	 * Push the specified job up to the parent node in the iteration strategy.
-	 */
-	protected final void pushJob(Job job) {
-		if (parent != null) {
-			int index = parent.getIndex(this);
-			if (index < 0) {
-				throw new WorkflowStructureException(
-						"Parent doesn't have this node in its child list!");
-			}
-			parent.receiveJob(parent.getIndex(this), job);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/CompletionHandlingAbstractIterationStrategyNode.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/CompletionHandlingAbstractIterationStrategyNode.java
deleted file mode 100644
index 7978e47..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/CompletionHandlingAbstractIterationStrategyNode.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * A superclass for all iteration strategy nodes which are required to propagate
- * final completion events formed from multiple inputs. This is all the 'real'
- * iteration strategy nodes (but not the internal ones within the iteration
- * strategy object itself or the named input port nodes). All events are passed
- * to delegates in subclasses after which the completion state is checked, the
- * logic is as follows :
- * <p>
- * If the event received is final, that is to say it has an index of zero, and
- * final events have been received on all other inputs and at least one final
- * completion has been received then emit a final completion, otherwise do
- * nothing.
- * <p>
- * This means that subclasses should not emit final completion events themselves
- * - these will be handled by this superclass and emiting them in the subclass
- * will lead to duplicatation.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class CompletionHandlingAbstractIterationStrategyNode extends
-		AbstractIterationStrategyNode {
-
-	/**
-	 * Container class for the state of completion for a given process
-	 * identifier
-	 * 
-	 * @author Tom Oinn
-	 * 
-	 */
-	private final class CompletionState {
-		protected CompletionState(int indexLength) {
-			inputComplete = new boolean[indexLength];
-			for (int i = 0; i < indexLength; i++) {
-				inputComplete[i] = false;
-			}
-		}
-
-		protected boolean[] inputComplete;
-		protected boolean receivedCompletion = false;
-
-		/**
-		 * Return true iff all inputs have completed
-		 */
-		protected boolean isComplete() {
-			for (boolean inputCompletion : inputComplete) {
-				if (!inputCompletion) {
-					return false;
-				}
-			}
-			return true;
-		}
-	}
-
-	private Map<String, CompletionState> ownerToCompletion = new HashMap<String, CompletionState>();
-
-	public final void receiveCompletion(int inputIndex, Completion completion) {
-		innerReceiveCompletion(inputIndex, completion);
-		if (completion.getIndex().length == 0) {
-			pingCompletionState(inputIndex, completion.getOwningProcess(),
-					true, completion.getContext());
-		}
-	}
-
-	public final void receiveJob(int inputIndex, Job newJob) {
-		innerReceiveJob(inputIndex, newJob);
-		if (newJob.getIndex().length == 0) {
-			pingCompletionState(inputIndex, newJob.getOwningProcess(), false,
-					newJob.getContext());
-		}
-	}
-
-	/**
-	 * Called after a final completion event has been emited for a given owning
-	 * process, should be used by subclasses to do any tidying required,
-	 * removing state etc.
-	 * 
-	 * @param owningProcess
-	 */
-	protected abstract void cleanUp(String owningProcess);
-
-	private void pingCompletionState(int inputIndex, String owningProcess,
-			boolean isCompletion, InvocationContext context) {
-		synchronized (ownerToCompletion) {
-			CompletionState cs = getCompletionState(owningProcess);
-			cs.inputComplete[inputIndex] = true;
-			if (isCompletion) {
-				cs.receivedCompletion = true;
-			}
-			if (cs.isComplete() && cs.receivedCompletion) {
-				ownerToCompletion.remove(owningProcess);
-				cleanUp(owningProcess);
-				pushCompletion(new Completion(owningProcess, new int[0],
-						context));
-			}
-		}
-	}
-
-	private CompletionState getCompletionState(String owningProcess) {
-		synchronized (ownerToCompletion) {
-			if (ownerToCompletion.containsKey(owningProcess)) {
-				return ownerToCompletion.get(owningProcess);
-			} else {
-				CompletionState cs = new CompletionState(getChildCount());
-				ownerToCompletion.put(owningProcess, cs);
-				return cs;
-			}
-		}
-	}
-
-	protected abstract void innerReceiveCompletion(int inputIndex,
-			Completion completion);
-
-	protected abstract void innerReceiveJob(int inputIndex, Job newJob);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/CrossProduct.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/CrossProduct.java
deleted file mode 100644
index fe4da95..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/CrossProduct.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * A cross product node combines its inputs in an 'all against all' manner. When
- * a new job is received on index 'n' a set of jobs is emited corresponding to
- * the combination of the new job with all other jobs on input indices other
- * than 'n'.
- * 
- * @author Tom Oinn
- * 
- */
-public class CrossProduct extends
-		CompletionHandlingAbstractIterationStrategyNode {
-
-	private Map<String, List<Set<Job>>> ownerToCache = new HashMap<String, List<Set<Job>>>();
-
-	/**
-	 * Receive a job, emit jobs corresponding to the orthogonal join of the new
-	 * job with all jobs in all other input lists.
-	 */
-	@Override
-	public synchronized void innerReceiveJob(int inputIndex, Job newJob) {
-		if (!ownerToCache.containsKey(newJob.getOwningProcess())) {
-			List<Set<Job>> perInputCache = new ArrayList<Set<Job>>();
-			for (int i = 0; i < getChildCount(); i++) {
-				perInputCache.add(new HashSet<Job>());
-			}
-			ownerToCache.put(newJob.getOwningProcess(), perInputCache);
-		}
-		// Store the new job
-		List<Set<Job>> perInputCache = ownerToCache.get(newJob
-				.getOwningProcess());
-		perInputCache.get(inputIndex).add(newJob);
-		// Find all combinations of the new job with all permutations of jobs in
-		// the other caches. We could make this a lot easier by restricting it
-		// to a single pair of inputs, this might be a more sane way to go in
-		// the future...
-		Set<Job> workingSet = perInputCache.get(0);
-		if (inputIndex == 0) {
-			workingSet = new HashSet<Job>();
-			workingSet.add(newJob);
-		}
-		for (int i = 1; i < getChildCount(); i++) {
-			Set<Job> thisSet = perInputCache.get(i);
-			if (i == inputIndex) {
-				// This is the cache for the new job, so we rewrite the set to a
-				// single element one containing only the newly submitted job
-				thisSet = new HashSet<Job>();
-				thisSet.add(newJob);
-			}
-			workingSet = merge(workingSet, thisSet);
-		}
-		for (Job outputJob : workingSet) {
-			pushJob(outputJob);
-		}
-
-	}
-
-	private Set<Job> merge(Set<Job> set1, Set<Job> set2) {
-		Set<Job> newSet = new HashSet<Job>();
-		for (Job job1 : set1) {
-			for (Job job2 : set2) {
-				int[] newIndex = new int[job1.getIndex().length
-						+ job2.getIndex().length];
-				int j = 0;
-				for (int i = 0; i < job1.getIndex().length; i++) {
-					newIndex[j++] = job1.getIndex()[i];
-				}
-				for (int i = 0; i < job2.getIndex().length; i++) {
-					newIndex[j++] = job2.getIndex()[i];
-				}
-				Map<String, T2Reference> newDataMap = new HashMap<String, T2Reference>();
-				newDataMap.putAll(job1.getData());
-				newDataMap.putAll(job2.getData());
-				newSet.add(new Job(job1.getOwningProcess(), newIndex,
-						newDataMap, job1.getContext()));
-			}
-		}
-		return newSet;
-	}
-
-	@Override
-	public synchronized void innerReceiveCompletion(int inputIndex,
-			Completion completion) {
-		// Do nothing, let the superclass handle final completion events
-	}
-
-	@Override
-	protected final synchronized void cleanUp(String owningProcess) {
-		ownerToCache.remove(owningProcess);
-	}
-
-	public synchronized int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException {
-		int temp = 0;
-		for (IterationStrategyNode child : getChildren()) {
-			temp += child.getIterationDepth(inputDepths);
-		}
-		return temp;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/DotProduct.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/DotProduct.java
deleted file mode 100644
index 9aebb37..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/DotProduct.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.TreeCache;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * The dot product matches jobs by index array, when a job is received a job is
- * emited if and only if the index array of the new job is matched exactly by
- * index arrays of one job in each other input index.
- * 
- * @author Tom Oinn
- * 
- */
-public class DotProduct extends CompletionHandlingAbstractIterationStrategyNode {
-
-	Map<String, TreeCache[]> ownerToCache = new HashMap<String, TreeCache[]>();
-
-	@Override
-	public synchronized void innerReceiveJob(int inputIndex, Job newJob) {
-		String owningProcess = newJob.getOwningProcess();
-		if (!ownerToCache.containsKey(owningProcess)) {
-			TreeCache[] caches = new TreeCache[getChildCount()];
-			for (int i = 0; i < getChildCount(); i++) {
-				caches[i] = new TreeCache();
-			}
-			ownerToCache.put(owningProcess, caches);
-		}
-		// Firstly store the new job in the cache, this isn't optimal but is
-		// safe for now - we can make this more efficient by doing the
-		// comparison first and only storing the job if required
-		TreeCache[] caches = ownerToCache.get(owningProcess);
-		caches[inputIndex].insertJob(newJob);
-		int[] indexArray = newJob.getIndex();
-		boolean foundMatch = true;
-		Map<String, T2Reference> newDataMap = new HashMap<String, T2Reference>();
-		for (TreeCache cache : caches) {
-
-			if (cache.containsLocation(indexArray)) {
-				newDataMap.putAll(cache.get(indexArray).getData());
-			} else {
-				foundMatch = false;
-			}
-		}
-		if (foundMatch) {
-			Job j = new Job(owningProcess, indexArray, newDataMap, newJob
-					.getContext());
-			// Remove all copies of the job with this index from the cache,
-			// we'll never use it
-			// again and it pays to be tidy
-			for (TreeCache cache : caches) {
-				cache.cut(indexArray);
-			}
-			pushJob(j);
-		}
-	}
-
-	/**
-	 * Delegate to the superclass to propogate completion events if and only if
-	 * the completion event is a final one. We can potentially implement finer
-	 * grained logic here in the future.
-	 */
-	@Override
-	public synchronized void innerReceiveCompletion(int inputIndex,
-			Completion completion) {
-		// Do nothing, let the superclass handle final completion events, ignore
-		// others for now (although in theory we should be able to do better
-		// than this really)
-	}
-
-	@Override
-	protected synchronized void cleanUp(String owningProcess) {
-		ownerToCache.remove(owningProcess);
-	}
-
-	public int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException {
-		// Check that all input depths are the same
-		int depth = getChildAt(0).getIterationDepth(inputDepths);
-		for (IterationStrategyNode childNode : getChildren()) {
-			if (childNode.getIterationDepth(inputDepths) != depth) {
-				throw new IterationTypeMismatchException(
-						"Mismatched input types for dot product node");
-			}
-		}
-		return depth;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategy.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategy.java
deleted file mode 100644
index 84a6031..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.Map;
-
-public interface IterationStrategy {
-
-	/**
-	 * The iteration strategy results in a set of job objects with a particular
-	 * job index. This method returns the length of that index array when the
-	 * specified input types are used. Input types are defined in terms of name
-	 * and integer pairs where the name is the name of a NamedInputPortNode in
-	 * the iteration strategy and the integer is the depth of the input data
-	 * collection (i.e. item depth + index array length for that item which
-	 * should be a constant).
-	 * 
-	 * @param inputDepths
-	 *            map of port names to input collection depth
-	 * @return the length of the index array which will be generated for each
-	 *         resultant job object.
-	 */
-	public int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException;
-
-	/**
-	 * Return a map of port name -> desired cardinality for this iteration
-	 * strategy
-	 */
-	public Map<String, Integer> getDesiredCardinalities();
-
-	public TerminalNode getTerminalNode();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategyNode.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategyNode.java
deleted file mode 100644
index 86f1df3..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategyNode.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.tree.MutableTreeNode;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Interface for nodes within an iteration strategy layer
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public interface IterationStrategyNode extends MutableTreeNode {
-
-	/**
-	 * Specialised return type of {@link TreeNode#children()}
-	 */
-
-	public Enumeration<IterationStrategyNode> children();
-
-	/**
-	 * Remove all children nodes and set the parent to <code>null</code>.
-	 */
-	public void clear();
-
-	/**
-	 * Specialised return type of {@link TreeNode#getChildAt(int)}
-	 */
-	public IterationStrategyNode getChildAt(int childIndex);
-
-	/**
-	 * Return a copy of the list of children nodes, or an empty list if
-	 * {@link #getAllowsChildren()} is <code>false</code>.
-	 * 
-	 * @return List of children nodes.
-	 */
-	public List<IterationStrategyNode> getChildren();
-
-	/**
-	 * In the context of an enclosing iteration strategy each node should be
-	 * able to return the iteration depth, i.e. the length of the index array,
-	 * for items it will emit. In all cases other than leaf nodes this is
-	 * defined in terms of the depth of child nodes. The input cardinalities for
-	 * named ports are pushed through each node so that the terminal nodes
-	 * corresponding to input port collators can evaluate this expression -
-	 * pushing it through the entire evaluation means we don't have to keep
-	 * state anywhere in the leaf nodes (standard dependency injection)
-	 * <p>
-	 * Nodes can choose to throw the IterationTypeMismatchException if their
-	 * inputs aren't compatible with the operational semantics of the node such
-	 * as in the case of a dot product node with inputs with different depths.
-	 * 
-	 * @param inputDepths
-	 * @return
-	 * @throws IterationTypeMismatchException
-	 */
-	public int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException;
-
-	/**
-	 * Specialised return type of {@link TreeNode#getParent()}
-	 */
-	public IterationStrategyNode getParent();
-
-	/**
-	 * Insert a new child node. The new child will be added in the end of the
-	 * list, so this would be equivalent to insert(child, getChildCount()).
-	 * 
-	 * @param child
-	 *            Child node to add
-	 */
-	public void insert(MutableTreeNode child);
-
-	/**
-	 * Nodes can also receive completion events, the simplest being one
-	 * declaring that no further input is expected on the given input, or
-	 * partial completion events which are interpreted as 'no event with an
-	 * index array prefixed by the specified completion index array will be
-	 * received on the specified index'
-	 */
-	public void receiveCompletion(int inputIndex, Completion completion);
-
-	/**
-	 * The nodes within the iteration strategy, a tree structure, are event
-	 * based. When a new fragment of a job from upstream in the tree (towards
-	 * leaves) arrives it is handled by this method. Implementations will
-	 * probably have to handle state management, i.e. what jobs have we already
-	 * seen, and emit appropriate jobs to downstream nodes.
-	 * 
-	 * @param inputIndex
-	 * @param newJob
-	 */
-	public void receiveJob(int inputIndex, Job newJob);
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategyStack.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategyStack.java
deleted file mode 100644
index 1423e8e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationStrategyStack.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Stack of iteration strategy containers. The stacking behaviour allows for
- * staged implicit iteration where intermediate strategies are used to drill
- * into the collection structure to a certain depth with a final one used to
- * render job objects containing data at the correct depth for the process. This
- * was achieved in Taverna 1 through the combination of nested workflows and
- * 'forcing' processors which could echo and therefore force input types of the
- * workflow to a particular cardinality.
- * 
- * @author Tom Oinn
- * 
- */
-public interface IterationStrategyStack {
-
-	/**
-	 * The iteration strategy stack consists of an ordered list of iteration
-	 * strategies.
-	 * 
-	 * @return An unmodifiable copy of the list containing the iteration
-	 *         strategy objects in order, with the strategy at position 0 in the
-	 *         list being the one to which data is fed first.
-	 */
-	public List<? extends IterationStrategy> getStrategies();
-
-	/**
-	 * Calculate the depth of the iteration strategy stack as a whole given a
-	 * set of named inputs and their cardinalities. This depth is the length of
-	 * the index array which will be added to any output data, so the resultant
-	 * output of each port in the owning processor is the depth of that port as
-	 * defined by the activity plus this value.
-	 * 
-	 * @param inputDepths
-	 * @return
-	 * @throws IterationTypeMismatchException
-	 * @throws MissingIterationInputException
-	 */
-	public int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException,
-			MissingIterationInputException;
-	
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationTypeMismatchException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationTypeMismatchException.java
deleted file mode 100644
index 9db4a34..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/IterationTypeMismatchException.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-/**
- * Thrown during the typecheck phase when an iteration strategy is configured
- * such that at runtime it would fail. This is generally because a dot product
- * node has been specified where the children of that node will have different
- * cardinalities (in this case the dot product isn't defined)
- * 
- * @author Tom Oinn
- * 
- */
-public class IterationTypeMismatchException extends Exception {
-
-	private static final long serialVersionUID = -3034020607723767223L;
-
-	public IterationTypeMismatchException() {
-		// TODO Auto-generated constructor stub
-	}
-
-	public IterationTypeMismatchException(String arg0) {
-		super(arg0);
-		// TODO Auto-generated constructor stub
-	}
-
-	public IterationTypeMismatchException(Throwable arg0) {
-		super(arg0);
-		// TODO Auto-generated constructor stub
-	}
-
-	public IterationTypeMismatchException(String arg0, Throwable arg1) {
-		super(arg0, arg1);
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/MissingIterationInputException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/MissingIterationInputException.java
deleted file mode 100644
index 6e09470..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/MissingIterationInputException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-/**
- * Thrown when an attempt is made to evaluate the type of the iteration strategy
- * but one or more input ports aren't defined in the input array of types.
- * Shouldn't normally happen as this will be handled by the type checker
- * detecting that there aren't enough inputs to check but we indicate it for
- * extra robustness.
- * 
- * @author Tom Oinn
- * 
- */
-public class MissingIterationInputException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -1615949178096496592L;
-
-	public MissingIterationInputException() {
-		// TODO Auto-generated constructor stub
-	}
-
-	public MissingIterationInputException(String arg0) {
-		super(arg0);
-		// TODO Auto-generated constructor stub
-	}
-
-	public MissingIterationInputException(Throwable arg0) {
-		super(arg0);
-		// TODO Auto-generated constructor stub
-	}
-
-	public MissingIterationInputException(String arg0, Throwable arg1) {
-		super(arg0, arg1);
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/NamedInputPortNode.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/NamedInputPortNode.java
deleted file mode 100644
index 7859bdc..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/NamedInputPortNode.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Acts as the input to a stage within the iteration strategy, passes all jobs
- * straight through. NamedInputPortNode objects are, as the name suggests,
- * named. These names correspond to the names of abstract input ports on the
- * Processor object to which the iteration strategy belongs.
- * 
- * @author Tom Oinn
- * 
- */
-public class NamedInputPortNode extends AbstractIterationStrategyNode {
-
-	private String portName;
-
-	private int desiredCardinality;
-
-	public NamedInputPortNode(String name, int cardinality) {
-		super();
-		this.portName = name;
-		this.desiredCardinality = cardinality;
-	}
-
-	/**
-	 * If this node receives a job it will always be pushed without modification
-	 * up to the parent
-	 */
-	public void receiveJob(int inputIndex, Job newJob) {
-		pushJob(newJob);
-	}
-
-	/**
-	 * Completion events are passed straight through the same as jobs
-	 */
-	public void receiveCompletion(int inputIndex, Completion completion) {
-		pushCompletion(completion);
-	}
-
-	/**
-	 * Each node maps to a single named input port within the processor
-	 */
-	public String getPortName() {
-		return this.portName;
-	}
-
-	/**
-	 * Each node defines the level of collection depth for that input port
-	 */
-	public int getCardinality() {
-		return this.desiredCardinality;
-	}
-
-	/**
-	 * These nodes correspond to inputs to the iteration strategy and are always
-	 * leaf nodes as a result.
-	 * 
-	 * @override
-	 */
-	@Override
-	public boolean isLeaf() {
-		return true;
-	}
-
-	/**
-	 * These nodes can never have children
-	 * 
-	 * @override
-	 */
-	@Override
-	public boolean getAllowsChildren() {
-		return false;
-	}
-
-	/**
-	 * Iteration depth is the difference between the supplied input depth and
-	 * the desired one. If the desired depth is greater then wrapping will
-	 * happen and the iteration depth will be zero (rather than a negative!)
-	 */
-	public int getIterationDepth(Map<String, Integer> inputDepths) {
-		int myInputDepth = inputDepths.get(portName);
-		int depthMismatch = myInputDepth - desiredCardinality;
-		return (depthMismatch > 0 ? depthMismatch : 0);
-	}
-
-	@Override
-	public String toString() {
-		return getClass().getSimpleName() + " " + getPortName() + "("
-				+ getCardinality() + ")";
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/PrefixDotProduct.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/PrefixDotProduct.java
deleted file mode 100644
index 0767a3e..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/PrefixDotProduct.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.TreeCache;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Matches jobs where the index array of the job on index 0 is the prefix of the
- * index array of the job on index 1. This node can only ever have exactly two
- * child nodes!
- * 
- * @author Tom Oinn
- * 
- */
-public class PrefixDotProduct extends DotProduct {
-
-	@Override
-	protected synchronized final void cleanUp(String owningProcess) {
-		ownerToCache.remove(owningProcess);
-	}
-
-	@Override
-	public void innerReceiveJob(int inputIndex, Job newJob) {
-		String owningProcess = newJob.getOwningProcess();
-		TreeCache[] caches;
-		synchronized (ownerToCache) {
-			caches = ownerToCache.get(owningProcess);
-			// Create the caches if not already initialized
-			if (caches == null) {
-				caches = new TreeCache[getChildCount()];
-				for (int i = 0; i < getChildCount(); i++) {
-					caches[i] = new TreeCache();
-				}
-				ownerToCache.put(owningProcess, caches);
-			}
-		}
-
-		// Store the job
-		caches[inputIndex].insertJob(newJob);
-
-		// If this job came in on index 0 we have to find all jobs in the cache
-		// for index 1 which have the index array as a prefix. Fortunately this
-		// is quite easy due to the tree structure of the cache, we can just ask
-		// for all nodes in the cache with that index.
-		if (inputIndex == 0) {
-			int[] prefixIndexArray = newJob.getIndex();
-			List<Job> matchingJobs;
-			synchronized (caches[1]) {
-				// Match all jobs and remove them so other calls can't produce
-				// duplicates
-				matchingJobs = caches[1].jobsWithPrefix(prefixIndexArray);
-				caches[1].cut(prefixIndexArray);
-			}
-			for (Job job : matchingJobs) {
-				Map<String, T2Reference> newDataMap = new HashMap<String, T2Reference>();
-				newDataMap.putAll(newJob.getData());
-				newDataMap.putAll(job.getData());
-				Job mergedJob = new Job(owningProcess, job.getIndex(),
-						newDataMap, newJob.getContext());
-				pushJob(mergedJob);
-			}
-		}
-
-		// If the job came in on index 1 we have to find the job on index 0 that
-		// matches the first 'n' indices, where 'n' is determined by the depth
-		// of jobs on the cache for index 0.
-		else if (inputIndex == 1) {
-			// Only act if we've received jobs on the cache at index 0
-			if (caches[0].getIndexLength() > 0) {
-				int[] prefix = new int[caches[0].getIndexLength()];
-				for (int i = 0; i < prefix.length; i++) {
-					prefix[i] = newJob.getIndex()[i];
-				}
-				Job j = caches[0].get(prefix);
-				if (j != null) {
-					Map<String, T2Reference> newDataMap = new HashMap<String, T2Reference>();
-					newDataMap.putAll(j.getData());
-					newDataMap.putAll(newJob.getData());
-					Job mergedJob = new Job(owningProcess, newJob.getIndex(),
-							newDataMap, newJob.getContext());
-					pushJob(mergedJob);
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/TerminalNode.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/TerminalNode.java
deleted file mode 100644
index 15836bb..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/TerminalNode.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import javax.swing.tree.MutableTreeNode;
-
-/**
- * The terminal node is the root of the iteration strategy tree, it is
- * responsible for forwarding all events up to the iteration strategy itself
- * which can then propogate them to the strategy stack.
- */
-public abstract class TerminalNode extends AbstractIterationStrategyNode {
-	@Override
-	public synchronized void insert(MutableTreeNode child, int index) {
-		if (getChildCount() > 0 && getChildAt(0) != child) {
-			throw new IllegalStateException(
-					"The terminal node can have maximum one child");
-		}
-		super.insert(child, index);
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/package.html
deleted file mode 100644
index 65f2a61..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/package.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<body>
-Object model and enactment logic for the iteration strategy component of
-a Processor
-</body>
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/DeserializationException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/DeserializationException.java
deleted file mode 100644
index 904299b..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/DeserializationException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization;
-
-
-public class DeserializationException extends Exception {
-
-	public DeserializationException(String msg) {
-		super(msg);
-	}
-
-	public DeserializationException(String msg, Exception cause) {
-		super(msg,cause);
-	}
-
-	private static final long serialVersionUID = -5905705659863088259L;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/SerializationException.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/SerializationException.java
deleted file mode 100644
index 03709b2..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/SerializationException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization;
-
-
-public class SerializationException extends Exception {
-
-	public SerializationException(String msg, Exception cause) {
-		super(msg,cause);
-	}
-
-	public SerializationException(String msg) {
-		super(msg);
-	}
-
-	private static final long serialVersionUID = -218787623524401819L;
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializer.java
deleted file mode 100644
index db8ef8b..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.jdom.Element;
-
-/**
- * The API that defines the entry point for deserialising a complete dataflow XML document into a dataflow instance.
- * 
- * @author Stuart Owen
- *
- */
-public interface XMLDeserializer {
-	
-	/**
-	 * Deserialises a complete dataflow document into a Dataflow instance.
-	 * 
-	 * @param element a jdom element holding the XML document that represents the dataflow
-	 * @return an instance of the Dataflow
-	 * @throws DeserializationException
-	 * @throws EditException - should an error occur whilst constructing the dataflow via Edits
-	 * 
-	 * @see Edits
-	 */
-	public Dataflow deserializeDataflow(Element element) throws DeserializationException,EditException;
-	
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializerRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializerRegistry.java
deleted file mode 100644
index 918d162..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializerRegistry.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-import org.apache.log4j.Logger;
-
-public class XMLDeserializerRegistry extends SPIRegistry<XMLDeserializer> {
-
-	private static Logger logger = Logger.getLogger(XMLDeserializerRegistry.class);
-	
-	private static XMLDeserializerRegistry instance;
-	
-	protected XMLDeserializerRegistry() {
-		super(XMLDeserializer.class);
-	}
-
-	public static synchronized XMLDeserializerRegistry getInstance() {
-		if (instance == null) {
-			instance = new XMLDeserializerRegistry();
-		}
-		return instance;
-	}
-
-	public XMLDeserializer getDeserializer() {
-		List<XMLDeserializer> instances = getInstance().getInstances();
-		XMLDeserializer result = null;
-		if (instances.size() == 0) {
-			logger.error("No Deserializer implementation defined");
-		} else {
-			if (instances.size() > 1)
-				logger.error("More that 1 XML Deserializer implementation defined, using the first");
-			result=instances.get(0);
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializer.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializer.java
deleted file mode 100644
index a50a9e9..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.serialization.SerializationException;
-
-import org.jdom.Element;
-
-
-/**
- * The main interface that defines the entry point for serialising a Dataflow instance into a JDOM Element
- * <br>
- * If the dataflow internally contains DataflowActivities (i.e. nested dataflows) then the resulting XML will also include
- * a definition of these.
- * 
- * @author Stuart Owen
- * @author Alan R Williams
- *
- */
-public interface XMLSerializer {
-	
-	/**
-	 * Serialises the dataflow into a JDOM element
-	 * @param dataflow
-	 * @return
-	 * @throws SerializationException if there is a problem serializing the dataflow
-	 */
-	Element serializeDataflow(Dataflow dataflow) throws SerializationException;
-	
-	/**
-	 * Specify what program produced the serialization
-	 * 
-	 * @param producedBy
-	 */
-	void setProducedBy(String producedBy);
-	
-	String getProducedBy();
-
-}
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializerRegistry.java b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializerRegistry.java
deleted file mode 100644
index bef47e8..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializerRegistry.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-
-import net.sf.taverna.t2.spi.SPIRegistry;
-
-import org.apache.log4j.Logger;
-
-public class XMLSerializerRegistry extends SPIRegistry<XMLSerializer> {
-
-	private static Logger logger = Logger.getLogger(XMLSerializerRegistry.class);
-	
-	private static XMLSerializerRegistry instance;
-	
-	protected XMLSerializerRegistry() {
-		super(XMLSerializer.class);
-	}
-
-	public static synchronized XMLSerializerRegistry getInstance() {
-		if (instance == null) {
-			instance = new XMLSerializerRegistry();
-		}
-		return instance;
-	}
-
-	public XMLSerializer getSerializer() {
-		List<XMLSerializer> instances = getInstance().getInstances();
-		XMLSerializer result = null;
-		if (instances.size() == 0) {
-			logger.error("No Serializer implementation defined");
-		} else {
-			if (instances.size() > 1)
-				logger.error("More that 1 XML Serializer implementation defined, using the first");
-			result=instances.get(0);
-		}
-		return result;
-	}
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/package.html b/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/package.html
deleted file mode 100644
index d1800c8..0000000
--- a/trunk/workflowmodel-api/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-The API definition for serialization/deserialization of a dataflow to and from XML.
-</body>
\ No newline at end of file
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/monitor/TestMonitorManager.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/monitor/TestMonitorManager.java
deleted file mode 100644
index 29285fd..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/monitor/TestMonitorManager.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import net.sf.taverna.t2.lang.observer.Observable;
-import net.sf.taverna.t2.lang.observer.Observer;
-import net.sf.taverna.t2.monitor.MonitorManager.AddPropertiesMessage;
-import net.sf.taverna.t2.monitor.MonitorManager.DeregisterNodeMessage;
-import net.sf.taverna.t2.monitor.MonitorManager.MonitorMessage;
-import net.sf.taverna.t2.monitor.MonitorManager.RegisterNodeMessage;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test {@link MonitorManager}.
- * 
- * @author Stian Soiland-Reyes
- *
- */
-public class TestMonitorManager {
-
-	private MonitorManager monitorManager;
-
-	@Test
-	public void addMonitor() {
-		TestMonitor testMonitor = new TestMonitor();
-		monitorManager.addObserver(testMonitor);
-		assertEquals(0, testMonitor.getCounts());
-		// Make a fake registration
-		Object workflowObject = "The workflow object as a string";
-		String[] owningProcess = { "dataflow0", "process4", "42424" };
-		Set<MonitorableProperty<?>> properties = new HashSet<MonitorableProperty<?>>();
-		properties.add(new ExampleProperty());
-		monitorManager.registerNode(workflowObject, owningProcess, properties);
-
-		assertEquals(1, testMonitor.getCounts());
-		assertEquals(monitorManager, testMonitor.lastSender);
-		MonitorMessage lastMessage = testMonitor.lastMessage;
-		assertTrue("Owning process did not match", Arrays.equals(owningProcess,
-				lastMessage.getOwningProcess()));
-
-		assertTrue("Message was not a RegisterNodeMessage",
-				lastMessage instanceof RegisterNodeMessage);
-		RegisterNodeMessage registerNodeMessage = (RegisterNodeMessage) lastMessage;
-		assertSame("Workflow object was not same", workflowObject,
-				registerNodeMessage.getWorkflowObject());
-		assertEquals(properties, registerNodeMessage.getProperties());
-
-		assertEquals("Another event was received", 1, testMonitor.getCounts());
-	}
-
-	@Test
-	public void addProperties() {
-		TestMonitor testMonitor = new TestMonitor();
-		monitorManager.addObserver(testMonitor);
-		assertEquals(0, testMonitor.getCounts());
-		// Make a fake add properties
-		String[] owningProcess = { "dataflow0", "process4", "42424" };
-		Set<MonitorableProperty<?>> newProperties = new HashSet<MonitorableProperty<?>>();
-		newProperties.add(new ExampleProperty());
-		monitorManager.addPropertiesToNode(owningProcess, newProperties);
-
-		assertEquals(1, testMonitor.getCounts());
-		assertEquals(monitorManager, testMonitor.lastSender);
-		MonitorMessage lastMessage = testMonitor.lastMessage;
-		assertTrue("Owning process did not match", Arrays.equals(owningProcess,
-				lastMessage.getOwningProcess()));
-
-		assertTrue("Message was not a AddPropertiesMessage",
-				lastMessage instanceof AddPropertiesMessage);
-		AddPropertiesMessage registerNodeMessage = (AddPropertiesMessage) lastMessage;
-		assertEquals(newProperties, registerNodeMessage.getNewProperties());
-
-		assertEquals("Another event was received", 1, testMonitor.getCounts());
-	}
-
-	@Before
-	public void findMonitorManager() {
-		monitorManager = MonitorManager.getInstance();
-	}
-
-	@Test
-	public void removeMonitor() {
-		TestMonitor testMonitor = new TestMonitor();
-		monitorManager.addObserver(testMonitor);
-		assertEquals(0, testMonitor.getCounts());
-
-		// Make a fake deregistration
-		String[] owningProcess = { "dataflow0", "process4", "1337" };
-		monitorManager.deregisterNode(owningProcess);
-
-		assertEquals(1, testMonitor.getCounts());
-		assertEquals(monitorManager, testMonitor.lastSender);
-		MonitorMessage lastMessage = testMonitor.lastMessage;
-		assertTrue("Owning process did not match", Arrays.equals(owningProcess,
-				lastMessage.getOwningProcess()));
-		assertTrue("Message was not a DeregisterNodeMessage",
-				lastMessage instanceof DeregisterNodeMessage);
-		assertEquals("Another event was received", 1, testMonitor.getCounts());
-	}
-
-	public class TestMonitor implements Observer<MonitorManager.MonitorMessage> {
-
-		private int counts = 0;
-		private MonitorMessage lastMessage;
-		private Observable<MonitorMessage> lastSender;
-
-		public int getCounts() {
-			return counts;
-		}
-
-		public MonitorMessage getMessage() {
-			return lastMessage;
-		}
-
-		public Observable<MonitorMessage> getSender() {
-			return lastSender;
-		}
-
-		public synchronized void notify(Observable<MonitorMessage> sender,
-				MonitorMessage message) throws Exception {
-			this.lastSender = sender;
-			this.lastMessage = message;
-			this.counts++;
-		}
-	}
-
-	private final class ExampleProperty implements MonitorableProperty<String> {
-		public Date getLastModified() {
-			return new Date();
-		}
-
-		public String[] getName() {
-			return new String[] { "monitor", "test", "example" };
-		}
-
-		public String getValue() throws NoSuchPropertyException {
-			return "Example property value";
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/FloatHealthChecker.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/FloatHealthChecker.java
deleted file mode 100644
index 4c25e5f..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/FloatHealthChecker.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-
-public class FloatHealthChecker implements HealthChecker<Float> {
-
-	public boolean canHandle(Object subject) {
-		return subject!=null && subject instanceof Float;
-	}
-
-	public HealthReport checkHealth(Float subject) {
-		return null;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/FloatHealthChecker2.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/FloatHealthChecker2.java
deleted file mode 100644
index 0dd9f01..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/FloatHealthChecker2.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-
-public class FloatHealthChecker2 implements HealthChecker<Float> {
-
-	public boolean canHandle(Object subject) {
-		return subject!=null && subject instanceof Float;
-	}
-
-	public HealthReport checkHealth(Float subject) {
-		return null;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerFactoryTest.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerFactoryTest.java
deleted file mode 100644
index 696e65e..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerFactoryTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
-import net.sf.taverna.t2.workflowmodel.health.HealthCheckerFactory;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class HealthCheckerFactoryTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@Test
-	public void testGetHealthCheckerForObject() {
-		String str = "A String";
-		List<HealthChecker<?>> checkers = HealthCheckerFactory.getInstance().getHealthCheckersForObject(str);
-		assertEquals("There should be 1 checker for String",1,checkers.size());
-		
-		Long l = new Long(123);
-		checkers = HealthCheckerFactory.getInstance().getHealthCheckersForObject(l);
-		assertEquals("There should be 0 checkers for Long",0,checkers.size());
-		
-		Float f = new Float(2.5f);
-		checkers = HealthCheckerFactory.getInstance().getHealthCheckersForObject(f);
-		assertEquals("There should be 2 checkers for Float",2,checkers.size());
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerRegistryTest.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerRegistryTest.java
deleted file mode 100644
index 8a13e59..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthCheckerRegistryTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import static org.junit.Assert.fail;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
-import net.sf.taverna.t2.workflowmodel.health.HealthCheckerRegistry;
-
-import org.junit.Test;
-
-public class HealthCheckerRegistryTest {
-
-
-	@SuppressWarnings("unchecked")
-	@Test
-	public void testGetInstances() {
-		HealthCheckerRegistry registry = new HealthCheckerRegistry();
-		List<HealthChecker> checkers = registry.getInstances();
-		for (HealthChecker<?> checker : checkers) {
-			if (checker.canHandle("a string")) return;
-		}
-		fail("A checker should have been found that can handle String");
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthReportTest.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthReportTest.java
deleted file mode 100644
index dded8be..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/HealthReportTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport.Status;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class HealthReportTest {
-
-	HealthReport report;
-	
-	@Before
-	public void setUp() throws Exception {
-		List<HealthReport> subreports = new ArrayList<HealthReport>();
-		subreports.add(new HealthReport("sub subject","this is a subreport",Status.OK));
-		report = new HealthReport("a subject","a message",Status.WARNING,subreports);
-	}
-
-	@Test
-	public void testActivityHealthReportStringStatus() {
-		report = new HealthReport("the subject","a string",Status.SEVERE);
-		assertEquals("a string",report.getMessage());
-		assertEquals(Status.SEVERE,report.getStatus());
-		assertEquals("the subject",report.getSubject());
-		assertEquals("the subreports should be an empty list",0,report.getSubReports().size());
-	}
-
-	@Test
-	public void testGetMessage() {
-		assertEquals("a message",report.getMessage());
-	}
-
-	@Test
-	public void testGetStatus() {
-		assertEquals(Status.WARNING,report.getStatus());
-	}
-	
-	@Test
-	public void testGetSubject() {
-		assertEquals("a subject",report.getSubject());
-	}
-	
-	@Test
-	public void testGetSubreports() {
-		List<HealthReport> subreports = report.getSubReports();
-		assertEquals("There should be 1 report",1,subreports.size());
-		assertEquals("Wrong subject","sub subject",subreports.get(0).getSubject());
-	}
-	
-	@Test 
-	public void testStatusHighestIncludingSubReports() {
-		report = new HealthReport("parent","set to ok",Status.OK);
-		assertEquals("should be OK",Status.OK,report.getStatus());
-		report.getSubReports().add(new HealthReport("child1","set to warning",Status.WARNING));
-		assertEquals("should be WARNING",Status.WARNING,report.getStatus());
-		report.getSubReports().add(new HealthReport("child1","set to severe",Status.SEVERE));
-		assertEquals("should be SEVERE",Status.SEVERE,report.getStatus());
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/StringHealthChecker.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/StringHealthChecker.java
deleted file mode 100644
index 1ef8132..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/health/StringHealthChecker.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.health;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-
-public class StringHealthChecker implements HealthChecker<String> {
-
-	public boolean canHandle(Object subject) {
-		return subject!=null && subject instanceof String;
-	}
-
-	public HealthReport checkHealth(String subject) {
-		return null;
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/TestIterationStrategyNodes.java b/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/TestIterationStrategyNodes.java
deleted file mode 100644
index 90f0cfd..0000000
--- a/trunk/workflowmodel-api/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/TestIterationStrategyNodes.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import static org.junit.Assert.*;
-
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Map;
-
-import javax.swing.tree.TreeNode;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test {@link AbstractIterationStrategyNode} implementations for
- * {@link TreeNode} behaviour.
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class TestIterationStrategyNodes {
-
-	TerminalNode root;
-	private NamedInputPortNode input1;
-	private NamedInputPortNode input2;
-	private CrossProduct crossProduct1;
-	private CrossProduct crossProduct2;
-	private DotProduct dotProduct1;
-	private DotProduct dotProduct2;
-
-	@Test
-	public void addSingleChildToTerminal() throws Exception {
-		assertNull(input1.getParent());
-		assertEquals(0, root.getChildCount());
-		root.insert(input1);
-		assertEquals(root, input1.getParent());
-		assertEquals(1, root.getChildCount());
-		assertEquals(input1, root.getChildAt(0));
-		assertEquals(Arrays.asList(input1), root.getChildren());
-
-		root.insert(input1);
-		assertEquals(1, root.getChildCount());
-
-		root.insert(input1, 0);
-		assertEquals(1, root.getChildCount());
-	}
-
-	@Test(expected = IllegalStateException.class)
-	public void cantAddSeveralChildrenToTerminal() throws Exception {
-		root.insert(input1);
-		root.insert(input2);
-	}
-
-	@Test
-	public void addCrossProduct() throws Exception {
-		assertNull(crossProduct1.getParent());
-		crossProduct1.setParent(root);
-		assertEquals(root, crossProduct1.getParent());
-		assertEquals(1, root.getChildCount());
-		assertEquals(crossProduct1, root.getChildAt(0));
-		assertEquals(Arrays.asList(crossProduct1), root.getChildren());
-		assertEquals(0, crossProduct1.getChildCount());
-
-		crossProduct1.insert(input1);
-		assertEquals(input1, crossProduct1.getChildAt(0));
-		crossProduct1.insert(input2, 0);
-		assertEquals(input2, crossProduct1.getChildAt(0));
-		assertEquals(input1, crossProduct1.getChildAt(1));
-		assertEquals(2, crossProduct1.getChildCount());
-		assertEquals(Arrays.asList(input2, input1), crossProduct1.getChildren());
-
-		// A re-insert should move it
-		crossProduct1.insert(input2, 2);
-		assertEquals(2, crossProduct1.getChildCount());
-		assertEquals(Arrays.asList(input1, input2), crossProduct1.getChildren());
-
-		crossProduct1.insert(input2, 0);
-		assertEquals(Arrays.asList(input2, input1), crossProduct1.getChildren());
-
-		crossProduct1.insert(input1, 1);
-		assertEquals(Arrays.asList(input2, input1), crossProduct1.getChildren());
-	}
-
-	@Test
-	public void addCrossProductMany() {
-		crossProduct1.insert(dotProduct1);
-		crossProduct1.insert(dotProduct2);
-		crossProduct1.insert(input1);
-		crossProduct1.insert(input2);
-		crossProduct1.insert(crossProduct2);
-		assertEquals(5, crossProduct1.getChildCount());
-		assertEquals(Arrays.asList(dotProduct1, dotProduct2, input1, input2,
-				crossProduct2), crossProduct1.getChildren());
-		Enumeration<IterationStrategyNode> enumeration = crossProduct1
-				.children();
-		assertTrue(enumeration.hasMoreElements());
-		assertEquals(dotProduct1, enumeration.nextElement());
-		assertEquals(dotProduct2, enumeration.nextElement());
-		assertEquals(input1, enumeration.nextElement());
-		assertEquals(input2, enumeration.nextElement());
-		assertEquals(crossProduct2, enumeration.nextElement());
-		assertFalse(enumeration.hasMoreElements());
-	}
-
-	@Test
-	public void moveNodeToDifferentParent() {
-		crossProduct1.setParent(root);
-		crossProduct1.insert(input1);
-		crossProduct1.insert(dotProduct1);
-		dotProduct1.insert(input2);
-		dotProduct1.insert(crossProduct2);
-
-		// Check tree
-		assertEquals(crossProduct2, root.getChildAt(0).getChildAt(1)
-				.getChildAt(1));
-		assertEquals(Arrays.asList(input2, crossProduct2), dotProduct1
-				.getChildren());
-
-		crossProduct1.insert(crossProduct2, 1);
-		assertEquals(Arrays.asList(input1, crossProduct2, dotProduct1),
-				crossProduct1.getChildren());
-		assertEquals(crossProduct1, crossProduct2.getParent());
-		// Should no longer be in dotProduct1
-		assertEquals(Arrays.asList(input2), dotProduct1.getChildren());
-	}
-
-	@Test(expected = IllegalStateException.class)
-	public void cantAddToNamedInput() throws Exception {
-		input1.insert(dotProduct1);
-	}
-
-	@Test
-	public void cantAddSelf() throws Exception {
-		dotProduct1.setParent(crossProduct1);
-		try {
-			dotProduct1.insert(dotProduct1);
-			fail("Didn't throw IllegalArgumentException");
-		} catch (IllegalArgumentException ex) {
-			// Make sure we didn't loose our old parent and
-			// ended up in a funny state
-			assertEquals(crossProduct1, dotProduct1.getParent());
-			assertEquals(dotProduct1, crossProduct1.getChildAt(0));
-		}
-	}
-
-	@Test
-	public void cantSetSelfParent() throws Exception {
-		crossProduct1.insert(dotProduct1);
-		try {
-			dotProduct1.setParent(dotProduct1);
-			fail("Didn't throw IllegalArgumentException");
-		} catch (IllegalArgumentException ex) {
-			// Make sure we didn't loose our old parent and
-			// ended up in a funny state
-			assertEquals(crossProduct1, dotProduct1.getParent());
-			assertEquals(dotProduct1, crossProduct1.getChildAt(0));
-		}
-	}
-
-	@Before
-	public void makeNodes() throws Exception {
-		root = new DummyTerminalNode();
-		input1 = new NamedInputPortNode("input1", 1);
-		input2 = new NamedInputPortNode("input2", 2);
-		crossProduct1 = new CrossProduct();
-		crossProduct2 = new CrossProduct();
-		dotProduct1 = new DotProduct();
-		dotProduct2 = new DotProduct();
-	}
-
-	protected final class DummyTerminalNode extends TerminalNode {
-
-		public int getIterationDepth(Map<String, Integer> inputDepths)
-				throws IterationTypeMismatchException {
-			return 0;
-		}
-
-		public void receiveCompletion(int inputIndex, Completion completion) {
-		}
-
-		public void receiveJob(int inputIndex, Job newJob) {
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-api/src/test/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker b/trunk/workflowmodel-api/src/test/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
deleted file mode 100644
index 63bb2e4..0000000
--- a/trunk/workflowmodel-api/src/test/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
+++ /dev/null
@@ -1,3 +0,0 @@
-net.sf.taverna.t2.workflowmodel.health.StringHealthChecker
-net.sf.taverna.t2.workflowmodel.health.FloatHealthChecker
-net.sf.taverna.t2.workflowmodel.health.FloatHealthChecker2
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/pom.xml b/trunk/workflowmodel-impl/pom.xml
deleted file mode 100644
index c8a8036..0000000
--- a/trunk/workflowmodel-impl/pom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>net.sf.taverna.t2</groupId>
-		<artifactId>core</artifactId>
-		<version>0.9</version>
-	</parent>
-	<groupId>net.sf.taverna.t2.core</groupId>
-	<artifactId>workflowmodel-impl</artifactId>
-	<name>Workflow Model implementation</name>
-	<description> Implementation of the core workflow object model for
-		Taverna 2 workflows including concrete instances of the workflow
-		definition objects and enactment behaviours.</description>
-	<dependencies>
-		<dependency>
-			<groupId>jdom</groupId>
-			<artifactId>jdom</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>net.sf.taverna.t2.core</groupId>
-			<artifactId>workflowmodel-api</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.thoughtworks.xstream</groupId>
-			<artifactId>xstream</artifactId>
-			<version>1.2.1</version>
-		</dependency>
-	</dependencies>
-</project>
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AddAnnotationAssertionEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AddAnnotationAssertionEdit.java
deleted file mode 100644
index 542a864..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AddAnnotationAssertionEdit.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-public class AddAnnotationAssertionEdit implements Edit<AnnotationChain> {
-
-	private boolean applied;
-
-	@SuppressWarnings("unchecked")
-	private AnnotationAssertion annotationAssertion;
-	private AnnotationChain annotationChain;
-
-	@SuppressWarnings("unchecked")
-	public AddAnnotationAssertionEdit(AnnotationChain annotationChain,
-			AnnotationAssertion annotationAssertion) {
-		this.annotationChain = annotationChain;
-		this.annotationAssertion = annotationAssertion;
-	}
-
-	public AnnotationChain doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied");
-		}
-		if (!(annotationChain instanceof AnnotationChainImpl)) {
-			throw new EditException(
-					"Object being edited must be instance of AnnotationChainImpl");
-		}
-
-		try {
-			synchronized (annotationChain) {
-				((AnnotationChainImpl) annotationChain)
-						.addAnnotationAssertion(annotationAssertion);
-				applied = true;
-				return this.annotationChain;
-			}
-		} catch (Exception e) {
-			applied = false;
-			throw new EditException("There was a problem with the edit", e);
-		}
-
-	}
-
-	public Object getSubject() {
-		return annotationChain;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		((AnnotationChainImpl)annotationChain).removeAnnotationAssertion(annotationAssertion);
-		applied = false;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationAssertionImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationAssertionImpl.java
deleted file mode 100644
index 30a7626..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationAssertionImpl.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-public class AnnotationAssertionImpl implements AnnotationAssertion<AnnotationBeanSPI> {
-	
-	private AnnotationBeanSPI annotationBean;
-	private AnnotationRole annotationRole;
-	private Date date;
-	private List<Person> creators;
-	private AnnotationSourceSPI annotationSource;
-	private List<CurationEvent<?>> curationEventList;
-
-	public AnnotationAssertionImpl(){
-		date = new Date();
-		curationEventList = new ArrayList<CurationEvent<?>>();
-		creators = new ArrayList<Person>();
-		
-	}
-	
-	public AnnotationAssertionImpl(AnnotationBeanSPI freeTextDescription, AnnotationRole annotationRole, List<Person> creators, AnnotationSourceSPI annotationSource) {
-		this.annotationBean = freeTextDescription;
-		this.annotationRole = annotationRole;
-		this.creators = creators;
-		this.annotationSource = annotationSource;
-	}
-
-	public AnnotationBeanSPI getDetail() {
-		return annotationBean;
-	}
-
-	public AnnotationRole getRole() {
-		return annotationRole;
-	}
-
-	public Date getCreationDate() {
-		return date;
-	}
-
-	public List<? extends Person> getCreators() {
-		return creators;
-	}
-	
-	public void addCreator(Person person) {
-		creators.add(person);
-	}
-	
-	public void removeCreator(Person person) {
-		creators.remove(person);
-	}
-
-	public List<CurationEvent<?>> getCurationAssertions() {
-		return curationEventList;
-	}
-
-	public AnnotationSourceSPI getSource() {
-		return annotationSource;
-	}
-
-	public void setAnnotationBean(AnnotationBeanSPI annotationBean) {
-		this.annotationBean = annotationBean;
-	}
-
-	public void setAnnotationRole(AnnotationRole annotationRole) {
-		this.annotationRole = annotationRole;
-	}
-	
-	public void removeAnnotationRole() {
-		this.annotationRole = null;
-	}
-
-	public void setDate(Date date) {
-		this.date = date;
-	}
-
-	public void setCreators(List<Person> creators) {
-		this.creators = creators;
-	}
-
-	public void setAnnotationSource(AnnotationSourceSPI annotationSource) {
-		this.annotationSource = annotationSource;
-	}
-	
-	public void removeAnnotationSource() {
-		this.annotationSource = null;
-	}
-
-	public void removeAnnotationBean() {
-		annotationBean = null;
-	}
-	
-	@SuppressWarnings("unchecked")
-	public void addCurationEvent(CurationEvent curationEvent) {
-		curationEventList.add(curationEvent);
-	}
-
-	@SuppressWarnings("unchecked")
-	public void removeCurationEvent(CurationEvent curationEvent) {
-		curationEventList.remove(curationEvent);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationChainImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationChainImpl.java
deleted file mode 100644
index 30b8500..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationChainImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class AnnotationChainImpl implements AnnotationChain{
-
-	private List<AnnotationAssertion<?>> annotationAssertions = new ArrayList<AnnotationAssertion<?>>();
-	
-	public List<AnnotationAssertion<?>> getAssertions() {
-		return new ArrayList<AnnotationAssertion<?>>(annotationAssertions);
-	}
-	
-	/**
-	 * Add an annotation to the chain Added because without the edits stuff how
-	 * else can we do it?
-	 * 
-	 * @param annotationAssertion
-	 */
-	@SuppressWarnings("unchecked")
-	public void addAnnotationAssertion(AnnotationAssertion annotationAssertion) {
-		annotationAssertions.add(annotationAssertion);
-	}
-	
-	@SuppressWarnings("unchecked")
-	public void removeAnnotationAssertion(AnnotationAssertion annotationAssertion) {
-		annotationAssertions.remove(annotationAssertion);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationEditsImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationEditsImpl.java
deleted file mode 100644
index ae36325..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/AnnotationEditsImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-public class AnnotationEditsImpl  {
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/DisputeEvent.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/DisputeEvent.java
deleted file mode 100644
index 20eb547..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/DisputeEvent.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-public class DisputeEvent implements CurationEvent<DisputeEventDetails>{
-	
-	private DisputeEventDetails disputeEventDetails;
-	private CurationEventType curationEventType;
-	private Curateable targetEvent;
-	
-	public DisputeEvent() {
-		
-	}
-	
-	
-	public DisputeEvent(DisputeEventDetails disputeEventDetails, CurationEventType curationEventType, Curateable targetEvent) {
-		this.disputeEventDetails = disputeEventDetails;
-		this.curationEventType = curationEventType;
-		this.targetEvent = targetEvent;
-	}
-
-	public DisputeEventDetails getDetail() {
-		return disputeEventDetails;
-	}
-
-	public Curateable getTarget() {
-		return targetEvent;
-	}
-
-	public CurationEventType getType() {
-		return curationEventType;
-	}
-
-
-	public void setDisputeEventDetails(DisputeEventDetails disputeEventDetails) {
-//		if (disputeEventDetails != null) {
-//			throw new RuntimeException("Dispute event details have already been set");
-//		}
-		this.disputeEventDetails = disputeEventDetails;
-	}
-
-
-	public void setCurationEventType(CurationEventType curationEventType) {
-//		if (curationEventType != null) {
-//			throw new RuntimeException("Curation event details have already been set");
-//		}
-		this.curationEventType = curationEventType;
-	}
-
-
-	public void setTargetEvent(Curateable targetEvent) {
-//		if (targetEvent!= null) {
-//			throw new RuntimeException("Target event details have already been set");
-//		}
-		this.targetEvent = targetEvent;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/DisputeEventDetails.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/DisputeEventDetails.java
deleted file mode 100644
index d6a51d6..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/DisputeEventDetails.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-public class DisputeEventDetails implements CurationEventBeanSPI {
-	
-	public DisputeEventDetails() {
-		
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/PersonImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/PersonImpl.java
deleted file mode 100644
index a29ee6f..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/PersonImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-public class PersonImpl implements Person {
-	
-	@SuppressWarnings("unused")
-	private String name;
-
-	public PersonImpl(String name) {
-		this.name = name;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/URISource.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/URISource.java
deleted file mode 100644
index 407b230..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/annotation/URISource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import java.net.URI;
-
-public class URISource implements AnnotationSourceSPI{
-	
-	private URI uri;
-	
-	public URISource() {
-		
-	}
-
-	public URISource(URI uri) {
-		this.uri = uri;
-	}
-
-	public void setUri(URI uri) {
-//		if (uri != null) {
-//			throw new RuntimeException("URI has already been set");
-//		}
-		this.uri = uri;
-	}
-
-	public URI getUri() {
-		return uri;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/facade/impl/WorkflowInstanceFacadeImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/facade/impl/WorkflowInstanceFacadeImpl.java
deleted file mode 100644
index 5535e09..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/facade/impl/WorkflowInstanceFacadeImpl.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.facade.impl;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.UUID;
-import java.util.WeakHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-import net.sf.taverna.t2.facade.FailureListener;
-import net.sf.taverna.t2.facade.ResultListener;
-import net.sf.taverna.t2.facade.WorkflowInstanceFacade;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.TokenOrderException;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.lang.observer.Observable;
-import net.sf.taverna.t2.lang.observer.Observer;
-import net.sf.taverna.t2.monitor.MonitorManager;
-import net.sf.taverna.t2.monitor.MonitorNode;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.provenance.item.DataflowRunComplete;
-import net.sf.taverna.t2.provenance.item.WorkflowDataProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.utility.TypedTreeModel;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EditsRegistry;
-import net.sf.taverna.t2.workflowmodel.InvalidDataflowException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorFinishedEvent;
-import net.sf.taverna.t2.workflowmodel.impl.ProcessorImpl;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.IntermediateProvenance;
-
-import org.apache.log4j.Logger;
-
-/**
- * Implementation of {@link WorkflowInstanceFacade}
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * @author Ian Dunlop
- * @author Alex Nenadic
- * 
- */
-public class WorkflowInstanceFacadeImpl implements WorkflowInstanceFacade {
-
-	private static Logger logger = Logger
-			.getLogger(WorkflowInstanceFacadeImpl.class);
-
-	protected static AtomicLong owningProcessId = new AtomicLong(0);
-
-	private InvocationContext context;
-
-	public InvocationContext getContext() {
-		return context;
-	}
-
-	private Dataflow dataflow;
-	private ResultListener facadeResultListener;
-	// In case workflow has no output ports we have to listen to individual processors to know when the workflow has finished
-	private List<ProcessorFinishedObserver> processorFinishedObservers;
-	// How many processors have finished so far
-	private int numberOfProcessorsFinished;
-	private String instanceOwningProcessId;
-	private String localName;
-	private MonitorManager monitorManager = MonitorManager.getInstance();
-	private boolean pushDataCalled = false;
-	protected List<FailureListener> failureListeners = new ArrayList<FailureListener>();
-	protected List<ResultListener> resultListeners = new ArrayList<ResultListener>();
-
-	private boolean provEnabled = false;
-	
-	private WeakHashMap<String, T2Reference> pushedDataMap = new WeakHashMap<String, T2Reference> ();
-
-	public WorkflowInstanceFacadeImpl(final Dataflow dataflow,
-			InvocationContext context, String parentProcess)
-			throws InvalidDataflowException {
-		DataflowValidationReport report = dataflow.checkValidity();
-		if (!report.isValid()) {
-			throw new InvalidDataflowException(dataflow, report);
-		}
-
-		this.dataflow = dataflow;
-		this.context = context;
-		this.localName = "facade" + owningProcessId.getAndIncrement();
-		if (parentProcess.equals("")) {
-			this.instanceOwningProcessId = localName;
-			// Add this WorkflowInstanceFacade to the map of all workflow run IDs 
-			// against the corresponding WorkflowInstanceFacadeS/ 
-			WorkflowInstanceFacade.workflowRunFacades.put(localName, this);
-			// Note that we do not put the IDs for nested workflows, just for the main ones!
-		} else {
-			this.instanceOwningProcessId = parentProcess + ":" + localName;
-		}
-		
-		WorkflowProvenanceItem workflowItem = null;
-		
-		if (context.getProvenanceReporter() != null) {
-
-			provEnabled = true;
-			workflowItem = new WorkflowProvenanceItem();
-			workflowItem.setDataflow(dataflow);
-			workflowItem.setProcessId(instanceOwningProcessId);
-			workflowItem.setIdentifier(UUID.randomUUID().toString());
-			workflowItem.setParentId(dataflow.getInternalIdentier());
-
-			addProvenanceLayerToProcessors(dataflow, workflowItem);
-			context.getProvenanceReporter().setSessionID(workflowItem.getIdentifier());
-			context.getProvenanceReporter().addProvenanceItem(workflowItem);
-		}
-		facadeResultListener = new FacadeResultListener(dataflow, workflowItem);
-		
-		// If workflow has no output ports then we have to monitor all its processors to know when 
-		// the workflow has finished running
-		if (dataflow.getOutputPorts().size() == 0){
-			processorFinishedObservers = new ArrayList<ProcessorFinishedObserver>();
-			// Register an observer with each of the processors
-			for (Processor processor: dataflow.getProcessors()){
-				ProcessorFinishedObserver observer = new ProcessorFinishedObserver(workflowItem);
-				((ProcessorImpl) processor).addObserver(observer);
-				processorFinishedObservers.add(observer);
-			}
-			numberOfProcessorsFinished = 0;
-		}
-	}
-
-	private void addProvenanceLayerToProcessors(Dataflow dataflow2, WorkflowProvenanceItem workflowItem) {
-		for (Processor processor : dataflow.getProcessors()) {
-			DispatchStack dispatchStack = processor.getDispatchStack();
-			List<DispatchLayer<?>> layers = dispatchStack.getLayers();
-			boolean provAlreadyAdded = false;
-			for (DispatchLayer<?> layer : layers) {
-				if (layer instanceof IntermediateProvenance) {
-					provAlreadyAdded = true;
-				}
-			}
-			if (provAlreadyAdded) {
-				continue;
-			}
-			for (int j = 0; j < layers.size(); j++) {
-				if (! (layers.get(j) instanceof ErrorBounce)) {
-					continue;
-				}
-				DispatchLayer<?> provenance = new IntermediateProvenance();
-				IntermediateProvenance intermediateProvenance = (IntermediateProvenance) provenance;
-				intermediateProvenance.setWorkflow(workflowItem);
-				intermediateProvenance.setReporter(context
-						.getProvenanceReporter());
-
-				Edits edits = EditsRegistry.getEdits();
-				try {
-					edits.getAddDispatchLayerEdit(dispatchStack, provenance,
-							j).doEdit();
-					break;
-				} catch (EditException e) {
-					logger.warn("adding provenance layer to dispatch stack failed "
-									+ e.toString());
-				}
-
-			}
-		}
-	}
-
-	public void addFailureListener(FailureListener listener) {
-		failureListeners.add(listener);
-	}
-
-	public synchronized void addResultListener(ResultListener listener) {
-		if (resultListeners.isEmpty()) {
-			for (DataflowOutputPort port : dataflow.getOutputPorts()) {
-				port.addResultListener(facadeResultListener);
-			}
-		}
-		resultListeners.add(listener);
-	}
-
-	public void fire() throws IllegalStateException {
-		if (pushDataCalled)
-			throw new IllegalStateException(
-					"Data has already been pushed, fire must be called first!");
-		monitorManager.registerNode(this, instanceOwningProcessId.split(":"),
-				new HashSet<MonitorableProperty<?>>());
-		dataflow.fire(instanceOwningProcessId, context);
-	}
-
-	public Dataflow getDataflow() {
-		return dataflow;
-	}
-
-	public TypedTreeModel<MonitorNode> getStateModel() {
-		// TODO WorkflowInstanceFacade.getStateModel not yet implemented
-		return null;
-	}
-
-	public void pushData(WorkflowDataToken token, String portName)
-			throws TokenOrderException {
-		// TODO: throw TokenOrderException when token stream is violates order
-		// constraints.
-		for (DataflowInputPort port : dataflow.getInputPorts()) {
-			if (portName.equals(port.getName())) {
-				pushedDataMap.put(portName, token.getData());
-				port.receiveEvent(token.pushOwningProcess(localName));
-			}
-		}
-		pushDataCalled = true;
-	}
-
-	public void removeFailureListener(FailureListener listener) {
-		failureListeners.remove(listener);
-	}
-
-	public synchronized void removeResultListener(ResultListener listener) {
-		resultListeners.remove(listener);
-		if (resultListeners.isEmpty()) {
-			for (DataflowOutputPort port : dataflow.getOutputPorts()) {
-				port.removeResultListener(facadeResultListener);
-			}
-		}
-	}
-
-	protected class FacadeResultListener implements ResultListener {
-		private int portsToComplete;
-		private final WorkflowProvenanceItem workflowItem;
-
-		public FacadeResultListener(Dataflow dataflow,
-				WorkflowProvenanceItem workflowItem) {
-			this.workflowItem = workflowItem;
-			portsToComplete = dataflow.getOutputPorts().size();
-		}
-
-		public void resultTokenProduced(WorkflowDataToken token, String portName) {
-			if (!instanceOwningProcessId.equals(token.getOwningProcess())) {
-				return;
-			}
-			if (provEnabled) {
-				WorkflowDataProvenanceItem workflowDataProvenanceItem = new WorkflowDataProvenanceItem();
-				workflowDataProvenanceItem.setPortName(portName);
-				workflowDataProvenanceItem.setData(token.getData());
-				workflowDataProvenanceItem.setReferenceService(context.getReferenceService());
-				workflowDataProvenanceItem.setParentId(workflowItem.getIdentifier());
-				workflowDataProvenanceItem.setWorkflowId(workflowItem.getParentId());
-				workflowDataProvenanceItem.setIdentifier(UUID.randomUUID().toString());
-				workflowDataProvenanceItem.setParentId(instanceOwningProcessId);
-				workflowDataProvenanceItem.setProcessId(instanceOwningProcessId);
-				workflowDataProvenanceItem.setIndex(token.getIndex());
-				workflowDataProvenanceItem.setFinal(token.isFinal());
-				context.getProvenanceReporter().addProvenanceItem(
-						workflowDataProvenanceItem);
-			}
-			synchronized (this) {
-				if (token.getIndex().length == 0) {
-					portsToComplete--;
-				}
-				if (portsToComplete == 0) {
-					// Received complete events on all ports, can
-					// un-register this node from the monitor
-					monitorManager.deregisterNode(
-							instanceOwningProcessId.split(":"));
-					if (provEnabled) {
-						try {
-							DataflowRunComplete dataflowRunComplete = new DataflowRunComplete();
-							dataflowRunComplete.setParentId(workflowItem.getParentId());
-							dataflowRunComplete.setWorkflowId(workflowItem.getIdentifier());
-							dataflowRunComplete
-									.setProcessId(instanceOwningProcessId);
-							dataflowRunComplete.setIdentifier(UUID.randomUUID().toString());
-							context.getProvenanceReporter().addProvenanceItem(
-									dataflowRunComplete);
-						} catch (Exception ex) {
-							logger.error("Could not store provenance for " + instanceOwningProcessId, ex);
-						}
-					}
-				}
-			}
-			ArrayList<ResultListener> copyOfListeners = new ArrayList<ResultListener>(
-					resultListeners);
-			for (ResultListener resultListener : copyOfListeners) {
-				try {
-					resultListener.resultTokenProduced(
-							token.popOwningProcess(), portName);
-				} catch (RuntimeException ex) {
-					logger.warn("Could not notify result listener "
-							+ resultListener, ex);
-				}
-			}
-
-		}
-	}
-	
-
-	/**
-	 * An observer of events that occur when a processor finishes with execution.
-	 *
-	 */
-	private class ProcessorFinishedObserver implements Observer<ProcessorFinishedEvent>{
-
-		private WorkflowProvenanceItem workflowItem;
-
-		public ProcessorFinishedObserver(WorkflowProvenanceItem workflowItem) {
-			this.workflowItem = workflowItem;
-		}
-
-		public void notify(Observable<ProcessorFinishedEvent> sender,
-				ProcessorFinishedEvent message) throws Exception {
-			
-			numberOfProcessorsFinished++;
-			
-			// De-register the processor node from the monitor as it has finished
-			monitorManager.deregisterNode(message.getOwningProcess());
-			
-			// De-register this observer from the processor
-			message.getProcessor().removeObserver(this);
-			
-			// All processors have finished => the workflow run has finished
-			if (numberOfProcessorsFinished == dataflow.getProcessors().size()){
-				
-				// De-register the workflow node from the monitor (if this is the top level 
-				// workflow object) as for some reason it does not get de-registered when
-				// there are no output ports 
-				if (dataflow.getLocalName().split(":").length==1){ // this is a top level workflow
-					monitorManager.deregisterNode(instanceOwningProcessId + ":" + dataflow.getLocalName());
-				}
-
-				// De-register this facade node from the monitor - this will effectively
-				// tell the monitor that the workflow run has finished
-				monitorManager.deregisterNode(instanceOwningProcessId);
-				
-				synchronized (this) {
-					if (provEnabled) {
-						DataflowRunComplete dataflowRunComplete = new DataflowRunComplete();
-						dataflowRunComplete.setParentId(workflowItem
-								.getIdentifier());
-						dataflowRunComplete
-								.setProcessId(instanceOwningProcessId);
-						dataflowRunComplete.setIdentifier(UUID.randomUUID()
-								.toString());
-						context.getProvenanceReporter().addProvenanceItem(
-								dataflowRunComplete);
-					}
-				}
-				
-				// Also remove this observer from the list of processor observers maintained by the facade
-				processorFinishedObservers.remove(this);
-			}
-		}
-	}
-
-	public WeakHashMap<String, T2Reference> getPushedDataMap() {
-		return pushedDataMap;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/monitor/impl/MonitorTreeModel.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/monitor/impl/MonitorTreeModel.java
deleted file mode 100644
index 212f738..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/monitor/impl/MonitorTreeModel.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor.impl;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Set;
-
-import javax.swing.JFrame;
-import javax.swing.JScrollPane;
-import javax.swing.JTree;
-import javax.swing.SwingUtilities;
-import javax.swing.event.TreeModelEvent;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.MutableTreeNode;
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreePath;
-
-import net.sf.taverna.t2.lang.observer.Observable;
-import net.sf.taverna.t2.lang.observer.Observer;
-import net.sf.taverna.t2.monitor.MonitorNode;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.monitor.NoSuchPropertyException;
-import net.sf.taverna.t2.monitor.MonitorManager.AddPropertiesMessage;
-import net.sf.taverna.t2.monitor.MonitorManager.DeregisterNodeMessage;
-import net.sf.taverna.t2.monitor.MonitorManager.MonitorMessage;
-import net.sf.taverna.t2.monitor.MonitorManager.RegisterNodeMessage;
-
-import org.apache.log4j.Logger;
-
-/**
- * A relatively naive Monitor interface which holds all
- * state in a tree model. Use getMonitor() to get the monitor singleton, all
- * workflows under a given JVM use the same instance in this implementation with
- * the root node of the monitor tree corresponding to the monitor itself.
- * <p>
- * Internally we use a default tree model with default mutable tree nodes where
- * the user object is set to instances of MonitorNode, with the exception of the
- * 'true' root of the tree in which it is set to the MonitorImpl itself
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public class MonitorTreeModel implements Observer<MonitorMessage> {
-
-	private static MonitorTreeModel instance = null;
-
-	private static Logger logger = Logger.getLogger(MonitorTreeModel.class);
-	
-	/**
-	 * Get the MonitorImpl singleton
-	 * 
-	 * @return The MonitorImpl singleton
-	 */
-	public synchronized static MonitorTreeModel getInstance() {
-		if (instance == null) {
-			instance = new MonitorTreeModel();
-		}
-		return instance;
-	}
-
-	private long nodeRemovalDelay = 1000;
-
-	private DefaultTreeModel monitorTree;
-
-	private java.util.Timer nodeRemovalTimer;
-
-	/**
-	 * Protected constructor, use singleton access {@link #getInstance()}
-	 * instead.
-	 * 
-	 */
-	protected MonitorTreeModel() {
-		monitorTree = new DefaultTreeModel(new DefaultMutableTreeNode(this));
-		// Create the node removal timer as a daemon thread
-		nodeRemovalTimer = new java.util.Timer(true);
-	}
-
-	/**
-	 * Returns a tree view over the monitor.
-	 * 
-	 * @return a tree view over the monitor
-	 */
-	public JTree getJTree() {
-		return new AlwaysOpenJTree(monitorTree);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void notify(Observable<MonitorMessage> sender, MonitorMessage message)
-			throws Exception {
-		if (message instanceof RegisterNodeMessage) {
-			RegisterNodeMessage regMessage = (RegisterNodeMessage) message;
-			registerNode(regMessage.getWorkflowObject(), regMessage
-					.getOwningProcess(), regMessage.getProperties());
-		} else if (message instanceof DeregisterNodeMessage) {
-			deregisterNode(message.getOwningProcess());
-		} else if (message instanceof AddPropertiesMessage) {
-			AddPropertiesMessage addMessage = (AddPropertiesMessage) message;
-			addPropertiesToNode(addMessage.getOwningProcess(), addMessage
-					.getNewProperties());
-		} else {
-			logger.warn("Unknown message " + message + " from " + sender);
-		}
-	}
-
-	/**
-	 * Nodes will be removed at least delayTime milliseconds after their initial
-	 * deregistration request, this allows UI components to show nodes which
-	 * would otherwise vanish almost instantaneously.
-	 * 
-	 * @param delayTime
-	 *            time in milliseconds between the deregistration request and
-	 *            attempt to actually remove the node in question
-	 */
-	public void setNodeRemovalDelay(long delayTime) {
-		nodeRemovalDelay = delayTime;
-	}
-
-	/**
-	 * Very simple UI!
-	 */
-	public void showMonitorFrame() {
-		final JTree tree = new AlwaysOpenJTree(monitorTree);
-		final JScrollPane jsp = new JScrollPane(tree);
-		JFrame frame = new JFrame();
-		frame.getContentPane().setLayout(new BorderLayout());
-		frame.getContentPane().add(jsp);
-		frame.pack();
-		frame.setVisible(true);
-		new javax.swing.Timer(500, new ActionListener() {
-			public void actionPerformed(ActionEvent ae) {
-				jsp.repaint();
-			}
-		}).start();
-	}
-
-	/**
-	 * Return the node pointed to by the first 'limit' number of elements in the
-	 * owning process string array. If limit is -1 then use owningProcess.length
-	 * 
-	 * @param owningProcess
-	 * @param limit
-	 * @return
-	 */
-	protected DefaultMutableTreeNode nodeAtProcessPath(String[] owningProcess,
-			int limit) throws IndexOutOfBoundsException {
-		if (limit == -1) {
-			limit = owningProcess.length;
-		}
-		DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) monitorTree
-				.getRoot();
-		for (int index = 0; index < limit && index < owningProcess.length; index++) {
-			boolean found = false;
-			for (int childIndex = 0; childIndex < monitorTree
-					.getChildCount(currentNode)
-					&& !found; childIndex++) {
-				DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) monitorTree
-						.getChild(currentNode, childIndex);
-				MonitorNode childMonitorNode = (MonitorNode) childNode
-						.getUserObject();
-				if (childMonitorNode.getOwningProcess()[index]
-						.equals(owningProcess[index])) {
-					currentNode = childNode;
-					found = true;
-					// break;
-				}
-			}
-			if (!found) {
-				throw new IndexOutOfBoundsException(
-						"Cannot locate node with process ID "
-								+ printProcess(owningProcess));
-			}
-		}
-		return currentNode;
-	}
-
-	protected String printProcess(String[] process) {
-		StringBuffer sb = new StringBuffer();
-		for (String part : process) {
-			sb.append("{" + part + "}");
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Inject properties into an existing node
-	 */
-	protected void addPropertiesToNode(String[] owningProcess,
-			Set<MonitorableProperty<?>> newProperties) {
-		try {
-			DefaultMutableTreeNode node = nodeAtProcessPath(owningProcess, -1);
-			MonitorNode mn = (MonitorNode) node.getUserObject();
-			for (MonitorableProperty<?> prop : newProperties) {
-				mn.addMonitorableProperty(prop);
-			}
-		} catch (IndexOutOfBoundsException ioobe) {
-			// Fail silently here, the node wasn't found in the state tree
-			logger.warn("Could not add properties to unknown node "
-					+ printProcess(owningProcess));
-		}
-	}
-
-	/**
-	 * Request the removal of the specified node from the monitor tree. In this
-	 * particular case the removal task will be added to a timer and executed at
-	 * some (slightly) later time as determined by the removalDelay property.
-	 */
-	protected void deregisterNode(String[] owningProcess) {
-		// logger.debug("Remove node @" +
-		// printProcess(owningProcess));
-		final DefaultMutableTreeNode nodeToRemove = nodeAtProcessPath(
-				owningProcess, -1);
-		((MonitorNodeImpl) nodeToRemove.getUserObject()).expire();
-		nodeRemovalTimer.schedule(new java.util.TimerTask() {
-			@Override
-			public void run() {
-				synchronized (monitorTree) {
-					monitorTree.removeNodeFromParent(nodeToRemove);
-				}
-			}
-		}, getNodeRemovalDelay());
-	}
-
-	/**
-	 * Create a new node in the monitor
-	 */
-	protected void registerNode(final Object workflowObject,
-			final String[] owningProcess,
-			final Set<MonitorableProperty<?>> properties) {
-		// logger.debug("Registering node " + printProcess(owningProcess));
-	
-		// Create a new MonitorNode
-		final DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
-				new MonitorNodeImpl(workflowObject, owningProcess, properties));
-		synchronized (monitorTree) {
-			final MutableTreeNode parentNode = nodeAtProcessPath(owningProcess,
-					owningProcess.length - 1);
-			monitorTree.insertNodeInto(newNode, parentNode, monitorTree
-					.getChildCount(parentNode));
-		}
-	}
-
-	class AlwaysOpenJTree extends JTree {
-		private static final long serialVersionUID = -3769998854485605447L;
-
-		public AlwaysOpenJTree(TreeModel newModel) {
-			super(newModel);
-			setRowHeight(18);
-			setLargeModel(true);
-			setEditable(false);
-			setExpandsSelectedPaths(false);
-			setDragEnabled(false);
-			setScrollsOnExpand(false);
-			setSelectionModel(EmptySelectionModel.sharedInstance());
-			setCellRenderer(new CellRenderer());
-		}
-
-		@Override
-		public void setModel(TreeModel model) {
-			if (treeModel == model)
-				return;
-			if (treeModelListener == null)
-				treeModelListener = new TreeModelListener();
-			if (model != null) {
-				model.addTreeModelListener(treeModelListener);
-			}
-			TreeModel oldValue = treeModel;
-			treeModel = model;
-			firePropertyChange(TREE_MODEL_PROPERTY, oldValue, model);
-		}
-
-		protected class CellRenderer extends DefaultTreeCellRenderer {
-			private static final long serialVersionUID = 7106767124654545039L;
-
-			@Override
-			public Component getTreeCellRendererComponent(JTree tree,
-					Object value, boolean sel, boolean expanded,
-					boolean leaf, int row, boolean hasFocus) {
-				super.getTreeCellRendererComponent(tree, value, sel,
-						expanded, leaf, row, hasFocus);
-				if (value instanceof DefaultMutableTreeNode) {
-					Object o = ((DefaultMutableTreeNode) value)
-							.getUserObject();
-					if (o instanceof MonitorNode) {
-						MonitorNode mn = (MonitorNode) o;
-						if (mn.hasExpired()) {
-							setEnabled(false);
-						}
-					}
-				}
-				return this;
-			}
-		}
-
-		protected class TreeModelListener extends TreeModelHandler {
-			@Override
-			public void treeNodesInserted(final TreeModelEvent ev) {
-				SwingUtilities.invokeLater(new Runnable() {
-					public void run() {
-						TreePath path = ev.getTreePath();
-						setExpandedState(path, true);
-						fireTreeExpanded(path);
-					}
-				});
-			}
-			@Override
-			public void treeStructureChanged(final TreeModelEvent ev) {
-				SwingUtilities.invokeLater(new Runnable() {
-					public void run() {
-						TreePath path = ev.getTreePath();
-						setExpandedState(path, true);
-						fireTreeExpanded(path);
-					}
-				});
-			}
-		}
-	}
-
-	class MonitorNodeImpl implements MonitorNode {
-
-		private boolean expired = false;
-		private String[] owningProcess;
-		private Set<MonitorableProperty<?>> properties;
-		private Object workflowObject;
-
-		Date creationDate = new Date();
-
-		MonitorNodeImpl(Object workflowObject, String[] owningProcess,
-				Set<MonitorableProperty<?>> properties) {
-			this.properties = properties;
-			this.workflowObject = workflowObject;
-			this.owningProcess = owningProcess;
-		}
-
-		public void addMonitorableProperty(MonitorableProperty<?> newProperty) {
-			properties.add(newProperty);
-		}
-
-		public void expire() {
-			expired = true;
-		}
-
-		public Date getCreationDate() {
-			return creationDate;
-		}
-
-		public String[] getOwningProcess() {
-			return owningProcess;
-		}
-
-		/**
-		 * Return an unmodifiable copy of the property set
-		 */
-		public Set<? extends MonitorableProperty<?>> getProperties() {
-			return Collections.unmodifiableSet(properties);
-		}
-
-		public Object getWorkflowObject() {
-			return workflowObject;
-		}
-
-		public boolean hasExpired() {
-			return this.expired;
-		}
-
-		@Override
-		public String toString() {
-			StringBuffer sb = new StringBuffer();
-			sb.append(getWorkflowObject().getClass().getSimpleName());
-			sb.append(", ");
-			sb.append(owningProcess[owningProcess.length - 1]);
-			sb.append(" : ");
-			for (MonitorableProperty<?> prop : getProperties()) {
-				int i = 0;
-				for (String nameElement : prop.getName()) {
-					sb.append(nameElement);
-					i++;
-					if (i < prop.getName().length) {
-						sb.append(".");
-					}
-				}
-				sb.append("=");
-				try {
-					sb.append(prop.getValue().toString());
-				} catch (NoSuchPropertyException nspe) {
-					sb.append("EXPIRED");
-				}
-				sb.append(" ");
-			}
-			return sb.toString();
-		}
-	}
-
-
-	public long getNodeRemovalDelay() {
-		return nodeRemovalDelay;
-	}
-
-	protected DefaultTreeModel getMonitorTree() {
-		return monitorTree;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractActivityEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractActivityEdit.java
deleted file mode 100644
index 834c671..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractActivityEdit.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * Abstraction of an edit acting on a Activity instance. Handles the check to
- * see that the Activity supplied is really a AbstractActivity.
- * 
- * @author David Withers
- * @author Stian Soiland-Reyes
- *
- */
-public abstract class AbstractActivityEdit extends AbstractEdit<Activity<?>, AbstractActivity<?>> {
-
-	protected AbstractActivityEdit(Activity<?> activity) {
-		super(AbstractActivity.class, activity);
-	}
-
-	public void setActivity(Activity<?> activity) {
-		this.subject = activity;
-	}
-
-	public Activity<?> getActivity() {
-		return getSubject();
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractBinaryProcessorEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractBinaryProcessorEdit.java
deleted file mode 100644
index 3484c5f..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractBinaryProcessorEdit.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.OrderedPair;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Generalization over all operations acting on an ordered pair of ProcessorImpl
- * objects. These include most operations where a relationship is created,
- * modified or destroyed between two processors.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractBinaryProcessorEdit implements
-		Edit<OrderedPair<Processor>> {
-
-	private OrderedPair<Processor> processors;
-
-	private boolean applied = false;
-
-	public AbstractBinaryProcessorEdit(Processor a, Processor b) {
-		this.processors = new OrderedPair<Processor>(a, b);
-	}
-
-	public final OrderedPair<Processor> doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (processors.getA() instanceof ProcessorImpl == false
-				|| processors.getB() instanceof ProcessorImpl == false) {
-			throw new EditException(
-					"Edit cannot be applied to a Processor which isn't an instance of ProcessorImpl");
-		}
-		ProcessorImpl pia = (ProcessorImpl) processors.getA();
-		ProcessorImpl pib = (ProcessorImpl) processors.getB();
-
-		try {
-			synchronized (processors) {
-				doEditAction(pia, pib);
-				applied = true;
-				return this.processors;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	public final OrderedPair<Processor> getSubject() {
-		return this.processors;
-	}
-
-	public final boolean isApplied() {
-		return this.applied;
-	}
-
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		ProcessorImpl pia = (ProcessorImpl) processors.getA();
-		ProcessorImpl pib = (ProcessorImpl) processors.getB();
-		synchronized (processors) {
-			undoEditAction(pia, pib);
-			applied = false;
-		}
-
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param processorA
-	 *            The ProcessorImpl which is in some sense the source of the
-	 *            relation between the two being asserted or operated on by this
-	 *            edit
-	 * @param processorB
-	 *            The ProcessorImpl at the other end of the relation. *
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(ProcessorImpl processorA,
-			ProcessorImpl processorB) throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 */
-	protected abstract void undoEditAction(ProcessorImpl processorA,
-			ProcessorImpl processorB);
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractCrystalizer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractCrystalizer.java
deleted file mode 100644
index 8c85998..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractCrystalizer.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.invocation.TreeCache;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Receives Job and Completion events and emits Jobs unaltered. Completion
- * events additionally cause registration of lists for each key in the datamap
- * of the jobs at immediate child locations in the index structure. These list
- * identifiers are sent in place of the Completion events.
- * <p>
- * State for a given process ID is purged when a final completion event is
- * received so there is no need for an explicit cache purge operation in the
- * public API (although for termination of partially complete workflows it may
- * be sensible for subclasses to provide one)
- * <p>
- * 
- * @author Tom Oinn
- */
-public abstract class AbstractCrystalizer implements Crystalizer {
-
-	private Map<String, CompletionAwareTreeCache> cacheMap = new HashMap<String, CompletionAwareTreeCache>();
-
-	public abstract Job getEmptyJob(String owningProcess, int[] index,
-			InvocationContext context);
-
-	/**
-	 * Receive a Job or Completion, Jobs are emitted unaltered and cached,
-	 * Completion events trigger registration of a corresponding list - this may
-	 * be recursive in nature if the completion event's index implies nested
-	 * lists which have not been registered.
-	 * <p>
-	 * If the baseListDepth property is defined then completion events on nodes
-	 * which don't already exist create empty jobs instead and emit those, if
-	 * undefined the completion event is emited intact.
-	 * 
-	 * @param e
-	 */
-	@SuppressWarnings("unchecked")
-	// suppressed to avoid jdk1.5 compilation errors caused by the declaration
-	// IterationInternalEvent<? extends IterationInternalEvent<?>> e
-	public void receiveEvent(IterationInternalEvent e) {
-		String owningProcess = e.getOwningProcess();
-		CompletionAwareTreeCache cache = null;
-		synchronized (cacheMap) {
-			if (!cacheMap.containsKey(owningProcess)) {
-				cache = new CompletionAwareTreeCache(owningProcess, e
-						.getContext());
-				cacheMap.put(owningProcess, cache);
-			} else {
-				cache = cacheMap.get(owningProcess);
-			}
-		}
-		synchronized (cache) {
-			if (e instanceof Job) {
-				// Pass through Job after storing it in the cache
-				Job j = (Job) e;
-				cache.insertJob(j);
-				jobCreated(j);
-				if (j.getIndex().length == 0) {
-					cacheMap.remove(j.getOwningProcess());
-				}
-				return;
-			} else if (e instanceof Completion) {
-				Completion c = (Completion) e;
-				int[] completionIndex = c.getIndex();
-				cache.resolveAt(owningProcess, completionIndex);
-				if (c.getIndex().length == 0) {
-					cacheMap.remove(c.getOwningProcess());
-				}
-			}
-		}
-	}
-
-	protected class CompletionAwareTreeCache extends TreeCache {
-
-		private String owningProcess;
-		private InvocationContext context;
-
-		public CompletionAwareTreeCache(String owningProcess,
-				InvocationContext context) {
-			super();
-			this.context = context;
-			this.owningProcess = owningProcess;
-		}
-
-		public void resolveAt(String owningProcess, int[] completionIndex) {
-			NamedNode n = nodeAt(completionIndex);
-			if (n != null) {
-				assignNamesTo(n, completionIndex);
-			} else {
-
-				// We know what the list depth should be, so we can
-				// construct appropriate depth empty lists to fill in the
-				// gaps.
-				Job j = getEmptyJob(owningProcess, completionIndex, context);
-				insertJob(j);
-				jobCreated(j);
-
-			}
-		}
-
-		private void assignNamesTo(NamedNode n, int[] index) {
-			// Only act if contents of this node undefined
-			// StringBuffer iString = new StringBuffer();
-			// for (int foo : index) {
-			// iString.append(foo+" ");
-			// }
-			if (n.contents == null) {
-				Map<String, List<T2Reference>> listItems = new HashMap<String, List<T2Reference>>();
-				int pos = 0;
-			for (NamedNode child : n.children) {
-
-					// If child doesn't have a defined name map yet then define
-					// it
-					Job j;
-					if (child == null) {
-						// happens if we're completing a partially empty
-						// collection structure
-						int[] newIndex = new int[index.length + 1];
-						for (int i = 0; i < index.length; i++) {
-							newIndex[i] = index[i];
-						}
-						newIndex[index.length] = pos++;
-						j = getEmptyJob(owningProcess, newIndex, context);
-						AbstractCrystalizer.this.jobCreated(j);
-					} else {
-
-						if (child.contents == null) {
-							int[] newIndex = new int[index.length + 1];
-							for (int i = 0; i < index.length; i++) {
-								newIndex[i] = index[i];
-							}
-							newIndex[index.length] = pos++;
-							assignNamesTo(child, newIndex);
-						} else {
-							pos++;
-						}
-						j = child.contents;
-					}
-					// Now pull the names out of the child job map and push them
-					// into lists to be registered
-
-					for (String outputName : j.getData().keySet()) {
-						List<T2Reference> items = listItems.get(outputName);
-						if (items == null) {
-							items = new ArrayList<T2Reference>();
-							listItems.put(outputName, items);
-						}
-						items.add(j.getData().get(outputName));
-					}
-				}
-				Map<String, T2Reference> newDataMap = new HashMap<String, T2Reference>();
-				for (String outputName : listItems.keySet()) {
-					List<T2Reference> idlist = listItems.get(outputName);
-					newDataMap.put(outputName, context.getReferenceService()
-							.getListService().registerList(idlist).getId());
-
-				}
-				Job newJob = new Job(owningProcess, index, newDataMap, context);
-				n.contents = newJob;
-				// Get rid of the children as we've now named this node
-				n.children.clear();
-				AbstractCrystalizer.this.jobCreated(n.contents);
-			}
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowEdit.java
deleted file mode 100644
index cc07d61..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowEdit.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Edit;
-
-/**
- * Abstraction of an edit acting on a Dataflow instance. Handles the check to
- * see that the Dataflow supplied is really a DataflowImpl.
- * 
- * @author David Withers
- * 
- */
-public abstract class AbstractDataflowEdit extends
-		AbstractEdit<Dataflow, DataflowImpl> implements Edit<Dataflow> {
-
-	protected AbstractDataflowEdit(Dataflow dataflow) {
-		super(DataflowImpl.class, dataflow);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowInputPortEdit.java
deleted file mode 100644
index f16c9cd..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowInputPortEdit.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Abstraction of an edit acting on a DataflowInputPort instance. Handles the check to
- * see that the DataflowInputPort supplied is really a DataflowInputPortImpl.
- * 
- * @author David Withers
- *
- */
-public abstract class AbstractDataflowInputPortEdit implements Edit<DataflowInputPort> {
-
-	private boolean applied = false;
-
-	private DataflowInputPort dataflowInputPort;
-
-	protected AbstractDataflowInputPortEdit(DataflowInputPort dataflowInputPort) {
-		if (dataflowInputPort == null) {
-			throw new RuntimeException(
-					"Cannot construct a DataflowInputPort edit with null DataflowInputPort");
-		}
-		this.dataflowInputPort = dataflowInputPort;
-	}
-
-	public final DataflowInputPort doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (dataflowInputPort instanceof DataflowInputPortImpl == false) {
-			throw new EditException(
-					"Edit cannot be applied to a DataflowInputPort which isn't an instance of DataflowInputPortImpl");
-		}
-		DataflowInputPortImpl dataflowInputPortImpl = (DataflowInputPortImpl) dataflowInputPort;
-		try {
-			synchronized (dataflowInputPortImpl) {
-				doEditAction(dataflowInputPortImpl);
-				applied = true;
-				return this.dataflowInputPort;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param dataflowInputPort
-	 *            The DataflowInputPortImpl to which the edit applies
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(DataflowInputPortImpl dataflowInputPort)
-			throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 */
-	protected abstract void undoEditAction(DataflowInputPortImpl dataflowInputPort);
-
-	public final DataflowInputPort getSubject() {
-		return dataflowInputPort;
-	}
-
-	public final boolean isApplied() {
-		return this.applied;
-	}
-
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		DataflowInputPortImpl dataflowInputPortImpl = (DataflowInputPortImpl) dataflowInputPort;
-		synchronized (dataflowInputPortImpl) {
-			undoEditAction(dataflowInputPortImpl);
-			applied = false;
-		}
-
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowOutputPortEdit.java
deleted file mode 100644
index 333145b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDataflowOutputPortEdit.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Abstraction of an edit acting on a DataflowOutputPort instance. Handles the check to
- * see that the DataflowOutputPort supplied is really a DataflowOutputPortImpl.
- * 
- * @author David Withers
- *
- */
-public abstract class AbstractDataflowOutputPortEdit implements Edit<DataflowOutputPort> {
-
-	private boolean applied = false;
-
-	private DataflowOutputPort dataflowOutputPort;
-
-	protected AbstractDataflowOutputPortEdit(DataflowOutputPort dataflowOutputPort) {
-		if (dataflowOutputPort == null) {
-			throw new RuntimeException(
-					"Cannot construct a DataflowOutputPort edit with null DataflowOutputPort");
-		}
-		this.dataflowOutputPort = dataflowOutputPort;
-	}
-
-	public final DataflowOutputPort doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (dataflowOutputPort instanceof DataflowOutputPortImpl == false) {
-			throw new EditException(
-					"Edit cannot be applied to a DataflowOutputPort which isn't an instance of DataflowOutputPortImpl");
-		}
-		DataflowOutputPortImpl dataflowOutputPortImpl = (DataflowOutputPortImpl) dataflowOutputPort;
-		try {
-			synchronized (dataflowOutputPortImpl) {
-				doEditAction(dataflowOutputPortImpl);
-				applied = true;
-				return this.dataflowOutputPort;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param dataflowOutputPort
-	 *            The DataflowOutputPortImpl to which the edit applies
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(DataflowOutputPortImpl dataflowOutputPort)
-			throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 */
-	protected abstract void undoEditAction(DataflowOutputPortImpl dataflowOutputPort);
-
-	public final DataflowOutputPort getSubject() {
-		return dataflowOutputPort;
-	}
-
-	public final boolean isApplied() {
-		return this.applied;
-	}
-
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		DataflowOutputPortImpl dataflowOutputPortImpl = (DataflowOutputPortImpl) dataflowOutputPort;
-		synchronized (dataflowOutputPortImpl) {
-			undoEditAction(dataflowOutputPortImpl);
-			applied = false;
-		}
-
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDatalinkEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDatalinkEdit.java
deleted file mode 100644
index cf46b3f..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDatalinkEdit.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Abstraction of an edit acting on a Datalink instance. Handles the check to
- * see that the Datalink supplied is really a DatalinkImpl.
- * 
- * @author David Withers
- *
- */
-public abstract class AbstractDatalinkEdit implements Edit<Datalink> {
-
-	private boolean applied = false;
-
-	private Datalink datalink;
-
-	protected AbstractDatalinkEdit(Datalink datalink) {
-		if (datalink == null) {
-			throw new RuntimeException(
-					"Cannot construct a datalink edit with null datalink");
-		}
-		this.datalink = datalink;
-	}
-
-	public final Datalink doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (datalink instanceof DatalinkImpl == false) {
-			throw new EditException(
-					"Edit cannot be applied to a Datalink which isn't an instance of DatalinkImpl");
-		}
-		DatalinkImpl datalinkImpl = (DatalinkImpl) datalink;
-		try {
-			synchronized (datalinkImpl) {
-				doEditAction(datalinkImpl);
-				applied = true;
-				return this.datalink;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param datalink
-	 *            The DatalinkImpl to which the edit applies
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(DatalinkImpl datalink)
-			throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 */
-	protected abstract void undoEditAction(DatalinkImpl datalink);
-
-	public final Datalink getSubject() {
-		return datalink;
-	}
-
-	public final boolean isApplied() {
-		return this.applied;
-	}
-
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		DatalinkImpl datalinkImpl = (DatalinkImpl) datalink;
-		synchronized (datalinkImpl) {
-			undoEditAction(datalinkImpl);
-			applied = false;
-		}
-
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractEdit.java
deleted file mode 100644
index f59098b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractEdit.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * An abstract {@link Edit} implementation that checks if an edit has been
- * applied or not, and that can also check if the subject implements the given
- * implementation subclass.
- * 
- * @author Stian Soiland-Reyes
- * 
- * @param <SubjectInterface>
- *            Official interface of the Subject of this edit
- * @param <SubjectType>
- *            Expected implementation type of the Subject of this edit
- */
-public abstract class AbstractEdit<SubjectInterface, SubjectType extends SubjectInterface>
-		implements Edit<SubjectInterface> {
-
-	private boolean applied = false;
-	protected SubjectInterface subject;
-	private final Class<? extends SubjectInterface> subjectType;
-
-	/**
-	 * Construct an AbstractEdit.
-	 * 
-	 * @param subjectType
-	 *            The expected implementation type of the subject. The edit will
-	 *            not go through unless the subject is an instance of this type.
-	 *            If the edit don't care about the implementation type, provide
-	 *            the official SubjectInterface instead.
-	 * @param subject
-	 *            The subject of this edit
-	 */
-	@SuppressWarnings("unchecked")
-	public AbstractEdit(Class<?> subjectType, SubjectInterface subject) {
-		if (subject == null && !isNullSubjectAllowed()) {
-			throw new RuntimeException(
-					"Cannot construct an edit with null subject");
-		}
-		this.subjectType = (Class<? extends SubjectInterface>) subjectType;
-		this.subject = subject;
-	}
-
-	protected boolean isNullSubjectAllowed() {
-		return false;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@SuppressWarnings("unchecked")
-	public final SubjectInterface doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (!subjectType.isInstance(subject)) {
-			throw new EditException(
-					"Edit cannot be applied to a object which isn't an instance of "
-							+ subjectType);
-		}
-		SubjectType subjectImpl = (SubjectType) subject;
-		try {
-			synchronized (subjectImpl) {
-				doEditAction(subjectImpl);
-				applied = true;
-				return this.subject;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param subjectImpl
-	 *            The implementation instance to which the edit applies
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(SubjectType subjectImpl)
-			throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 * 
-	 * @param subjectImpl
-	 *            The implementation instance to which the edit applies
-	 */
-	protected abstract void undoEditAction(SubjectType subjectImpl);
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@SuppressWarnings("unchecked")
-	public final SubjectType getSubject() {
-		return (SubjectType) subject;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public final boolean isApplied() {
-		return applied;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@SuppressWarnings("unchecked")
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		SubjectType subjectImpl = (SubjectType) subject;
-		synchronized (subjectImpl) {
-			undoEditAction(subjectImpl);
-			applied = false;
-		}
-
-	}
-
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractEventHandlingInputPort.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractEventHandlingInputPort.java
deleted file mode 100644
index 1351500..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractEventHandlingInputPort.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.AbstractPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-/**
- * Extends AbstractPort with the getIncomingLink method and an additional
- * implementation method to set the incoming data link
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractEventHandlingInputPort extends AbstractPort
-		implements EventHandlingInputPort {
-
-	private Datalink incomingLink = null;
-
-	protected AbstractEventHandlingInputPort(String name, int depth) {
-		super(name, depth);
-	}
-
-	public Datalink getIncomingLink() {
-		return this.incomingLink;
-	}
-
-	protected void setIncomingLink(Datalink newLink) {
-		this.incomingLink = newLink;
-	}
-	
-	protected void setName(String name) {
-		this.name = name;
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractFilteringInputPort.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractFilteringInputPort.java
deleted file mode 100644
index b73ba6f..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractFilteringInputPort.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.reference.ContextualizedT2Reference;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.FilteringInputPort;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-
-/**
- * Abstract superclass for filtering input ports, extend and implement the
- * pushXXX methods to configure behaviour
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractFilteringInputPort extends
-		AbstractEventHandlingInputPort implements FilteringInputPort {
-
-	protected AbstractFilteringInputPort(String name, int depth) {
-		super(name, depth);
-		this.filterDepth = depth;
-	}
-
-	public int getFilterDepth() {
-		return this.filterDepth;
-	}
-
-	private int filterDepth;
-
-	public void receiveEvent(WorkflowDataToken token) {
-		receiveToken(token);
-	}
-
-	public void pushToken(WorkflowDataToken dt, String owningProcess,
-			int desiredDepth) {
-		if (dt.getData().getDepth() == desiredDepth) {
-			pushData(getName(), owningProcess, dt.getIndex(), dt.getData(), dt
-					.getContext());
-		} else {
-
-			ReferenceService rs = dt.getContext().getReferenceService();
-
-			Iterator<ContextualizedT2Reference> children = rs.traverseFrom(dt
-					.getData(), dt.getData().getDepth() - 1);
-
-			while (children.hasNext()) {
-				ContextualizedT2Reference ci = children.next();
-				int[] newIndex = new int[dt.getIndex().length
-						+ ci.getIndex().length];
-				int i = 0;
-				for (int indx : dt.getIndex()) {
-					newIndex[i++] = indx;
-				}
-				for (int indx : ci.getIndex()) {
-					newIndex[i++] = indx;
-				}
-				pushToken(new WorkflowDataToken(owningProcess, newIndex, ci
-						.getReference(), dt.getContext()), owningProcess,
-						desiredDepth);
-			}
-			pushCompletion(getName(), owningProcess, dt.getIndex(), dt
-					.getContext());
-		}
-	}
-
-	public void receiveToken(WorkflowDataToken token) {
-		String newOwner = transformOwningProcess(token.getOwningProcess());
-		if (filterDepth == -1) {
-			throw new WorkflowStructureException(
-					"Input depth filter not configured on input port, failing");
-		} else {
-			int tokenDepth = token.getData().getDepth();
-			if (tokenDepth == filterDepth) {
-				if (filterDepth == getDepth()) {
-					// Pass event straight through, the filter depth is the same
-					// as the desired input port depth
-					pushData(getName(), newOwner, token.getIndex(), token
-							.getData(), token.getContext());
-				} else {
-					pushToken(token, newOwner, getDepth());
-					/**
-					 * // Shred the input identifier into the appropriate port //
-					 * depth and send the events through, pushing a //
-					 * completion event at the end. DataManager dManager =
-					 * ContextManager .getDataManager(newOwner); Iterator<ContextualizedIdentifier>
-					 * children = dManager .traverse(token.getData(),
-					 * getDepth()); while (children.hasNext()) {
-					 * ContextualizedIdentifier ci = children.next(); int[]
-					 * newIndex = new int[token.getIndex().length +
-					 * ci.getIndex().length]; int i = 0; for (int indx :
-					 * token.getIndex()) { newIndex[i++] = indx; } for (int indx :
-					 * ci.getIndex()) { newIndex[i++] = indx; }
-					 * pushData(getName(), newOwner, newIndex, ci.getDataRef()); }
-					 * pushCompletion(getName(), newOwner, token.getIndex());
-					 */
-
-				}
-			} else if (tokenDepth > filterDepth) {
-				// Convert to a completion event and push into the iteration
-				// strategy
-				pushCompletion(getName(), newOwner, token.getIndex(), token
-						.getContext());
-			} else if (tokenDepth < filterDepth) {
-				// Normally we can ignore these, but there is a special case
-				// where token depth is less than filter depth and there is no
-				// index array. In this case we can't throw the token away as
-				// there will never be an enclosing one so we have to use the
-				// data manager to register a new single element collection and
-				// recurse.
-				if (token.getIndex().length == 0) {
-					T2Reference ref = token.getData();
-					ReferenceService rs = token.getContext()
-							.getReferenceService();
-					int currentDepth = tokenDepth;
-					while (currentDepth < filterDepth) {
-						// Wrap in a single item list
-						List<T2Reference> newList = new ArrayList<T2Reference>();
-						newList.add(ref);
-						ref = rs.getListService().registerList(newList).getId();
-						currentDepth++;
-					}
-					pushData(getName(), newOwner, new int[0], ref, token
-							.getContext());
-				}
-			}
-		}
-	}
-
-	public void setFilterDepth(int filterDepth) {
-		this.filterDepth = filterDepth;
-		if (filterDepth < getDepth()) {
-			this.filterDepth = getDepth();
-		}
-	}
-
-	/**
-	 * Action to take when the filter pushes a completion event out
-	 * 
-	 * @param portName
-	 * @param owningProcess
-	 * @param index
-	 */
-	protected abstract void pushCompletion(String portName,
-			String owningProcess, int[] index, InvocationContext context);
-
-	/**
-	 * Action to take when a data event is created by the filter
-	 * 
-	 * @param portName
-	 * @param owningProcess
-	 * @param index
-	 * @param data
-	 */
-	protected abstract void pushData(String portName, String owningProcess,
-			int[] index, T2Reference data, InvocationContext context);
-
-	/**
-	 * Override this to transform owning process identifiers as they pass
-	 * through the filter, by default this is the identity transformation
-	 * 
-	 * @param oldOwner
-	 * @return
-	 */
-	protected String transformOwningProcess(String oldOwner) {
-		return oldOwner;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractMergeEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractMergeEdit.java
deleted file mode 100644
index 70739e0..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractMergeEdit.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-
-public abstract class AbstractMergeEdit implements Edit<Merge>{
-	
-	Merge merge;
-	boolean applied=false;
-	
-	public AbstractMergeEdit(Merge merge) {
-		if (merge==null) throw new RuntimeException("Cannot construct a merge edit with a null merge");
-		this.merge=merge;
-	}
-
-	public Merge doEdit() throws EditException {
-		if (applied) throw new EditException("Edit has already been applied!");
-		if (!(merge instanceof MergeImpl)) throw new EditException("Merge must be an instanceof MergeImpl");
-		MergeImpl mergeImpl = (MergeImpl)merge;
-		try {
-			synchronized (mergeImpl) {
-				doEditAction(mergeImpl);
-				applied = true;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-		
-		return this.merge;
-	}
-
-	protected abstract void doEditAction(MergeImpl mergeImpl) throws EditException;
-	protected abstract void undoEditAction(MergeImpl mergeImpl);
-	
-	public Object getSubject() {
-		return merge;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		MergeImpl mergeImpl = (MergeImpl) merge;
-		synchronized (mergeImpl) {
-			undoEditAction(mergeImpl);
-			applied = false;
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractProcessorEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractProcessorEdit.java
deleted file mode 100644
index cefc24d..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AbstractProcessorEdit.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Abstraction of an edit acting on a Processor instance. Handles the check to
- * see that the Processor supplied is really a ProcessorImpl.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractProcessorEdit implements Edit<Processor> {
-
-	private boolean applied = false;
-
-	private Processor processor;
-
-	protected AbstractProcessorEdit(Processor p) {
-		if (p == null) {
-			throw new RuntimeException(
-					"Cannot construct a processor edit with null processor");
-		}
-		this.processor = p;
-	}
-
-	public final Processor doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (!(processor instanceof ProcessorImpl)) {
-			throw new EditException(
-					"Edit cannot be applied to a Processor which isn't an instance of ProcessorImpl");
-		}
-		ProcessorImpl pi = (ProcessorImpl) processor;
-		try {
-			synchronized (pi) {
-				doEditAction(pi);
-				applied = true;
-				return this.processor;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param processor
-	 *            The ProcessorImpl to which the edit applies
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(ProcessorImpl processor)
-			throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 */
-	protected abstract void undoEditAction(ProcessorImpl processor);
-
-	public final Processor getSubject() {
-		return processor;
-	}
-
-	public final boolean isApplied() {
-		return this.applied;
-	}
-
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		ProcessorImpl pi = (ProcessorImpl) processor;
-		synchronized (pi) {
-			undoEditAction(pi);
-			applied = false;
-		}
-
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityEdit.java
deleted file mode 100644
index 972b462..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityEdit.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * Add a new Activity to a Processor, adding the new Activity at the end of the
- * current activity list for that processor.
- * 
- * @author Tom Oinn
- * 
- */
-public class AddActivityEdit extends AbstractProcessorEdit {
-
-	private Activity<?> activityToAdd;
-
-	public AddActivityEdit(Processor processor, Activity<?> activity) {
-		super(processor);
-		this.activityToAdd = activity;
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		List<Activity<?>> activities = processor.activityList;
-		if (activities.contains(activityToAdd) == false) {
-			synchronized (processor) {
-				activities.add(activityToAdd);
-			}
-		} else {
-			throw new EditException(
-					"Cannot add a duplicate activity to processor");
-		}
-
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		synchronized (processor) {
-			processor.activityList.remove(activityToAdd);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityInputPortEdit.java
deleted file mode 100644
index fb9c6c6..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityInputPortEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-
-/**
- * Adds an activity input port to an activity.
- * 
- * @author David Withers
- */
-public class AddActivityInputPortEdit extends AbstractActivityEdit {
-
-	private ActivityInputPort activityInputPort;
-
-	public AddActivityInputPortEdit(Activity<?> activity, ActivityInputPort activityInputPort) {
-		super(activity);
-		this.activityInputPort = activityInputPort;
-	}
-
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity) throws EditException {
-		activity.getInputPorts().add(activityInputPort);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getInputPorts().remove(activityInputPort);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityInputPortMappingEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityInputPortMappingEdit.java
deleted file mode 100644
index ce5e3d0..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityInputPortMappingEdit.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-public class AddActivityInputPortMappingEdit extends AbstractActivityEdit {
-
-	private final String processorPortName;
-	private final String activityPortName;
-
-	public AddActivityInputPortMappingEdit(Activity<?> activity, String processorPortName, String activityPortName) {
-		super(activity);
-		this.processorPortName = processorPortName;
-		this.activityPortName = activityPortName;
-	}
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity)
-			throws EditException {
-		if (activity.getInputPortMapping().containsKey(processorPortName)) throw new EditException("The output mapping for processor name:"+processorPortName+" already exists");
-		// Note javadoc of getOutputPortMapping - the mapping is processorPort -> activityPort
-		// -- opposite of the outputPortMapping
-		activity.getInputPortMapping().put(processorPortName, activityPortName);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getInputPortMapping().remove(processorPortName);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityOutputPortEdit.java
deleted file mode 100644
index 481387a..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityOutputPortEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * Adds an output port to an activity.
- * 
- * @author David Withers
- */
-public class AddActivityOutputPortEdit extends AbstractActivityEdit {
-
-	private OutputPort activityOutputPort;
-
-	public AddActivityOutputPortEdit(Activity<?> activity, OutputPort activityInputPort) {
-		super(activity);
-		this.activityOutputPort = activityInputPort;
-	}
-
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity) throws EditException {
-		activity.getOutputPorts().add(activityOutputPort);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getOutputPorts().remove(activityOutputPort);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityOutputPortMappingEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityOutputPortMappingEdit.java
deleted file mode 100644
index 19caeab..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddActivityOutputPortMappingEdit.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-public class AddActivityOutputPortMappingEdit extends AbstractActivityEdit {
-
-	private final String processorPortName;
-	private final String activityPortName;
-
-	public AddActivityOutputPortMappingEdit(Activity<?> activity, String processorPortName, String activityPortName) {
-		super(activity);
-		this.processorPortName = processorPortName;
-		this.activityPortName = activityPortName;
-	}
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity)
-			throws EditException {
-		if (activity.getOutputPortMapping().containsKey(activityPortName)) throw new EditException("The mapping starting with:"+activityPortName+" already exists");
-		// Note javadoc of getOutputPortMapping - the mapping is activityPort -> processorPort
-		// -- opposite of the outputPortMapping
-		activity.getOutputPortMapping().put(activityPortName, processorPortName);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getOutputPortMapping().remove(activityPortName);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationBeanEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationBeanEdit.java
deleted file mode 100644
index 027a4b4..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationBeanEdit.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationAssertionImpl;
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-@SuppressWarnings("unchecked")
-public class AddAnnotationBeanEdit implements Edit<AnnotationAssertion> {
-
-	private AnnotationAssertion annotationAssertion;
-	private AnnotationBeanSPI annotationBean;
-	private boolean applied;
-
-	public AddAnnotationBeanEdit(AnnotationAssertion annotationAssertion,
-			AnnotationBeanSPI annotationBean) {
-				this.annotationAssertion = annotationAssertion;
-				this.annotationBean = annotationBean;
-	}
-
-	public AnnotationAssertion doEdit() throws EditException {
-			if (applied) {
-				throw new EditException("Edit has already been applied");
-			}
-			if (!(annotationAssertion instanceof AnnotationAssertionImpl)) {
-				throw new EditException(
-						"Object being edited must be instance of AnnotationAssertionImpl");
-			}
-
-			try {
-				synchronized (annotationAssertion) {
-					((AnnotationAssertionImpl) annotationAssertion).setAnnotationBean(annotationBean);
-					applied = true;
-					return this.annotationAssertion;
-				}
-			} catch (Exception e) {
-				applied = false;
-				throw new EditException("There was a problem with the edit", e);
-			}
-	}
-
-	public Object getSubject() {
-		return annotationAssertion;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		((AnnotationAssertionImpl) annotationAssertion).removeAnnotationBean();
-		applied = false;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationRoleEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationRoleEdit.java
deleted file mode 100644
index 94d1069..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationRoleEdit.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationAssertionImpl;
-import net.sf.taverna.t2.annotation.AnnotationRole;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-@SuppressWarnings("unchecked")
-public class AddAnnotationRoleEdit implements Edit<AnnotationAssertion> {
-
-	private AnnotationAssertion annotationAssertion;
-	private AnnotationRole annotationRole;
-	private boolean applied;
-
-	@SuppressWarnings("unchecked")
-	public AddAnnotationRoleEdit(AnnotationAssertion annotationAssertion,
-			AnnotationRole annotationRole) {
-		this.annotationAssertion = annotationAssertion;
-		this.annotationRole = annotationRole;
-	}
-
-	public AnnotationAssertion doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied");
-		}
-		if (!(annotationAssertion instanceof AnnotationAssertionImpl)) {
-			throw new EditException(
-					"Object being edited must be instance of AnnotationAssertionImpl");
-		}
-
-		try {
-			synchronized (annotationAssertion) {
-				((AnnotationAssertionImpl) annotationAssertion)
-						.setAnnotationRole(annotationRole);
-				applied = true;
-				return this.annotationAssertion;
-			}
-		} catch (Exception e) {
-			applied = false;
-			throw new EditException("There was a problem with the edit", e);
-		}
-	}
-
-	public Object getSubject() {
-		return annotationAssertion;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		((AnnotationAssertionImpl) annotationAssertion).removeAnnotationRole();
-		applied = false;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationSourceEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationSourceEdit.java
deleted file mode 100644
index 34814dc..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddAnnotationSourceEdit.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationAssertionImpl;
-import net.sf.taverna.t2.annotation.AnnotationSourceSPI;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-@SuppressWarnings("unchecked")
-public class AddAnnotationSourceEdit implements Edit<AnnotationAssertion> {
-
-	private AnnotationAssertion annotationAssertion;
-	private AnnotationSourceSPI annotationSource;
-	private boolean applied;
-
-	@SuppressWarnings("unchecked")
-	public AddAnnotationSourceEdit(AnnotationAssertion annotationAssertion,
-			AnnotationSourceSPI annotationSource) {
-		this.annotationAssertion = annotationAssertion;
-		this.annotationSource = annotationSource;
-	}
-
-	public AnnotationAssertion doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied");
-		}
-		if (!(annotationAssertion instanceof AnnotationAssertionImpl)) {
-			throw new EditException(
-					"Object being edited must be instance of AnnotationAssertionImpl");
-		}
-
-		try {
-			synchronized (annotationAssertion) {
-				((AnnotationAssertionImpl) annotationAssertion)
-						.setAnnotationSource(annotationSource);
-				applied = true;
-				return this.annotationAssertion;
-			}
-		} catch (Exception e) {
-			applied = false;
-			throw new EditException("There was a problem with the edit", e);
-		}
-	}
-
-	public Object getSubject() {
-		return annotationAssertion;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		((AnnotationAssertionImpl) annotationAssertion)
-				.removeAnnotationSource();
-		applied = false;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddCreatorEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddCreatorEdit.java
deleted file mode 100644
index 5b716eb..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddCreatorEdit.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationAssertionImpl;
-import net.sf.taverna.t2.annotation.Person;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-@SuppressWarnings("unchecked")
-public class AddCreatorEdit implements Edit<AnnotationAssertion> {
-
-	private AnnotationAssertion annotationAssertion;
-	private Person person;
-	private boolean applied;
-
-	@SuppressWarnings("unchecked")
-	public AddCreatorEdit(AnnotationAssertion annotationAssertion, Person person) {
-		this.annotationAssertion = annotationAssertion;
-		this.person = person;
-	}
-
-	public AnnotationAssertion doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied");
-		}
-		if (!(annotationAssertion instanceof AnnotationAssertionImpl)) {
-			throw new EditException(
-					"Object being edited must be instance of AnnotationAssertionImpl");
-		}
-
-		try {
-			synchronized (annotationAssertion) {
-				((AnnotationAssertionImpl) annotationAssertion).addCreator(person);
-				applied = true;
-				return this.annotationAssertion;
-			}
-		} catch (Exception e) {
-			applied = false;
-			throw new EditException("There was a problem with the edit", e);
-		}
-	}
-
-	public Object getSubject() {
-		return annotationAssertion;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		((AnnotationAssertionImpl) annotationAssertion).removeCreator(person);
-		applied = false;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddCurationEventEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddCurationEventEdit.java
deleted file mode 100644
index a256930..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddCurationEventEdit.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationAssertionImpl;
-import net.sf.taverna.t2.annotation.CurationEvent;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-@SuppressWarnings("unchecked")
-public class AddCurationEventEdit implements Edit<AnnotationAssertion> {
-
-	private AnnotationAssertion annotationAssertion;
-	private CurationEvent curationEvent;
-	private boolean applied;
-
-	@SuppressWarnings("unchecked")
-	public AddCurationEventEdit(AnnotationAssertion annotationAssertion,
-			CurationEvent curationEvent) {
-				this.annotationAssertion = annotationAssertion;
-				this.curationEvent = curationEvent;
-	}
-
-	public AnnotationAssertion doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied");
-		}
-		if (!(annotationAssertion instanceof AnnotationAssertionImpl)) {
-			throw new EditException(
-					"Object being edited must be instance of AnnotationAssertionImpl");
-		}
-
-		try {
-			synchronized (annotationAssertion) {
-				((AnnotationAssertionImpl) annotationAssertion)
-						.addCurationEvent(curationEvent);
-				applied = true;
-				return this.annotationAssertion;
-			}
-		} catch (Exception e) {
-			applied = false;
-			throw new EditException("There was a problem with the edit", e);
-		}
-	}
-
-	public Object getSubject() {
-		return annotationAssertion;
-	}
-
-	public boolean isApplied() {
-		return applied;
-	}
-
-	public void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		((AnnotationAssertionImpl)annotationAssertion).removeCurationEvent(curationEvent);
-		applied = false;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddDataflowInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddDataflowInputPortEdit.java
deleted file mode 100644
index a3065d0..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddDataflowInputPortEdit.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Adds a dataflow input port to a dataflow.
- * 
- * @author David Withers
- */
-public class AddDataflowInputPortEdit extends AbstractDataflowEdit {
-
-	private DataflowInputPort dataflowInputPort;
-
-	public AddDataflowInputPortEdit(Dataflow dataflow, DataflowInputPort dataflowInputPort) {
-		super(dataflow);
-		this.dataflowInputPort = dataflowInputPort;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		if (dataflowInputPort instanceof DataflowInputPortImpl) {
-			dataflow.addInputPort((DataflowInputPortImpl) dataflowInputPort);
-		}
-		else {
-			throw new EditException("The DataflowInputPort is of the wrong implmentation, it should be of type DataflowInputPortImpl");
-		}
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		try {
-			dataflow.removeDataflowInputPort(dataflowInputPort);
-		} catch (EditException e1) {
-			//this port has already been added
-		}
-	}
-
-	public DataflowInputPort getDataflowInputPort() {
-		return dataflowInputPort;
-	}
-
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddDataflowOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddDataflowOutputPortEdit.java
deleted file mode 100644
index 5cc5409..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddDataflowOutputPortEdit.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Adds a dataflow output port to a dataflow.
- * 
- * @author David Withers
- */
-public class AddDataflowOutputPortEdit extends AbstractDataflowEdit {
-
-	private DataflowOutputPort dataflowOutputPort;
-
-	public AddDataflowOutputPortEdit(Dataflow dataflow, DataflowOutputPort dataflowOutputPort) {
-		super(dataflow);
-		this.dataflowOutputPort = dataflowOutputPort;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		if (dataflowOutputPort instanceof DataflowOutputPortImpl) {
-			dataflow.addOutputPort((DataflowOutputPortImpl) dataflowOutputPort);
-		}
-		else {
-			throw new EditException("The DataflowOutputPort is of the wrong implmentation, it should be of type DataflowOutputPortImpl");
-		}
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		try {
-			dataflow.removeDataflowOutputPort(dataflowOutputPort);
-		} catch (EditException e1) {
-			//this port has already been added
-		}
-	}
-	
-	public DataflowOutputPort getDataflowOutputPort() {
-		return dataflowOutputPort;
-	}
-
-
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddMergeEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddMergeEdit.java
deleted file mode 100644
index a84ca24..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddMergeEdit.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-
-/**
- * An Edit class responsible for adding a Merge to the dataflow.
- * 
- * @author Tom Oinn
- *
- */
-public class AddMergeEdit extends AbstractDataflowEdit{
-	
-	private Merge merge;
-	
-	protected AddMergeEdit(Dataflow dataflow, Merge merge) {
-		super(dataflow);
-		this.merge=merge;
-	}
-
-	/**
-	 * Adds the Merge instance to the Dataflow
-	 * 
-	 * @throws EditException if the edit has already taken place (without an intermediate undo) or a processor with that name already exists.
-	 */
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		if (merge instanceof MergeImpl) {
-			dataflow.addMerge((MergeImpl)merge);
-		}
-		else {
-			throw new EditException("The Merge is of the wrong implmentation, it should be of type MergeImpl");
-		}
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		dataflow.removeMerge(merge);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddMergeInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddMergeInputPortEdit.java
deleted file mode 100644
index 4c20738..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddMergeInputPortEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-
-/**
- * Adds a merge input port to a merge.
- * 
- * @author David Withers
- */
-public class AddMergeInputPortEdit extends AbstractMergeEdit {
-
-	private MergeInputPort mergeInputPort;
-	
-	public AddMergeInputPortEdit(Merge merge, MergeInputPort mergeInputPort) {
-		super(merge);
-		this.mergeInputPort = mergeInputPort;
-	}
-
-	@Override
-	protected void doEditAction(MergeImpl mergeImpl) throws EditException {
-		if (mergeInputPort instanceof MergeInputPortImpl) {
-			mergeImpl.addInputPort((MergeInputPortImpl) mergeInputPort);
-		}
-		else {
-			throw new EditException("The MergeInputPort is of the wrong implmentation, it should be of type MergeInputPortImpl");
-		}
-	}
-
-	@Override
-	protected void undoEditAction(MergeImpl mergeImpl) {
-		if (mergeInputPort instanceof MergeInputPortImpl) {
-			mergeImpl.removeInputPort((MergeInputPortImpl) mergeInputPort);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorEdit.java
deleted file mode 100644
index 1cec30e..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorEdit.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * An Edit class responsible for add a Processor to the dataflow.
- * 
- * @author Stuart Owen
- *
- */
-public class AddProcessorEdit extends AbstractDataflowEdit{
-	
-	private Processor processor;
-	
-	public Processor getProcessor() {
-		return processor;
-	}
-
-	protected AddProcessorEdit(Dataflow dataflow, Processor processor) {
-		super(dataflow);
-		this.processor=processor;
-	}
-
-	/**
-	 * Adds the Processor instance to the Dataflow
-	 * 
-	 * @throws EditException if the edit has already taken place (without an intermediate undo) or a processor with that name already exists.
-	 */
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		if (processor instanceof ProcessorImpl) {
-			dataflow.addProcessor((ProcessorImpl)processor);
-		}
-		else {
-			throw new EditException("The Processor is of the wrong implmentation, it should be of type ProcessorImpl");
-		}
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		dataflow.removeProcessor(processor);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorInputPortEdit.java
deleted file mode 100644
index 59fb30a..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorInputPortEdit.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.NamedInputPortNode;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyImpl;
-
-import org.jdom.Element;
-
-/**
- * Build a new input port on a processor, also modifies the processor's
- * iteration strategy or strategies to ensure the new port is bound into them.
- * 
- * @author Tom Oinn
- * 
- */
-public class AddProcessorInputPortEdit extends AbstractProcessorEdit {
-
-	Element previousIterationStrategyState = null;
-
-	private final ProcessorInputPortImpl port;
-
-	public AddProcessorInputPortEdit(Processor p, ProcessorInputPort port) {
-		super(p);
-		this.port = (ProcessorInputPortImpl)port;
-		
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		// Add a new InputPort object to the processor and also create an
-		// appropriate NamedInputPortNode in any iteration strategies. By
-		// default set the desired drill depth on each iteration strategy node
-		// to the same as the input port, so this won't automatically trigger
-		// iteration staging unless the depth is altered on the iteration
-		// strategy itself.)
-		if (processor.getInputPortWithName(port.getName()) != null) {
-			throw new EditException(
-					"Attempt to create duplicate input port with name '"
-							+ port.getName() + "'");
-		}
-		previousIterationStrategyState = processor.iterationStack.asXML();
-		processor.inputPorts.add(port);
-		for (IterationStrategyImpl is : processor.iterationStack.getStrategies()) {
-			NamedInputPortNode nipn = new NamedInputPortNode(port.getName(),
-					port.getDepth());
-			is.addInput(nipn);
-			is.connectDefault(nipn);
-		}
-
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		processor.iterationStack
-				.configureFromElement(previousIterationStrategyState);
-		processor.inputPorts
-				.remove(processor.getInputPortWithName(port.getName()));
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorOutputPortEdit.java
deleted file mode 100644
index 7a67268..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorOutputPortEdit.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Add a new output port to the specified ProcessorImpl
- * 
- * @author Tom Oinn
- * 
- */
-public class AddProcessorOutputPortEdit extends AbstractProcessorEdit {
-
-	private final ProcessorOutputPortImpl port;
-
-	public AddProcessorOutputPortEdit(Processor processor, OutputPort port) {
-		super(processor);
-		this.port = (ProcessorOutputPortImpl)port;
-		
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		if (processor.getOutputPortWithName(port.getName()) != null) {
-			throw new EditException("Duplicate output port name");
-		}
-		
-		processor.outputPorts.add(port);
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		BasicEventForwardingOutputPort pop = processor.getOutputPortWithName(port.getName());
-		if (pop != null) {
-			processor.outputPorts.remove(pop);
-		}
-
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/BasicEventForwardingOutputPort.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/BasicEventForwardingOutputPort.java
deleted file mode 100644
index c8587f8..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/BasicEventForwardingOutputPort.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.AbstractOutputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-
-/**
- * Extension of AbstractOutputPort implementing EventForwardingOutputPort
- * 
- * @author Tom Oinn
- * 
- */
-public class BasicEventForwardingOutputPort extends AbstractOutputPort
-		implements EventForwardingOutputPort {
-
-	protected Set<DatalinkImpl> outgoingLinks;
-
-	/**
-	 * Construct a new abstract output port with event forwarding capability
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 * @param granularDepth
-	 */
-	public BasicEventForwardingOutputPort(String portName, int portDepth,
-			int granularDepth) {
-		super(portName, portDepth, granularDepth);
-		this.outgoingLinks = new HashSet<DatalinkImpl>();
-	}
-
-	/**
-	 * Implements EventForwardingOutputPort
-	 */
-	public final Set<? extends Datalink> getOutgoingLinks() {
-		return Collections.unmodifiableSet(this.outgoingLinks);
-	}
-
-	/**
-	 * Forward the specified event to all targets
-	 * 
-	 * @param e
-	 */
-	public void sendEvent(WorkflowDataToken e) {
-		for (Datalink link : outgoingLinks) {
-			link.getSink().receiveEvent(e);
-		}
-	}
-
-	protected void addOutgoingLink(DatalinkImpl link) {
-		if (outgoingLinks.contains(link) == false) {
-			outgoingLinks.add(link);
-		}
-	}
-
-	protected void removeOutgoingLink(Datalink link) {
-		outgoingLinks.remove(link);
-	}
-
-	protected void setDepth(int depth) {
-		this.depth = depth;
-	}
-	
-	protected void setGranularDepth(int granularDepth) {
-		this.granularDepth = granularDepth;
-	}
-	
-	protected void setName(String name) {
-		this.name = name;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortDepthEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortDepthEdit.java
deleted file mode 100644
index 60007fa..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortDepthEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Change the depth of the specified DataflowInputPort.
- * 
- * @author David Withers
- * 
- */
-public class ChangeDataflowInputPortDepthEdit extends AbstractDataflowInputPortEdit {
-
-	private int newDepth;
-
-	private int oldDepth;
-
-	public ChangeDataflowInputPortDepthEdit(DataflowInputPort dataflowInputPort, int newDepth) {
-		super(dataflowInputPort);
-		this.newDepth = newDepth;
-	}
-
-	@Override
-	protected void doEditAction(DataflowInputPortImpl dataflowInputPort) throws EditException {
-		oldDepth = dataflowInputPort.getDepth();
-		dataflowInputPort.setDepth(newDepth);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowInputPortImpl dataflowInputPort) {
-		dataflowInputPort.setDepth(oldDepth);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortGranularDepthEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortGranularDepthEdit.java
deleted file mode 100644
index 751057b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortGranularDepthEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Change the granular depth of the specified DataflowInputPort.
- * 
- * @author David Withers
- * 
- */
-public class ChangeDataflowInputPortGranularDepthEdit extends AbstractDataflowInputPortEdit {
-
-	private int newGranularDepth;
-
-	private int oldGranularDepth;
-
-	public ChangeDataflowInputPortGranularDepthEdit(DataflowInputPort dataflowInputPort, int newGranularDepth) {
-		super(dataflowInputPort);
-		this.newGranularDepth = newGranularDepth;
-	}
-
-	@Override
-	protected void doEditAction(DataflowInputPortImpl dataflowInputPort) throws EditException {
-		oldGranularDepth = dataflowInputPort.getGranularInputDepth();
-		dataflowInputPort.setGranularDepth(newGranularDepth);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowInputPortImpl dataflowInputPort) {
-		dataflowInputPort.setGranularDepth(oldGranularDepth);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConditionImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConditionImpl.java
deleted file mode 100644
index 58334a5..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConditionImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.workflowmodel.Condition;
-
-public class ConditionImpl extends AbstractAnnotatedThing<Condition> implements Condition {
-
-	private ProcessorImpl control, target;
-
-	private Map<String, Boolean> stateMap = new HashMap<String, Boolean>();
-
-	protected ConditionImpl(ProcessorImpl control, ProcessorImpl target) {
-		this.control = control;
-		this.target = target;
-	}
-
-	public ProcessorImpl getControl() {
-		return this.control;
-	}
-
-	public ProcessorImpl getTarget() {
-		return this.target;
-	}
-
-	public boolean isSatisfied(String owningProcess) {
-		if (stateMap.containsKey(owningProcess)) {
-			return stateMap.get(owningProcess);
-		} else {
-			return false;
-		}
-	}
-
-	protected void satisfy(String owningProcess) {
-		stateMap.put(owningProcess, Boolean.TRUE);
-		// TODO - poke target processor here
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureActivityEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureActivityEdit.java
deleted file mode 100644
index 63a44aa..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureActivityEdit.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-import org.apache.log4j.Logger;
-
-/**
- * An Edit that is responsible for configuring an Activity with a given
- * configuration bean.
- * 
- * @author Stuart Owen
- * @author Stian Soiland-Reyes
- * 
- */
-@SuppressWarnings("unchecked")
-public class ConfigureActivityEdit extends ConfigureEdit {
-
-	@SuppressWarnings("unused")
-	private static Logger logger = Logger
-			.getLogger(ConfigureActivityEdit.class);
-
-	public ConfigureActivityEdit(Activity<?> activity, Object configurationBean) {
-		super(Activity.class, activity, configurationBean);
-	}
-
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureEdit.java
deleted file mode 100644
index f339215..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureEdit.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.io.IOException;
-
-import net.sf.taverna.t2.workflowmodel.Configurable;
-import net.sf.taverna.t2.workflowmodel.ConfigurationException;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.AbstractXMLDeserializer;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.AbstractXMLSerializer;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-/**
- * An Edit that is responsible for configuring a {@link Configurable} with a
- * given configuration bean.
- * 
- * @author Stuart Owen
- * @author Stian Soiland-Reyes
- */
-@SuppressWarnings("unchecked")
-public class ConfigureEdit<SubjectInterface extends Configurable, SubjectType extends SubjectInterface>
-		extends AbstractEdit<SubjectInterface, SubjectType> {
-
-	private static Logger logger = Logger
-			.getLogger(ConfigureEdit.class);
-
-	private BeanDeSerialiser beanDeSerialiser = new BeanDeSerialiser();
-
-	private BeanSerialiser beanSerialiser = new BeanSerialiser();
-
-	private final Object configurationBean;
-
-	private Element previousBean;
-
-	public ConfigureEdit(Class<?> subjectType,
-			SubjectInterface configurable, Object configurationBean) {
-		super(subjectType, configurable);
-		this.configurationBean = configurationBean;
-	}
-
-	@Override
-	protected void doEditAction(SubjectType subject) throws EditException {
-		if (subject.getConfiguration() == null) {
-			previousBean = null;
-		} else {
-			try {
-				previousBean = beanSerialiser.beanAsElement(subject
-						.getConfiguration());
-			} catch (Exception e) {
-				logger.error("Error serializing configuration bean for: "
-						+ subject);
-				throw new EditException(
-						"Error serializing configuration bean for: " + subject,
-						e);
-			}
-		}
-
-		try {
-			// FIXME: Should clone bean on configuration to prevent caller from
-			// modifying bean afterwards
-			subject.configure(configurationBean);
-		} catch (ConfigurationException e) {
-			logger.error("Error configuring :"
-					+ subject.getClass().getSimpleName(), e);
-			throw new EditException(e);
-		}
-	}
-
-	protected Object cloneBean(Object object) throws JDOMException, IOException {
-		Element element = beanSerialiser.beanAsElement(object);
-		return beanDeSerialiser.createBean(element);
-	}
-
-	@Override
-	protected void undoEditAction(SubjectType subject) {
-		try {
-			if (previousBean == null) {
-				logger.warn("Ignoring attempt to reconfiguring " + subject + " with a null-bean");
-				// which would breaks most activities if undoing a recent 
-				// dragging of activity to  dataflow
-				// subject.configure(null);
-			} else {
-				Object bean = beanDeSerialiser.createBean(previousBean);
-				subject.configure(bean);
-			}
-		} catch (ConfigurationException e) {
-			logger.error("There was an error reconfiguring " + subject
-					+ " during an undo");
-		}
-	}
-
-	/**
-	 * Deserialise the bean using its classloader if it has one, otherwise use
-	 * the bean deserialisers
-	 * 
-	 */
-	protected class BeanDeSerialiser extends AbstractXMLDeserializer {
-		public Object createBean(Element configElement) {
-			ClassLoader beanClassLoader = getClass().getClassLoader();
-			ClassLoader configurableClassLoader = getSubject()
-					.getConfiguration().getClass().getClassLoader();
-			if (configurableClassLoader != null) {
-				return super.createBean(configElement, configurableClassLoader);
-			} else {
-				return super.createBean(configElement, beanClassLoader);
-			}
-		}
-	}
-
-	protected class BeanSerialiser extends AbstractXMLSerializer {
-		public Element beanAsElement(Object obj) throws JDOMException,
-				IOException {
-			return super.beanAsElement(obj);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectDatalinkEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectDatalinkEdit.java
deleted file mode 100644
index cc16ff0..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectDatalinkEdit.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-/**
- * Connect a datalink to its source and sink.
- * 
- * @author David Withers
- * 
- */
-public class ConnectDatalinkEdit extends AbstractDatalinkEdit {
-
-	public ConnectDatalinkEdit(Datalink datalink) {
-		super(datalink);
-	}
-
-	@Override
-	protected void doEditAction(DatalinkImpl datalink) throws EditException {
-		EventForwardingOutputPort source = datalink.getSource();
-		EventHandlingInputPort sink = datalink.getSink();
-		if (source instanceof BasicEventForwardingOutputPort) {
-			((BasicEventForwardingOutputPort) source).addOutgoingLink(datalink);
-		}
-		if (sink instanceof AbstractEventHandlingInputPort) {
-			((AbstractEventHandlingInputPort) sink).setIncomingLink(datalink);
-		}
-	}
-
-	@Override
-	protected void undoEditAction(DatalinkImpl datalink) {
-		EventForwardingOutputPort source = datalink.getSource();
-		EventHandlingInputPort sink = datalink.getSink();
-		if (source instanceof BasicEventForwardingOutputPort) {
-			((BasicEventForwardingOutputPort) source).removeOutgoingLink(datalink);
-		}
-		if (sink instanceof AbstractEventHandlingInputPort) {
-			((AbstractEventHandlingInputPort) sink).setIncomingLink(null);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectMergedDatalinkEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectMergedDatalinkEdit.java
deleted file mode 100644
index 06fa753..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectMergedDatalinkEdit.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.utils.Tools;
-
-/**
- * <p>
- * An edit that connects an EventForwardingOutputPort sourcePort and EventHandlingInputPort sinkPort together
- * via an intermediary {@link Merge} instance, which is provided to the constructor. 
- * The connections are made using {@link Datalink}. Using a Merge facilitates multiple incoming Datalinks connect to a single
- * input port.
- * </p>
- * <p>
- * If an connection already exists between a sinkPort and a sourcePort, then then an new datalink is provided
- * for the incoming link but the outgoing link remains as is (since there can only be 1). In this case, if the
- * sink port differs from the existing one then an EditException is thrown.
- * </p>
- * 
- * @author Stuart Owen
- *
- */
-public class ConnectMergedDatalinkEdit extends AbstractMergeEdit {
-
-	private EventHandlingInputPort sinkPort;
-	private EventForwardingOutputPort sourcePort;
-	private Datalink inLink;
-	private Datalink outLink;
-	private Edit<Datalink> connectInLinkEdit;
-	private Edit<Datalink> connectOutLinkEdit;
-	private MergeInputPortImpl mergeInputPort;
-	
-	/**
-	 * Constructs the ConnectMergedDatalinkEdit with an existing Merge instance, and the source and sink ports that are to
-	 * be connected.
-	 * 
-	 * @param merge
-	 * @param sourcePort
-	 * @param sinkPort
-	 */
-	public ConnectMergedDatalinkEdit(Merge merge, EventForwardingOutputPort sourcePort, EventHandlingInputPort sinkPort) {
-		super(merge);
-		if (sinkPort==null) throw new RuntimeException("The sinkport cannot be null");
-		this.sinkPort=sinkPort;
-		if (sourcePort==null) throw new RuntimeException("The sourceport cannot be null");
-		this.sourcePort=sourcePort;
-	}
-	
-	@Override
-	protected void doEditAction(MergeImpl mergeImpl) throws EditException {
-		Edits edits = new EditsImpl();
-		String name = Tools.getUniqueMergeInputPortName(mergeImpl, sourcePort.getName()+"To" + merge.getLocalName() + "_input", 0);
-		mergeInputPort = new MergeInputPortImpl(mergeImpl,name,sinkPort.getDepth());
-		inLink = edits.createDatalink(sourcePort, mergeInputPort);
-		connectInLinkEdit=edits.getConnectDatalinkEdit(inLink);
-		if (mergeImpl.getOutputPort().getOutgoingLinks().size()==0) {
-			outLink = edits.createDatalink(mergeImpl.getOutputPort(), sinkPort);
-			connectOutLinkEdit=edits.getConnectDatalinkEdit(outLink);
-		}
-		else if (mergeImpl.getOutputPort().getOutgoingLinks().size()==1){
-			if (mergeImpl.getOutputPort().getOutgoingLinks().toArray(new Datalink[]{})[0].getSink() != sinkPort) {
-				throw new EditException("Cannot add a different sinkPort to a Merge that already has one defined");
-			}
-		}
-		else {
-			throw new EditException("The merge instance cannot have more that 1 outgoing Datalink");
-		}
-		
-		mergeImpl.addInputPort(mergeInputPort);
-		connectInLinkEdit.doEdit();
-		if (connectOutLinkEdit!=null) connectOutLinkEdit.doEdit();
-	}
-
-	@Override
-	protected void undoEditAction(MergeImpl mergeImpl) {
-		if (connectOutLinkEdit!=null) connectOutLinkEdit.undo();
-		connectInLinkEdit.undo();
-		mergeImpl.removeInputPort(mergeInputPort);
-	}
-	
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectProcesorOutputEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectProcesorOutputEdit.java
deleted file mode 100644
index bb4f2b9..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ConnectProcesorOutputEdit.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Connect the named output port on a given processor to the specified
- * EventHandlingInputPort, updating the connected port list on the output port
- * of the processor such that events will be forwarded as appropriate. If the
- * target port is a FilteringInputPort then also set the filter level
- * appropriately.
- * 
- * @author Tom Oinn
- * 
- */
-public class ConnectProcesorOutputEdit extends AbstractProcessorEdit {
-
-	private EventHandlingInputPort target;
-
-	private String outputName;
-
-	private BasicEventForwardingOutputPort outputPort;
-	
-	private DatalinkImpl newLink = null;
-
-	public ConnectProcesorOutputEdit(Processor p, String outputName,
-			EventHandlingInputPort targetPort) {
-		super(p);
-		this.target = targetPort;
-		this.outputName = outputName;
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		for (BasicEventForwardingOutputPort popi : processor.outputPorts) {
-			if (popi.getName().equals(outputName)) {
-				newLink = new DatalinkImpl(popi, target);
-				popi.addOutgoingLink(newLink);
-				if (target instanceof AbstractEventHandlingInputPort) {
-					((AbstractEventHandlingInputPort)target).setIncomingLink(newLink);
-				}
-				outputPort = popi;
-				return;
-			}
-		}
-		throw new EditException("Cannot locate output port with name '"
-				+ outputName + "'");
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		outputPort.removeOutgoingLink(newLink);
-		if (target instanceof AbstractEventHandlingInputPort) {
-			((AbstractEventHandlingInputPort)target).setIncomingLink(null);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateConditionEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateConditionEdit.java
deleted file mode 100644
index 3735f17..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateConditionEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-public class CreateConditionEdit extends AbstractBinaryProcessorEdit {
-
-	private ConditionImpl condition;
-	
-	CreateConditionEdit(Processor control, Processor target) {
-		super(control, target);
-	}
-	
-	@Override
-	protected void doEditAction(ProcessorImpl control, ProcessorImpl target) throws EditException {
-		condition = new ConditionImpl(control, target);
-		// Check for duplicates
-		for (Condition c : control.controlledConditions) {
-			if (c.getTarget() == target) {
-				throw new EditException("Attempt to create duplicate control link");
-			}
-		}
-		control.controlledConditions.add(condition);
-		target.conditions.add(condition);
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl control, ProcessorImpl target) {
-		control.controlledConditions.remove(condition);
-		target.conditions.remove(condition);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowInputPortEdit.java
deleted file mode 100644
index d12d095..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowInputPortEdit.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Adds a new input port to a dataflow
- * 
- * @author David Withers
- *
- */
-public class CreateDataflowInputPortEdit extends AbstractDataflowEdit {
-
-	private String newPortName;
-
-	private int newPortDepth;
-	
-	private int newPortGranularDepth;
-
-	public CreateDataflowInputPortEdit(Dataflow dataflow, String portName,
-			int portDepth, int portGranularDepth) {
-		super(dataflow);
-		this.newPortName = portName;
-		this.newPortDepth = portDepth;
-		this.newPortGranularDepth = portGranularDepth;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.createInputPort(newPortName, newPortDepth, newPortGranularDepth);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		try {
-			dataflow.removeDataflowInputPort(newPortName);
-		} catch (EditException e) {
-			//shouldn't happen as port should exist
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowOutputPortEdit.java
deleted file mode 100644
index 63e3dde..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowOutputPortEdit.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Adds a new output port to a dataflow
- * 
- * @author David Withers
- * 
- */
-public class CreateDataflowOutputPortEdit extends AbstractDataflowEdit {
-
-	private String newPortName;
-
-	public CreateDataflowOutputPortEdit(Dataflow dataflow, String portName) {
-		super(dataflow);
-		this.newPortName = portName;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.createOutputPort(newPortName);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		try {
-			dataflow.removeDataflowOutputPort(newPortName);
-		} catch (EditException e) {
-			// shouldn't happen as port should exist
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/Crystalizer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/Crystalizer.java
deleted file mode 100644
index 60ccd66..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/Crystalizer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Recieves Job and Completion events and emits Jobs unaltered. Completion
- * events additionally cause registration of lists for each key in the datamap
- * of the jobs at immediate child locations in the index structure. These list
- * identifiers are sent in place of the Completion events.
- * <p>
- * State for a given process ID is purged when a final completion event is
- * received so there is no need for an explicit cache purge operation in the
- * public API (although for termination of partially complete workflows it may
- * be sensible for subclasses to provide one)
- * <p>
- * 
- * @author Tom Oinn
- */
-public interface Crystalizer {
-
-	/**
-	 * Receive a Job or Completion, Jobs are emitted unaltered and cached,
-	 * Completion events trigger registration of a corresponding list - this may
-	 * be recursive in nature if the completion event's index implies nested
-	 * lists which have not been registered.
-	 */
-	public void receiveEvent(IterationInternalEvent<? extends IterationInternalEvent<?>> event);
-
-	/**
-	 * This method is called when a new Job has been handled by the
-	 * AbstractCrystalizer, either by direct passthrough or by list
-	 * registration.
-	 * 
-	 */
-	public void jobCreated(Job outputJob);
-
-	/**
-	 * Called whenever a completion not corresponding to a node in the cache is
-	 * generated. In many cases this is an indication of an error state, the
-	 * processor implementation should ensure that completion events are only
-	 * sent to the crystalizer if there has been at least one data event with a
-	 * lower depth on the same path.
-	 */
-	public void completionCreated(Completion completion);
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowImpl.java
deleted file mode 100644
index 1b76f0e..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowImpl.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.monitor.MonitorManager;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.FailureTransmitter;
-import net.sf.taverna.t2.workflowmodel.InvalidDataflowException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.NamedWorkflowEntity;
-import net.sf.taverna.t2.workflowmodel.NamingException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.TokenProcessingEntity;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-
-/**
- * Implementation of Dataflow including implementation of the dataflow level
- * type checker. Other than this the implementation is fairly simple as it's
- * effectively just a container for other things especially the dataflow input
- * and output port implementations.
- * 
- * @author Tom Oinn
- * 
- */
-public class DataflowImpl extends AbstractAnnotatedThing<Dataflow> implements
-		Dataflow {
-
-	List<ProcessorImpl> processors;
-	List<MergeImpl> merges;
-	private String name;
-	private static int nameIndex = 1;
-	private List<DataflowInputPortImpl> inputs;
-	private List<DataflowOutputPortImpl> outputs;
-	protected String internalIdentifier;
-
-	/**
-	 * Protected constructor, assigns a default name. To build an instance of
-	 * DataflowImpl you should use the appropriate Edit object from the Edits
-	 * interface
-	 */
-	protected DataflowImpl() {
-		this.name = "Workflow" + (nameIndex++);
-		this.processors = new ArrayList<ProcessorImpl>();
-		this.merges = new ArrayList<MergeImpl>();
-		this.inputs = new ArrayList<DataflowInputPortImpl>();
-		this.outputs = new ArrayList<DataflowOutputPortImpl>();
-		refreshInternalIdentifier();
-	}
-
-	/**
-	 * Adds a processor on the DataFlow.
-	 * 
-	 * @param processor
-	 *            the ProcessorImpl to be added to the Dataflow
-	 * @return
-	 * @throws NamingException
-	 *             if a processor already exists with the same local name
-	 */
-	protected synchronized void addProcessor(ProcessorImpl processor)
-			throws NamingException {
-		for (Processor existingProcessor : processors
-				.toArray(new Processor[] {})) {
-			if (existingProcessor.getLocalName().equals(
-					processor.getLocalName()))
-				throw new NamingException("There already is a processor named:"
-						+ processor.getLocalName());
-		}
-		processors.add(processor);
-	}
-
-	protected synchronized void removeProcessor(Processor processor) {
-		processors.remove(processor);
-	}
-
-	/**
-	 * Adds a processor on the DataFlow.
-	 * 
-	 * @param processor
-	 *            the ProcessorImpl to be added to the Dataflow
-	 * @return
-	 * @throws NamingException
-	 *             if a processor already exists with the same local name
-	 */
-	protected synchronized void addMerge(MergeImpl merge)
-			throws NamingException {
-		for (Merge existingMerge : merges.toArray(new Merge[] {})) {
-			if (existingMerge.getLocalName().equals(merge.getLocalName()))
-				throw new NamingException(
-						"There already is a merge operation named:"
-								+ merge.getLocalName());
-		}
-		merges.add(merge);
-	}
-
-	protected synchronized void removeMerge(Merge merge) {
-		merges.remove(merge);
-	}
-
-	/**
-	 * Build a new dataflow input port, the granular depth is set for the input
-	 * port so it can be copied onto the internal output port
-	 * 
-	 * @param name
-	 *            name of the dataflow input port to build
-	 * @param depth
-	 *            input depth
-	 * @param granularDepth
-	 *            granular depth to copy to the internal output port
-	 * @throws NamingException
-	 *             in the event of a duplicate or invalid name
-	 * @return the newly created input port
-	 */
-	protected synchronized DataflowInputPort createInputPort(String name,
-			int depth, int granularDepth) throws NamingException {
-		for (DataflowInputPort dip : inputs) {
-			if (dip.getName().equals(name)) {
-				throw new NamingException("Duplicate workflow input port name '" + name
-						+ "' in workflow already.");
-			}
-		}
-		DataflowInputPortImpl dipi = new DataflowInputPortImpl(name, depth,
-				granularDepth, this);
-		inputs.add(dipi);
-		return dipi;
-	}
-
-	/**
-	 * Adds an input port to the DataFlow.
-	 * 
-	 * @param inputPort
-	 *            the DataflowInputPortImpl to be added to the Dataflow
-	 * @throws EditException 
-	 */
-	protected synchronized void addInputPort(DataflowInputPortImpl inputPort)
-			throws EditException {
-		for (DataflowInputPort existingInputPort : inputs
-				.toArray(new DataflowInputPort[] {})) {
-			if (existingInputPort.getName().equals(inputPort.getName()))
-				throw new NamingException("There already is a workflow input port named:"
-						+ inputPort.getName());
-		}
-		if (inputPort.getDataflow() != this) {
-			throw new EditException("Port specifies a different workflow");
-		}
-		inputs.add(inputPort);
-	}
-
-	/**
-	 * Remove the named dataflow input port
-	 * 
-	 * @param name
-	 *            name of the dataflow input port to remove
-	 * @throws EditException
-	 *             if the specified port doesn't exist within this dataflow
-	 */
-	protected synchronized void removeDataflowInputPort(String name)
-			throws EditException {
-		DataflowInputPort found = null;
-		for (DataflowInputPort dip : inputs) {
-			if (dip.getName().equals(name)) {
-				found = dip;
-				break;
-			}
-		}
-		if (found != null) {
-			removeDataflowInputPort(found);
-		} else {
-			throw new EditException("No such input port '" + name
-					+ "' in workflow.");
-		}
-	}
-
-	/**
-	 * Remove the specified input port from this dataflow
-	 * 
-	 * @param dip
-	 *            dataflow input port to remove
-	 * @throws EditException
-	 *             if the input port isn't in the list of inputs - should never
-	 *             happen but you never know.
-	 */
-	protected synchronized void removeDataflowInputPort(DataflowInputPort dip)
-			throws EditException {
-		if (inputs.contains(dip)) {
-			inputs.remove(dip);
-		} else {
-			throw new EditException(
-					"Can't locate the specified input port in workflow. Input port has name '"
-							+ dip.getName() + "'.");
-		}
-	}
-
-	/**
-	 * Create and return a new DataflowOutputPort in this dataflow
-	 * 
-	 * @param name
-	 *            name of the port to create, must be unique within the set of
-	 *            output ports for this dataflow
-	 * @return the newly created DataflowOutputPort
-	 * @throws NamingException
-	 *             if the name is invalid or already exists as a name for a
-	 *             dataflow output
-	 */
-	protected synchronized DataflowOutputPort createOutputPort(String name)
-			throws NamingException {
-		for (DataflowOutputPort dop : outputs) {
-			if (dop.getName().equals(name)) {
-				throw new NamingException("Duplicate workflow output port name '" + name
-						+ "' in workflow already.");
-			}
-		}
-		DataflowOutputPortImpl dopi = new DataflowOutputPortImpl(name, this);
-		outputs.add(dopi);
-		return dopi;
-	}
-
-	/**
-	 * Adds an output port to the DataFlow.
-	 * 
-	 * @param outputPort
-	 *            the DataflowOutputPortImpl to be added to the Dataflow
-	 * @throws EditException 
-	 */
-	protected synchronized void addOutputPort(DataflowOutputPortImpl outputPort)
-			throws EditException {
-		for (DataflowOutputPort existingOutputPort : outputs
-				.toArray(new DataflowOutputPort[] {})) {
-			if (existingOutputPort.getName().equals(outputPort.getName()))
-				throw new NamingException("There already is a workflow output port named:"
-						+ outputPort.getName());
-		}
-		if (outputPort.getDataflow() != this) {
-			throw new EditException("Port specifies a different workflow");
-		}
-		outputs.add(outputPort);
-	}
-
-	/**
-	 * Remove the named dataflow output port
-	 * 
-	 * @param name
-	 *            name of the dataflow output port to remove
-	 * @throws EditException
-	 *             if the specified port doesn't exist within this dataflow
-	 */
-	protected synchronized void removeDataflowOutputPort(String name)
-			throws EditException {
-		DataflowOutputPort found = null;
-		for (DataflowOutputPort dop : outputs) {
-			if (dop.getName().equals(name)) {
-				found = dop;
-				break;
-			}
-		}
-		if (found != null) {
-			removeDataflowOutputPort(found);
-		} else {
-			throw new EditException("No such output port '" + name
-					+ "' in workflow.");
-		}
-	}
-
-	/**
-	 * Remove the specified output port from this dataflow
-	 * 
-	 * @param dop
-	 *            dataflow output port to remove
-	 * @throws EditException
-	 *             if the output port isn't in the list of outputs for this
-	 *             dataflow
-	 */
-	protected synchronized void removeDataflowOutputPort(DataflowOutputPort dop)
-			throws EditException {
-		if (outputs.contains(dop)) {
-			outputs.remove(dop);
-		} else {
-			throw new EditException(
-					"Can't locate the specified output port in workflow, output port has name '"
-							+ dop.getName() + "'.");
-		}
-	}
-
-	/**
-	 * Create a new datalink between two entities within the workflow
-	 * 
-	 * @param sourceName
-	 *            interpreted either as the literal name of a dataflow input
-	 *            port or the colon seperated name of a
-	 *            [processorName|mergeName]:[outputPort]
-	 * @param sinkName
-	 *            as with sourceName but for processor or merge input ports and
-	 *            dataflow output ports
-	 * @return the created Datalink
-	 * @throws EditException
-	 *             if either source or sink isn't found within this dataflow or
-	 *             if the link would violate workflow structural constraints in
-	 *             an immediate way. This won't catch cycles (see the validation
-	 *             methods for that) but will prevent you from having more than
-	 *             one link going to an input port.
-	 */
-	protected synchronized Datalink link(String sourceName, String sinkName)
-			throws EditException {
-		BasicEventForwardingOutputPort source = null;
-		AbstractEventHandlingInputPort sink = null;
-
-		// Find source port
-		String[] split = sourceName.split(":");
-		if (split.length == 2) {
-			// source is a processor
-			// TODO - update to include Merge when it's added
-			for (ProcessorImpl pi : processors) {
-				if (pi.getLocalName().equals(split[0])) {
-					source = pi.getOutputPortWithName(split[1]);
-					break;
-				}
-			}
-		} else if (split.length == 1) {
-			// source is a workflow input port, or at least the internal output
-			// port within it
-			for (DataflowInputPortImpl dipi : inputs) {
-				if (dipi.getName().equals(split[0])) {
-					source = dipi.internalOutput;
-					break;
-				}
-			}
-		} else {
-			throw new EditException("Invalid source link name '" + sourceName
-					+ "'.");
-		}
-		if (source == null) {
-			throw new EditException("Unable to find source port named '"
-					+ sourceName + "' in link creation.");
-		}
-
-		// Find sink
-		split = sinkName.split(":");
-		if (split.length == 2) {
-			// sink is a processor
-			// TODO - update to include Merge when it's added
-			for (ProcessorImpl pi : processors) {
-				if (pi.getLocalName().equals(split[0])) {
-					sink = pi.getInputPortWithName(split[1]);
-					break;
-				}
-			}
-		} else if (split.length == 1) {
-			// source is a workflow input port, or at least the internal output
-			// port within it
-			for (DataflowOutputPortImpl dopi : outputs) {
-				if (dopi.getName().equals(split[0])) {
-					sink = dopi.internalInput;
-					break;
-				}
-			}
-		} else {
-			throw new EditException("Invalid link sink name '" + sinkName
-					+ "'.");
-		}
-		if (sink == null) {
-			throw new EditException("Unable to find sink port named '"
-					+ sinkName + "' in link creation");
-		}
-
-		// Check whether the sink is already linked
-		if (sink.getIncomingLink() != null) {
-			throw new EditException("Cannot link to sink port '" + sinkName
-					+ "' as it is already linked");
-		}
-
-		// Got here so we have both source and sink and the sink isn't already
-		// linked from somewhere. If the sink isn't linked we can't have a
-		// duplicate link here which would have been the other condition to
-		// check for.
-		DatalinkImpl link = new DatalinkImpl(source, sink);
-		source.addOutgoingLink(link);
-		sink.setIncomingLink(link);
-
-		return link;
-
-	}
-
-	/**
-	 * Return a copy of the list of dataflow input ports for this dataflow
-	 */
-	public synchronized List<? extends DataflowInputPort> getInputPorts() {
-		return Collections.unmodifiableList(inputs);
-	}
-
-	/**
-	 * For each processor input, merge input and workflow output get the
-	 * incoming link and, if non null, add to a list and return the entire list.
-	 */
-	public synchronized List<? extends Datalink> getLinks() {
-		List<Datalink> result = new ArrayList<Datalink>();
-		// All processors have a set of input ports each of which has at most
-		// one incoming data link
-		for (TokenProcessingEntity p : getEntities(TokenProcessingEntity.class)) {
-			for (EventHandlingInputPort pip : p.getInputPorts()) {
-				Datalink dl = pip.getIncomingLink();
-				if (dl != null) {
-					result.add(dl);
-				}
-			}
-		}
-		// Workflow outputs have zero or one incoming data link to their
-		// internal input port
-		for (DataflowOutputPort dop : getOutputPorts()) {
-			Datalink dl = dop.getInternalInputPort().getIncomingLink();
-			if (dl != null) {
-				result.add(dl);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Return the list of all processors within the dataflow
-	 */
-	public synchronized List<? extends Processor> getProcessors() {
-		return getEntities(Processor.class);
-	}
-
-	/**
-	 * Return the list of all merge operations within the dataflow
-	 */
-	public synchronized List<? extends Merge> getMerges() {
-		return getEntities(Merge.class);
-	}
-
-	/**
-	 * Return all dataflow output ports
-	 */
-	public synchronized List<? extends DataflowOutputPort> getOutputPorts() {
-		return Collections.unmodifiableList(this.outputs);
-	}
-
-	/**
-	 * Return the local name of this workflow
-	 */
-	public String getLocalName() {
-		return this.name;
-	}
-
-	/**
-	 * Run the type check algorithm and return a report on any problems found.
-	 * This method must be called prior to actually pushing data through the
-	 * dataflow as it sets various properties as a side effect.
-	 */
-	public synchronized DataflowValidationReport checkValidity() {
-		// First things first - nullify the resolved depths in all datalinks
-		for (Datalink dl : getLinks()) {
-			if (dl instanceof DatalinkImpl) {
-				DatalinkImpl dli = (DatalinkImpl) dl;
-				dli.setResolvedDepth(-1);
-			}
-		}
-		// Now copy type information from workflow inputs
-		for (DataflowInputPort dip : getInputPorts()) {
-			for (Datalink dl : dip.getInternalOutputPort().getOutgoingLinks()) {
-				if (dl instanceof DatalinkImpl) {
-					DatalinkImpl dli = (DatalinkImpl) dl;
-					dli.setResolvedDepth(dip.getDepth());
-				}
-			}
-		}
-		// Now iteratively attempt to resolve everything else.
-
-		// Firstly take a copy of the processor list, we'll processors from this
-		// list as they become either failed or resolved
-		List<TokenProcessingEntity> unresolved = new ArrayList<TokenProcessingEntity>(
-				getEntities(TokenProcessingEntity.class));
-
-		// Keep a list of processors that have failed, initially empty
-		List<TokenProcessingEntity> failed = new ArrayList<TokenProcessingEntity>();
-
-		/**
-		 * Is the dataflow valid? The flow is valid if and only if both
-		 * unresolved and failed lists are empty at the end. This doesn't
-		 * guarantee that the workflow will run, in particular it doesn't
-		 * actually check for issues such as unresolved output edges.
-		 */
-
-		// Flag to indicate whether we've finished yet, set to true if no
-		// changes are made in an iteration
-		boolean finished = false;
-
-		Map<TokenProcessingEntity, DataflowValidationReport> invalidDataflows = new HashMap<TokenProcessingEntity, DataflowValidationReport>();
-		while (!finished) {
-			// We're finished unless something happens later
-			finished = true;
-			// Keep a list of processors to remove from the unresolved list
-			// because they've been resolved properly
-			List<TokenProcessingEntity> removeValidated = new ArrayList<TokenProcessingEntity>();
-			// Keep another list of those that have failed
-			List<TokenProcessingEntity> removeFailed = new ArrayList<TokenProcessingEntity>();
-			
-			
-			for (TokenProcessingEntity p : unresolved) {
-				try {
-					// true = checked and valid, false = can't check, the
-					// exception means the processor was checked but was invalid
-					// for some reason
-					boolean entityValid = p.doTypeCheck();
-					if (entityValid) {
-						removeValidated.add(p);
-					}
-				} catch (IterationTypeMismatchException e) {
-					removeFailed.add(p);
-				} catch (InvalidDataflowException e) {
-					invalidDataflows.put(p, e.getDataflowValidationReport());
-					removeFailed.add(p);
-				}
-			}
-
-			/**
-			 * Remove validated and failed items from the pending lists. If
-			 * anything was removed because it validated okay then we're not
-			 * finished yet and should reset the boolean finished flag
-			 */
-			for (TokenProcessingEntity p : removeValidated) {
-				unresolved.remove(p);
-				finished = false;
-			}
-			for (TokenProcessingEntity p : removeFailed) {
-				unresolved.remove(p);
-				failed.add(p);
-			}
-
-		}
-
-		// At this point we know whether the processors within the workflow
-		// validated. If all the processors validated then we're probably okay,
-		// but there are a few other problems to check for. Firstly we need to
-		// check whether all the dataflow outputs are connected; any unconnected
-		// output is by definition a validation failure.
-		List<DataflowOutputPort> unresolvedOutputs = new ArrayList<DataflowOutputPort>();
-		for (DataflowOutputPortImpl dopi : outputs) {
-			Datalink dl = dopi.getInternalInputPort().getIncomingLink();
-			// Unset any type information on the output port, we'll set it again
-			// later if there's a suitably populated link going into it
-			dopi.setDepths(-1, -1);
-			if (dl == null) {
-				// not linked, this is by definition an unsatisfied link!
-				unresolvedOutputs.add(dopi);
-			} else if (dl.getResolvedDepth() == -1) {
-				// linked but the edge hasn't had its depth resolved, i.e. it
-				// links from an unresolved entity
-				unresolvedOutputs.add(dopi);
-			} else {
-				// linked and edge depth is defined, we can therefore populate
-				// the granular and real depth of the dataflow output port. Note
-				// that this is the only way these values can be populated, you
-				// don't define them when creating the ports as they are
-				// entirely based on the type check stage.
-				int granularDepth = dl.getSource().getGranularDepth();
-				int resolvedDepth = dl.getResolvedDepth();
-				dopi.setDepths(resolvedDepth, granularDepth);
-			}
-		}
-
-		// Check if workflow is 'incomplete' - i.e. if it contains no processors and no output ports.
-		// This is to prevent empty workflows or ones that contain input ports from being run.
-		boolean dataflowIsIncomplete = getProcessors().isEmpty() && getOutputPorts().isEmpty();
-		// For a workflow to be valid - workflow must not be 'empty' and lists of problems must all be empty 
-		boolean dataflowValid = (!dataflowIsIncomplete) && unresolvedOutputs.isEmpty() && failed.isEmpty()
-				&& unresolved.isEmpty();
-
-		// Build and return a new validation report containing the overall state
-		// along with lists of failed and unsatisfied processors and unsatisfied
-		// output ports
-		return new DataflowValidationReportImpl(dataflowValid, dataflowIsIncomplete, failed,
-				unresolved, unresolvedOutputs, invalidDataflows);
-	}
-
-	/**
-	 * Gets all workflow entities of the specified type and returns as an
-	 * unmodifiable list of that type
-	 */
-	public <T extends NamedWorkflowEntity> List<? extends T> getEntities(
-			Class<T> entityType) {
-		List<T> result = new ArrayList<T>();
-		filterAndAdd(processors, result, entityType);
-		filterAndAdd(merges, result, entityType);
-		return Collections.unmodifiableList(result);
-	}
-
-	private <T extends NamedWorkflowEntity> void filterAndAdd(
-			Iterable<?> source, List<T> target, Class<T> type) {
-		for (Object o : source) {
-			if (type.isAssignableFrom(o.getClass())) {
-				T targetObject = type.cast(o);
-				target.add(targetObject);
-			}
-		}
-	}
-
-	/**
-	 * The active process identifiers correspond to current strands of data
-	 * running through this dataflow. The keys are process identifiers, the
-	 * values are sets of output port names for which final events have been
-	 * received.
-	 */
-	private Map<String, Set<String>> activeProcessIdentifiers = new HashMap<String, Set<String>>();
-
-	/**
-	 * Called when a token is received or the dataflow is fired, checks to see
-	 * whether the process identifier is already known (in which case we assume
-	 * it's been registered and can ignore it) or registers it with the monitor
-	 * along with all child entities. The method is called with the ID of the
-	 * new process, that is to say the ID of the token with ':'getLocalName()
-	 * appended.
-	 * 
-	 * @param owningProcess
-	 * 
-	 * @return true if the owning process specified was already in the active
-	 *         process identifier set, false otherwise
-	 */
-	protected boolean tokenReceived(String owningProcess,
-			InvocationContext context) {
-		synchronized (activeProcessIdentifiers) {
-			if (! activeProcessIdentifiers.keySet().contains(owningProcess)) {
-				MonitorManager.getInstance().registerNode(this, owningProcess);
-				// Message each processor within the dataflow and instruct it to
-				// register any properties with the monitor including any
-				// processor level properties it can aggregate from its dispatch
-				// stack.
-				for (ProcessorImpl p : getEntities(ProcessorImpl.class)) {
-					p.registerWithMonitor(owningProcess);
-					if (p.getInputPorts().isEmpty()) {
-						p.fire(owningProcess, context);
-					}
-				}
-				activeProcessIdentifiers.put(owningProcess,
-						new HashSet<String>());
-				return false;
-			}
-			return true;
-		}
-	}
-	
-	/**
-	 * Sets the local name for the dataflow
-	 * @param localName
-	 */
-	public void setLocalName(String localName) {
-		name=localName;
-	}
-	
-	@Override
-	public String toString() {
-		return "Dataflow " + getLocalName() + "[" + getInternalIdentier() + "]"; 
-	}
-
-	public void fire(String owningProcess, InvocationContext context) {
-		String newOwningProcess = owningProcess + ":" + getLocalName();
-		if (tokenReceived(newOwningProcess, context)) {
-			// This is not good - should ideally handle it as it means the
-			// workflow has been fired when in a state where this wasn't
-			// sensible, i.e. already having been fired on this process
-			// identifier. For now we'll ignore it (ho hum, release deadline
-			// etc!)
-		}
-		// The code below now happens in the tokenReceived method, we need to
-		// fire any processors which don't have dependencies when a new token
-		// arrives and we weren't doing that anywhere.
-		/**
-		 * for (Processor p : getEntities(Processor.class)) { if
-		 * (p.getInputPorts().isEmpty()) { p.fire(newOwningProcess, context); } }
-		 */
-	}
-
-	/**
-	 * Called when a token with index array length zero is sent from a dataflow
-	 * output port.
-	 * 
-	 * @param portName
-	 */
-	public void sentFinalToken(String portName, String owningProcess) {
-		synchronized (activeProcessIdentifiers) {
-			Set<String> alreadyReceivedPortNames = activeProcessIdentifiers
-					.get(owningProcess);
-			if (alreadyReceivedPortNames == null) {
-				throw new RuntimeException(
-						"Workflow's broken in some way, received an output token for process '"
-								+ owningProcess + "' that shouldn't exist!");
-			}
-			if (alreadyReceivedPortNames.contains(portName)) {
-				throw new RuntimeException(
-						"Received duplicate final events on port name '"
-								+ portName + "' for process '" + owningProcess
-								+ "', this is not a good thing");
-			}
-
-			// No duplicates and the set wasn't null, add this port name to the
-			// set of ports which have sent final events.
-			alreadyReceivedPortNames.add(portName);
-
-			// Check - if we have no duplicates and the set of output ports
-			// which have sent final events in this data thread is the same size
-			// as the number of output ports then we've finished and can
-			// deregister from the monitor
-			if (alreadyReceivedPortNames.size() == getOutputPorts().size()) {
-
-				// request deregistration of processor nodes (arguably we don't
-				// need
-				// to do this and could just deregister the dataflow node in the
-				// tree as that'll by definition detach all the child nodes but
-				// this
-				// seems cleaner)
-				for (Processor p : getEntities(Processor.class)) {
-					MonitorManager.getInstance().deregisterNode(
-							owningProcess + ":" + p.getLocalName());
-				}
-				MonitorManager.getInstance().deregisterNode(owningProcess);
-
-				// Remove this entry from the active process map
-				activeProcessIdentifiers.remove(owningProcess);
-
-			}
-		}
-
-	}
-
-	public FailureTransmitter getFailureTransmitter() {
-		throw new UnsupportedOperationException(
-				"Not implemented for DataflowImpl yet");
-	}
-
-	public boolean doTypeCheck() throws IterationTypeMismatchException {
-		throw new UnsupportedOperationException(
-				"Not implemented for DataflowImpl yet");
-	}
-	
-	public void refreshInternalIdentifier() {
-		internalIdentifier=UUID.randomUUID().toString();
-	}
-
-	public String getInternalIdentier() {
-		return internalIdentifier;
-	}
-	
-	protected void setInternalIndentifier(String id) {
-		this.internalIdentifier=id;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowInputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowInputPortImpl.java
deleted file mode 100644
index 99cdb98..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowInputPortImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-
-public class DataflowInputPortImpl extends AbstractEventHandlingInputPort
-		implements DataflowInputPort {
-
-	protected BasicEventForwardingOutputPort internalOutput;
-
-	private int granularInputDepth;
-
-	private Dataflow dataflow;
-
-	DataflowInputPortImpl(String name, int depth, int granularDepth, Dataflow df) {
-		super(name, depth);
-		granularInputDepth = granularDepth;
-		dataflow = df;
-		internalOutput = new BasicEventForwardingOutputPort(name, depth,
-				granularDepth);
-	}
-
-	public int getGranularInputDepth() {
-		return granularInputDepth;
-	}
-
-	void setDepth(int depth) {
-		this.depth = depth;
-		internalOutput.setDepth(depth);
-	}
-	
-	void setGranularDepth(int granularDepth) {
-		this.granularInputDepth = granularDepth;
-		internalOutput.setGranularDepth(granularDepth);
-	}
-	
-	public EventForwardingOutputPort getInternalOutputPort() {
-		return internalOutput;
-	}
-
-	/**
-	 * Receive an input event, relay it through the internal output port to all
-	 * connected entities
-	 */
-	public void receiveEvent(WorkflowDataToken t) {
-		WorkflowDataToken transformedToken = t.pushOwningProcess(dataflow.getLocalName());
-		// I'd rather avoid casting to the implementation but in this
-		// case we're in the same package - the only reason to do this
-		// is to allow dummy implementations of parts of this
-		// infrastructure during testing, in 'real' use this should
-		// always be a dataflowimpl
-		if (dataflow instanceof DataflowImpl) {
-			((DataflowImpl) dataflow).tokenReceived(transformedToken
-					.getOwningProcess(), t.getContext());
-		}
-		for (Datalink dl : internalOutput.getOutgoingLinks()) {
-			dl.getSink().receiveEvent(transformedToken);
-		}
-	}
-
-	public Dataflow getDataflow() {
-		return dataflow;
-	}
-	
-	public void setName(String newName) {
-		this.name = newName;
-		internalOutput.setName(newName);
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowOutputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowOutputPortImpl.java
deleted file mode 100644
index 4aa6fee..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowOutputPortImpl.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.facade.ResultListener;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-public class DataflowOutputPortImpl extends BasicEventForwardingOutputPort
-		implements DataflowOutputPort {
-
-	protected AbstractEventHandlingInputPort internalInput;
-	protected List<ResultListener> resultListeners = new ArrayList<ResultListener>();
-
-	private Dataflow dataflow;
-
-	DataflowOutputPortImpl(final String portName, final Dataflow dataflow) {
-		super(portName, -1, -1);
-		this.dataflow = dataflow;
-		this.internalInput = new AbstractEventHandlingInputPort(name, -1) {
-			/**
-			 * Forward the event through the output port Also informs any
-			 * ResultListeners on the output port to the new token.
-			 */
-			public void receiveEvent(WorkflowDataToken token) {
-				// Pull the dataflow process identifier from the owning process
-				// and push the modified token out
-				// I'd rather avoid casting to the implementation but in this
-				// case we're in the same package - the only reason to do this
-				// is to allow dummy implementations of parts of this
-				// infrastructure during testing, in 'real' use this should
-				// always be a dataflowimpl
-				if (token.getIndex().length == 0
-						&& dataflow instanceof DataflowImpl) {
-					((DataflowImpl) dataflow).sentFinalToken(portName, token
-							.getOwningProcess());
-				}
-				WorkflowDataToken newToken = token.popOwningProcess();
-				sendEvent(newToken);
-				for (ResultListener listener : resultListeners
-						.toArray(new ResultListener[] {})) {
-					listener.resultTokenProduced(newToken, this.getName());
-				}
-			}
-
-			/**
-			 * Always copy the value of the enclosing dataflow output port
-			 */
-			@Override
-			public int getDepth() {
-				return DataflowOutputPortImpl.this.getDepth();
-			}
-		};
-	}
-
-	public EventHandlingInputPort getInternalInputPort() {
-		return this.internalInput;
-	}
-
-	public Dataflow getDataflow() {
-		return this.dataflow;
-	}
-
-	void setDepths(int depth, int granularDepth) {
-		this.depth = depth;
-		this.granularDepth = granularDepth;
-	}
-
-	public void addResultListener(ResultListener listener) {
-		resultListeners.add(listener);
-	}
-
-	public void removeResultListener(ResultListener listener) {
-		resultListeners.remove(listener);
-	}
-	
-	public void setName(String newName) {
-		this.name = newName;
-		internalInput.setName(newName);
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowValidationReportImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowValidationReportImpl.java
deleted file mode 100644
index b575d9e..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DataflowValidationReportImpl.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.TokenProcessingEntity;
-
-/**
- * Simple implementation of the DataflowValidationReport interface
- * 
- * @author Tom Oinn
- * 
- */
-public class DataflowValidationReportImpl implements DataflowValidationReport {
-
-	private final List<TokenProcessingEntity> failed;
-	private final Map<TokenProcessingEntity, DataflowValidationReport> invalidDataflows;
-	private final List<DataflowOutputPort> unresolvedOutputs;
-	private final List<TokenProcessingEntity> unsatisfied;
-	private boolean valid;
-	private boolean isWorkflowIncomplete; // whether a workflow is incomplete (contains no processors and no output ports), in which case it also must be invalid
-
-	DataflowValidationReportImpl(boolean isValid, boolean isWorkflowIncomplete,
-			List<TokenProcessingEntity> failedProcessors,
-			List<TokenProcessingEntity> unsatisfiedProcessors,
-			List<DataflowOutputPort> unresolvedOutputs, Map<TokenProcessingEntity, DataflowValidationReport> invalidDataflows) {
-		this.valid = isValid;
-		this.isWorkflowIncomplete = isWorkflowIncomplete;
-		this.invalidDataflows = Collections.unmodifiableMap(invalidDataflows);
-		this.failed = Collections.unmodifiableList(failedProcessors);
-		this.unsatisfied = Collections.unmodifiableList(unsatisfiedProcessors);
-		this.unresolvedOutputs = Collections.unmodifiableList(unresolvedOutputs);
-	}
-
-	public List<? extends TokenProcessingEntity> getFailedEntities() {
-		return failed;
-	}
-
-	public Map<TokenProcessingEntity, DataflowValidationReport> getInvalidDataflows() {
-		return invalidDataflows;
-	}
-
-	public List<? extends DataflowOutputPort> getUnresolvedOutputs() {
-		return unresolvedOutputs;
-	}
-	
-	public List<? extends TokenProcessingEntity> getUnsatisfiedEntities() {
-		return unsatisfied;
-	}
-
-	public boolean isValid() {
-		return valid;
-	}
-
-	public boolean isWorkflowIncomplete() {
-		return isWorkflowIncomplete;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DatalinkImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DatalinkImpl.java
deleted file mode 100644
index d28fa0e..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DatalinkImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-/**
- * Naive bean implementation of Datalink
- * 
- * @author Tom Oinn
- * 
- */
-public class DatalinkImpl extends AbstractAnnotatedThing<Datalink> implements
-		Datalink {
-
-	private EventForwardingOutputPort source;
-
-	private EventHandlingInputPort sink;
-
-	private transient int resolvedDepth = -1;
-	
-	public int getResolvedDepth() {
-		return this.resolvedDepth;
-	}
-	
-	protected void setResolvedDepth(int newResolvedDepth) {
-		this.resolvedDepth = newResolvedDepth;
-	}
-	
-	protected DatalinkImpl(EventForwardingOutputPort source,
-			EventHandlingInputPort sink) {
-		this.source = source;
-		this.sink = sink;
-	}
-
-	public EventHandlingInputPort getSink() {
-		return sink;
-	}
-
-	public EventForwardingOutputPort getSource() {
-		return source;
-	}
-	
-	@Override
-	public String toString() {
-		return "link("+resolvedDepth+")"+source.getName()+":"+sink.getName();
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DefaultDispatchStackEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DefaultDispatchStackEdit.java
deleted file mode 100644
index d84f973..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DefaultDispatchStackEdit.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.CompoundEdit;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.impl.AddDispatchLayerEdit;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.impl.DispatchStackImpl;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry;
-
-public class DefaultDispatchStackEdit extends AbstractProcessorEdit {
-	private Edit<?> compoundEdit=null;
-	private static final int MAX_JOBS = 1;
-	private static final long BACKOFF_FACTOR = (long) 1.1;
-	private static final int MAX_DELAY = 5000;
-	private static final int INITIAL_DELAY = 1000;
-	private static final int MAX_RETRIES = 0;
-
-	public DefaultDispatchStackEdit(Processor processor) {
-		super(processor);
-		DispatchStackImpl stack = ((ProcessorImpl)processor).getDispatchStack();
-		// Top level parallelise layer
-		int layer = 0;
-		List<Edit<?>> edits = new ArrayList<Edit<?>>();
-		
-		edits.add(new AddDispatchLayerEdit(stack, new Parallelize(MAX_JOBS), layer++));
-		edits.add(new AddDispatchLayerEdit(stack, new ErrorBounce(), layer++));
-		edits.add(new AddDispatchLayerEdit(stack, new Failover(), layer++));
-		edits.add(new AddDispatchLayerEdit(stack, new Retry(MAX_RETRIES, INITIAL_DELAY,
-				MAX_DELAY, BACKOFF_FACTOR), layer++));
-		edits.add(new AddDispatchLayerEdit(stack, new Invoke(), layer++));
-		compoundEdit=new CompoundEdit(edits);
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		compoundEdit.doEdit();
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		compoundEdit.undo();
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DisconnectDatalinkEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DisconnectDatalinkEdit.java
deleted file mode 100644
index 49e5453..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/DisconnectDatalinkEdit.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-/**
- * Disconnect a datalink from its source and sink.
- * 
- * @author David Withers
- * 
- */
-public class DisconnectDatalinkEdit extends AbstractDatalinkEdit {
-
-	public DisconnectDatalinkEdit(Datalink datalink) {
-		super(datalink);
-	}
-
-	@Override
-	protected void doEditAction(DatalinkImpl datalink) throws EditException {
-		EventForwardingOutputPort source = datalink.getSource();
-		EventHandlingInputPort sink = datalink.getSink();
-		if (source instanceof BasicEventForwardingOutputPort) {
-			((BasicEventForwardingOutputPort) source).removeOutgoingLink(datalink);
-		}
-		if (sink instanceof AbstractEventHandlingInputPort) {
-			((AbstractEventHandlingInputPort) sink).setIncomingLink(null);
-		}
-	}
-
-	@Override
-	protected void undoEditAction(DatalinkImpl datalink) {
-		EventForwardingOutputPort source = datalink.getSource();
-		EventHandlingInputPort sink = datalink.getSink();
-		if (source instanceof BasicEventForwardingOutputPort) {
-			((BasicEventForwardingOutputPort) source).addOutgoingLink(datalink);
-		}
-		if (sink instanceof AbstractEventHandlingInputPort) {
-			((AbstractEventHandlingInputPort) sink).setIncomingLink(datalink);
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/EditsImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/EditsImpl.java
deleted file mode 100644
index a460b95..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/EditsImpl.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.AddAnnotationAssertionEdit;
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationAssertionImpl;
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.annotation.AnnotationChainImpl;
-import net.sf.taverna.t2.annotation.AnnotationRole;
-import net.sf.taverna.t2.annotation.AnnotationSourceSPI;
-import net.sf.taverna.t2.annotation.CurationEvent;
-import net.sf.taverna.t2.annotation.Person;
-import net.sf.taverna.t2.facade.WorkflowInstanceFacade;
-import net.sf.taverna.t2.facade.impl.WorkflowInstanceFacadeImpl;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.workflowmodel.CompoundEdit;
-import net.sf.taverna.t2.workflowmodel.Configurable;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.InvalidDataflowException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-import net.sf.taverna.t2.workflowmodel.OrderedPair;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.impl.ActivityInputPortImpl;
-import net.sf.taverna.t2.workflowmodel.processor.activity.impl.ActivityOutputPortImpl;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.impl.AddDispatchLayerEdit;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.impl.DeleteDispatchLayerEdit;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-
-/**
- * Implementation of {@link Edits}
- * 
- */
-public class EditsImpl implements Edits {
-
-	public Dataflow createDataflow() {
-		return new DataflowImpl();
-	}
-
-	public Datalink createDatalink(EventForwardingOutputPort source,
-			EventHandlingInputPort sink) {
-		return new DatalinkImpl(source, sink);
-	}
-
-	public DataflowInputPort createDataflowInputPort(String name, int depth,
-			int granularDepth, Dataflow dataflow) {
-		return new DataflowInputPortImpl(name, depth, granularDepth, dataflow);
-	}
-
-	public DataflowOutputPort createDataflowOutputPort(String name,
-			Dataflow dataflow) {
-		return new DataflowOutputPortImpl(name, dataflow);
-	}
-
-	public MergeInputPort createMergeInputPort(Merge merge, String name,
-			int depth) {
-		if (merge instanceof MergeImpl) {
-			return new MergeInputPortImpl((MergeImpl) merge, name, depth);
-		} else {
-			return null;
-		}
-	}
-
-	public ProcessorOutputPort createProcessorOutputPort(Processor processor,
-			String name, int depth, int granularDepth) {
-		return new ProcessorOutputPortImpl((ProcessorImpl) processor, name,
-				depth, granularDepth);
-	}
-
-	public ProcessorInputPort createProcessorInputPort(Processor processor,
-			String name, int depth) {
-		return new ProcessorInputPortImpl((ProcessorImpl) processor, name,
-				depth);
-	}
-
-	public Edit<Dataflow> getAddProcessorEdit(Dataflow dataflow,
-			Processor processor) {
-		return new AddProcessorEdit(dataflow, processor);
-	}
-
-	public Edit<Dataflow> getAddMergeEdit(Dataflow dataflow, Merge merge) {
-		return new AddMergeEdit(dataflow, merge);
-	}
-
-	public Edit<DispatchStack> getAddDispatchLayerEdit(DispatchStack stack,
-			DispatchLayer<?> layer, int position) {
-		return new AddDispatchLayerEdit(stack, layer, position);
-	}
-
-	public Edit<Processor> getAddActivityEdit(Processor processor,
-			Activity<?> activity) {
-		return new AddActivityEdit(processor, activity);
-	}
-
-	public Edit<Processor> getAddProcessorInputPortEdit(Processor processor,
-			ProcessorInputPort port) {
-		return new AddProcessorInputPortEdit(processor, port);
-	}
-
-	public Edit<Processor> getAddProcessorOutputPortEdit(Processor processor,
-			ProcessorOutputPort port) {
-		return new AddProcessorOutputPortEdit(processor, port);
-	}
-
-	public Edit<Dataflow> getCreateDataflowInputPortEdit(Dataflow dataflow,
-			String portName, int portDepth, int granularDepth) {
-		return new CreateDataflowInputPortEdit(dataflow, portName, portDepth,
-				granularDepth);
-	}
-
-	public Edit<Dataflow> getCreateDataflowOutputPortEdit(Dataflow dataflow,
-			String portName) {
-		return new CreateDataflowOutputPortEdit(dataflow, portName);
-	}
-
-	public Edit<DispatchStack> getDeleteDispatchLayerEdit(DispatchStack stack,
-			DispatchLayer<?> layer) {
-		return new DeleteDispatchLayerEdit(stack, layer);
-	}
-	
-	public Edit<Merge> getRenameMergeEdit(Merge merge,
-			String newName) {
-		return new RenameMergeEdit(merge, newName);
-	}
-
-	public Edit<Processor> getRenameProcessorEdit(Processor processor,
-			String newName) {
-		return new RenameProcessorEdit(processor, newName);
-	}
-
-	public Edit<DataflowInputPort> getRenameDataflowInputPortEdit(
-			DataflowInputPort dataflowInputPort, String newName) {
-		return new RenameDataflowInputPortEdit(dataflowInputPort, newName);
-	}
-
-	public Edit<DataflowOutputPort> getRenameDataflowOutputPortEdit(
-			DataflowOutputPort dataflowOutputPort, String newName) {
-		return new RenameDataflowOutputPortEdit(dataflowOutputPort, newName);
-	}
-
-	public Edit<DataflowInputPort> getChangeDataflowInputPortDepthEdit(
-			DataflowInputPort dataflowInputPort, int depth) {
-		return new ChangeDataflowInputPortDepthEdit(dataflowInputPort, depth);
-	}
-
-	public Edit<DataflowInputPort> getChangeDataflowInputPortGranularDepthEdit(
-			DataflowInputPort dataflowInputPort, int granularDepth) {
-		return new ChangeDataflowInputPortGranularDepthEdit(dataflowInputPort,
-				granularDepth);
-	}
-
-	public Edit<Processor> getConnectProcessorOutputEdit(Processor processor,
-			String outputPortName, EventHandlingInputPort targetPort) {
-		return new ConnectProcesorOutputEdit(processor, outputPortName,
-				targetPort);
-	}
-
-	public Edit<Datalink> getConnectDatalinkEdit(Datalink datalink) {
-		return new ConnectDatalinkEdit(datalink);
-	}
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationChain> getAddAnnotationAssertionEdit(
-			AnnotationChain annotationChain,
-			AnnotationAssertion annotationAssertion) {
-		return new AddAnnotationAssertionEdit(annotationChain,
-				annotationAssertion);
-	}
-
-	/**
-	 * Creates a MergeImpl instance. Merge names are generated as 'Merge0',
-	 * 'Merge1', 'Merge2', etc. The next merge to be added always gets the name
-	 * as the previous merge in the list with its index incremented by one. If a
-	 * merge is deleted, that is not taken into account when generating merges'
-	 * names.
-	 */
-	public Merge createMerge(Dataflow dataflow) {
-
-		String mergeName;
-
-		// Get all merges for a workflow
-		List<? extends Merge> merges = (List<? extends Merge>) dataflow
-				.getMerges();
-
-		if (merges.isEmpty()) {
-			mergeName = "Merge0"; // the first merge to be added to the list
-		} else {
-			String lastMergeName = merges.get(merges.size() - 1).getLocalName();
-			// Get the index of the last Merge
-			int lastMergeIndex = Integer.parseInt(lastMergeName.substring(5));
-			mergeName = "Merge" + String.valueOf((lastMergeIndex + 1));
-		}
-
-		return new MergeImpl(mergeName);
-	}
-
-	/**
-	 * @return a new instance of ConnectMergedDatalinkEdit constructed from the
-	 *         provided parameters.
-	 * 
-	 * @param merge
-	 *            a Merge instance
-	 * @param sourcePort
-	 *            the source port from which a link is to be created.
-	 * @param sinkPort
-	 *            the sink port to which the link is to be created.
-	 */
-	public Edit<Merge> getConnectMergedDatalinkEdit(Merge merge,
-			EventForwardingOutputPort sourcePort,
-			EventHandlingInputPort sinkPort) {
-		return new ConnectMergedDatalinkEdit(merge, sourcePort, sinkPort);
-	}
-
-	public Edit<OrderedPair<Processor>> getCreateConditionEdit(
-			Processor control, Processor target) {
-		return new CreateConditionEdit(control, target);
-	}
-
-	public Edit<OrderedPair<Processor>> getRemoveConditionEdit(
-			Processor control, Processor target) {
-		return new RemoveConditionEdit(control, target);
-	}
-
-	public Processor createProcessor(String name) {
-		ProcessorImpl processor = new ProcessorImpl();
-		processor.setName(name);
-		return processor;
-	}
-
-	/**
-	 * Builds an instance of {@link ActivityInputPortImpl}
-	 */
-	public ActivityInputPort createActivityInputPort(
-			String portName,
-			int portDepth,
-			boolean allowsLiteralValues,
-			List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes,
-			Class<?> translatedElementClass) {
-		return new ActivityInputPortImpl(portName, portDepth,
-				allowsLiteralValues, handledReferenceSchemes,
-				translatedElementClass);
-	}
-
-	/**
-	 * Builds an instance of {@link ActivityOutputPortImpl}
-	 */
-	public OutputPort createActivityOutputPort(String portName, int portDepth,
-			int portGranularDepth) {
-		return new ActivityOutputPortImpl(portName, portDepth,
-				portGranularDepth);
-	}
-
-	public WorkflowInstanceFacade createWorkflowInstanceFacade(
-			Dataflow dataflow, InvocationContext context, String parentProcess)
-			throws InvalidDataflowException {
-		return new WorkflowInstanceFacadeImpl(dataflow, context, parentProcess);
-	}
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddAnnotationBean(
-			AnnotationAssertion annotationAssertion,
-			AnnotationBeanSPI annotationBean) {
-		return new AddAnnotationBeanEdit(annotationAssertion, annotationBean);
-	}
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddCurationEvent(
-			AnnotationAssertion annotationAssertion, CurationEvent curationEvent) {
-		return new AddCurationEventEdit(annotationAssertion, curationEvent);
-	}
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddAnnotationRole(
-			AnnotationAssertion annotationAssertion,
-			AnnotationRole annotationRole) {
-		return new AddAnnotationRoleEdit(annotationAssertion, annotationRole);
-	}
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddAnnotationSource(
-			AnnotationAssertion annotationAssertion,
-			AnnotationSourceSPI annotationSource) {
-		return new AddAnnotationSourceEdit(annotationAssertion,
-				annotationSource);
-	}
-
-	@SuppressWarnings("unchecked")
-	public Edit<AnnotationAssertion> getAddCreator(
-			AnnotationAssertion annotationAssertion, Person person) {
-		return new AddCreatorEdit(annotationAssertion, person);
-	}
-
-	public Edit<?> getAddAnnotationChainEdit(Annotated<?> annotated,
-			AnnotationBeanSPI annotation) {
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-
-		AnnotationAssertion<?> annotationAssertion = new AnnotationAssertionImpl();
-		editList.add(getAddAnnotationBean(annotationAssertion, annotation));
-
-		AnnotationChain annotationChain = new AnnotationChainImpl();
-		editList.add(getAddAnnotationAssertionEdit(annotationChain,
-				annotationAssertion));
-
-		editList.add(annotated.getAddAnnotationEdit(annotationChain));
-
-		return new CompoundEdit(editList);
-	}
-
-	public Edit<Dataflow> getUpdateDataflowNameEdit(Dataflow dataflow,
-			String newName) {
-		return new UpdateDataflowNameEdit(dataflow, newName);
-	}
-
-	public Edit<Dataflow> getUpdateDataflowInternalIdentifierEdit(
-			Dataflow dataflow, String newId) {
-		return new UpdateDataflowInternalIdentifierEdit(dataflow, newId);
-	}
-
-	public Edit<Datalink> getDisconnectDatalinkEdit(Datalink datalink) {
-		return new DisconnectDatalinkEdit(datalink);
-	}
-
-	public Edit<Dataflow> getRemoveDataflowInputPortEdit(Dataflow dataflow,
-			DataflowInputPort dataflowInputPort) {
-		return new RemoveDataflowInputPortEdit(dataflow, dataflowInputPort);
-	}
-
-	public Edit<Dataflow> getRemoveDataflowOutputPortEdit(Dataflow dataflow,
-			DataflowOutputPort dataflowOutputPort) {
-		return new RemoveDataflowOutputPortEdit(dataflow, dataflowOutputPort);
-	}
-
-	public Edit<Dataflow> getRemoveProcessorEdit(Dataflow dataflow,
-			Processor processor) {
-		return new RemoveProcessorEdit(dataflow, processor);
-	}
-
-	public Edit<Dataflow> getRemoveMergeEdit(Dataflow dataflow, Merge merge) {
-		return new RemoveMergeEdit(dataflow, merge);
-	}
-
-	public Edit<Dataflow> getAddDataflowInputPortEdit(Dataflow dataflow,
-			DataflowInputPort dataflowInputPort) {
-		return new AddDataflowInputPortEdit(dataflow, dataflowInputPort);
-	}
-
-	public Edit<Dataflow> getAddDataflowOutputPortEdit(Dataflow dataflow,
-			DataflowOutputPort dataflowOutputPort) {
-		return new AddDataflowOutputPortEdit(dataflow, dataflowOutputPort);
-	}
-
-	public Edit<Activity<?>> getAddActivityInputPortEdit(Activity<?> activity,
-			ActivityInputPort activityInputPort) {
-		return new AddActivityInputPortEdit(activity, activityInputPort);
-	}
-
-	public Edit<Activity<?>> getAddActivityInputPortMappingEdit(
-			Activity<?> activity, String processorPortName,
-			String activityPortName) {
-		return new AddActivityInputPortMappingEdit(activity, processorPortName,
-				activityPortName);
-	}
-
-	public Edit<Activity<?>> getAddActivityOutputPortEdit(Activity<?> activity,
-			OutputPort activityOutputPort) {
-		return new AddActivityOutputPortEdit(activity, activityOutputPort);
-	}
-
-	public Edit<Activity<?>> getAddActivityOutputPortMappingEdit(
-			Activity<?> activity, String processorPortName,
-			String activityPortName) {
-		return new AddActivityOutputPortMappingEdit(activity,
-				processorPortName, activityPortName);
-	}
-
-	public Edit<Activity<?>> getRemoveActivityInputPortEdit(
-			Activity<?> activity, ActivityInputPort activityInputPort) {
-		return new RemoveActivityInputPortEdit(activity, activityInputPort);
-	}
-
-	public Edit<Activity<?>> getRemoveActivityInputPortMappingEdit(
-			Activity<?> activity, String processorPortName) {
-		return new RemoveActivityInputPortMappingEdit(activity,
-				processorPortName);
-	}
-
-	public Edit<Activity<?>> getRemoveActivityOutputPortEdit(
-			Activity<?> activity, OutputPort activityOutputPort) {
-		return new RemoveActivityOutputPortEdit(activity, activityOutputPort);
-	}
-
-	public Edit<Activity<?>> getRemoveActivityOutputPortMappingEdit(
-			Activity<?> activity, String processorPortName) {
-		return new RemoveActivityOutputPortMappingEdit(activity,
-				processorPortName);
-	}
-
-	public Edit<Merge> getAddMergeInputPortEdit(Merge merge,
-			MergeInputPort mergeInputPort) {
-		return new AddMergeInputPortEdit(merge, mergeInputPort);
-	}
-
-	@SuppressWarnings("unchecked")
-	public <ConfigurationBean> Edit<Activity<?>> getConfigureActivityEdit(
-			Activity<ConfigurationBean> activity,
-			ConfigurationBean configurationBean) {
-		return new ConfigureActivityEdit(activity, configurationBean);
-	}
-
-	public Edit<Processor> getRemoveProcessorInputPortEdit(Processor processor,
-			ProcessorInputPort port) {
-		return new RemoveProcessorInputPortEdit(processor, port);
-	}
-
-	public Edit<Processor> getRemoveProcessorOutputPortEdit(
-			Processor processor, ProcessorOutputPort port) {
-		return new RemoveProcessorOutputPortEdit(processor, port);
-	}
-
-	public Edit<Processor> getMapProcessorPortsForActivityEdit(
-			Processor processor) {
-		return new MapProcessorPortsForActivityEdit(processor);
-	}
-
-	public Edit<Processor> getDefaultDispatchStackEdit(Processor processor) {
-		return new DefaultDispatchStackEdit(processor);
-	}
-
-	public Edit<Processor> getSetIterationStrategyStackEdit(
-			Processor processor, IterationStrategyStack iterationStrategyStack) {
-		return new SetIterationStrategyStackEdit(processor,
-				iterationStrategyStack);
-	}
-
-	public <ConfigurationType> Edit<? extends Configurable<ConfigurationType>> getConfigureEdit(
-			Configurable<ConfigurationType> configurable,
-			ConfigurationType configBean) {
-		return new ConfigureEdit<Configurable<ConfigurationType>, Configurable<ConfigurationType>>(
-				Configurable.class, configurable, configBean);
-	}
-
-	public Edit<Merge> getReorderMergeInputPortsEdit(Merge merge,
-			List<MergeInputPort> reorderedMergeInputPortList) {
-		return new ReorderMergeInputPortsEdit(merge, reorderedMergeInputPortList);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MapProcessorPortsForActivityEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MapProcessorPortsForActivityEdit.java
deleted file mode 100644
index 95f12df..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MapProcessorPortsForActivityEdit.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.CompoundEdit;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-
-public class MapProcessorPortsForActivityEdit implements Edit<Processor> {
-
-	private final ProcessorImpl processor;
-	CompoundEdit compoundEdit = null;
-	
-
-	public MapProcessorPortsForActivityEdit(Processor processor) {
-		this.processor = (ProcessorImpl)processor;
-	}
-	
-	public Processor doEdit() throws EditException {
-		EditsImpl editsImpl = new EditsImpl();
-		List<Edit<?>> edits = new ArrayList<Edit<?>>();
-		Activity<?> a = processor.getActivityList().get(0);
-		
-		List<? extends ProcessorInputPort> inputPortsForRemoval = determineInputPortsForRemoval(processor,a);
-		List<? extends ProcessorOutputPort> outputPortsForRemoval = determineOutputPortsForRemoval(processor,a);
-//		List<ActivityInputPort> changedInputPorts = determineChangedInputPorts(processor,a);
-//		List<OutputPort> changedOutputPorts = determineChangedOutputPorts(processor,a);
-//		List<ActivityInputPort> newInputPorts = determineNewInputPorts(processor,a);
-//		List<OutputPort> newOutputPorts = determineNewOutputPorts(processor,a);
-		
-		for (ProcessorInputPort ip : inputPortsForRemoval) {
-			if (ip.getIncomingLink()!=null) {
-				edits.add(editsImpl.getDisconnectDatalinkEdit(ip.getIncomingLink()));
-			}
-			edits.add(editsImpl.getRemoveProcessorInputPortEdit(processor, ip));
-			if (a.getInputPortMapping().containsKey(ip.getName())) {
-				edits.add(new RemoveActivityInputPortMappingEdit(a,ip.getName()));
-			}
-		}
-		
-		for (ProcessorOutputPort op : outputPortsForRemoval) {
-			if (op.getOutgoingLinks().size()>0) {
-				for (Datalink link : op.getOutgoingLinks())
-				edits.add(editsImpl.getDisconnectDatalinkEdit(link));
-			}
-			edits.add(editsImpl.getRemoveProcessorOutputPortEdit(processor, op));
-			if (a.getOutputPortMapping().containsKey(op.getName())) {
-				edits.add(new RemoveActivityOutputPortMappingEdit(a,op.getName()));
-			}
-		}
-		
-//		for (ActivityInputPort ip : changedInputPorts) {
-//			ProcessorInputPort pPort = processor.getInputPortWithName(ip.getName());
-//			edits.add(new ChangeProcessorInputPortDepthEdit(pPort,ip.getDepth()));
-//		}
-//		
-//		for (OutputPort op : changedOutputPorts) {
-//			ProcessorOutputPort pPort = processor.getOutputPortWithName(op.getName());
-//			if (pPort.getDepth() != op.getDepth()) {
-//				edits.add(new ChangeProcessorOutputPortDepthEdit(pPort,op.getDepth()));
-//			}
-//			if (pPort.getGranularDepth() != op.getGranularDepth()) {
-//				edits.add(new ChangeProcessorOutputPortGranularDepthEdit(pPort,op.getGranularDepth()));
-//			}
-//		}
-		
-//		for (ActivityInputPort ip : newInputPorts) {
-//			ProcessorInputPort processorInputPort = editsImpl.createProcessorInputPort(processor, ip.getName(), ip.getDepth());
-//			edits.add(editsImpl.getAddProcessorInputPortEdit(processor, processorInputPort));
-//			edits.add(new AddActivityInputPortMapping(a,ip.getName(),ip.getName()));
-//		}
-//		
-//		for (OutputPort op : newOutputPorts) {
-//			ProcessorOutputPort processorOutputPort = editsImpl.createProcessorOutputPort(processor, op.getName(), op.getDepth(), op.getGranularDepth());
-//			edits.add(editsImpl.getAddProcessorOutputPortEdit(processor, processorOutputPort));
-//			edits.add(new AddActivityOutputPortMapping(a,op.getName(),op.getName()));
-//		}
-		
-		compoundEdit = new CompoundEdit(edits);
-		compoundEdit.doEdit();
-		return processor;
-	}
-
-	public Object getSubject() {
-		return processor;
-	}
-
-	public boolean isApplied() {
-		return (compoundEdit!=null && compoundEdit.isApplied());
-	}
-
-	public void undo() {
-		compoundEdit.undo();
-	}
-
-	private List<ProcessorInputPort> determineInputPortsForRemoval(Processor p,Activity<?>a) {
-		
-		List<ProcessorInputPort> result = new ArrayList<ProcessorInputPort>();
-		for (ProcessorInputPort pPort : p.getInputPorts()) {
-			boolean found=false;
-			for (ActivityInputPort aPort : a.getInputPorts()) {
-				if (aPort.getName().equals(pPort.getName())) {
-					if (pPort.getDepth() == aPort.getDepth()) {
-						found=true;
-					}
-					break;
-				}
-			}
-			if (!found) {
-				result.add(pPort);
-			}
-		}
-		return result;
-	}
-	
-	private List<ProcessorOutputPort> determineOutputPortsForRemoval(Processor p,Activity<?>a) {
-		List<ProcessorOutputPort> result = new ArrayList<ProcessorOutputPort>();
-		for (ProcessorOutputPort pPort : p.getOutputPorts()) {
-			boolean found=false;
-			for (OutputPort aPort : a.getOutputPorts()) {
-				if (aPort.getName().equals(pPort.getName())) {
-					if (pPort.getDepth() == aPort.getDepth() && pPort.getGranularDepth() == aPort.getGranularDepth()) {
-						found=true;
-					}
-					break;
-				}
-			}
-			if (!found) {
-				result.add(pPort);
-			}
-		}
-		return result;
-	}
-	
-//	private List<ActivityInputPort> determineChangedInputPorts(ProcessorImpl p,Activity<?>a) {
-//		
-//		List<ActivityInputPort> result = new ArrayList<ActivityInputPort>();
-//		for (ActivityInputPort aPort : a.getInputPorts()) {
-//			ProcessorInputPort pPort = p.getInputPortWithName(aPort.getName());
-//			
-//			if (pPort!=null && pPort.getDepth()!=aPort.getDepth()) {
-//				result.add(aPort);
-//			}
-//		}
-//		return result;
-//	}
-//	
-//	private List<OutputPort> determineChangedOutputPorts(ProcessorImpl p,Activity<?>a) {
-//		List<OutputPort> result = new ArrayList<OutputPort>();
-//		for (OutputPort aPort : a.getOutputPorts()) {
-//			ProcessorOutputPort pPort = p.getOutputPortWithName(aPort.getName());
-//			
-//			if (pPort!=null && (pPort.getDepth()!=aPort.getDepth() || pPort.getGranularDepth()!=aPort.getGranularDepth())) {
-//				result.add(aPort);
-//			}
-//		}
-//		return result;
-//	}
-	
-//	private List<ActivityInputPort> determineNewInputPorts(ProcessorImpl p,Activity<?> a) {
-//		List<ActivityInputPort> result = new ArrayList<ActivityInputPort>();
-//		for (ActivityInputPort aPort : a.getInputPorts()) {
-//			ProcessorInputPort pPort = p.getInputPortWithName(aPort.getName());
-//			
-//			if (pPort==null) {
-//				result.add(aPort);
-//			}
-//		}
-//		
-//		return result;
-//	}
-//	
-//	private List<OutputPort> determineNewOutputPorts(ProcessorImpl p,Activity<?> a) {
-//		List<OutputPort> result = new ArrayList<OutputPort>();
-//		for (OutputPort aPort : a.getOutputPorts()) {
-//			ProcessorOutputPort pPort = p.getOutputPortWithName(aPort.getName());
-//			
-//			if (pPort==null) {
-//				result.add(aPort);
-//			}
-//		}
-//		
-//		return result;
-//	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeImpl.java
deleted file mode 100644
index adfd382..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeImpl.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.reference.IdentifiedList;
-import net.sf.taverna.t2.reference.ListService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.InputPort;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-
-import org.apache.log4j.Logger;
-
-/**
- * Implementation of {@link Merge}
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- *
- */
-public class MergeImpl implements Merge {
-
-	@SuppressWarnings("unused")
-	private static Logger logger = Logger.getLogger(MergeImpl.class);
-	
-	private List<MergeInputPortImpl> inputs = new ArrayList<MergeInputPortImpl>();
-
-	private String name;
-
-	private BasicEventForwardingOutputPort output;
-	
-	private Map<String, List<T2Reference>> partialOutputsByProcess = new HashMap<String, List<T2Reference>>();
-
-	public MergeImpl(String mergeName) {
-		super();
-		this.name = mergeName;
-		this.output = new MergeOutputPortImpl(this, name+"_output", 0, 0);
-	}
-
-	public String getLocalName() {
-		return this.name;
-	}
-	
-	protected void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * Adds a new input port to the internal list of ports.
-	 * 
-	 * @param inputPort
-	 *            the MergeInputPortImpl
-	 */
-	public void addInputPort(MergeInputPortImpl inputPort) {
-		inputs.add(inputPort);
-	}
-
-	/**
-	 * Removes an input port from the internal list of ports.
-	 * 
-	 * @param inputPort
-	 */
-	public void removeInputPort(MergeInputPortImpl inputPort) {
-		inputs.remove(inputPort);
-	}
-
-	public List<? extends MergeInputPort> getInputPorts() {
-		return inputs;
-	}
-
-	public EventForwardingOutputPort getOutputPort() {
-		return this.output;
-	}
-
-	/**
-	 * Return the index of the port with the specified name, or -1 if the port
-	 * can't be found (this is a bad thing!)
-	 * 
-	 * @param portName
-	 * @return
-	 */
-	private int inputPortNameToIndex(String portName) {
-		int i = 0;
-		for (InputPort ip : inputs) {
-			if (ip.getName().equals(portName)) {
-				return i;
-			}
-			i++;
-		}
-		return -1; // FIXME: as the javadoc states, this is a bad thing!
-	}
-	
-
-	protected void receiveEvent(WorkflowDataToken token, String portName) {
-		List<T2Reference> outputList;
-		String owningProcess = token.getOwningProcess();
-		synchronized (partialOutputsByProcess) {
-			outputList = partialOutputsByProcess.get(owningProcess);
-			if (outputList == null) {
-				int numPorts = getInputPorts().size();
-				outputList = new ArrayList<T2Reference>(Collections.nCopies(numPorts, (T2Reference)null));
-				partialOutputsByProcess.put(owningProcess, outputList);
-			}
-		}
-		int portIndex = inputPortNameToIndex(portName);
-		if (portIndex == -1) {
-			throw new WorkflowStructureException(
-					"Received event on unknown port " + portName);
-		}
-		int[] currentIndex = token.getIndex();
-		int[] newIndex = new int[currentIndex.length + 1];
-		newIndex[0] = portIndex;
-		for (int i = 0; i < currentIndex.length; i++) {
-			newIndex[i + 1] = currentIndex[i];
-		}
-		InvocationContext context = token.getContext();
-		output.sendEvent(new WorkflowDataToken(owningProcess,
-				newIndex, token.getData(), context));
-		if (token.getIndex().length == 0) {
-			// Add to completion list
-			synchronized (outputList) {
-				if (outputList.size() <= portIndex) {
-					// Ports changed after initiating running as our list is
-					// smaller than portIndex
-					throw new WorkflowStructureException(
-							"Unexpected addition of output port " + portName
-									+ " at " + portIndex);
-				}
-				if (outputList.get(portIndex) != null) {
-					throw new WorkflowStructureException(
-							"Already received completion for port " + portName
-									+ " " + outputList.get(portIndex));
-				}
-				outputList.set(portIndex, token.getData());
-				if (!outputList.contains(null)) {
-					// We're finished, let's register and send out the list
-					ListService listService = context.getReferenceService()
-							.getListService();
-					IdentifiedList<T2Reference> registeredList = listService
-							.registerList(outputList);
-					WorkflowDataToken workflowDataToken = new WorkflowDataToken(
-							owningProcess, new int[0], registeredList.getId(),
-							context);
-					synchronized (partialOutputsByProcess) {
-						partialOutputsByProcess.remove(owningProcess);
-					}
-					output.sendEvent(workflowDataToken);
-				}
-			}
-		}
-	}
-
-	/**
-	 * There is only ever a single output from a merge node but the token
-	 * processing entity interface defines a list, in this case it always
-	 * contains exactly one item.
-	 */
-	public List<? extends EventForwardingOutputPort> getOutputPorts() {
-		List<EventForwardingOutputPort> result = new ArrayList<EventForwardingOutputPort>();
-		result.add(output);
-		return result;
-	}
-
-	public boolean doTypeCheck() throws IterationTypeMismatchException {
-		if (inputs.size() == 0) {
-			// Arguable, but technically a merge with no inputs is valid, it may
-			// make more sense to throw an exception here though as it has no
-			// actual meaning.
-			return true;
-		}
-		// Return false if we have unbound input ports or bound ports where the
-		// resolved depth hasn't been calculated yet
-		for (MergeInputPort ip : inputs) {
-			if (ip.getIncomingLink() == null
-					|| ip.getIncomingLink().getResolvedDepth() == -1) {
-				return false;
-			}
-		}
-		// Got all input ports, now scan for input depths
-		int inputDepth = inputs.get(0).getIncomingLink().getResolvedDepth();
-		for (MergeInputPort ip : inputs) {
-			if (ip.getIncomingLink().getResolvedDepth() != inputDepth) {
-				throw new IterationTypeMismatchException();
-			}
-		}
-		// Got to here so all the input resolved depths match, push depth+1 to
-		// all outgoing links and return true
-		for (DatalinkImpl dli : output.outgoingLinks) {
-			dli.setResolvedDepth(inputDepth+1);
-		}
-		return true;
-	}
-
-	@SuppressWarnings("unchecked")
-	public void reorderInputPorts(
-			List<? extends MergeInputPort> reorderedInputPortList) {
-		// Just set the inputs to the already reordered list of ports
-		inputs = (List<MergeInputPortImpl>) reorderedInputPortList;	
-	}
-	
-	@Override
-	public String toString() {
-		return "Merge " + getLocalName();
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeInputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeInputPortImpl.java
deleted file mode 100644
index e8597e6..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeInputPortImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-
-public class MergeInputPortImpl extends AbstractEventHandlingInputPort implements MergeInputPort {
-
-	private MergeImpl parent;
-	
-	protected MergeInputPortImpl(MergeImpl merge, String name, int depth) {
-		super(name, depth);
-		this.parent = merge;
-	}
-
-	public void receiveEvent(WorkflowDataToken t) {
-		parent.receiveEvent(t, this.name);
-	}
-
-	/**
-	 * Deprecated - use {@link #getMerge()}
-	 * 
-	 * @see #getMerge()
-	 * @return
-	 */
-	@Deprecated
-	public Merge getMergeInstance() {
-		return parent;
-	}
-	
-
-	public Merge getMerge() {
-		return parent;
-	}
-
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeOutputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeOutputPortImpl.java
deleted file mode 100644
index 4b6b550..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/MergeOutputPortImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeOutputPort;
-
-public class MergeOutputPortImpl extends BasicEventForwardingOutputPort implements MergeOutputPort {
-	
-	private Merge merge;
-	
-	public MergeOutputPortImpl(Merge merge,String portName, int portDepth, int granularDepth) {
-		super(portName, portDepth, granularDepth);
-		this.merge=merge;
-	}
-	
-	public Merge getMerge() {
-		return merge;
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorCrystalizerImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorCrystalizerImpl.java
deleted file mode 100644
index 6dd506e..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorCrystalizerImpl.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * AbstractCrystalizer bound to a specific ProcessorImpl
- * 
- * @author Tom Oinn
- * 
- */
-public class ProcessorCrystalizerImpl extends AbstractCrystalizer {
-
-	private ProcessorImpl parent;
-
-	/**
-	 * Create and bind to the specified ProcessorImpl
-	 * 
-	 * @param parent
-	 */
-	protected ProcessorCrystalizerImpl(ProcessorImpl parent) {
-		this.parent = parent;
-	}
-
-	public void completionCreated(Completion completion) {
-		throw new WorkflowStructureException(
-				"Should never see this if everything is working,"
-						+ "if this occurs it is likely that the internal "
-						+ "logic is broken, talk to Tom");
-	}
-
-	public void jobCreated(Job outputJob) {
-		for (String outputPortName : outputJob.getData().keySet()) {
-			WorkflowDataToken token = new WorkflowDataToken(outputJob
-					.getOwningProcess(), outputJob.getIndex(), outputJob
-					.getData().get(outputPortName), outputJob.getContext());
-			parent.getOutputPortWithName(outputPortName).receiveEvent(token);
-		}
-	}
-
-	@Override
-	/**
-	 * Used to construct a Job of empty lists at the appropriate depth in the
-	 * event of a completion hitting the crystalizer before it sees a child
-	 * node, i.e. the result of iterating over an empty collection structure of
-	 * some kind.
-	 */
-	public Job getEmptyJob(String owningProcess, int[] index,
-			InvocationContext context) {
-		int wrappingDepth = parent.resultWrappingDepth;
-		if (wrappingDepth < 0)
-			throw new RuntimeException(
-					"Processor ["+owningProcess+"] hasn't been configured, cannot emit empty job");
-		// The wrapping depth is the length of index array that would be used if
-		// a single item of the output port type were returned. We can examine
-		// the index array for the node we're trying to create and use this to
-		// work out how much we need to add to the output port depth to create
-		// empty lists of the right type given the index array.
-		int depth = wrappingDepth - index.length;
-		// TODO - why was this incrementing?
-		// depth++;
-
-		ReferenceService rs = context.getReferenceService();
-		Map<String, T2Reference> emptyJobMap = new HashMap<String, T2Reference>();
-		for (OutputPort op : parent.getOutputPorts()) {
-			emptyJobMap.put(op.getName(), rs.getListService()
-					.registerEmptyList(depth + op.getDepth()).getId());
-		}
-		return new Job(owningProcess, index, emptyJobMap, context);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthChecker.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthChecker.java
deleted file mode 100644
index 3609c1d..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthChecker.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
-import net.sf.taverna.t2.workflowmodel.health.HealthCheckerFactory;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport.Status;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * A Health Checker associated with Processors. This iterates over the processor activities
- * invoking each HealthChecker available for each Activity to generate an overal ProcessorHealthReport
- * @author Stuart Owen
- *
- */
-public class ProcessorHealthChecker implements HealthChecker<Processor> {
-
-	public boolean canHandle(Object subject) {
-		return subject!=null && subject instanceof Processor;
-	}
-
-	@SuppressWarnings("unchecked")
-	public HealthReport checkHealth(Processor subject) {
-		List<HealthReport> activityReports = new ArrayList<HealthReport>();
-		for (Activity<?> a : subject.getActivityList()) {
-			List<HealthChecker<?>> checkers = HealthCheckerFactory
-					.getInstance().getHealthCheckersForObject(a);
-			if (checkers.size() > 0) {
-				List<HealthReport> reports = new ArrayList<HealthReport>();
-				for (HealthChecker checker : checkers) {
-					reports.add(checker.checkHealth(a));
-				}
-				if (reports.size() == 1) {
-					activityReports.add(reports.get(0));
-				} else {
-					activityReports.add(new HealthReport("Activity tests...", "",
-							Status.OK, reports));
-				}
-			}
-		}
-		HealthReport processorHealthReport = new ProcessorHealthReport(
-				subject.getLocalName() + " Processor", activityReports);
-		return processorHealthReport;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthReport.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthReport.java
deleted file mode 100644
index 68e1186..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthReport.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-
-/**
- * A HealthReport assocatied with Processors.<br>
- * In particular the behaviour for producing an overall status is specialised.
- * @author Stuart Owen
- *
- * @see ProcessorHealthReport#getStatus()
- */
-public class ProcessorHealthReport extends HealthReport {
-
-	public ProcessorHealthReport(String subject,List<HealthReport> activityHealthReports) {
-		super(subject,"",Status.OK,activityHealthReports);
-		
-	}
-
-	/**
-	 * the overall status is SEVERE if all sub reports are SEVERE, OK if all are OK, otherwise WARNING.
-	 * return 
-	 */
-	@Override
-	public Status getStatus() {
-		Status result = super.getStatus();
-		int severeCount = 0;
-		for (HealthReport report : getSubReports()) {
-			if (report.getStatus()!=Status.OK) {
-				result = Status.WARNING;
-			}
-			if (report.getStatus()==Status.SEVERE) severeCount++;
-		}
-		if (severeCount==getSubReports().size()) result=Status.SEVERE;
-		return result;
-	}
-	
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorImpl.java
deleted file mode 100644
index f03060c..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorImpl.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.raven.log.Log;
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.lang.observer.MultiCaster;
-import net.sf.taverna.t2.lang.observer.Observer;
-import net.sf.taverna.t2.monitor.MonitorManager;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.InvalidDataflowException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorFinishedEvent;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-import net.sf.taverna.t2.workflowmodel.processor.activity.NestedDataflow;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.PropertyContributingDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.impl.DispatchStackImpl;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.MissingIterationInputException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyImpl;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyStackImpl;
-
-/**
- * Implementation of Processor
- * 
- * @author Tom Oinn
- * @author Stuart Owen
- * @author Alex Nenadic
- * 
- */
-public final class ProcessorImpl extends AbstractAnnotatedThing<Processor>
-		implements Processor{
-
-	protected List<ConditionImpl> conditions = new ArrayList<ConditionImpl>();
-
-	protected List<ConditionImpl> controlledConditions = new ArrayList<ConditionImpl>();
-
-	protected List<ProcessorInputPortImpl> inputPorts = new ArrayList<ProcessorInputPortImpl>();
-
-	protected List<ProcessorOutputPortImpl> outputPorts = new ArrayList<ProcessorOutputPortImpl>();
-
-	protected List<Activity<?>> activityList = new ArrayList<Activity<?>>();
-
-	protected AbstractCrystalizer crystalizer;
-
-	protected DispatchStackImpl dispatchStack;
-
-	protected IterationStrategyStackImpl iterationStack;
-
-	private static int pNameCounter = 0;
-
-	protected String name;
-
-	public transient int resultWrappingDepth = -1;
-
-	protected transient Map<String, Set<MonitorableProperty<?>>> monitorables = new HashMap<String, Set<MonitorableProperty<?>>>();
-	
-	private static Log logger = Log.getLogger(ProcessorImpl.class);
-
-	private MultiCaster<ProcessorFinishedEvent> processorFinishedMultiCaster = new MultiCaster<ProcessorFinishedEvent>(this);
-	
-	/**
-	 * <p>
-	 * Create a new processor implementation with default blank iteration
-	 * strategy and dispatch stack.
-	 * </p>
-	 * <p>
-	 * This constructor is protected to enforce that an instance can only be
-	 * created via the {@link EditsImpl#createProcessor(String)} method.
-	 * </p>
-	 */
-
-	@SuppressWarnings("unchecked")
-	protected ProcessorImpl() {
-
-		// Set a default name
-		name = "UnnamedProcessor" + (pNameCounter++);
-
-		// Create iteration stack, configure it to send jobs and completion
-		// events to the dispatch stack.
-		iterationStack = new IterationStrategyStackImpl() {
-			@Override
-			protected void receiveEventFromStrategy(IterationInternalEvent e) {
-				dispatchStack.receiveEvent(e);
-			}
-		};
-		iterationStack.addStrategy(new IterationStrategyImpl());
-
-		// Configure dispatch stack to push output events to the crystalizer
-		dispatchStack = new DispatchStackImpl() {
-
-			@Override
-			protected String getProcessName() {
-				return ProcessorImpl.this.name;
-			}
-
-			public Processor getProcessor() {
-				return ProcessorImpl.this;
-			}
-			
-			/**
-			 * Called when an event bubbles out of the top of the dispatch
-			 * stack. In this case we pass it into the crystalizer.
-			 */
-			@Override
-			protected void pushEvent(IterationInternalEvent e) {
-				crystalizer.receiveEvent(e);
-			}
-
-			/**
-			 * Iterate over all the preconditions and return true if and only if
-			 * all are satisfied for the given process identifier.
-			 */
-			@Override
-			protected boolean conditionsSatisfied(String owningProcess) {
-				for (Condition c : conditions) {
-					if (c.isSatisfied(owningProcess) == false) {
-						return false;
-					}
-				}
-				return true;
-			}
-
-			@Override
-			protected List<? extends Activity<?>> getActivities() {
-				return ProcessorImpl.this.getActivityList();
-			}
-
-			/**
-			 * We've finished here, set the satisfied property on any controlled
-			 * condition objects to true and notify the targets.
-			 */
-			@Override
-			protected void finishedWith(String owningProcess) {
-				if (! controlledConditions.isEmpty()) {
-					String enclosingProcess = owningProcess.substring(0,
-							owningProcess.lastIndexOf(':'));
-					for (ConditionImpl ci : controlledConditions) {
-						ci.satisfy(enclosingProcess);
-						ci.getTarget().getDispatchStack().satisfyConditions(
-								enclosingProcess);
-					}
-				}
-				// Tell whoever is interested that the processor has finished executing
-				processorFinishedMultiCaster.notify(new ProcessorFinishedEvent(this.getProcessor(), owningProcess));
-			}
-
-			public void receiveMonitorableProperty(MonitorableProperty<?> prop,
-					String processID) {
-				synchronized (monitorables) {
-					Set<MonitorableProperty<?>> props = monitorables
-							.get(processID);
-					if (props == null) {
-						props = new HashSet<MonitorableProperty<?>>();
-						monitorables.put(processID, props);
-					}
-					props.add(prop);
-				}
-			}
-		};
-
-		// Configure crystalizer to send realized events to the output ports
-		crystalizer = new ProcessorCrystalizerImpl(this);
-
-	}
-
-	/**
-	 * When called this method configures input port filters and the
-	 * crystalizer, pushing cardinality information into outgoing datalinks.
-	 * 
-	 * @return true if the typecheck was successful or false if the check failed
-	 *         because there were preconditions missing such as unsatisfied
-	 *         input types
-	 * @throws IterationTypeMismatchException
-	 *             if the typing occured but didn't match because of an
-	 *             iteration mismatch
-	 * @throws InvalidDataflowException 
-	 * 			 	if the entity depended on a dataflow that was not valid
-	 */
-	public boolean doTypeCheck() throws IterationTypeMismatchException, InvalidDataflowException {
-		
-		// Check for any nested dataflows, they should all be valid
-		for (Activity<?> activity : getActivityList()) {
-			if (activity instanceof NestedDataflow) {
-				NestedDataflow nestedDataflowActivity = (NestedDataflow) activity;
-				Dataflow nestedDataflow = nestedDataflowActivity.getNestedDataflow();
-				DataflowValidationReport validity = nestedDataflow.checkValidity();
-				if (! validity.isValid())  {
-					throw new InvalidDataflowException(nestedDataflow, validity);
-				}
-			}	
-		}
-		
-		// Check whether all our input ports have inbound links
-		Map<String, Integer> inputDepths = new HashMap<String, Integer>();
-		for (ProcessorInputPortImpl input : inputPorts) {
-			if (input.getIncomingLink() == null) {
-				return false;
-			} else {
-				if (input.getIncomingLink().getResolvedDepth() == -1) {
-					// Incoming link hasn't been resolved yet, can't do this
-					// processor at the moment
-					return false;
-				}
-				// Get the conceptual resolved depth of the datalink
-				inputDepths.put(input.getName(), input.getIncomingLink()
-						.getResolvedDepth());
-				// Configure the filter with the finest grained item from the
-				// link source
-				input.setFilterDepth(input.getIncomingLink().getSource()
-						.getGranularDepth());
-			}
-		}
-		// Got here so we have all the inputs, now test whether the iteration
-		// strategy typechecks correctly
-		try {
-			this.resultWrappingDepth = iterationStack
-					.getIterationDepth(inputDepths);
-			for (BasicEventForwardingOutputPort output : outputPorts) {
-				for (DatalinkImpl outgoingLink : output.outgoingLinks) {
-					// Set the resolved depth on each output edge
-					outgoingLink.setResolvedDepth(this.resultWrappingDepth
-							+ output.getDepth());
-				}
-			}
-
-		} catch (MissingIterationInputException e) {
-			// This should never happen as we only get here if we've already
-			// checked that all the inputs have been provided. If it does happen
-			// we've got some deeper issues.
-			logger.error(e);
-			return false;
-		}
-
-		// If we get to here everything has been configured appropriately
-		return true;
-	}
-
-	/* Utility methods */
-
-	protected ProcessorInputPortImpl getInputPortWithName(String name) {
-		for (ProcessorInputPortImpl p : inputPorts) {
-			String portName = p.getName();
-			if (portName.equals(name)) {
-				return p;
-			}
-		}
-		return null;
-	}
-
-	protected ProcessorOutputPortImpl getOutputPortWithName(String name) {
-		for (ProcessorOutputPortImpl p : outputPorts) {
-			String portName = p.getName();
-			if (portName.equals(name)) {
-				return p;
-			}
-		}
-		return null;
-	}
-
-	/* Implementations of Processor interface */
-
-	public void fire(String enclosingProcess, InvocationContext context) {
-		Job newJob = new Job(enclosingProcess + ":" + this.name, new int[0],
-				new HashMap<String, T2Reference>(), context);
-		dispatchStack.receiveEvent(newJob);
-	}
-
-	public List<? extends Condition> getPreconditionList() {
-		return Collections.unmodifiableList(conditions);
-	}
-
-	public List<? extends Condition> getControlledPreconditionList() {
-		return Collections.unmodifiableList(controlledConditions);
-	}
-
-	public DispatchStackImpl getDispatchStack() {
-		return dispatchStack;
-	}
-
-	public IterationStrategyStackImpl getIterationStrategy() {
-		return iterationStack;
-	}
-
-	public List<? extends ProcessorInputPort> getInputPorts() {
-		return Collections.unmodifiableList(inputPorts);
-	}
-
-	public List<? extends ProcessorOutputPort> getOutputPorts() {
-		return Collections.unmodifiableList(outputPorts);
-	}
-
-	public List<? extends Activity<?>> getActivityList() {
-		return Collections.unmodifiableList(activityList);
-	}
-
-	protected void setName(String newName) {
-		this.name = newName;
-	}
-
-	public String getLocalName() {
-		return this.name;
-	}
-
-	/**
-	 * Called by the DataflowImpl containing this processor requesting that it
-	 * register itself with the monitor tree under the specified process
-	 * identifier.
-	 * 
-	 * @param dataflowOwningProcess
-	 *            the process identifier of the parent dataflow, the processor
-	 *            must register with this as the base path plus the local name
-	 */
-	void registerWithMonitor(String dataflowOwningProcess) {
-		// Given the dataflow process identifier, so append local name to get
-		// the process identifier that will be applied to incoming data tokens
-		String processID = dataflowOwningProcess + ":" + getLocalName();
-
-		// The set of monitorable (and steerable) properties for this processor
-		// level monitor node
-		Set<MonitorableProperty<?>> properties = new HashSet<MonitorableProperty<?>>();
-
-		// If any dispatch layers implement PropertyContributingDispatchLayer
-		// then message them to push their properties into the property store
-		// within the dispatch stack. In this case the anonymous inner class
-		// implements this by storing them in a protected map within
-		// ProcessoImpl from where they can be recovered after the iteration has
-		// finished.
-		for (DispatchLayer<?> layer : dispatchStack.getLayers()) {
-			if (layer instanceof PropertyContributingDispatchLayer) {
-				((PropertyContributingDispatchLayer<?>) layer)
-						.injectPropertiesFor(processID);
-			}
-		}
-		// All layers have now injected properties into the parent dispatch
-		// stack, which has responded by building an entry in the monitorables
-		// map in this class. We can pull everything out of it and remove the
-		// entry quite safely at this point.
-		synchronized (monitorables) {
-			Set<MonitorableProperty<?>> layerProps = monitorables
-					.get(processID);
-			if (layerProps != null) {
-				for (MonitorableProperty<?> prop : layerProps) {
-					properties.add(prop);
-				}
-				monitorables.remove(processID);
-			}
-		}
-
-		// Register the node with the monitor tree, including any aggregated
-		// properties from layers.
-		MonitorManager.getInstance().registerNode(this,
-				dataflowOwningProcess + ":" + getLocalName(), properties);
-	}
-
-	public void addObserver(Observer<ProcessorFinishedEvent> observer) {
-		processorFinishedMultiCaster.addObserver(observer);
-	}
-
-	public List<Observer<ProcessorFinishedEvent>> getObservers() {
-		return processorFinishedMultiCaster.getObservers();
-	}
-
-	public void removeObserver(Observer<ProcessorFinishedEvent> observer) {
-		processorFinishedMultiCaster.removeObserver(observer);
-	}
-	
-	@Override
-	public String toString() {
-		return "Processor " + getLocalName();
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorInputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorInputPortImpl.java
deleted file mode 100644
index 96f312c..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorInputPortImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-
-/**
- * An implementation of the filtering input port interface used as an input for
- * a ProcessorImpl. If the filter level is undefined this input port will always
- * throw workflow structure exceptions when you push data into it. This port
- * must be linked to a crystalizer or something which offers the same
- * operational contract, it requires a full hierarchy of data tokens (i.e. if
- * you push something in with an index you must at some point subsequent to that
- * push at least a single list in with the empty index)
- * 
- * @author Tom Oinn
- * 
- */
-public class ProcessorInputPortImpl extends AbstractFilteringInputPort implements
-		ProcessorInputPort {
-
-	private ProcessorImpl parent;
-
-	protected ProcessorInputPortImpl(ProcessorImpl parent, String name,
-			int depth) {
-		super(name, depth);
-		this.parent = parent;
-	}
-
-	@Override
-	public String transformOwningProcess(String oldOwner) {
-		return oldOwner + ":" + parent.getLocalName();
-	}
-	
-	@Override
-	protected void pushCompletion(String portName, String owningProcess, int[] index, InvocationContext context) {
-		parent.iterationStack.receiveCompletion(portName, owningProcess, index, context);	
-	}
-
-	@Override
-	protected void pushData(String portName, String owningProcess, int[] index, T2Reference data, InvocationContext context) {
-		parent.iterationStack.receiveData(portName, owningProcess, index, data, context);
-	}
-	
-	public Processor getProcessor() {
-		return this.parent;
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorOutputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorOutputPortImpl.java
deleted file mode 100644
index 5ec6afb..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorOutputPortImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-
-/**
- * Extension of AbstractOutputPort for use as the output port on a
- * ProcessorImpl. Contains additional logic to relay workflow data tokens from
- * the internal crystalizer to each in a set of target FilteringInputPort
- * instances.
- * 
- * @author Tom Oinn
- * @author Stuart Owen
- * 
- */
-public class ProcessorOutputPortImpl extends BasicEventForwardingOutputPort implements ProcessorOutputPort{
-
-	private ProcessorImpl parent = null;
-	
-	protected ProcessorOutputPortImpl(ProcessorImpl parent,String portName, int portDepth,
-			int granularDepth) {
-		super(portName, portDepth, granularDepth);
-		this.parent = parent;
-	}
-
-	/**
-	 * Strip off the last id in the owning process stack (as this will have been
-	 * pushed onto the stack on entry to the processor) and relay the event to
-	 * the targets.
-	 * 
-	 */
-	protected void receiveEvent(WorkflowDataToken token) {
-		sendEvent(token.popOwningProcess());
-	}
-	
-	public Processor getProcessor() {
-		return this.parent;
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityInputPortEdit.java
deleted file mode 100644
index 47dc064..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityInputPortEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-
-/**
- * Removes an activity input port from an activity.
- * 
- * @author David Withers
- */
-public class RemoveActivityInputPortEdit extends AbstractActivityEdit {
-
-	private ActivityInputPort activityInputPort;
-
-	public RemoveActivityInputPortEdit(Activity<?> activity, ActivityInputPort activityInputPort) {
-		super(activity);
-		this.activityInputPort = activityInputPort;
-	}
-
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity) throws EditException {
-		activity.getInputPorts().remove(activityInputPort);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getInputPorts().add(activityInputPort);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityInputPortMappingEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityInputPortMappingEdit.java
deleted file mode 100644
index 3a366f0..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityInputPortMappingEdit.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-public class RemoveActivityInputPortMappingEdit extends AbstractActivityEdit {
-
-	private final String processorPortName;
-	private String oldValue=null;
-
-	public RemoveActivityInputPortMappingEdit(Activity<?>activity, String processorPortName) {
-		super(activity);
-		this.processorPortName = processorPortName;
-		
-	}
-	
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity)
-			throws EditException {
-		if (!activity.getInputPortMapping().containsKey(processorPortName)) throw new EditException("The input port mapping for the processor port name:"+processorPortName+" doesn't exist");
-		oldValue=activity.getInputPortMapping().get(processorPortName);
-		activity.getInputPortMapping().remove(processorPortName);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getInputPortMapping().put(processorPortName, oldValue);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityOutputPortEdit.java
deleted file mode 100644
index 2622245..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityOutputPortEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-/**
- * Removes an output port from an activity.
- * 
- * @author David Withers
- */
-public class RemoveActivityOutputPortEdit extends AbstractActivityEdit {
-
-	private OutputPort activityOutputPort;
-
-	public RemoveActivityOutputPortEdit(Activity<?> activity, OutputPort activityInputPort) {
-		super(activity);
-		this.activityOutputPort = activityInputPort;
-	}
-
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity) throws EditException {
-		activity.getOutputPorts().remove(activityOutputPort);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getOutputPorts().add(activityOutputPort);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityOutputPortMappingEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityOutputPortMappingEdit.java
deleted file mode 100644
index 91766ed..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveActivityOutputPortMappingEdit.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-public class RemoveActivityOutputPortMappingEdit extends AbstractActivityEdit {
-
-	private final String processorPortName;
-	private String oldValue=null;
-
-	public RemoveActivityOutputPortMappingEdit(Activity<?>activity, String processorPortName) {
-		super(activity);
-		this.processorPortName = processorPortName;
-		
-	}
-	
-	@Override
-	protected void doEditAction(AbstractActivity<?> activity)
-			throws EditException {
-		if (!activity.getOutputPortMapping().containsKey(processorPortName)) throw new EditException("The output port mapping for the processor port name:"+processorPortName+" doesn't exist");
-		oldValue=activity.getOutputPortMapping().get(processorPortName);
-		activity.getOutputPortMapping().remove(processorPortName);
-	}
-
-	@Override
-	protected void undoEditAction(AbstractActivity<?> activity) {
-		activity.getOutputPortMapping().put(processorPortName, oldValue);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveConditionEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveConditionEdit.java
deleted file mode 100644
index e72adb7..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveConditionEdit.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Remove the condition serializing execution between the specified control and
- * target processors.
- * 
- * @author Tom Oinn
- * 
- */
-public class RemoveConditionEdit extends AbstractBinaryProcessorEdit {
-
-	private ConditionImpl condition = null;
-
-	public RemoveConditionEdit(Processor control, Processor target) {
-		super(control, target);
-
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl control, ProcessorImpl target)
-			throws EditException {
-		for (ConditionImpl c : control.controlledConditions) {
-			if (c.getTarget() == target) {
-				this.condition = c;
-				break;
-			}
-		}
-		if (this.condition == null) {
-			throw new EditException(
-					"Can't remove a control link as it doesn't exist");
-		}
-
-		control.controlledConditions.remove(condition);
-		target.conditions.remove(condition);
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl control, ProcessorImpl target) {
-		control.controlledConditions.add(condition);
-		target.conditions.add(condition);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveDataflowInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveDataflowInputPortEdit.java
deleted file mode 100644
index dcc8e0c..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveDataflowInputPortEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Removes a dataflow input port from a dataflow.
- * 
- * @author David Withers
- *
- */
-public class RemoveDataflowInputPortEdit extends AbstractDataflowEdit {
-
-	private DataflowInputPort dataflowInputPort;
-
-	public RemoveDataflowInputPortEdit(Dataflow dataflow, DataflowInputPort dataflowInputPort) {
-		super(dataflow);
-		this.dataflowInputPort = dataflowInputPort;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.removeDataflowInputPort(dataflowInputPort);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		if (dataflowInputPort instanceof DataflowInputPortImpl) {
-			try {
-				dataflow.addInputPort((DataflowInputPortImpl) dataflowInputPort);
-			} catch (EditException e) {
-				//shouldn't happen as a port with this name has been removed
-			}
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveDataflowOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveDataflowOutputPortEdit.java
deleted file mode 100644
index 95a3a25..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveDataflowOutputPortEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Removes a dataflow output port from a dataflow.
- * 
- * @author David Withers
- *
- */
-public class RemoveDataflowOutputPortEdit extends AbstractDataflowEdit {
-
-	private DataflowOutputPort dataflowOutputPort;
-
-	public RemoveDataflowOutputPortEdit(Dataflow dataflow, DataflowOutputPort dataflowOutputPort) {
-		super(dataflow);
-		this.dataflowOutputPort = dataflowOutputPort;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.removeDataflowOutputPort(dataflowOutputPort);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		if (dataflowOutputPort instanceof DataflowOutputPortImpl) {
-			try {
-				dataflow.addOutputPort((DataflowOutputPortImpl) dataflowOutputPort);
-			} catch (EditException e) {
-				//shouldn't happen as a port with this name has been removed
-			}
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveMergeEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveMergeEdit.java
deleted file mode 100644
index ebddefe..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveMergeEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.NamingException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-
-/**
- * Removes a merge from a dataflow.
- * 
- * @author David Withers
- */
-public class RemoveMergeEdit extends AbstractDataflowEdit{
-	
-	private Merge merge;
-	
-	public RemoveMergeEdit(Dataflow dataflow, Merge merge) {
-		super(dataflow);
-		this.merge = merge;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.removeMerge(merge);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		if (merge instanceof MergeImpl) {
-			try {
-				dataflow.addMerge((MergeImpl) merge);
-			} catch (NamingException e) {
-				//a merge with this name has already been removed
-			}
-		}
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorEdit.java
deleted file mode 100644
index d38d6fd..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.NamingException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Removes a processor from a dataflow.
- * 
- * @author David Withers
- */
-public class RemoveProcessorEdit extends AbstractDataflowEdit{
-	
-	private Processor processor;
-	
-	public RemoveProcessorEdit(Dataflow dataflow, Processor processor) {
-		super(dataflow);
-		this.processor = processor;
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.removeProcessor(processor);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		if (processor instanceof ProcessorImpl) {
-			try {
-				dataflow.addProcessor((ProcessorImpl) processor);
-			} catch (NamingException e) {
-				//a processor with this name has already been removed
-			}
-		}
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorInputPortEdit.java
deleted file mode 100644
index de54c9b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorInputPortEdit.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyImpl;
-
-import org.apache.log4j.Logger;
-
-public class RemoveProcessorInputPortEdit extends AbstractProcessorEdit {
-
-	private final ProcessorInputPort port;
-	private static Logger logger = Logger
-			.getLogger(RemoveProcessorInputPortEdit.class);
-
-	public RemoveProcessorInputPortEdit(Processor processor, ProcessorInputPort port) {
-		super(processor);
-		this.port = port;
-	}
-	
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		if (processor.getInputPortWithName(port.getName())==null) throw new EditException("The processor doesn't have a port named:"+port.getName());
-		for (IterationStrategyImpl is : processor.iterationStack.getStrategies()) {
-			is.removeInputByName(port.getName());
-		}
-		processor.inputPorts.remove(port);
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		try {
-			new EditsImpl().getAddProcessorInputPortEdit(processor, port).doEdit();
-		} catch (EditException e) {
-			logger.error("There was an error adding an input port to a Processor whilst undoing a remove");
-		}
-	}
-	
-	
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorOutputPortEdit.java
deleted file mode 100644
index f25ca5c..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorOutputPortEdit.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-
-import org.apache.log4j.Logger;
-
-public class RemoveProcessorOutputPortEdit extends AbstractProcessorEdit {
-
-	private final ProcessorOutputPort port;
-	private static Logger logger = Logger
-			.getLogger(RemoveProcessorOutputPortEdit.class);
-
-	public RemoveProcessorOutputPortEdit(Processor processor, ProcessorOutputPort port) {
-		super(processor);
-		this.port = port;
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		if (processor.getOutputPortWithName(port.getName())==null) throw new EditException("The processor doesn't have a port named:"+port.getName());
-		processor.outputPorts.remove(port);
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		try {
-			new EditsImpl().getAddProcessorOutputPortEdit(processor, port).doEdit();
-		} catch (EditException e) {
-			logger.error("There was an error adding an input port to a Processor whilst undoing a remove");
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameDataflowInputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameDataflowInputPortEdit.java
deleted file mode 100644
index 94565d9..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameDataflowInputPortEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Rename the specified DataflowInputPort
- * 
- * @author David Withers
- * 
- */
-public class RenameDataflowInputPortEdit extends AbstractDataflowInputPortEdit {
-
-	private String newName;
-
-	private String oldName = null;
-
-	public RenameDataflowInputPortEdit(DataflowInputPort dataflowInputPort, String newName) {
-		super(dataflowInputPort);
-		this.newName = newName;
-	}
-
-	@Override
-	protected void doEditAction(DataflowInputPortImpl dataflowInputPort) throws EditException {
-		oldName = dataflowInputPort.getName();
-		dataflowInputPort.setName(newName);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowInputPortImpl dataflowInputPort) {
-		dataflowInputPort.setName(oldName);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameDataflowOutputPortEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameDataflowOutputPortEdit.java
deleted file mode 100644
index 15047be..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameDataflowOutputPortEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-/**
- * Rename the specified DataflowOutputPort
- * 
- * @author David Withers
- * 
- */
-public class RenameDataflowOutputPortEdit extends AbstractDataflowOutputPortEdit {
-
-	private String newName;
-
-	private String oldName = null;
-
-	public RenameDataflowOutputPortEdit(DataflowOutputPort dataflowOutputPort, String newName) {
-		super(dataflowOutputPort);
-		this.newName = newName;
-	}
-
-	@Override
-	protected void doEditAction(DataflowOutputPortImpl dataflowOutputPort) throws EditException {
-		oldName = dataflowOutputPort.getName();
-		dataflowOutputPort.setName(newName);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowOutputPortImpl dataflowOutputPort) {
-		dataflowOutputPort.setName(oldName);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameMergeEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameMergeEdit.java
deleted file mode 100644
index 1a97f30..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameMergeEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-
-/**
- * Rename a merge
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class RenameMergeEdit extends AbstractMergeEdit {
-
-	String newName;
-
-	String oldName = null;
-
-	public RenameMergeEdit(Merge p, String newName) {
-		super(p);
-		this.newName = newName;
-	}
-
-	@Override
-	protected void doEditAction(MergeImpl merge) throws EditException {
-		oldName = merge.getLocalName();
-		merge.setName(newName);
-	}
-
-	@Override
-	protected void undoEditAction(MergeImpl merge) {
-		merge.setName(oldName);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameProcessorEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameProcessorEdit.java
deleted file mode 100644
index f8d8c81..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/RenameProcessorEdit.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-/**
- * Rename the specified processor
- * 
- * @author Tom Oinn
- * 
- */
-public class RenameProcessorEdit extends AbstractProcessorEdit {
-
-	String newName;
-
-	String oldName = null;
-
-	public RenameProcessorEdit(Processor p, String newName) {
-		super(p);
-		this.newName = newName;
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		oldName = processor.getLocalName();
-		processor.setName(newName);
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		processor.setName(oldName);
-
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ReorderMergeInputPortsEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ReorderMergeInputPortsEdit.java
deleted file mode 100644
index be2e44d..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/ReorderMergeInputPortsEdit.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-
-public class ReorderMergeInputPortsEdit extends AbstractMergeEdit {
-
-	private List<? extends MergeInputPort> previousInputPortList; // needed for undo
-	private List<? extends MergeInputPort> reorderedInputPortList;
-
-	public ReorderMergeInputPortsEdit(Merge merge, List<? extends MergeInputPort> reorderedInputPortList) {
-		super(merge);
-		this.reorderedInputPortList = reorderedInputPortList;
-		this.previousInputPortList = merge.getInputPorts();
-	}
-
-	@Override
-	protected void doEditAction(MergeImpl mergeImpl) throws EditException {
-		if (mergeImpl instanceof MergeImpl) {
-			mergeImpl.reorderInputPorts(reorderedInputPortList);		
-		}
-		else {
-			throw new EditException("The Merge is of the wrong implementation, it should be of type MergeImpl");
-		}
-	}
-
-	@Override
-	protected void undoEditAction(MergeImpl mergeImpl) {
-		mergeImpl.reorderInputPorts(previousInputPortList);		
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/SetIterationStrategyStackEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/SetIterationStrategyStackEdit.java
deleted file mode 100644
index 3b784cc..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/SetIterationStrategyStackEdit.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyStackImpl;
-
-/**
- * Set the iteration strategy
- * 
- * @author Stian Soiland-Reyes
- *
- */
-public class SetIterationStrategyStackEdit extends AbstractProcessorEdit {
-
-	private final IterationStrategyStack iterationStrategyStack;
-	private IterationStrategyStackImpl oldStrategyStack;
-
-	public SetIterationStrategyStackEdit(Processor processor,
-			IterationStrategyStack iterationStrategyStack) {
-		super(processor);
-		this.iterationStrategyStack = iterationStrategyStack;
-	}
-
-	@Override
-	protected void doEditAction(ProcessorImpl processor) throws EditException {
-		oldStrategyStack = processor.getIterationStrategy();
-
-		if (!(iterationStrategyStack instanceof IterationStrategyStackImpl)) {
-			throw new EditException(
-					"Unknown implementation of iteration strategy "
-							+ iterationStrategyStack);
-		}
-		processor.iterationStack = (IterationStrategyStackImpl) iterationStrategyStack;
-	}
-
-	@Override
-	protected void undoEditAction(ProcessorImpl processor) {
-		processor.iterationStack = oldStrategyStack;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/Tools.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/Tools.java
deleted file mode 100644
index 81d158d..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/Tools.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.beans.XMLDecoder;
-import java.beans.XMLEncoder;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.List;
-
-import net.sf.taverna.raven.Raven;
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.ArtifactNotFoundException;
-import net.sf.taverna.raven.repository.ArtifactStateException;
-import net.sf.taverna.raven.repository.BasicArtifact;
-import net.sf.taverna.raven.repository.Repository;
-import net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader;
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.workflowmodel.ConfigurationException;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.InputPort;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-import org.jdom.output.Format;
-import org.jdom.output.XMLOutputter;
-
-/**
- * 
- * Contains static methods concerned with legacy Processor construction and XML
- * handling for the various configurable types such as Activity and
- * DispatchLayer.
- * <p>
- * Not to be confused with the probably more helpful 
- * {@link net.sf.taverna.t2.workflowmodel.utils.Tools}.
- * 
- * @author Tom Oinn
- * @author Stuart Owen
- * 
- */
-public class Tools {
-
-	private static Logger logger = Logger
-	.getLogger(Tools.class);
-
-	// XML element names
-	private static final String LAYER = "layer";
-	private static final String ACTIVITY = "activity";
-	private static final String JAVA = "java";
-	private static final String OUTPUT_MAP = "outputMap";
-	private static final String TO = "to";
-	private static final String FROM = "from";
-	private static final String MAP = "map";
-	private static final String INPUT_MAP = "inputMap";
-	private static final String CLASS = "class";
-	private static final String VERSION = "version";
-	private static final String ARTIFACT = "artifact";
-	private static final String GROUP = "group";
-	private static final String RAVEN = "raven";
-	private static final String ANNOTATIONS = "annotations";
-	@SuppressWarnings("unused")
-	private static final String ANNOTATION = "annotation";
-
-	
-
-	/**
-	 * Build a JDOM &lt;activity&gt; Element corresponding to the given
-	 * {@link Activity} implementation. Relies on the {@link XMLEncoder} based
-	 * serialisation of the configuration bean to store configuration data.
-	 * 
-	 * @param activity
-	 *            {@link Activity} to serialise
-	 * @return JDOM &lt;activity&gt; Element
-	 * @throws JDOMException
-	 * @throws IOException
-	 */
-	@Deprecated
-	public static Element activityAsXML(Activity<?> activity)
-			throws JDOMException, IOException {
-		Element activityElem = new Element(ACTIVITY);
-
-		ClassLoader cl = activity.getClass().getClassLoader();
-		if (cl instanceof LocalArtifactClassLoader) {
-			activityElem
-					.addContent(ravenElement((LocalArtifactClassLoader) cl));
-		}
-		Element classNameElement = new Element(CLASS);
-		classNameElement.setText(activity.getClass().getName());
-		activityElem.addContent(classNameElement);  
-
-		// Write out the mappings (processor input -> activity input, activity
-		// output -> processor output)
-		Element ipElement = new Element(INPUT_MAP);
-		for (String processorInputName : activity.getInputPortMapping()
-				.keySet()) {
-			Element mapElement = new Element(MAP);
-			mapElement.setAttribute(FROM, processorInputName);
-			mapElement.setAttribute(TO, activity.getInputPortMapping().get(
-					processorInputName));
-			ipElement.addContent(mapElement);
-		}
-		activityElem.addContent(ipElement);
-
-		Element opElement = new Element(OUTPUT_MAP);
-		for (String activityOutputName : activity.getOutputPortMapping()
-				.keySet()) {
-			Element mapElement = new Element(MAP);
-			mapElement.setAttribute(FROM, activityOutputName);
-			mapElement.setAttribute(TO, activity.getOutputPortMapping().get(
-					activityOutputName));
-			opElement.addContent(mapElement);
-		}
-		activityElem.addContent(opElement);
-
-		// Get element for configuration
-		Object o = activity.getConfiguration();
-		Element configElement = beanAsElement(o);
-		activityElem.addContent(configElement);
-
-		return activityElem;
-
-	}
-	
-	/**
-	 * Iterates over all the processors in the dataflow, returning the first processor found to contain the given activity.
-	 * @param dataflow
-	 * @param activity
-	 * @return the processor to which the activity is attached, or null if it cannot be found
-	 */
-	public Processor findProcessorForActivity(Dataflow dataflow, Activity<?> activity) {
-		for (Processor p : dataflow.getProcessors()) {
-			for (Activity<?> a : p.getActivityList()) {
-				if (a==activity) return p;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Add the annotations contained in the specified &lt;annotations&gt;
-	 * element to the specified instance of a MutableAnnotated object.
-	 * 
-	 * @param annotations
-	 *            {@link Element} to extract 'annotation' elements from
-	 * @param annotated
-	 *            {@link MutableAnnotated} to be annotated
-	 */
-	@SuppressWarnings("unchecked")
-	@Deprecated
-	public static void annotateObject(Element annotations, Annotated annotated) {
-		// TODO - implement for new annotation chain framework
-		/**
-		for (Element e : (List<Element>) annotations.getChildren(ANNOTATION)) {
-			ClassLoader cl = Tools.class.getClassLoader();
-			Element ravenElement = e.getChild(RAVEN);
-			if (ravenElement != null) {
-				try {
-					cl = getRavenLoader(ravenElement);
-				} catch (Exception ex) {
-					logger.error(ex);
-					// TODO - handle this properly, either by logging correctly
-					// or by going back to the repository and attempting to
-					// fetch the offending missing artifacts
-				}
-			}
-			Object annotationBean = createBean(e.getChild(JAVA), cl);
-			if (annotationBean instanceof WorkflowAnnotation) {
-				WorkflowAnnotation newAnnotation = (WorkflowAnnotation) annotationBean;
-				try {
-					annotated.getAddAnnotationEdit(newAnnotation).doEdit();
-				} catch (EditException e1) {
-					logger.error(e1);
-				}
-			} else {
-				System.out.println("Found non annotation bean inside an"
-						+ " annotation element, something's not right here");
-			}
-		}
-		*/
-
-	}
-
-	/**
-	 * Get the &lt;java&gt; element from the {@link XMLEncoder} for the given
-	 * bean as a JDOM {@link Element}.
-	 * 
-	 * @see net.sf.taverna.t2.util.beanable.jaxb.BeanSerialiser
-	 * @param obj
-	 *            Object to serialise
-	 * @return &lt;java&gt; element for serialised bean
-	 * @throws JDOMException
-	 * @throws IOException
-	 * 
-	 */
-	@Deprecated
-	public static Element beanAsElement(Object obj) throws JDOMException,
-			IOException {
-		ByteArrayOutputStream bos = new ByteArrayOutputStream();
-		XMLEncoder xenc = new XMLEncoder(bos);
-		xenc.writeObject(obj);
-		xenc.close();
-		byte[] bytes = bos.toByteArray();
-		ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
-		Element configElement = new SAXBuilder().build(bis).getRootElement();
-		configElement.getParent().removeContent(configElement);
-		return configElement;
-	}
-
-	/**
-	 * Build an Activity instance from the specified &lt;activity&gt; JDOM
-	 * Element using reflection to assemble the configuration bean and configure
-	 * the new Activity object. If the &lt;activity&gt; has a &lt;raven&gt;
-	 * child element the metadata in that element will be used to locate an
-	 * appropriate ArtifactClassLoader, if absent the ClassLoader used will be
-	 * the one used to load this utility class.
-	 * 
-	 * @param element
-	 *            &lt;activity&gt; JDOM from where to build the Activity
-	 * @return Built {@link Activity} instance
-	 * @throws ClassNotFoundException
-	 * @throws InstantiationException
-	 * @throws IllegalAccessException
-	 * @throws ActivityConfigurationException
-	 */
-	@Deprecated
-	@SuppressWarnings("unchecked")
-	public static Activity buildActivity(Element element)
-			throws ClassNotFoundException, InstantiationException,
-			IllegalAccessException, ActivityConfigurationException {
-		Element ravenElement = element.getChild(RAVEN);
-		ClassLoader cl = Tools.class.getClassLoader();
-		if (ravenElement != null) {
-			try {
-				cl = getRavenLoader(ravenElement);
-			} catch (Exception ex) {
-				logger.error("Exception loading raven classloader "
-						+ "for Activity instance", ex);
-			}
-		}
-		String className = element.getChild(CLASS).getTextTrim();
-		Class<? extends Activity> c = (Class<? extends Activity>) cl
-				.loadClass(className);
-		Activity<Object> activity = c.newInstance();
-
-		Element ipElement = element.getChild(INPUT_MAP);
-		for (Element mapElement : (List<Element>) (ipElement.getChildren(MAP))) {
-			String processorInputName = mapElement.getAttributeValue(FROM);
-			String activityInputName = mapElement.getAttributeValue(TO);
-			activity.getInputPortMapping().put(processorInputName,
-					activityInputName);
-		}
-
-		Element opElement = element.getChild(OUTPUT_MAP);
-		for (Element mapElement : (List<Element>) (opElement.getChildren(MAP))) {
-			String activityOutputName = mapElement.getAttributeValue(FROM);
-			String processorOutputName = mapElement.getAttributeValue(TO);
-			activity.getOutputPortMapping().put(activityOutputName,
-					processorOutputName);
-		}
-
-		// Handle the configuration of the activity
-		Element configElement = element.getChild(JAVA);
-		Object configObject = createBean(configElement, cl);
-		activity.configure(configObject);
-		return activity;
-	}
-
-	/**
-	 * Build a {@link DispatchLayer} object from the specified JDOM
-	 * &lt;layer&gt; {@link Element}.
-	 * 
-	 * @param element
-	 *            &lt;layer&gt; {@link Element}
-	 * @return A {@link DispatchLayer} built from the element
-	 * @throws ClassNotFoundException
-	 * @throws IllegalAccessException
-	 * @throws InstantiationException
-	 * 
-	 */
-	@Deprecated
-	@SuppressWarnings("unchecked")
-	public static DispatchLayer buildDispatchLayer(Element element)
-			throws ClassNotFoundException, InstantiationException,
-			IllegalAccessException {
-		Element ravenElement = element.getChild(RAVEN);
-		ClassLoader cl = Tools.class.getClassLoader();
-		if (ravenElement != null) {
-			try {
-				cl = getRavenLoader(ravenElement);
-			} catch (Exception ex) {
-				logger.error("Exception loading raven classloader "
-						+ "for Activity instance", ex);
-				// TODO - handle this properly, either by logging correctly or
-				// by going back to the repository and attempting to fetch the
-				// offending missing artifacts
-			}
-		}
-		String className = element.getChild(CLASS).getTextTrim();
-		Class<? extends DispatchLayer> c = (Class<? extends DispatchLayer>) cl
-				.loadClass(className);
-		DispatchLayer<Object> layer = c.newInstance();
-
-		// Handle the configuration of the dispatch layer
-		Element configElement = element.getChild(JAVA);
-		Object configObject = createBean(configElement, cl);
-		try {
-			layer.configure(configObject);
-		} catch (ConfigurationException e) {
-			logger.error("", e);
-			// TODO - handle this properly
-		}
-
-		return layer;
-	}
-
-	/**
-	 * Construct a new {@link Processor} with a single {@link Activity} and
-	 * overall processor inputs and outputs mapped to the activity inputs and
-	 * outputs. This is intended to be equivalent to the processor creation in
-	 * Taverna1 where the concepts of Processor and Activity were somewhat
-	 * confused; it also inserts retry, parallelise and failover layers
-	 * configured as a Taverna1 process would be.
-	 * <p>
-	 * Modifies the given activity object, adding the mappings for input and
-	 * output port names (these will all be fooport->fooport but they're still
-	 * needed)
-	 * 
-	 * @param activity
-	 *            the {@link Activity} to use to build the new processor around
-	 * @return An initialised {@link ProcessorImpl}
-	 */
-	public static ProcessorImpl buildFromActivity(Activity<?> activity)
-			throws EditException {
-		EditsImpl edits = new EditsImpl();
-		ProcessorImpl processor = (ProcessorImpl)edits.createProcessor("");
-		new DefaultDispatchStackEdit(processor).doEdit();
-		// Add the Activity to the processor
-		processor.activityList.add(activity);
-		// Create processor inputs and outputs corresponding to activity inputs
-		// and outputs and set the mappings in the Activity object.
-		activity.getInputPortMapping().clear();
-		activity.getOutputPortMapping().clear();
-		for (InputPort ip : activity.getInputPorts()) {
-			ProcessorInputPort pip = edits.createProcessorInputPort(processor,ip.getName(), ip.getDepth());
-			new AddProcessorInputPortEdit(processor, pip).doEdit();
-			activity.getInputPortMapping().put(ip.getName(), ip.getName());
-		}
-		for (OutputPort op : activity.getOutputPorts()) {
-			ProcessorOutputPort pop=edits.createProcessorOutputPort(processor,op.getName(), op
-					.getDepth(), op.getGranularDepth());
-			new AddProcessorOutputPortEdit(processor, pop).doEdit();
-			activity.getOutputPortMapping().put(op.getName(), op.getName());
-		}
-		
-		return processor;
-	}
-
-	/**
-	 * Use the XMLDecoder to build an arbitrary java bean from the &lt;java&gt;
-	 * JDOM Element object. Uses the supplied {@link ClassLoader} to accommodate
-	 * systems such as {@link Raven}.
-	 * 
-	 * @param element
-	 *            &lt;java&gt; JDOM {@link Element} from where to build the bean
-	 * @param classLoader
-	 *            {@link ClassLoader} from where to find the bean's classes
-	 * @return The deserialised bean
-	 */
-	@Deprecated
-	public static Object createBean(Element element, ClassLoader classLoader) {
-		String beanXML = new XMLOutputter(Format.getRawFormat())
-				.outputString(element);
-		XMLDecoder decoder = new XMLDecoder(new ByteArrayInputStream(beanXML
-				.getBytes()), null, null, classLoader);
-		Object bean = decoder.readObject();
-		return bean;
-	}
-
-	/**
-	 * Make a JDOM &lt;layer&gt; {@link Element} serialising the given
-	 * {@link DispatchLayer}.
-	 * 
-	 * @param layer
-	 *            layer to serialise
-	 * @return &lt:layer&gt: {@link Element} describing the
-	 *         {@link DispatchLayer}
-	 */
-	@Deprecated
-	public static Element dispatchLayerAsXML(DispatchLayer<?> layer)
-			throws JDOMException, IOException {
-		Element layerElem = new Element(LAYER);
-
-		ClassLoader cl = layer.getClass().getClassLoader();
-		if (cl instanceof LocalArtifactClassLoader) {
-			layerElem.addContent(ravenElement((LocalArtifactClassLoader) cl));
-		}
-		Element classNameElement = new Element(CLASS);
-		classNameElement.setText(layer.getClass().getName());
-		layerElem.addContent(classNameElement);
-
-		// Get element for configuration
-		Object o = layer.getConfiguration();
-		Element configElement = beanAsElement(o);
-		layerElem.addContent(configElement);
-		return layerElem;
-	}
-
-	/**
-	 * Return the &lt;annotation&gt; element for a specified {@link Annotated}
-	 * entity.
-	 * 
-	 * @see net.sf.taverna.t2.util.beanable.jaxb.BeanSerialiser
-	 * @param annotated
-	 *            the workflow entity to serialise annotations for
-	 * @return a JDOM {@link Element} object containing the annotations
-	 */
-	@Deprecated
-	public static Element getAnnotationsElement(Annotated<?> annotated) {
-		Element result = new Element(ANNOTATIONS);
-		// TODO - implement for new annotation chain framework
-		/**
-		 * for (WorkflowAnnotation annotation : annotated.getAnnotations()) {
-		 * Element annotationElement = new Element(ANNOTATION); // If this was
-		 * loaded by raven then store the artifact details if
-		 * (annotation.getClass().getClassLoader() instanceof
-		 * LocalArtifactClassLoader) { LocalArtifactClassLoader lacl =
-		 * (LocalArtifactClassLoader) annotation .getClass().getClassLoader();
-		 * annotationElement.addContent(ravenElement(lacl)); } try {
-		 * annotationElement.addContent(beanAsElement(annotation)); } catch
-		 * (JDOMException e) { // Auto-generated catch block but should never
-		 * see this e.printStackTrace(); } catch (IOException e) { //
-		 * Auto-generated catch block but should never see this
-		 * e.printStackTrace(); } result.addContent(annotationElement); }
-		 */
-		return result;
-	}
-
-	/**
-	 * Get the {@link ClassLoader} for loading classes from the artifact
-	 * specified by the &lt;raven&gt; element.
-	 * <p>
-	 * If this class wasn't loaded by Raven then this ignores the element
-	 * entirely and defaults to using the same classloader as
-	 * {@link Tools this class} was loaded by. This is probably not what you
-	 * want but it's a sensible enough fallback position
-	 * 
-	 * @param ravenElement
-	 *            &lt;raven&gt; element describing artifact
-	 * @return Resolved {@link LocalArtifactClassLoader} or current
-	 *         {@link ClassLoader}
-	 * @throws ArtifactNotFoundException
-	 *             If the element (directly or indirectly) specified an unknown
-	 *             artifact
-	 * @throws ArtifactStateException
-	 *             If something went wrong when fetching artifact
-	 */
-	public static ClassLoader getRavenLoader(Element ravenElement)
-			throws ArtifactNotFoundException, ArtifactStateException {
-		// Try to get the current Repository object, if there isn't one we can't
-		// do this here
-		Repository repository = null;
-		try {
-			LocalArtifactClassLoader lacl = (LocalArtifactClassLoader) (Tools.class
-					.getClassLoader());
-			repository = lacl.getRepository();
-
-		} catch (ClassCastException cce) {
-			return Tools.class.getClassLoader();
-			// TODO - should probably warn that this is happening as it's likely
-			// to be because of an error in API usage. There are times it won't
-			// be though so leave it for now.
-		}
-		String groupId = ravenElement.getChildTextTrim(GROUP);
-		String artifactId = ravenElement.getChildTextTrim(ARTIFACT);
-		String version = ravenElement.getChildTextTrim(VERSION);
-		Artifact artifact = new BasicArtifact(groupId, artifactId, version);
-		return repository.getLoader(artifact, null);
-	}
-
-	/**
-	 * Insert the element produce by {@link #getAnnotationsElement(Annotated)}
-	 * into the specified {@link Element}. If the annotation set is empty this
-	 * does nothing - this is to prevent copy and paste code of the style 'if
-	 * there are annotations add...'
-	 * 
-	 * @param element
-	 *            {@link Element} where to inject annotations
-	 * @param annotated
-	 *            {@link Annotated} from where to find annotations
-	 */
-	@Deprecated
-	public static void injectAnnotations(Element element, Annotated<?> annotated) {
-		if (!annotated.getAnnotations().isEmpty()) {
-			element.addContent(getAnnotationsElement(annotated));
-		}
-	}
-
-	/**
-	 * Populate annotations of a {@link MutableAnnotated} from an
-	 * {@link Element} containing a child 'annotations'. If the annotations
-	 * element is not present this method does nothing.
-	 * 
-	 * @see #injectAnnotations(Element, Annotated)
-	 * @param parent
-	 *            Element from where to find the 'annotations' child
-	 * @param annotated
-	 *            {@link MutableAnnotated} to be annotated
-	 */
-	@Deprecated
-	public static void populateAnnotationsFromParent(Element parent,
-			Annotated<?> annotated) {
-		Element annotationsElement = parent.getChild(ANNOTATIONS);
-		if (annotationsElement != null) {
-			annotateObject(annotationsElement, annotated);
-		}
-	}
-
-	/**
-	 * Create the &lt;raven&gt; element for a given local artifact classloader.
-	 * 
-	 * @param classLoader
-	 *            The {@link LocalArtifactClassLoader} for the artifact
-	 * @return Populated &lt;raven&gt; element
-	 */
-	public static Element ravenElement(LocalArtifactClassLoader classLoader) {
-		Element element = new Element(RAVEN);
-		Artifact artifact = classLoader.getArtifact();
-		// Group
-		Element groupIdElement = new Element(GROUP);
-		groupIdElement.setText(artifact.getGroupId());
-		element.addContent(groupIdElement);
-		// Artifact ID
-		Element artifactIdElement = new Element(ARTIFACT);
-		artifactIdElement.setText(artifact.getArtifactId());
-		element.addContent(artifactIdElement);
-		// Version
-		Element versionElement = new Element(VERSION);
-		versionElement.setText(artifact.getVersion());
-		element.addContent(versionElement);
-		// Return assembled raven element
-		return element;
-	}
-
-	/**
-	 * 
-	 * @see net.sf.taverna.t2.workflowmodel.utils.Tools#uniqueProcessorName(String, Dataflow)
-	 */
-	@Deprecated
-	public static String uniqueProcessorName(String preferredName,
-			Dataflow dataflow) {
-		return net.sf.taverna.t2.workflowmodel.utils.Tools.uniqueProcessorName(preferredName, dataflow);
-	}
-		
-	
-	
-	/**
-	 * Protected constructor, use static methods only.
-	 */
-	protected Tools() {
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowInternalIdentifierEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowInternalIdentifierEdit.java
deleted file mode 100644
index c78d90b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowInternalIdentifierEdit.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-public class UpdateDataflowInternalIdentifierEdit extends AbstractDataflowEdit {
-
-	private String newId;
-	private String oldId;
-
-	public UpdateDataflowInternalIdentifierEdit(Dataflow dataflow,String newId) {
-		super(dataflow);
-		this.newId=newId;
-		this.oldId=dataflow.getInternalIdentier();
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.internalIdentifier=newId;
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		dataflow.internalIdentifier=oldId;
-	}
-	
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowNameEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowNameEdit.java
deleted file mode 100644
index 25bed3a..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowNameEdit.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-public class UpdateDataflowNameEdit extends AbstractDataflowEdit {
-
-	private String newName;
-	private String oldName;
-
-	public UpdateDataflowNameEdit(Dataflow dataflow,String newName) {
-		super(dataflow);
-		this.newName=newName;
-		this.oldName=dataflow.getLocalName();
-	}
-
-	@Override
-	protected void doEditAction(DataflowImpl dataflow) throws EditException {
-		dataflow.setLocalName(newName);
-	}
-
-	@Override
-	protected void undoEditAction(DataflowImpl dataflow) {
-		dataflow.setLocalName(oldName);
-	}
-	
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/package.html b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/package.html
deleted file mode 100644
index 46b9fee..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/impl/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-Implementation package for workflow entities
-</body>
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/ActivityInputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/ActivityInputPortImpl.java
deleted file mode 100644
index 7f77328..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/ActivityInputPortImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity.impl;
-
-import java.util.Collections;
-import java.util.List;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.workflowmodel.AbstractPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-
-/**
- * An input port on an Activity instance. Simply used as a bean to hold port
- * name and depth properties.
- * 
- * @author Tom Oinn
- * @author Stuart Owen
- * 
- */
-public class ActivityInputPortImpl extends AbstractPort implements
-		ActivityInputPort {
-
-	private Class<?> translatedElementClass;
-	private List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes;
-	boolean allowsLiteralValues;
-
-	/**
-	 * Constructs an Activity input port instance with the provided name and
-	 * depth.
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 */
-	public ActivityInputPortImpl(String portName, int portDepth) {
-		super(portName, portDepth);
-	}
-
-	/**
-	 * Constructs an Activity input port with the provided name and depth,
-	 * together with a list of predetermined annotations.
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 */
-	public ActivityInputPortImpl(String portName, int portDepth,
-			boolean allowsLiteralValues,
-			List<Class<? extends ExternalReferenceSPI>> handledReferenceSchemes,
-			Class<?> translatedElementClass) {
-		this(portName, portDepth);
-		this.allowsLiteralValues = allowsLiteralValues;
-		this.handledReferenceSchemes = handledReferenceSchemes;
-		this.translatedElementClass = translatedElementClass;
-	}
-
-	public boolean allowsLiteralValues() {
-		return this.allowsLiteralValues();
-	}
-
-	public List<Class<? extends ExternalReferenceSPI>> getHandledReferenceSchemes() {
-		return Collections.unmodifiableList(this.handledReferenceSchemes);
-	}
-
-	public Class<?> getTranslatedElementClass() {
-		return this.translatedElementClass;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/ActivityOutputPortImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/ActivityOutputPortImpl.java
deleted file mode 100644
index d037058..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/ActivityOutputPortImpl.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.activity.impl;
-
-import java.util.Set;
-
-import net.sf.taverna.raven.log.Log;
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.workflowmodel.AbstractOutputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityOutputPort;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.DispatchLayerXMLDeserializer;
-
-/**
- * An output port on an Activity instance, used as a bean to hold port name,
- * depth and granular depth properties.
- * 
- * @author Tom Oinn
- * 
- */
-public class ActivityOutputPortImpl extends AbstractOutputPort implements ActivityOutputPort {
-
-	private static Log logger = Log.getLogger(ActivityOutputPortImpl.class);
-
-
-	/**
-	 * Constructs an Activity output port instance with the provided name,depth
-	 * and granular depth.
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 * @param granularDepth
-	 */
-	public ActivityOutputPortImpl(String portName, int portDepth,
-			int granularDepth) {
-		super(portName, portDepth, granularDepth);
-	}
-
-	/**
-	 * Constructs an Activity input port with the provided name, depth and
-	 * granularDepth together with a list of predetermined annotations.
-	 * 
-	 * @param portName
-	 * @param portDepth
-	 * @param granularDepth
-	 * @param annotations
-	 */
-	public ActivityOutputPortImpl(String portName, int portDepth,
-			int granularDepth, Set<AnnotationChain> annotations) {
-		this(portName, portDepth, granularDepth);
-		for (AnnotationChain newAnnotation : annotations) {
-			try {
-				getAddAnnotationEdit(newAnnotation).doEdit();
-			} catch (EditException e) {
-				// TODO Auto-generated catch block
-				logger.error(e);
-			}
-		}
-
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/package.html b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/package.html
deleted file mode 100644
index c985eee..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/activity/impl/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-Contains specific implementations of the Activity Ports, together with an implementation of ActivityPortBuilder which is responsible for building them.
-</body>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/AbstractDispatchLayerEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/AbstractDispatchLayerEdit.java
deleted file mode 100644
index a459753..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/AbstractDispatchLayerEdit.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.impl;
-
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-
-/**
- * Abstraction of an edit acting on a DispatchLayer instance. Handles the check to
- * see that the DispatchLayer supplied is really a DispatchLayerImpl.
- * 
- * @author Tom Oinn
- * 
- */
-public abstract class AbstractDispatchLayerEdit implements Edit<DispatchStack> {
-
-	private boolean applied = false;
-
-	private DispatchStack stack;
-
-	protected AbstractDispatchLayerEdit(DispatchStack s) {
-		if (s == null) {
-			throw new RuntimeException(
-					"Cannot construct a dispatch stack edit with null dispatch stack");
-		}
-		this.stack = s;
-	}
-
-	public final DispatchStack doEdit() throws EditException {
-		if (applied) {
-			throw new EditException("Edit has already been applied!");
-		}
-		if (stack instanceof DispatchStackImpl == false) {
-			throw new EditException(
-					"Edit cannot be applied to a DispatchStack which isn't an instance of DispatchStackImpl");
-		}
-		DispatchStackImpl dsi = (DispatchStackImpl) stack;
-		try {
-			synchronized (dsi) {
-				doEditAction(dsi);
-				applied = true;
-				return this.stack;
-			}
-		} catch (EditException ee) {
-			applied = false;
-			throw ee;
-		}
-	}
-
-	/**
-	 * Do the actual edit here
-	 * 
-	 * @param processor
-	 *            The ProcessorImpl to which the edit applies
-	 * @throws EditException
-	 */
-	protected abstract void doEditAction(DispatchStackImpl stack)
-			throws EditException;
-
-	/**
-	 * Undo any edit effects here
-	 */
-	protected abstract void undoEditAction(DispatchStackImpl stack);
-
-	public final DispatchStack getSubject() {
-		return stack;
-	}
-
-	public final boolean isApplied() {
-		return this.applied;
-	}
-
-	public final void undo() {
-		if (!applied) {
-			throw new RuntimeException(
-					"Attempt to undo edit that was never applied");
-		}
-		DispatchStackImpl dsi = (DispatchStackImpl) stack;
-		synchronized (dsi) {
-			undoEditAction(dsi);
-			applied = false;
-		}
-
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/AddDispatchLayerEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/AddDispatchLayerEdit.java
deleted file mode 100644
index 6b1a7f8..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/AddDispatchLayerEdit.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-
-/**
- * Edit object to add a new DispatchLayer instance to a DispatchStackImpl
- * 
- * @author Tom Oinn
- * 
- */
-public class AddDispatchLayerEdit extends AbstractDispatchLayerEdit {
-
-	private DispatchLayer<?> layer;
-
-	private int index;
-
-	public AddDispatchLayerEdit(DispatchStack stack, DispatchLayer<?> newLayer,
-			int index) {
-		super(stack);
-		this.layer = newLayer;
-		this.index = index;
-	}
-
-	@Override
-	protected void doEditAction(DispatchStackImpl stack) throws EditException {
-		stack.addLayer(this.layer, this.index);
-	}
-
-	@Override
-	protected void undoEditAction(DispatchStackImpl stack) {
-		stack.removeLayer(layer);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/DeleteDispatchLayerEdit.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/DeleteDispatchLayerEdit.java
deleted file mode 100644
index 73c2c12..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/DeleteDispatchLayerEdit.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.impl;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-
-/**
- * Edit implementation to remove a DispatchLayer from a DispatchStackImpl
- * 
- * @author Tom Oinn
- * 
- */
-public class DeleteDispatchLayerEdit extends AbstractDispatchLayerEdit {
-
-	private DispatchLayer<?> layer;
-
-	private int index;
-
-	public DeleteDispatchLayerEdit(DispatchStack stack,
-			DispatchLayer<?> removeLayer) {
-		super(stack);
-		this.layer = removeLayer;
-	}
-
-	@Override
-	protected void doEditAction(DispatchStackImpl stack) throws EditException {
-		index = stack.removeLayer(layer);		
-	}
-
-	@Override
-	protected void undoEditAction(DispatchStackImpl stack) {
-		stack.addLayer(layer, index);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/DispatchStackImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/DispatchStackImpl.java
deleted file mode 100644
index 7f0ea96..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/DispatchStackImpl.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.NotifiableLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobQueueEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-import org.apache.log4j.Logger;
-
-/**
- * The dispatch stack is responsible for consuming a queue of jobs from the
- * iteration strategy and dispatching those jobs through a stack based control
- * flow to an appropriate invocation target. Conceptually the queue and
- * description of activities enter the stack at the top, travel down to an
- * invocation layer at the bottom from which results, errors and completion
- * events rise back up to the top layer. Dispatch stack layers are stored as an
- * ordered list with index 0 being the top of the stack.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public abstract class DispatchStackImpl extends
-		AbstractAnnotatedThing<DispatchStack> implements DispatchStack {
-
-	private static Logger logger = Logger.getLogger(DispatchStackImpl.class);
-
-	private Map<String, BlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>>> queues = new HashMap<String, BlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>>>();
-
-	private List<DispatchLayer<?>> dispatchLayers = new ArrayList<DispatchLayer<?>>();
-
-	/**
-	 * Override to return the list of activities to be used by this dispatch
-	 * stack.
-	 * 
-	 * @return list of activities to be used by jobs in this dispatch stack
-	 */
-	protected abstract List<? extends Activity<?>> getActivities();
-
-	/**
-	 * Called when an event (Completion or Job) hits the top of the dispatch
-	 * stack and needs to be pushed out of the processor
-	 * 
-	 * @param e
-	 */
-	protected abstract void pushEvent(
-			IterationInternalEvent<? extends IterationInternalEvent<?>> e);
-
-	/**
-	 * Called to determine whether all the preconditions for this dispatch stack
-	 * are satisfied. Jobs with the given owningProcess are not processed by the
-	 * dispatch stack until this returns true. Once it has returned true for a
-	 * given owning process it must always return true, the precondition is not
-	 * allowed to change from true back to false.
-	 * 
-	 * @param owningProcess
-	 * @return whether all preconditions to invocation are satisfied.
-	 */
-	protected abstract boolean conditionsSatisfied(String owningProcess);
-
-	/**
-	 * Called when the specified owning process is finished with, that is to say
-	 * all invocation has been performed and any layer state caches have been
-	 * purged.
-	 * 
-	 * @param owningProcess
-	 */
-	protected abstract void finishedWith(String owningProcess);
-
-	/**
-	 * Defines the enclosing process name, usually Processor.getName() on the
-	 * parent
-	 */
-	protected abstract String getProcessName();
-
-	private DispatchLayer<Object> topLayer = new TopLayer();
-
-	/**
-	 * Receive an event to be fed into the top layer of the dispatch stack for
-	 * processing. This has the effect of creating a queue if there isn't one
-	 * already, honouring any conditions that may be defined by an enclosing
-	 * processor through the conditionsSatisfied() check method.
-	 * <p>
-	 * Because the condition checking logic must check against the enclosing
-	 * process any attempt to call this method with an owning process without a
-	 * colon in will fail with an index array out of bounds error. All owning
-	 * process identifiers must resemble 'enclosingProcess:processorName' at the
-	 * minimum.
-	 * 
-	 * @param event
-	 */
-	@SuppressWarnings("unchecked")
-	public void receiveEvent(IterationInternalEvent event) {
-		BlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>> queue = null;
-		String owningProcess = event.getOwningProcess();
-		synchronized (queues) {
-			String enclosingProcess = owningProcess.substring(0, owningProcess
-					.lastIndexOf(':'));
-			if (!queues.containsKey(owningProcess)) {
-				queue = new LinkedBlockingQueue<IterationInternalEvent<? extends IterationInternalEvent<?>>>();
-				queues.put(owningProcess, queue);
-				queue.add(event);
-
-				// If all preconditions are satisfied push the queue to the
-				// dispatch layer
-				if (conditionsSatisfied(enclosingProcess)) {
-					firstLayer().receiveJobQueue(
-							new DispatchJobQueueEvent(owningProcess, event
-									.getContext(), queue, getActivities()));
-				}
-			} else {
-				queue = queues.get(owningProcess);
-				queue.add(event);
-
-				// If all preconditions are satisfied then notify the queue
-				// addition to any NotifiableLayer instances. If the
-				// preconditions are not satisfied the queue isn't visible to
-				// the dispatch stack yet so do nothing.
-				if (conditionsSatisfied(enclosingProcess)) {
-					for (DispatchLayer layer : dispatchLayers) {
-						if (layer instanceof NotifiableLayer) {
-							((NotifiableLayer) layer).eventAdded(owningProcess);
-						}
-					}
-				}
-			}
-		}
-	}
-
-
-
-	/**
-	 * Called when a set of conditions which were unsatisfied in the context of
-	 * a given owning process become satisfied. At this point any jobs in the
-	 * queue for that owning process identifier should be pushed through to the
-	 * dispatch mechanism. As the queue itself will not have been pushed through
-	 * at this point this just consists of messaging the first layer with the
-	 * queue and activity set.
-	 * 
-	 * @param owningProcess
-	 */
-	public void satisfyConditions(String enclosingProcess) {
-		if (conditionsSatisfied(enclosingProcess)) {
-			String owningProcess = enclosingProcess + ":" + getProcessName();
-			synchronized (queues) {
-				if (queues.containsKey(owningProcess)) {
-					/**
-					 * At least one event has been received with this process ID
-					 * and a queue exists for it.
-					 */
-					firstLayer()
-							.receiveJobQueue(
-									new DispatchJobQueueEvent(owningProcess,
-											queues.get(owningProcess).peek()
-													.getContext(), queues
-													.get(owningProcess),
-											getActivities()));
-				} else {
-					/**
-					 * Do nothing, if the conditions are satisfied before any
-					 * jobs are received this mechanism is effectively redundant
-					 * and the normal notification system for the events will
-					 * let everything work through as per usual
-					 */
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack#getLayers()
-	 */
-	public List<DispatchLayer<?>> getLayers() {
-		return Collections.unmodifiableList(this.dispatchLayers);
-	}
-
-	public void addLayer(DispatchLayer<?> newLayer) {
-		dispatchLayers.add(newLayer);
-		newLayer.setDispatchStack(this);
-	}
-
-	public void addLayer(DispatchLayer<?> newLayer, int index) {
-		dispatchLayers.add(index, newLayer);
-		newLayer.setDispatchStack(this);
-	}
-
-	public int removeLayer(DispatchLayer<?> layer) {
-		int priorIndex = dispatchLayers.indexOf(layer);
-		dispatchLayers.remove(layer);
-		return priorIndex;
-	}
-
-	/**
-	 * Return the layer above (lower index!) the specified layer, or a reference
-	 * to the internal top layer dispatch layer if there is no layer above the
-	 * specified one. Remember - input data and activities go down, results,
-	 * errors and completion events bubble back up the dispatch stack.
-	 * <p>
-	 * The top layer within the dispatch stack is always invisible and is held
-	 * within the DispatchStackImpl object itself, being used to route data out
-	 * of the entire stack
-	 * 
-	 * @param layer
-	 * @return
-	 */
-	public DispatchLayer<?> layerAbove(DispatchLayer<?> layer) {
-		int layerIndex = dispatchLayers.indexOf(layer);
-		if (layerIndex > 0) {
-			return dispatchLayers.get(layerIndex - 1);
-		} else if (layerIndex == 0) {
-			return topLayer;
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * Return the layer below (higher index) the specified layer, or null if
-	 * there are no layers below this one
-	 */
-	public DispatchLayer<?> layerBelow(DispatchLayer<?> layer) {
-		int layerIndex = dispatchLayers.indexOf(layer);
-		if (layerIndex < dispatchLayers.size() - 1) {
-			return dispatchLayers.get(layerIndex + 1);
-		} else {
-			return null;
-		}
-	}
-	
-	protected DispatchLayer<?> firstLayer() {
-		return dispatchLayers.get(0);
-	}
-
-	protected class TopLayer extends AbstractDispatchLayer<Object> {
-
-		@Override
-		public void receiveResult(DispatchResultEvent resultEvent) {
-			DispatchStackImpl.this.pushEvent(new Job(resultEvent
-					.getOwningProcess(), resultEvent.getIndex(), resultEvent
-					.getData(), resultEvent.getContext()));
-			if (resultEvent.getIndex().length == 0) {
-				sendCachePurge(resultEvent.getOwningProcess());
-			}
-		}
-
-		// TODO - implement top level error handling, if an error bubbles up to
-		// the top layer of the dispatch stack it's trouble and probably fails
-		// this process
-		@Override
-		public void receiveError(DispatchErrorEvent errorEvent) {
-			logger.error("Error received in dispatch stack on owningProcess:"
-					+ errorEvent.getOwningProcess() + ", msg:"
-					+ errorEvent.getMessage(), errorEvent.getCause());
-			if (errorEvent.getIndex().length == 0) {
-				sendCachePurge(errorEvent.getOwningProcess());
-			}
-		}
-
-		@Override
-		public void receiveResultCompletion(
-				DispatchCompletionEvent completionEvent) {
-			Completion c = new Completion(completionEvent.getOwningProcess(),
-					completionEvent.getIndex(), completionEvent.getContext());
-			DispatchStackImpl.this.pushEvent(c);
-			if (c.isFinal()) {
-				sendCachePurge(c.getOwningProcess());
-			}
-		}
-
-		private void sendCachePurge(String owningProcess) {
-			for (DispatchLayer<?> layer : dispatchLayers) {
-				layer.finishedWith(owningProcess);
-			}
-			DispatchStackImpl.this.finishedWith(owningProcess);
-		}
-
-		public void configure(Object config) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public Object getConfiguration() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/package.html b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/package.html
deleted file mode 100644
index 52dcb5a..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/impl/package.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<body>
-Implementation package for the dispatch stack interfaces. Contains
-DispatchStack implementation and edit objects to modify it, actual
-dispatch layer implementations are held elsewhere (in third party
-plugins and in the
-net.sf.taverna.t2.workflowmodel.processor.dispatch.layers package for
-internal layers)
-</body>
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/ErrorBounce.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/ErrorBounce.java
deleted file mode 100644
index b3bac7b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/ErrorBounce.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.CREATE_PROCESS_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.NO_EFFECT;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.UPDATE_PROCESS_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.RESULT;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimerTask;
-
-import net.sf.taverna.t2.invocation.Event;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.monitor.NoSuchPropertyException;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.PropertyContributingDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerErrorReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerJobReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerResultCompletionReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerResultReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.SupportsStreamedResult;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-/**
- * Receives job events, checks to see whether any parameters in the job are
- * error tokens or collections which contain errors. If so then sends a
- * corresponding result message back where all outputs are error tokens having
- * registered such with the invocation context's data manager. It also re-writes
- * any failure messages as result messages containing error tokens at the
- * appropriate depth - this means that it must be placed above any error
- * handling layers in order for those to have an effect at all. In general this
- * layer should be placed immediately below the parallelize layer in most
- * default cases (this will guarantee the processor never sees a failure message
- * though, which may or may not be desirable)
- * 
- * @author Tom Oinn
- * 
- */
-@DispatchLayerErrorReaction(emits = { RESULT }, relaysUnmodified = false, stateEffects = {
-		CREATE_PROCESS_STATE, UPDATE_PROCESS_STATE })
-@DispatchLayerJobReaction(emits = { RESULT }, relaysUnmodified = true, stateEffects = {
-		CREATE_PROCESS_STATE, UPDATE_PROCESS_STATE, NO_EFFECT })
-@DispatchLayerResultReaction(emits = {}, relaysUnmodified = true, stateEffects = {})
-@DispatchLayerResultCompletionReaction(emits = {}, relaysUnmodified = true, stateEffects = {})
-@SupportsStreamedResult
-public class ErrorBounce extends AbstractDispatchLayer<Object> implements
-		PropertyContributingDispatchLayer<Object> {
-
-	/**
-	 * Track the number of reflected and translated errors handled by this error
-	 * bounce instance
-	 */
-	private Map<String, ErrorBounceState> state = new HashMap<String, ErrorBounceState>();
-	
-	
-
-	private synchronized ErrorBounceState getState(String owningProcess) {
-		if (state.containsKey(owningProcess)) {
-			return state.get(owningProcess);
-		} else {
-			ErrorBounceState ebs = new ErrorBounceState();
-			state.put(owningProcess, ebs);
-			return ebs;
-		}
-	}
-
-	/**
-	 * If the job contains errors, or collections which contain errors
-	 * themselves then bounce a result message with error documents in back up
-	 * to the layer above
-	 */
-	@Override
-	public void receiveJob(DispatchJobEvent jobEvent) {
-		Set<T2Reference> errorReferences = new HashSet<T2Reference>();
-		for (T2Reference ei : jobEvent.getData().values()) {
-			if (ei.containsErrors()) {
-				errorReferences.add(ei);
-			}
-		}
-		if (errorReferences.isEmpty()) {
-			// relay the message down...
-			getBelow().receiveJob(jobEvent);
-		} else {
-			getState(jobEvent.getOwningProcess())
-			.incrementErrorsReflected();
-			sendErrorOutput(jobEvent, null, errorReferences);
-		}
-
-	}
-
-	/**
-	 * Always send the error document job result on receiving a failure, at
-	 * least for now! This should be configurable, in effect this is the part
-	 * that ensures the processor never sees a top level failure.
-	 */
-	@Override
-	public void receiveError(DispatchErrorEvent errorEvent) {
-		getState(errorEvent.getOwningProcess()).incrementErrorsTranslated();
-		sendErrorOutput(errorEvent, errorEvent.getCause(), null);
-	}
-
-	/**
-	 * Construct and send a new result message with error documents in place of
-	 * all outputs at the appropriate depth
-	 * 
-	 * @param event
-	 * @param cause
-	 * @param errorReferences
-	 */
-	private void sendErrorOutput(Event<?> event, Throwable cause, Set<T2Reference> errorReferences) {
-		ReferenceService rs = event.getContext().getReferenceService();
-
-		Processor p = dispatchStack.getProcessor();
-		Map<String, T2Reference> outputDataMap = new HashMap<String, T2Reference>();
-		String[] owningProcessArray = event.getOwningProcess().split(":");
-		String processor = owningProcessArray[owningProcessArray.length - 1];
-		for (OutputPort op : p.getOutputPorts()) {
-			String message = "Processor '" + processor + "' - Port '" + op.getName() + "'";
-			if (event instanceof DispatchErrorEvent) {
-				message += ": " + ((DispatchErrorEvent) event).getMessage();
-			}
-			if (cause != null) {
-				outputDataMap.put(op.getName(), rs.getErrorDocumentService()
-						.registerError(message, cause, op.getDepth()).getId());
-			} else {
-				outputDataMap.put(op.getName(), rs.getErrorDocumentService()
-						.registerError(message, errorReferences, op.getDepth()).getId());
-			}
-		}
-		DispatchResultEvent dre = new DispatchResultEvent(event.getOwningProcess(),
-				event.getIndex(), event.getContext(), outputDataMap, false);
-		getAbove().receiveResult(dre);
-	}
-
-	public void configure(Object config) {
-		// Do nothing - no configuration required
-	}
-
-	public Object getConfiguration() {
-		// Layer has no configuration associated
-		return null;
-	}
-
-	public void finishedWith(final String owningProcess) {
-		// Delay the removal of the state to give the monitor
-		// a chance to poll
-		cleanupTimer.schedule(new TimerTask() {
-			@Override
-			public void run() {
-				state.remove(owningProcess);
-			}			
-		}, CLEANUP_DELAY_MS);
-	}
-
-	/**
-	 * Two properties, dispatch.errorbounce.reflected(integer) is the number of
-	 * incoming jobs which have been bounced back as results with errors,
-	 * dispatch.errorbounce.translated(integer) is the number of failures from
-	 * downstream in the stack that have been re-written as complete results
-	 * containing error documents.
-	 */
-	public void injectPropertiesFor(final String owningProcess) {
-
-		MonitorableProperty<Integer> errorsReflectedProperty = new MonitorableProperty<Integer>() {
-			public Date getLastModified() {
-				return new Date();
-			}
-
-			public String[] getName() {
-				return new String[] { "dispatch", "errorbounce", "reflected" };
-			}
-
-			public Integer getValue() throws NoSuchPropertyException {
-				ErrorBounceState ebs = state.get(owningProcess);
-				if (ebs == null) {
-					return 0;
-				} else {
-					return ebs.getErrorsReflected();
-				}
-			}
-		};
-		dispatchStack.receiveMonitorableProperty(errorsReflectedProperty,
-				owningProcess);
-
-		MonitorableProperty<Integer> errorsTranslatedProperty = new MonitorableProperty<Integer>() {
-			public Date getLastModified() {
-				return new Date();
-			}
-
-			public String[] getName() {
-				return new String[] { "dispatch", "errorbounce", "translated" };
-			}
-
-			public Integer getValue() throws NoSuchPropertyException {
-				ErrorBounceState ebs = state.get(owningProcess);
-				if (ebs == null) {
-					return 0;
-				} else {
-					return ebs.getErrorsTranslated();
-				}
-			}
-		};
-		dispatchStack.receiveMonitorableProperty(errorsTranslatedProperty,
-				owningProcess);
-
-	}
-
-	class ErrorBounceState {
-		private int errorsReflected = 0;
-		private int errorsTranslated = 0;
-
-		/**
-		 * Number of times the bounce layer has converted an incoming job event
-		 * where the input data contained error tokens into a result event
-		 * containing all errors.
-		 */
-		int getErrorsReflected() {
-			return this.errorsReflected;
-		}
-
-		/**
-		 * Number of times the bounce layer has converted an incoming failure
-		 * event into a result containing error tokens
-		 */
-		int getErrorsTranslated() {
-			return this.errorsTranslated;
-		}
-
-		synchronized void incrementErrorsReflected() {
-			errorsReflected++;
-		}
-
-		synchronized void incrementErrorsTranslated() {
-			errorsTranslated++;
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Failover.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Failover.java
deleted file mode 100644
index f963ba2..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Failover.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractErrorHandlerLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerErrorReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerJobReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerResultReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.*;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.*;
-
-/**
- * Failure handling dispatch layer, consumes job events with multiple activities
- * and emits the same job but with only the first activity. On failures the job
- * is resent to the layer below with a new activity list containing the second
- * in the original list and so on. If a failure is received and there are no
- * further activities to use the job fails and the failure is sent back up to
- * the layer above.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- * 
- */
-@DispatchLayerErrorReaction(emits = { JOB }, relaysUnmodified = true, stateEffects = {
-		UPDATE_LOCAL_STATE, REMOVE_LOCAL_STATE })
-@DispatchLayerJobReaction(emits = {}, relaysUnmodified = true, stateEffects = { CREATE_LOCAL_STATE })
-@DispatchLayerResultReaction(emits = {}, relaysUnmodified = true, stateEffects = { REMOVE_LOCAL_STATE })
-public class Failover extends AbstractErrorHandlerLayer<Object> {
-
-	@Override
-	protected JobState getStateObject(DispatchJobEvent jobEvent) {
-		return new FailoverState(jobEvent);
-	}
-
-	/**
-	 * Receive a job from the layer above, store it in the state map then relay
-	 * it to the layer below with a modified activity list containing only the
-	 * activity at index 0
-	 */
-	@Override
-	public void receiveJob(DispatchJobEvent jobEvent) {
-		addJobToStateList(jobEvent);
-		List<Activity<?>> newActivityList = new ArrayList<Activity<?>>();
-		newActivityList.add(jobEvent.getActivities().get(0));
-		getBelow().receiveJob(
-				new DispatchJobEvent(jobEvent.getOwningProcess(), jobEvent
-						.getIndex(), jobEvent.getContext(), jobEvent.getData(),
-						newActivityList));
-	}
-
-	class FailoverState extends JobState {
-
-		int currentActivityIndex = 0;
-
-		public FailoverState(DispatchJobEvent jobEvent) {
-			super(jobEvent);
-		}
-
-		@Override
-		public boolean handleError() {
-			currentActivityIndex++;
-			if (currentActivityIndex == jobEvent.getActivities().size()) {
-				return false;
-			} else {
-				List<Activity<?>> newActivityList = new ArrayList<Activity<?>>();
-				newActivityList.add(jobEvent.getActivities().get(
-						currentActivityIndex));
-				getBelow().receiveJob(
-						new DispatchJobEvent(jobEvent.getOwningProcess(),
-								jobEvent.getIndex(), jobEvent.getContext(),
-								jobEvent.getData(), newActivityList));
-				return true;
-			}
-		}
-	}
-
-	public void configure(Object config) {
-		// Do nothing - there is no configuration to do
-	}
-
-	public Object getConfiguration() {
-		return null;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/IntermediateProvenance.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/IntermediateProvenance.java
deleted file mode 100644
index d5018a8..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/IntermediateProvenance.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import java.beans.XMLDecoder;
-import java.beans.XMLEncoder;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.Map.Entry;
-
-import net.sf.taverna.t2.invocation.Event;
-import net.sf.taverna.t2.provenance.item.ActivityProvenanceItem;
-import net.sf.taverna.t2.provenance.item.ErrorProvenanceItem;
-import net.sf.taverna.t2.provenance.item.InputDataProvenanceItem;
-import net.sf.taverna.t2.provenance.item.IterationProvenanceItem;
-import net.sf.taverna.t2.provenance.item.OutputDataProvenanceItem;
-import net.sf.taverna.t2.provenance.item.ProcessProvenanceItem;
-import net.sf.taverna.t2.provenance.item.ProcessorProvenanceItem;
-import net.sf.taverna.t2.provenance.item.ProvenanceItem;
-import net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem;
-import net.sf.taverna.t2.provenance.reporter.ProvenanceReporter;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobQueueEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-import org.apache.log4j.Logger;
-
-/**
- * Sits above the {@link Invoke} layer and collects information about the
- * current workflow run to be stored by the {@link ProvenanceConnector}.
- * 
- * @author Ian Dunlop
- * @author Stian Soiland-Reyes
- * 
- */
-public class IntermediateProvenance extends AbstractDispatchLayer<String> {
-
-	Logger logger = Logger.getLogger(IntermediateProvenance.class);
-
-	private ProvenanceReporter reporter;
-
-	Map<String, Map<String, IterationProvenanceItem>> processToIndexes = new HashMap<String, Map<String, IterationProvenanceItem>>();
-
-	private Map<ActivityProvenanceItem, List<Object>> activityProvenanceItemMap = new HashMap<ActivityProvenanceItem, List<Object>>();
-
-	private Map<InputDataProvenanceItem, List<Object>> inputDataProvenanceItemMap = new HashMap<InputDataProvenanceItem, List<Object>>();
-
-	// private List<ActivityProvenanceItem> activityProvenanceItemList = new
-	// ArrayList<ActivityProvenanceItem>();
-	//
-	// private List<InputDataProvenanceItem> inputDataProvenanceItemList = new
-	// ArrayList<InputDataProvenanceItem>();
-
-	private WorkflowProvenanceItem workflowItem;
-
-	public void configure(String o) {
-	}
-
-	/**
-	 * A set of provenance events for a particular owning process has been
-	 * finished with so you can remove all the {@link IterationProvenanceItem}s
-	 * from the map
-	 */
-	@Override
-	public void finishedWith(String owningProcess) {
-		processToIndexes.remove(owningProcess);
-	}
-
-	public String getConfiguration() {
-		return null;
-	}
-
-	protected Map<String, IterationProvenanceItem> getIndexesByProcess(
-			String owningProcess) {
-		synchronized (processToIndexes) {
-			Map<String, IterationProvenanceItem> indexes = processToIndexes
-					.get(owningProcess);
-			if (indexes == null) {
-				indexes = new HashMap<String, IterationProvenanceItem>();
-				processToIndexes.put(owningProcess, indexes);
-			}
-			return indexes;
-		}
-	}
-
-	protected IterationProvenanceItem getIterationProvItem(Event<?> event) {
-		String owningProcess = event.getOwningProcess();
-		int[] originalIndex = event.getIndex();
-		int[] index = event.getIndex();
-		String indexStr = indexStr(index);
-		Map<String, IterationProvenanceItem> indexes = getIndexesByProcess(owningProcess);
-		IterationProvenanceItem iterationProvenanceItem = null;
-		synchronized (indexes) {
-			// find the iteration item for the int index eg [1]
-			iterationProvenanceItem = indexes.get(indexStr);
-			// if it is null then strip the index and look again
-
-			while (iterationProvenanceItem == null) {
-				try {
-					index = removeLastIndex(index);
-					iterationProvenanceItem = indexes.get(indexStr(index));
-					// if we have a 'parent' iteration then create a new
-					// iteration for the original index and link it to the
-					// activity and the input data
-					// FIXME should this be linked to the parent iteration
-					// instead?
-					if (iterationProvenanceItem != null) {
-						// set the index to the one from the event
-						IterationProvenanceItem iterationProvenanceItem1 = new IterationProvenanceItem();
-						iterationProvenanceItem1.setIteration(originalIndex);
-						iterationProvenanceItem1.setProcessId(owningProcess);
-						iterationProvenanceItem1.setIdentifier(UUID
-								.randomUUID().toString());
-						iterationProvenanceItem1.setWorkflowId(workflowItem.getParentId());
-
-						for (Entry<ActivityProvenanceItem, List<Object>> entrySet : activityProvenanceItemMap
-								.entrySet()) {
-							List<Object> value = entrySet.getValue();
-							int[] newIndex = (int[]) value.get(0);
-							String owner = (String) value.get(1);
-							String indexString = indexStr(newIndex);
-							String indexString2 = indexStr(index);
-
-							if (owningProcess.equalsIgnoreCase(owner)
-									&& indexString
-											.equalsIgnoreCase(indexString2)) {
-								iterationProvenanceItem1.setParentId(entrySet
-										.getKey().getIdentifier());
-							}
-						}
-
-						for (Entry<InputDataProvenanceItem, List<Object>> entrySet : inputDataProvenanceItemMap
-								.entrySet()) {
-							List<Object> value = entrySet.getValue();
-							int[] newIndex = (int[]) value.get(0);
-							String owner = (String) value.get(1);
-							String indexString = indexStr(newIndex);
-							String indexString2 = indexStr(index);
-							if (owningProcess.equalsIgnoreCase(owner)
-									&& indexString
-											.equalsIgnoreCase(indexString2)) {
-								iterationProvenanceItem1
-										.setInputDataItem(entrySet.getKey());
-							}
-
-						}
-
-						// for (ActivityProvenanceItem item :
-						// activityProvenanceItemList) {
-						// if (owningProcess.equalsIgnoreCase(item
-						// .getProcessId())) {
-						// iterationProvenanceItem1.setParentId(item
-						// .getIdentifier());
-						// }
-						// }
-						// for (InputDataProvenanceItem item :
-						// inputDataProvenanceItemList) {
-						// if (owningProcess.equalsIgnoreCase(item
-						// .getProcessId())) {
-						// iterationProvenanceItem1.setInputDataItem(item);
-						// }
-						// indexes.put(indexStr, iterationProvenanceItem1);
-						// return iterationProvenanceItem1;
-						// // }
-						// }
-
-						// add this new iteration item to the map
-						getIndexesByProcess(event.getOwningProcess()).put(
-								indexStr(event.getIndex()),
-								iterationProvenanceItem1);
-						return iterationProvenanceItem1;
-					}
-					// if we have not found an iteration items and the index
-					// is
-					// [] then something is wrong
-					// remove the last index in the int array before we go
-					// back
-					// through the while
-				} catch (IllegalStateException e) {
-					logger
-							.warn("Cannot find a parent iteration with index [] for owning process: "
-									+ owningProcess
-									+ "Workflow invocation is in an illegal state");
-					throw e;
-				}
-			}
-
-			// if (iterationProvenanceItem == null) {
-			// logger.info("Iteration item was null for: "
-			// + event.getOwningProcess() + " " + event.getIndex());
-			// System.out.println("Iteration item was null for: "
-			// + event.getOwningProcess() + " " + event.getIndex());
-			// iterationProvenanceItem = new IterationProvenanceItem(index);
-			// iterationProvenanceItem.setProcessId(owningProcess);
-			// iterationProvenanceItem.setIdentifier(UUID.randomUUID()
-			// .toString());
-			// // for (ActivityProvenanceItem
-			// item:activityProvenanceItemList)
-			// // {
-			// // if (owningProcess.equalsIgnoreCase(item.getProcessId())) {
-			// // iterationProvenanceItem.setParentId(item.getIdentifier());
-			// // }
-			// // }
-			// // for (InputDataProvenanceItem item:
-			// // inputDataProvenanceItemList) {
-			// // if (owningProcess.equalsIgnoreCase(item.getProcessId())) {
-			// // iterationProvenanceItem.setInputDataItem(item);
-			// // }
-			// // }
-			// indexes.put(indexStr, iterationProvenanceItem);
-
-		}
-		return iterationProvenanceItem;
-	}
-
-	private String indexStr(int[] index) {
-		String indexStr = "";
-		for (int ind : index) {
-			indexStr += ":" + ind;
-		}
-		return indexStr;
-	}
-
-	/**
-	 * Remove the last index of the int array in the form 1:2:3 etc
-	 * 
-	 * @param index
-	 * @return
-	 */
-	@SuppressWarnings("unused")
-	private String[] stripLastIndex(int[] index) {
-		String indexStr = "";
-		for (int ind : index) {
-			indexStr += ":" + ind;
-		}
-		// will be in form :1:2:3
-		String[] split = indexStr.split(":");
-
-		return split;
-	}
-
-	/**
-	 * Remove the last value in the int array
-	 * 
-	 * @param index
-	 * @return
-	 */
-	private int[] removeLastIndex(int[] index) {
-		if (index.length == 0) {
-			throw new IllegalStateException(
-					"There is no parent iteration of index [] for this result");
-		}
-		int[] newIntArray = new int[index.length - 1];
-		for (int i = 0; i < index.length - 1; i++) {
-			newIntArray[i] = index[i];
-		}
-		return newIntArray;
-	}
-
-	/**
-	 * Create an {@link ErrorProvenanceItem} and send across to the
-	 * {@link ProvenanceConnector}
-	 */
-	@Override
-	public void receiveError(DispatchErrorEvent errorEvent) {
-		IterationProvenanceItem iterationProvItem = getIterationProvItem(errorEvent);
-		// get using errorEvent.getOwningProcess();
-		
-		ErrorProvenanceItem errorItem = new ErrorProvenanceItem();
-		errorItem.setCause(errorEvent
-				.getCause());
-		errorItem.setErrorType(errorEvent
-				.getFailureType().toString());
-		errorItem.setMessage(errorEvent.getMessage());
-		
-		errorItem.setProcessId(errorEvent.getOwningProcess());
-		errorItem.setIdentifier(UUID.randomUUID().toString());
-		errorItem.setParentId(iterationProvItem.getIdentifier());
-		// iterationProvItem.setErrorItem(errorItem);
-		// FIXME don't need to add to the processor item earlier
-		getReporter().addProvenanceItem(errorItem);
-		super.receiveError(errorEvent);
-	}
-
-	/**
-	 * Create the {@link ProvenanceItem}s and send them all across to the
-	 * {@link ProvenanceConnector} except for the
-	 * {@link IterationProvenanceItem}, this one is told what it's inputs are
-	 * but has to wait until the results are received before being sent across.
-	 * Each item has a unique identifier and also knows who its parent item is
-	 */
-	@Override
-	public void receiveJob(DispatchJobEvent jobEvent) {
-
-		// FIXME do we need this ProcessProvenanceItem?
-		ProcessProvenanceItem provenanceItem;
-		String[] split = jobEvent.getOwningProcess().split(":");
-		provenanceItem = new ProcessProvenanceItem();
-		//FIXME are the facade id and dataflow name really needed? 
-		String parentDataflowId = workflowItem.getParentId();
-		provenanceItem.setWorkflowId(parentDataflowId);
-		provenanceItem.setFacadeID(split[0]);
-		provenanceItem.setDataflowID(split[1]);
-		provenanceItem.setProcessId(jobEvent.getOwningProcess());
-		provenanceItem.setIdentifier(UUID.randomUUID().toString());
-		provenanceItem.setParentId(workflowItem.getIdentifier());
-		ProcessorProvenanceItem processorProvItem;
-		processorProvItem = new ProcessorProvenanceItem();
-		processorProvItem.setWorkflowId(parentDataflowId);
-		processorProvItem.setProcessId(jobEvent
-				.getOwningProcess());
-		processorProvItem.setIdentifier(UUID.randomUUID().toString());
-		processorProvItem.setParentId(provenanceItem.getIdentifier());
-		provenanceItem.setProcessId(jobEvent.getOwningProcess());
-		getReporter().addProvenanceItem(provenanceItem);
-		getReporter().addProvenanceItem(processorProvItem);
-
-		IterationProvenanceItem iterationProvItem = null;
-		iterationProvItem = new IterationProvenanceItem();
-		iterationProvItem.setWorklfowId(parentDataflowId);
-		iterationProvItem.setIteration(jobEvent.getIndex());
-		iterationProvItem.setIdentifier(UUID.randomUUID().toString());
-		ReferenceService referenceService = jobEvent.getContext()
-				.getReferenceService();
-
-		InputDataProvenanceItem inputDataItem = new InputDataProvenanceItem();
-		inputDataItem.setDataMap(jobEvent.getData());
-		inputDataItem.setReferenceService(referenceService);
-		inputDataItem.setIdentifier(UUID.randomUUID().toString());
-		inputDataItem.setParentId(iterationProvItem.getIdentifier());
-		inputDataItem.setProcessId(jobEvent.getOwningProcess());
-
-		List<Object> inputIndexOwnerList = new ArrayList<Object>();
-		inputIndexOwnerList.add(jobEvent.getIndex());
-		inputIndexOwnerList.add(jobEvent.getOwningProcess());
-		inputDataProvenanceItemMap.put(inputDataItem, inputIndexOwnerList);
-
-		// inputDataProvenanceItemList.add(inputDataItem);
-		iterationProvItem.setInputDataItem(inputDataItem);
-		iterationProvItem.setIteration(jobEvent.getIndex());
-		iterationProvItem.setProcessId(jobEvent.getOwningProcess());
-
-		for (Activity<?> activity : jobEvent.getActivities()) {
-			if (activity instanceof AsynchronousActivity) {
-				ActivityProvenanceItem activityProvItem = new ActivityProvenanceItem();
-				activityProvItem.setWorkflowId(parentDataflowId);
-				activityProvItem.setIdentifier(UUID.randomUUID().toString());
-				iterationProvItem.setParentId(activityProvItem.getIdentifier());
-				// getConnector().addProvenanceItem(iterationProvItem);
-				activityProvItem.setParentId(processorProvItem.getIdentifier());
-				// processorProvItem.setActivityProvenanceItem(activityProvItem);
-				activityProvItem.setProcessId(jobEvent.getOwningProcess());
-				List<Object> activityIndexOwnerList = new ArrayList<Object>();
-				activityIndexOwnerList.add(jobEvent.getOwningProcess());
-				activityIndexOwnerList.add(jobEvent.getIndex());
-				activityProvenanceItemMap.put(activityProvItem,
-						inputIndexOwnerList);
-				// activityProvenanceItemList.add(activityProvItem);
-				// activityProvItem.setIterationProvenanceItem(iterationProvItem);
-				getReporter().addProvenanceItem(activityProvItem);
-				break;
-			}
-		}
-		getIndexesByProcess(jobEvent.getOwningProcess()).put(
-				indexStr(jobEvent.getIndex()), iterationProvItem);
-		super.receiveJob(jobEvent);
-	}
-
-	@Override
-	public void receiveJobQueue(DispatchJobQueueEvent jobQueueEvent) {
-
-		super.receiveJobQueue(jobQueueEvent);
-	}
-
-	/**
-	 * Populate an {@link OutputDataProvenanceItem} with the results and attach
-	 * it to the appropriate {@link IterationProvenanceItem}. Then send the
-	 * {@link IterationProvenanceItem} across to the {@link ProvenanceConnector}
-	 */
-	@Override
-	public void receiveResult(DispatchResultEvent resultEvent) {
-		try {
-			// FIXME use the connector from the result event context
-			IterationProvenanceItem iterationProvItem = getIterationProvItem(resultEvent);
-			
-			ReferenceService referenceService = resultEvent.getContext()
-					.getReferenceService();
-			
-	
-			OutputDataProvenanceItem outputDataItem = new OutputDataProvenanceItem();
-			outputDataItem.setDataMap(resultEvent.getData());
-			outputDataItem.setReferenceService(referenceService);
-			outputDataItem.setIdentifier(UUID.randomUUID().toString());
-			outputDataItem.setProcessId(resultEvent.getOwningProcess());
-			outputDataItem.setParentId(iterationProvItem.getIdentifier());
-			iterationProvItem.setOutputDataItem(outputDataItem);
-			
-			getReporter().addProvenanceItem(iterationProvItem);
-			// getConnector().addProvenanceItem(outputDataItem);
-	
-			// PM -- testing
-			// add xencoding of data value here??
-	//		Map<String, T2Reference> inputDataMap = iterationProvItem.getInputDataItem().getDataMap();
-	//		for(Map.Entry<String, T2Reference> entry:inputDataMap.entrySet()) {
-	//			
-	//			// create a simpler bean that we can serialize?
-	//			
-	//			T2Reference ref = entry.getValue();
-	//			
-	//			SimplerT2Reference t2RefBean = new SimplerT2Reference();
-	//			t2RefBean.setReferenceType(ref.getReferenceType());
-	//			t2RefBean.setDepth(ref.getDepth());
-	//			t2RefBean.setLocalPart(ref.getLocalPart());
-	//			t2RefBean.setNamespacePart(ref.getNamespacePart());
-	//						
-	//			System.out.println("data ref: "+ref);
-	//			String serializedInput = SerializeParam(t2RefBean);
-	//			System.out.println("serialized reference:" + serializedInput);
-	//			
-	//			System.out.println(referenceService.renderIdentifier(entry.getValue(), String.class, resultEvent.getContext()));
-//		}
-		} catch (Exception ex) {
-			logger.error("Could not store provenance for "
-					+ resultEvent.getOwningProcess() + " "
-					+ Arrays.toString(resultEvent.getIndex()), ex);
-			// But don't break super.receiveResult() !!
-		}
-		super.receiveResult(resultEvent);
-	}
-
-
-	
-	@Override
-	public void receiveResultCompletion(DispatchCompletionEvent completionEvent) {
-		// TODO Auto-generated method stub		
-		super.receiveResultCompletion(completionEvent);
-	}
-
-	/**
-	 * Tell this layer what {@link ProvenanceConnector} implementation is being
-	 * used to capture the {@link ProvenanceItem}s. NOTE: should probably use
-	 * the connector from the result events context where possible
-	 * 
-	 * @param connector
-	 */
-	public void setReporter(ProvenanceReporter connector) {
-		this.reporter = connector;
-	}
-
-	public ProvenanceReporter getReporter() {
-		return reporter;
-	}
-
-	/**
-	 * So that the {@link ProvenanceItem}s know which {@link Dataflow} has been
-	 * enacted this layer has to know about the {@link WorkflowProvenanceItem}
-	 * 
-	 * @param workflowItem
-	 */
-	public void setWorkflow(WorkflowProvenanceItem workflowItem) {
-		this.workflowItem = workflowItem;
-	}
-
-	
-	  public static String SerializeParam(Object ParamValue) {
-		    ByteArrayOutputStream BStream = new ByteArrayOutputStream();
-		    XMLEncoder encoder = new XMLEncoder(BStream);
-		    encoder.writeObject(ParamValue);
-		    encoder.close();
-		    return BStream.toString();
-		  }
-	  
-	  public static Object DeserializeParam (String SerializedParam) {
-		    InputStream IStream = new ByteArrayInputStream(SerializedParam.getBytes()); 
-		    XMLDecoder decoder = new XMLDecoder(IStream);
-		    Object output = decoder.readObject();
-		    decoder.close(); 
-		    return output;
-		  }
-	  
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Invoke.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Invoke.java
deleted file mode 100644
index 96e0f56..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Invoke.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.ERROR;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.RESULT;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.RESULT_COMPLETION;
-
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.log4j.Logger;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.monitor.MonitorManager;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.ControlBoundary;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback;
-import net.sf.taverna.t2.workflowmodel.processor.activity.MonitorableAsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerJobReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorType;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-/**
- * Context free invoker layer, does not pass index arrays of jobs into activity
- * instances.
- * <p>
- * This layer will invoke the first invokable activity in the activity list, so
- * any sane dispatch stack will have narrowed this down to a single item list by
- * this point, i.e. by the insertion of a failover layer.
- * <p>
- * Currently only handles activities implementing {@link AsynchronousActivity}.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-@DispatchLayerJobReaction(emits = { ERROR, RESULT_COMPLETION, RESULT }, relaysUnmodified = false, stateEffects = {})
-@ControlBoundary
-public class Invoke extends AbstractDispatchLayer<Object> {
-
-	private static Logger logger = Logger.getLogger(Invoke.class);
-	
-	private static Long invocationCount = 0L;
-
-	private static String getNextProcessID() {
-		synchronized (invocationCount) {
-			invocationCount = invocationCount + 1L;
-		}
-		return "invocation" + invocationCount;
-	}
-
-	public Invoke() {
-		super();
-	}
-
-	public void configure(Object config) {
-		// No configuration, do nothing
-	}
-
-	public Object getConfiguration() {
-		return null;
-	}
-
-	/**
-	 * Receive a job from the layer above and pick the first concrete activity
-	 * from the list to invoke. Invoke this activity, creating a callback which
-	 * will wrap up the result messages in the appropriate collection depth
-	 * before sending them on (in general activities are not aware of their
-	 * invocation context and should not be responsible for providing correct
-	 * index arrays for results)
-	 * <p>
-	 * This layer will invoke the first invokable activity in the activity list,
-	 * so any sane dispatch stack will have narrowed this down to a single item
-	 * list by this point, i.e. by the insertion of a failover layer.
-	 */
-	@Override
-	public void receiveJob(final DispatchJobEvent jobEvent) {
-		for (Activity<?> activity : jobEvent.getActivities()) {
-
-			if (activity instanceof AsynchronousActivity) {
-				// Register with the monitor
-				final String invocationProcessIdentifier = jobEvent
-						.pushOwningProcess(getNextProcessID())
-						.getOwningProcess();
-				MonitorManager.getInstance().registerNode(activity,
-						invocationProcessIdentifier.split(":"),
-						new HashSet<MonitorableProperty<?>>());
-
-				// The activity is an AsynchronousActivity so we invoke it with
-				// an AsynchronousActivityCallback object containing appropriate
-				// callback methods to push results, completions and failures
-				// back to the invocation layer.
-				final AsynchronousActivity<?> asyncActivity = (AsynchronousActivity<?>) activity;
-
-				// Get the registered DataManager for this process. In most
-				// cases this will just be a single DataManager for the entire
-				// workflow system but it never hurts to generalize
-
-				final ReferenceService refService = jobEvent.getContext()
-						.getReferenceService();
-
-				// Create a Map of EntityIdentifiers named appropriately given
-				// the activity mapping
-				Map<String, T2Reference> inputData = new HashMap<String, T2Reference>();
-				for (String inputName : jobEvent.getData().keySet()) {
-					String activityInputName = asyncActivity
-							.getInputPortMapping().get(inputName);
-					if (activityInputName != null) {
-						inputData.put(activityInputName, jobEvent.getData()
-								.get(inputName));
-					}
-				}
-
-				// Create a callback object to receive events, completions and
-				// failure notifications from the activity
-				AsynchronousActivityCallback callback = new InvokeCallBack(
-						jobEvent, refService, invocationProcessIdentifier,
-						asyncActivity);
-
-				if (asyncActivity instanceof MonitorableAsynchronousActivity<?>) {
-					// Monitorable activity so get the monitorable properties
-					// and push them into the state tree after launching the job
-					MonitorableAsynchronousActivity<?> maa = (MonitorableAsynchronousActivity<?>) asyncActivity;
-					Set<MonitorableProperty<?>> props = maa
-							.executeAsynchWithMonitoring(inputData, callback);
-					MonitorManager.getInstance().addPropertiesToNode(
-							invocationProcessIdentifier.split(":"), props);
-				} else {
-					// Run the job, passing in the callback we've just created
-					// along with the (possibly renamed) input data map
-					asyncActivity.executeAsynch(inputData, callback);
-				}
-				return;
-			}
-		}
-	}
-
-	protected class InvokeCallBack implements AsynchronousActivityCallback {
-		protected final AsynchronousActivity<?> asyncActivity;
-		protected final String invocationProcessIdentifier;
-		protected final DispatchJobEvent jobEvent;
-		protected final ReferenceService refService;
-		protected boolean sentJob = false;
-
-		protected InvokeCallBack(DispatchJobEvent jobEvent,
-				ReferenceService refService,
-				String invocationProcessIdentifier,
-				AsynchronousActivity<?> asyncActivity) {
-			this.jobEvent = jobEvent;
-			this.refService = refService;
-			this.invocationProcessIdentifier = invocationProcessIdentifier;
-			this.asyncActivity = asyncActivity;
-		}
-
-		public void fail(String message) {
-			fail(message, null);
-		}
-
-		public void fail(String message, Throwable t) {
-			fail(message, t, DispatchErrorType.INVOCATION);
-		}
-
-		public void fail(String message, Throwable t,
-				DispatchErrorType errorType) {
-			logger.warn("Failed (" + errorType + ") invoking " + asyncActivity
-					+ " for job " + jobEvent + ": " + message, t);
-			MonitorManager.getInstance().deregisterNode(
-					invocationProcessIdentifier);
-			getAbove().receiveError(
-					new DispatchErrorEvent(jobEvent.getOwningProcess(),
-							jobEvent.getIndex(), jobEvent.getContext(),
-							message, t, errorType, asyncActivity));
-		}
-
-		public InvocationContext getContext() {
-			return jobEvent.getContext();
-		}
-
-		public String getParentProcessIdentifier() {
-			return invocationProcessIdentifier;
-		}
-
-		public void receiveCompletion(int[] completionIndex) {
-			if (completionIndex.length == 0) {
-				// Final result, clean up monitor state
-				MonitorManager.getInstance().deregisterNode(
-						invocationProcessIdentifier);
-			}
-			if (sentJob) {
-				int[] newIndex;
-				if (completionIndex.length == 0) {
-					newIndex = jobEvent.getIndex();
-				} else {
-					newIndex = new int[jobEvent.getIndex().length
-							+ completionIndex.length];
-					int i = 0;
-					for (int indexValue : jobEvent.getIndex()) {
-						newIndex[i++] = indexValue;
-					}
-					for (int indexValue : completionIndex) {
-						newIndex[i++] = indexValue;
-					}
-				}
-				DispatchCompletionEvent c = new DispatchCompletionEvent(
-						jobEvent.getOwningProcess(), newIndex, jobEvent
-								.getContext());
-				getAbove().receiveResultCompletion(c);
-			} else {
-				// We haven't sent any 'real' data prior to
-				// completing a stream. This in effect means we're
-				// sending an empty top level collection so we need
-				// to register empty collections for each output
-				// port with appropriate depth (by definition if
-				// we're streaming all outputs are collection types
-				// of some kind)
-				Map<String, T2Reference> emptyListMap = new HashMap<String, T2Reference>();
-				for (OutputPort op : asyncActivity.getOutputPorts()) {
-					String portName = op.getName();
-					int portDepth = op.getDepth();
-					emptyListMap.put(portName, refService.getListService()
-							.registerEmptyList(portDepth).getId());
-				}
-				receiveResult(emptyListMap, new int[0]);
-			}
-
-		}
-
-		public void receiveResult(Map<String, T2Reference> data, int[] index) {
-
-			if (index.length == 0) {
-				// Final result, clean up monitor state
-				MonitorManager.getInstance().deregisterNode(
-						invocationProcessIdentifier);
-			}
-
-			// Construct a new result map using the activity mapping
-			// (activity output name to processor output name)
-			Map<String, T2Reference> resultMap = new HashMap<String, T2Reference>();
-			for (String outputName : data.keySet()) {
-				String processorOutputName = asyncActivity
-						.getOutputPortMapping().get(outputName);
-				if (processorOutputName != null) {
-					resultMap.put(processorOutputName, data.get(outputName));
-				}
-			}
-			// Construct a new index array if the specified index is
-			// non zero length, otherwise just use the original
-			// job's index array (means we're not streaming)
-			int[] newIndex;
-			boolean streaming = false;
-			if (index.length == 0) {
-				newIndex = jobEvent.getIndex();
-			} else {
-				streaming = true;
-				newIndex = new int[jobEvent.getIndex().length + index.length];
-				int i = 0;
-				for (int indexValue : jobEvent.getIndex()) {
-					newIndex[i++] = indexValue;
-				}
-				for (int indexValue : index) {
-					newIndex[i++] = indexValue;
-				}
-			}
-			DispatchResultEvent resultEvent = new DispatchResultEvent(jobEvent
-					.getOwningProcess(), newIndex, jobEvent.getContext(),
-					resultMap, streaming);
-			// Push the modified data to the layer above in the
-			// dispatch stack
-			getAbove().receiveResult(resultEvent);
-
-			sentJob = true;
-		}	
-
-		public void requestRun(Runnable runMe) {
-			String newThreadName = jobEvent.toString();
-			Thread thread = new Thread(runMe, newThreadName);
-			thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){
-				public void uncaughtException(Thread t, Throwable e) {
-					fail("Uncaught exception while invoking " + asyncActivity, e);
-				}});
-			thread.start();
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Loop.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Loop.java
deleted file mode 100644
index 1c29f30..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Loop.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.AbstractDispatchEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorType;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobQueueEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-import org.apache.log4j.Logger;
-
-/**
- * A layer that allows while-style loops.
- * <p>
- * The layer is configured with a {@link LoopConfiguration}, where an activity
- * has been set as the
- * {@link LoopConfiguration#setCondition(net.sf.taverna.t2.workflowmodel.processor.activity.Activity)
- * condition}.
- * </p>
- * <p>
- * After a job has been successful further down the dispatch stack, the loop
- * layer will invoke the conditional activity to determine if the job will be
- * invoked again. If {@link LoopConfiguration#isRunFirst()} is false, this test
- * will be performed even before the first invocation. (The default
- * runFirst=true is equivalent to a do..while construct, while runFirst=false is
- * equivalent to a while.. construct.)
- * </p>
- * <p>
- * A job will be resent down the dispatch stack only if the conditional activity
- * returns a reference to a string equal to "true" on its output port "loop".
- * </p>
- * <p>
- * If a job or the conditional activity fails, the while-loop is interrupted and
- * the error is sent further up.
- * </p>
- * <p>
- * Note that the LoopLayer will be invoked for each item in an iteration, if you
- * want to do the loop for the whole collection (ie. re-iterating if the
- * loop-condition fails after processing the full list) - create a nested
- * workflow with the desired depths on it's input ports and insert this
- * LoopLayer in the stack of the nested workflow's processor in parent workflow.
- * </p>
- * <p>
- * It is recommended that the LoopLayer is to be inserted after the
- * {@link ErrorBounce} layer, as this layer is needed for registering errors
- * produced by the LoopLayer. If the user requires {@link Retry retries} and
- * {@link Failover failovers} before checking the while condition, such layers
- * should be below LoopLayer.
- * </p>
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-
-@SuppressWarnings("unchecked")
-public class Loop extends AbstractDispatchLayer<LoopConfiguration> {
-
-	private static Logger logger = Logger.getLogger(Loop.class);
-
-	private LoopConfiguration config = new LoopConfiguration();
-
-	protected Map<String, AbstractDispatchEvent> incomingJobs = new HashMap<String, AbstractDispatchEvent>();
-
-	protected Map<String, AbstractDispatchEvent> outgoingJobs = new HashMap<String, AbstractDispatchEvent>();
-
-	public void configure(LoopConfiguration config) {
-		this.config = config;
-	}
-
-	@Override
-	public void finishedWith(String owningProcess) {
-		String prefix = owningProcess + "[";
-		synchronized (outgoingJobs) {
-			for (String key : new ArrayList<String>(outgoingJobs.keySet())) {
-				if (key.startsWith(prefix)) {
-					outgoingJobs.remove(key);
-				}
-			}
-		}
-		synchronized (incomingJobs) {
-			for (String key : new ArrayList<String>(incomingJobs.keySet())) {
-				if (key.startsWith(prefix)) {
-					incomingJobs.remove(key);
-				}
-			}
-		}
-	}
-
-	public LoopConfiguration getConfiguration() {
-		return config;
-	}
-
-	@Override
-	public void receiveJob(DispatchJobEvent jobEvent) {
-		synchronized (incomingJobs) {
-			incomingJobs.put(jobIdentifier(jobEvent), jobEvent);
-		}
-		if (config.isRunFirst()) {
-			// We'll do the conditional in receiveResult instead
-			super.receiveJob(jobEvent);
-			return;
-		}
-		checkCondition(jobEvent);
-	}
-
-	@Override
-	public void receiveJobQueue(DispatchJobQueueEvent jobQueueEvent) {
-		synchronized (incomingJobs) {
-			incomingJobs.put(jobIdentifier(jobQueueEvent), jobQueueEvent);
-		}
-		if (config.isRunFirst()) {
-			// We'll do the conditional in receiveResult instead
-			super.receiveJobQueue(jobQueueEvent);
-			return;
-		}
-		checkCondition(jobQueueEvent);
-	}
-
-	@Override
-	public void receiveResult(DispatchResultEvent resultEvent) {
-		Activity<?> condition = config.getCondition();
-		if (condition == null) {
-			super.receiveResult(resultEvent);
-			return;
-		}
-		synchronized (outgoingJobs) {
-			outgoingJobs.put(jobIdentifier(resultEvent), resultEvent);
-		}
-		checkCondition(resultEvent);
-	}
-
-	@Override
-	public void receiveResultCompletion(DispatchCompletionEvent completionEvent) {
-		Activity<?> condition = config.getCondition();
-		if (condition == null) {
-			super.receiveResultCompletion(completionEvent);
-			return;
-		}
-		synchronized (outgoingJobs) {
-			outgoingJobs.put(jobIdentifier(completionEvent), completionEvent);
-		}
-		checkCondition(completionEvent);
-	}
-
-	private void checkCondition(AbstractDispatchEvent event) {
-		Activity<?> condition;
-		condition = config.getCondition();
-		if (condition == null) {
-			super.receiveError(new DispatchErrorEvent(event.getOwningProcess(),
-					event.getIndex(), event.getContext(),
-					"Can't invoke condition service: null", null,
-					DispatchErrorType.INVOCATION, condition));
-			return;
-		}
-		if (!(condition instanceof AbstractAsynchronousActivity)) {
-			DispatchErrorEvent errorEvent = new DispatchErrorEvent(
-					event.getOwningProcess(),
-					event.getIndex(),
-					event.getContext(),
-					"Can't invoke condition service "
-							+ condition
-							+ " is not an instance of AbstractAsynchronousActivity",
-					null, DispatchErrorType.INVOCATION, condition);
-			super.receiveError(errorEvent);
-			return;
-		}
-		AbstractAsynchronousActivity asyncCondition = (AbstractAsynchronousActivity) condition;
-		String jobIdentifier = jobIdentifier(event);
-		Map<String, T2Reference> inputs = prepareInputs(asyncCondition,
-				jobIdentifier);
-		AsynchronousActivityCallback callback = new ConditionCallBack(
-				jobIdentifier);
-		asyncCondition.executeAsynch(inputs, callback);
-	}
-
-	private Map<String, T2Reference> prepareInputs(
-			AbstractAsynchronousActivity asyncCondition, String jobIdentifier) {
-		Map<String, T2Reference> inputs = new HashMap<String, T2Reference>();
-		Map<String, T2Reference> inData = getInData(jobIdentifier);
-		Map<String, T2Reference> outData = getOutData(jobIdentifier);
-
-		Set<ActivityInputPort> inputPorts = asyncCondition.getInputPorts();
-		for (ActivityInputPort conditionIn : inputPorts) {
-			String conditionPort = conditionIn.getName();
-			if (outData.containsKey(conditionPort)) {
-				// Copy from previous output
-				inputs.put(conditionPort, outData.get(conditionPort));
-			} else if (inData.containsKey(conditionPort)) {
-				// Copy from original input
-				inputs.put(conditionPort, inData.get(conditionPort));
-			}
-		}
-		return inputs;
-	}
-
-	private Map<String, T2Reference> getInData(String jobIdentifier) {
-		AbstractDispatchEvent inEvent;
-		synchronized (incomingJobs) {
-			inEvent = incomingJobs.get(jobIdentifier);
-		}
-		Map<String, T2Reference> inData = new HashMap<String, T2Reference>();
-		if (inEvent instanceof DispatchJobEvent) {
-			inData = ((DispatchJobEvent) inEvent).getData();
-		}
-		return inData;
-	}
-
-	private Map<String, T2Reference> getOutData(String jobIdentifier) {
-		AbstractDispatchEvent outEvent;
-		synchronized (outgoingJobs) {
-			outEvent = outgoingJobs.get(jobIdentifier);
-		}
-		Map<String, T2Reference> outData = new HashMap<String, T2Reference>();
-		if (outEvent instanceof DispatchResultEvent) {
-			outData = ((DispatchResultEvent) outEvent).getData();
-		}
-		return outData;
-	}
-
-	private String jobIdentifier(AbstractDispatchEvent event) {
-		String jobId = event.getOwningProcess()
-				+ Arrays.toString(event.getIndex());
-		return jobId;
-	}
-
-	public static final String LOOP_PORT = "loop";
-	
-	
-	public class ConditionCallBack implements AsynchronousActivityCallback {
-		private InvocationContext context;
-		private final String jobIdentifier;
-		private String processId;
-
-		public ConditionCallBack(String jobIdentifier) {
-			this.jobIdentifier = jobIdentifier;
-			AbstractDispatchEvent originalEvent;
-			synchronized (incomingJobs) {
-				originalEvent = incomingJobs.get(jobIdentifier);
-			}
-			context = originalEvent.getContext();
-			processId = originalEvent.getOwningProcess() + ":condition";
-		}
-
-		public void fail(String message) {
-			fail(message, null, DispatchErrorType.INVOCATION);
-		}
-
-		public void fail(String message, Throwable t) {
-			fail(message, t, DispatchErrorType.INVOCATION);
-		}
-
-		public void fail(String message, Throwable t,
-				DispatchErrorType errorType) {
-			logger.warn("Failed (" + errorType + ") invoking condition service "
-					+ jobIdentifier + ":" + message, t);
-
-			AbstractDispatchEvent originalEvent;
-			synchronized (incomingJobs) {
-				originalEvent = incomingJobs.get(jobIdentifier);
-			}
-			receiveError(new DispatchErrorEvent(originalEvent
-					.getOwningProcess(), originalEvent.getIndex(),
-					originalEvent.getContext(),
-					"Can't invoke condition service ", t,
-					DispatchErrorType.INVOCATION, null));
-		}
-
-		public InvocationContext getContext() {
-			return context;
-		}
-
-		public String getParentProcessIdentifier() {
-			return processId;
-		}
-
-		public void receiveCompletion(int[] completionIndex) {
-			// Ignore streaming
-		}
-
-		public void receiveResult(Map<String, T2Reference> data, int[] index) {
-			if (index.length > 0) {
-				// Ignore streaming
-				return;
-			}
-			T2Reference loopRef = data.get(LOOP_PORT);
-			if (loopRef == null) {
-				fail("Condition service didn't contain output port " + LOOP_PORT);
-				return;
-			}
-			if (loopRef.containsErrors()) {
-				fail("Condition service failed: " + loopRef);
-				return;
-			}
-			if (loopRef.getDepth() != 0) {
-				fail("Condition service output " + LOOP_PORT
-						+ " depth is not 0, but " + loopRef.getDepth());
-			}
-			ReferenceService referenceService = context.getReferenceService();
-			String loop = (String) referenceService.renderIdentifier(loopRef,
-					String.class, context);
-
-			if (Boolean.parseBoolean(loop)) {
-				// Push it down again
-				AbstractDispatchEvent dispatchEvent;
-				synchronized (incomingJobs) {
-					dispatchEvent = incomingJobs.get(jobIdentifier);
-				}
-				if (dispatchEvent == null) {
-					fail("Unknown job identifier " + jobIdentifier);
-				}
-				if (dispatchEvent instanceof DispatchJobEvent) {
-					DispatchJobEvent newJobEvent = prepareNewJobEvent(data,
-							dispatchEvent);
-					getBelow().receiveJob(newJobEvent);
-				} else if (dispatchEvent instanceof DispatchJobQueueEvent) {
-					getBelow().receiveJobQueue(
-							(DispatchJobQueueEvent) dispatchEvent);
-				} else {
-					fail("Unknown type of incoming event " + dispatchEvent);
-				}
-				return;
-
-			} else {
-				// We'll push it up, end of loop for now
-
-				AbstractDispatchEvent outgoingEvent;
-				synchronized (outgoingJobs) {
-					outgoingEvent = outgoingJobs.get(jobIdentifier);
-				}
-				if (outgoingEvent == null && !config.isRunFirst()) {
-					fail("Initial loop condition failed");
-				}
-				if (outgoingEvent instanceof DispatchCompletionEvent) {
-					getAbove().receiveResultCompletion(
-							(DispatchCompletionEvent) outgoingEvent);
-				} else if (outgoingEvent instanceof DispatchResultEvent) {
-					getAbove().receiveResult(
-							(DispatchResultEvent) outgoingEvent);
-				} else {
-					fail("Unknown type of outgoing event " + outgoingEvent);
-				}
-			}
-
-		}
-
-		private DispatchJobEvent prepareNewJobEvent(
-				Map<String, T2Reference> data,
-				AbstractDispatchEvent dispatchEvent) {
-			DispatchJobEvent dispatchJobEvent = (DispatchJobEvent) dispatchEvent;
-			Map<String, T2Reference> newInputs = new HashMap<String, T2Reference>(
-					dispatchJobEvent.getData());
-			newInputs.putAll(data);
-			DispatchJobEvent newJobEvent = new DispatchJobEvent(dispatchEvent
-					.getOwningProcess(), dispatchEvent.getIndex(),
-					dispatchEvent.getContext(), newInputs,
-					((DispatchJobEvent) dispatchEvent).getActivities());
-			// TODO: Should this be registered as an incomingJobs? If so the
-			// conditional
-			// could even feed to itself, and we should also keep a list of
-			// originalJobs.
-			return newJobEvent;
-		}
-
-		public void requestRun(Runnable runMe) {
-			String newThreadName = "Condition service "
-					+ getParentProcessIdentifier();
-			Thread thread = new Thread(runMe, newThreadName);
-			thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
-				public void uncaughtException(Thread t, Throwable e) {
-					fail("Uncaught exception while invoking " + jobIdentifier,
-							e);
-				}
-			});
-			thread.start();
-		}
-	}
-
-	public Processor getProcessor() {
-		if (dispatchStack == null) {
-			return null;
-		}
-		return dispatchStack.getProcessor();
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/LoopConfiguration.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/LoopConfiguration.java
deleted file mode 100644
index 8944135..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/LoopConfiguration.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.HashMap;
-import java.util.Properties;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.ActivityXMLDeserializer;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.ActivityXMLSerializer;
-
-import org.apache.log4j.Logger;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-import org.jdom.output.XMLOutputter;
-
-/**
- * Configuration bean for the {@link Loop}.
- * <p>
- * Set the {@link #setCondition(Activity)} for an activity with an output port
- * called "loop". The LoopLayer will re-send a job only if this port exist and
- * it's output can be dereferenced to a string equal to "true".
- * </p>
- * <p>
- * If {@link #isRunFirst()} is false, the loop layer will check the condition
- * before invoking the job for the first time, otherwise the condition will be
- * invoked after the job has come back with successful results.
- * </p>
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class LoopConfiguration implements Cloneable {
-
-	transient private static Logger logger = Logger
-			.getLogger(LoopConfiguration.class);
-
-	/**
-	 * Transient - will be stored as XML
-	 */
-	transient private Activity<?> condition = null;
-	private String conditionXML;
-	private Boolean runFirst;
-	private Properties properties;
-
-	public Properties getProperties() {
-		synchronized (this) {
-			if (properties == null) {
-				properties = new Properties();
-			}
-		}
-		return properties;
-	}
-
-	public void setProperties(Properties properties) {
-		this.properties = properties;
-	}
-
-	@Override
-	public LoopConfiguration clone() {
-		LoopConfiguration clone;
-		try {
-			clone = (LoopConfiguration) super.clone();
-			clone.condition = null;
-		} catch (CloneNotSupportedException e) {
-			throw new RuntimeException("Unexpected CloneNotSupportedException",
-					e);
-		}
-		return clone;
-	}
-
-	public Activity<?> getCondition() {
-		SAXBuilder builder = new SAXBuilder();
-
-		synchronized (this) {
-			if (condition == null && conditionXML != null) {
-				try {
-					Document document = builder.build(new StringReader(
-							conditionXML));
-					Element conditionElement = document.getRootElement();
-					ActivityXMLDeserializer deserializer = ActivityXMLDeserializer
-							.getInstance();
-					this.condition = deserializer.deserializeActivity(
-							conditionElement, new HashMap<String, Element>());
-				} catch (Exception e) {
-					logger.warn("Can't deserialise condition service", e);
-				}
-			}
-		}
-		return condition;
-	}
-
-	public boolean isRunFirst() {
-		if (runFirst == null) {
-			return true;
-		}
-		return runFirst;
-	}
-
-	public void setCondition(Activity<?> activity) {
-		ActivityXMLSerializer serializer = ActivityXMLSerializer.getInstance();
-
-		this.condition = activity;
-
-		try {
-			if (condition != null) {
-				Element conditionElement = serializer.activityToXML(activity);
-				XMLOutputter xmlOutputter = new XMLOutputter();
-				conditionXML = xmlOutputter.outputString(conditionElement);
-			} else {
-				conditionXML = null;
-			}
-		} catch (JDOMException e) {
-			logger.warn("Can't serialise activity " + activity, e);
-			conditionXML = null;
-		} catch (IOException e) {
-			logger.warn("Can't serialise activity " + activity, e);
-			conditionXML = null;
-		}
-	}
-
-	public void setRunFirst(boolean runFirst) {
-		this.runFirst = runFirst;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Parallelize.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Parallelize.java
deleted file mode 100644
index 4e8999c..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Parallelize.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.CREATE_PROCESS_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.NO_EFFECT;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.REMOVE_PROCESS_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.JOB;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimerTask;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-import net.sf.taverna.t2.monitor.NoSuchPropertyException;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.NotifiableLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.PropertyContributingDispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerErrorReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerJobQueueReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerResultCompletionReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerResultReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.SupportsStreamedResult;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchErrorEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobQueueEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-import org.apache.log4j.Logger;
-
-/**
- * Dispatch layer which consumes a queue of events and fires off a fixed number
- * of simultaneous jobs to the layer below. It observes failure, data and
- * completion events coming up and uses these to determine when to push more
- * jobs downwards into the stack as well as when it can safely emit completion
- * events from the queue.
- * 
- * @author Tom Oinn
- * 
- */
-@DispatchLayerErrorReaction(emits = {}, relaysUnmodified = true, stateEffects = {
-		REMOVE_PROCESS_STATE, NO_EFFECT })
-@DispatchLayerJobQueueReaction(emits = { JOB }, relaysUnmodified = false, stateEffects = { CREATE_PROCESS_STATE })
-@DispatchLayerResultReaction(emits = {}, relaysUnmodified = true, stateEffects = {
-		REMOVE_PROCESS_STATE, NO_EFFECT })
-@DispatchLayerResultCompletionReaction(emits = {}, relaysUnmodified = true, stateEffects = {
-		REMOVE_PROCESS_STATE, NO_EFFECT })
-@SupportsStreamedResult
-public class Parallelize extends AbstractDispatchLayer<ParallelizeConfig>
-		implements NotifiableLayer,
-		PropertyContributingDispatchLayer<ParallelizeConfig> {
-
-	private static Logger logger = Logger.getLogger(Parallelize.class);
-	
-	private Map<String, StateModel> stateMap = new HashMap<String, StateModel>();
-
-	private ParallelizeConfig config = new ParallelizeConfig();
-
-	int sentJobsCount = 0;
-
-	int completedJobsCount = 0;
-
-	public Parallelize() {
-		super();
-	}
-
-	/**
-	 * Test constructor, only used by unit tests, should probably not be public
-	 * access here?
-	 * 
-	 * @param maxJobs
-	 */
-	public Parallelize(int maxJobs) {
-		super();
-		config.setMaximumJobs(maxJobs);
-	}
-
-	public void eventAdded(String owningProcess) {
-		StateModel stateModel;
-		synchronized (stateMap) {
-			stateModel = stateMap.get(owningProcess);
-		}
-		if (stateModel == null) {
-			/*
-			 * Should never see this here, it means we've had duplicate
-			 * completion events from upstream
-			 */
-			throw new WorkflowStructureException(
-					"Unknown owning process " + owningProcess);		
-		}
-		synchronized (stateModel) {
-			stateModel.fillFromQueue();
-		}
-	}
-
-	@Override
-	public void receiveJobQueue(DispatchJobQueueEvent queueEvent) {
-		StateModel model = new StateModel(queueEvent, config.getMaximumJobs());
-		synchronized(stateMap) {
-			stateMap.put(queueEvent.getOwningProcess(), model);
-		}
-		model.fillFromQueue();
-	}
-
-	public void receiveJob(Job job, List<? extends Activity<?>> activities) {
-		throw new WorkflowStructureException(
-				"Parallelize layer cannot handle job events");
-	}
-	
-
-	@Override
-	public void receiveError(DispatchErrorEvent errorEvent) {
-		StateModel model;
-		String owningProcess = errorEvent.getOwningProcess();
-		synchronized(stateMap) {
-			model = stateMap.get(owningProcess);
-		}
-		getAbove().receiveError(errorEvent);
-		if (model == null) {
-			logger.warn("Error received for unknown owning process: " + owningProcess);
-			return;
-		}
-		model.finishWith(errorEvent.getIndex());
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public void receiveResult(DispatchResultEvent resultEvent) {
-		StateModel model;
-		String owningProcess = resultEvent.getOwningProcess();
-		synchronized(stateMap) {
-			model = stateMap.get(owningProcess);
-		}
-		DispatchLayer above = getAbove();
-		above.receiveResult(resultEvent);
-		if (model == null) {
-			logger.warn("Error received for unknown owning process: " + owningProcess);
-			return;
-		}
-		model.finishWith(resultEvent.getIndex());
-	}
-
-	/**
-	 * Only going to receive this if the activity invocation was streaming, in
-	 * which case we need to handle all completion events and pass them up the
-	 * stack.
-	 */
-	@Override
-	public void receiveResultCompletion(DispatchCompletionEvent completionEvent) {
-		StateModel model;
-		String owningProcess = completionEvent.getOwningProcess();
-		synchronized(stateMap) {
-			model = stateMap.get(owningProcess);
-		}
-		getAbove().receiveResultCompletion(completionEvent);
-		if (model == null) {
-			logger.warn("Error received for unknown owning process: " + owningProcess);
-			return;
-		}
-		model.finishWith(completionEvent.getIndex());
-	}
-
-	@Override
-	public void finishedWith(final String owningProcess) {
-		// Delay the removal of the state to give the monitor
-		// a chance to poll
-		cleanupTimer.schedule(new TimerTask() {
-			@Override
-			public void run() {
-				synchronized(stateMap) {
-					stateMap.remove(owningProcess);
-				}
-			}			
-		}, CLEANUP_DELAY_MS);
-	}
-
-	public void configure(ParallelizeConfig config) {
-		this.config = config;
-	}
-
-	public ParallelizeConfig getConfiguration() {
-		return this.config;
-	}
-
-	/**
-	 * Injects the following properties into its parent processor's property set
-	 * :
-	 * <ul>
-	 * <li><code>dispatch.parallelize.queuesize [Integer]</code><br/>The current
-	 * size of the incomming job queue, or -1 if the state isn't defined for the
-	 * registered process identifier (which will be the case if the process
-	 * hasn't started or has had its state purged after a final completion of
-	 * some kind.</li>
-	 * </ul>
-	 */
-	public void injectPropertiesFor(final String owningProcess) {
-		/**
-		 * Property for the queue depth, will evaluate to -1 if there isn't a
-		 * queue in the state model for this identifier (which will be the case
-		 * if we haven't created the state yet or the queue has been collected)
-		 */
-		MonitorableProperty<Integer> queueSizeProperty = new MonitorableProperty<Integer>() {
-
-			public Date getLastModified() {
-				return new Date();
-			}
-
-			public String[] getName() {
-				return new String[] { "dispatch", "parallelize", "queuesize" };
-			}
-
-			public Integer getValue() throws NoSuchPropertyException {
-				
-				StateModel model;
-				synchronized(stateMap) {
-					model = stateMap.get(owningProcess);
-				}
-				if (model != null) {
-					return model.queueSize();
-				} else {
-					return -1;
-				}
-			}
-
-		};
-		dispatchStack.receiveMonitorableProperty(queueSizeProperty,
-				owningProcess);
-
-		MonitorableProperty<Integer> sentJobsProperty = new MonitorableProperty<Integer>() {
-
-			public Date getLastModified() {
-				return new Date();
-			}
-
-			public String[] getName() {
-				return new String[] { "dispatch", "parallelize", "sentjobs" };
-			}
-
-			public Integer getValue() throws NoSuchPropertyException {
-				return sentJobsCount;
-			}
-
-		};
-		dispatchStack.receiveMonitorableProperty(sentJobsProperty,
-				owningProcess);
-
-		MonitorableProperty<Integer> completedJobsProperty = new MonitorableProperty<Integer>() {
-
-			public Date getLastModified() {
-				return new Date();
-			}
-
-			public String[] getName() {
-				return new String[] { "dispatch", "parallelize",
-						"completedjobs" };
-			}
-
-			public Integer getValue() throws NoSuchPropertyException {
-				return completedJobsCount;
-			}
-
-		};
-		dispatchStack.receiveMonitorableProperty(completedJobsProperty,
-				owningProcess);
-
-	}
-
-	/**
-	 * Holds the state for a given owning process
-	 * 
-	 * @author Tom Oinn
-	 * 
-	 */
-	class StateModel {
-	
-		private DispatchJobQueueEvent queueEvent;
-	
-		@SuppressWarnings("unchecked")
-		// suppressed to avoid jdk1.5 error messages caused by the declaration
-		// IterationInternalEvent<? extends IterationInternalEvent<?>> e
-		private BlockingQueue<IterationInternalEvent> pendingEvents = new LinkedBlockingQueue<IterationInternalEvent>();
-	
-		private int activeJobs = 0;
-	
-		private int maximumJobs;
-	
-		/**
-		 * Construct state model for a particular owning process
-		 * 
-		 * @param owningProcess
-		 *            Process to track parallel execution
-		 * @param queue
-		 *            reference to the queue into which jobs are inserted by the
-		 *            iteration strategy
-		 * @param activities
-		 *            activities to pass along with job events down into the
-		 *            stack below
-		 * @param maxJobs
-		 *            maximum number of concurrent jobs to keep 'hot' at any
-		 *            given point
-		 */
-		protected StateModel(DispatchJobQueueEvent queueEvent, int maxJobs) {
-			this.queueEvent = queueEvent;
-			this.maximumJobs = maxJobs;
-		}
-	
-		Integer queueSize() {
-			return queueEvent.getQueue().size();
-		}
-	
-		/**
-		 * Poll the queue repeatedly until either the queue is empty or we have
-		 * enough jobs pulled from it. The semantics for this are:
-		 * <ul>
-		 * <li>If the head of the queue is a Job and activeJobs < maximumJobs
-		 * then increment activeJobs, add the Job to the pending events list at
-		 * the end and send the message down the stack
-		 * <li>If the head of the queue is a Completion and the pending jobs
-		 * list is empty then send it to the layer above
-		 * <li>If the head of the queue is a Completion and the pending jobs
-		 * list is not empty then add the Completion to the end of the pending
-		 * jobs list and return
-		 * </ul>
-		 */
-		@SuppressWarnings("unchecked")
-		// suppressed to avoid jdk1.5 error messages caused by the declaration
-		// IterationInternalEvent<? extends IterationInternalEvent<?>> e
-		protected void fillFromQueue() {
-			synchronized (this) {
-				while (queueEvent.getQueue().peek() != null
-						&& activeJobs < maximumJobs) {
-					final IterationInternalEvent e = queueEvent.getQueue()
-							.remove();
-	
-					if (e instanceof Completion && pendingEvents.peek() == null) {
-						new Thread(new Runnable() {
-							public void run() {
-								getAbove().receiveResultCompletion(
-										new DispatchCompletionEvent(e
-												.getOwningProcess(), e
-												.getIndex(), e.getContext()));
-							}
-						}, "Parallelize " + e.getOwningProcess()).start();
-						// getAbove().receiveResultCompletion((Completion) e);
-					} else {
-						pendingEvents.add(e);
-					}
-					if (e instanceof Job) {
-						synchronized (this) {
-							activeJobs++;
-						}
-						sentJobsCount++;
-						getBelow()
-								.receiveJob(
-										new DispatchJobEvent(e
-												.getOwningProcess(), e
-												.getIndex(), e.getContext(),
-												((Job) e).getData(), queueEvent
-														.getActivities()));
-					}
-				}
-			}
-		}
-	
-		/**
-		 * Returns true if the index matched an existing Job exactly, if this
-		 * method returns false then you have a partial completion event which
-		 * should be sent up the stack without modification.
-		 * 
-		 * @param index
-		 * @return
-		 */
-		@SuppressWarnings("unchecked")
-		// suppressed to avoid jdk1.5 error messages caused by the declaration
-		// IterationInternalEvent<? extends IterationInternalEvent<?>> e
-		protected boolean finishWith(int[] index) {
-			synchronized (this) {
-	
-				for (IterationInternalEvent e : new ArrayList<IterationInternalEvent>(
-						pendingEvents)) {
-					if (e instanceof Job) {
-						Job j = (Job) e;
-						if (arrayEquals(j.getIndex(), index)) {
-							// Found a job in the pending events list which has
-							// the same index, remove it and decrement the
-							// current count of active jobs
-							pendingEvents.remove(e);
-							activeJobs--;
-							completedJobsCount++;
-							// Now pull any completion events that have reached
-							// the head of the queue - this indicates that all
-							// the job events which came in before them have
-							// been processed and we can emit the completions
-							while (pendingEvents.peek() != null
-									&& pendingEvents.peek() instanceof Completion) {
-								Completion c = (Completion) pendingEvents
-										.remove();
-								getAbove().receiveResultCompletion(
-										new DispatchCompletionEvent(c
-												.getOwningProcess(), c
-												.getIndex(), c.getContext()));
-	
-							}
-							// Refresh from the queue; as we've just decremented
-							// the active job count there should be a worker
-							// available
-							fillFromQueue();
-							// Return true to indicate that we removed a job
-							// event from the queue, that is to say that the
-							// index wasn't that of a partial completion.
-							return true;
-						}
-					}
-				}
-			}
-			return false;
-		}
-	
-		private boolean arrayEquals(int[] a, int[] b) {
-			if (a.length != b.length) {
-				return false;
-			}
-			for (int i = 0; i < a.length; i++) {
-				if (a[i] != b[i]) {
-					return false;
-				}
-			}
-			return true;
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/ParallelizeConfig.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/ParallelizeConfig.java
deleted file mode 100644
index 102eb24..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/ParallelizeConfig.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-/**
- * Bean to hold the configuration for the parallelize layer, specifically a
- * single int property defining the number of concurrent jobs in that processor
- * instance per owning process ID.
- * 
- * @author Tom Oinn
- * 
- */
-public class ParallelizeConfig {
-
-	private int maxJobs;
-
-	public ParallelizeConfig() {
-		super();
-		this.maxJobs = 5;
-	}
-
-	public void setMaximumJobs(int maxJobs) {
-		this.maxJobs = maxJobs;
-	}
-
-	public int getMaximumJobs() {
-		return this.maxJobs;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Retry.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Retry.java
deleted file mode 100644
index 07e828f..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/Retry.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.CREATE_LOCAL_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.REMOVE_LOCAL_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerStateEffect.UPDATE_LOCAL_STATE;
-import static net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchMessageType.JOB;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.AbstractErrorHandlerLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerErrorReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerJobReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.description.DispatchLayerResultReaction;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchJobEvent;
-
-/**
- * Implements retry policy with delay between retries and exponential backoff
- * <p>
- * Default properties are as follows :
- * <ul>
- * <li>maxRetries = 0 (int)</li>
- * <li>initialDelay = 1000 (milliseconds)</li>
- * <li>maxDelay = 2000 (milliseconds)</li>
- * <li>backoffFactor = 1.0 (float)</li>
- * </ul>
- * 
- * @author Tom Oinn
- * 
- */
-@DispatchLayerErrorReaction(emits = { JOB }, relaysUnmodified = true, stateEffects = {
-		UPDATE_LOCAL_STATE, REMOVE_LOCAL_STATE })
-@DispatchLayerJobReaction(emits = {}, relaysUnmodified = true, stateEffects = { CREATE_LOCAL_STATE })
-@DispatchLayerResultReaction(emits = {}, relaysUnmodified = true, stateEffects = { REMOVE_LOCAL_STATE })
-public class Retry extends AbstractErrorHandlerLayer<RetryConfig> {
-
-	private RetryConfig config = new RetryConfig();
-
-	private static Timer retryTimer = new Timer("Retry timer", true);
-
-	public Retry() {
-		super();
-	}
-
-	public Retry(int maxRetries, int initialDelay, int maxDelay,
-			float backoffFactor) {
-		super();
-		this.config.setMaxRetries(maxRetries);
-		this.config.setInitialDelay(initialDelay);
-		this.config.setMaxDelay(maxDelay);
-		this.config.setBackoffFactor(backoffFactor);
-	}
-
-	class RetryState extends JobState {
-
-		int currentRetryCount = 0;
-
-		public RetryState(DispatchJobEvent jobEvent) {
-			super(jobEvent);
-		}
-
-		/**
-		 * Try to schedule a retry, returns true if a retry is scheduled, false
-		 * if the retry count has already been reached (in which case no retry
-		 * is scheduled
-		 * 
-		 * @return
-		 */
-		@Override
-		public boolean handleError() {
-			if (currentRetryCount == config.getMaxRetries()) {
-				return false;
-			}
-			int delay = (int) (config.getInitialDelay() * (Math.pow(config.getBackoffFactor(), currentRetryCount)));
-			if (delay > config.getMaxDelay()) {
-				delay = config.getMaxDelay();
-			}
-			TimerTask task = new TimerTask() {
-				@Override
-				public void run() {
-					currentRetryCount++;
-					getBelow().receiveJob(jobEvent);
-				}
-
-			};
-			retryTimer.schedule(task, delay);
-			return true;
-		}
-
-	}
-
-	@Override
-	protected JobState getStateObject(DispatchJobEvent jobEvent) {
-		return new RetryState(jobEvent);
-	}
-
-	public void configure(RetryConfig config) {
-		this.config = config;
-	}
-
-	public RetryConfig getConfiguration() {
-		return this.config;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/RetryConfig.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/RetryConfig.java
deleted file mode 100644
index 3d90034..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/RetryConfig.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-public class RetryConfig {
-
-	private float backoffFactor = 1f;
-	private int initialDelay = 1000;
-	private int maxDelay = 2000;
-	private int maxRetries = 0;
-
-	/**
-	 * Factor by which the initial delay is multiplied for each retry after the
-	 * first, this allows for exponential backoff of retry times up to a certain
-	 * ceiling
-	 * 
-	 * @return
-	 */
-	public float getBackoffFactor() {
-		return this.backoffFactor;
-	}
-
-	/**
-	 * Delay in milliseconds between the initial failure message and the first
-	 * attempt to retry the failed job
-	 * 
-	 * @return
-	 */
-	public int getInitialDelay() {
-		return this.initialDelay;
-	}
-
-	/**
-	 * Maximum delay in milliseconds between failure reception and retry. This
-	 * acts as a ceiling for the exponential backoff factor allowing the retry
-	 * delay to initially increase to a certain value then remain constant after
-	 * that point rather than exploding to unreasonable levels.
-	 */
-	public int getMaxDelay() {
-		return this.maxDelay;
-	}
-
-	/**
-	 * Maximum number of retries for a failing process
-	 * 
-	 * @return
-	 */
-	public int getMaxRetries() {
-		return this.maxRetries;
-	}
-
-	public void setBackoffFactor(float factor) {
-		this.backoffFactor = factor;
-	}
-
-	public void setInitialDelay(int delay) {
-		this.initialDelay = delay;
-	}
-
-	public void setMaxDelay(int delay) {
-		this.maxDelay = delay;
-	}
-
-	public void setMaxRetries(int max) {
-		this.maxRetries = max;
-	}
-
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/SimplerT2Reference.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/SimplerT2Reference.java
deleted file mode 100644
index 02196d1..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/SimplerT2Reference.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package net.sf.taverna.t2.workflowmodel.processor.dispatch.layers;
-
-import net.sf.taverna.t2.reference.T2ReferenceType;
-
-class SimplerT2Reference {
-	
-	private String localPart;
-	private String namespacePart;
-//	private boolean containsErrors = false;
-	private T2ReferenceType referenceType = T2ReferenceType.ReferenceSet;
-	private int depth = 0;
-	/**
-	 * @return the localPart
-	 */
-	public String getLocalPart() {
-		return localPart;
-	}
-	/**
-	 * @param localPart the localPart to set
-	 */
-	public void setLocalPart(String localPart) {
-		this.localPart = localPart;
-	}
-	/**
-	 * @return the namespacePart
-	 */
-	public String getNamespacePart() {
-		return namespacePart;
-	}
-	/**
-	 * @param namespacePart the namespacePart to set
-	 */
-	public void setNamespacePart(String namespacePart) {
-		this.namespacePart = namespacePart;
-	}
-	/**
-	 * @return the containsErrors
-	 */
-//	public boolean isContainsErrors() {
-//		return containsErrors;
-//	}
-//	/**
-//	 * @param containsErrors the containsErrors to set
-//	 */
-//	public void setContainsErrors(boolean containsErrors) {
-//		this.containsErrors = containsErrors;
-//	}
-	/**
-	 * @return the referenceType
-	 */
-	public T2ReferenceType getReferenceType() {
-		return referenceType;
-	}
-	/**
-	 * @param referenceType the referenceType to set
-	 */
-	public void setReferenceType(T2ReferenceType referenceType) {
-		this.referenceType = referenceType;
-	}
-	/**
-	 * @return the depth
-	 */
-	public int getDepth() {
-		return depth;
-	}
-	/**
-	 * @param depth the depth to set
-	 */
-	public void setDepth(int depth) {
-		this.depth = depth;
-	}
-
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/package.html b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/package.html
deleted file mode 100644
index fe6e73f..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/layers/package.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<body>
-Contains implementations of DispatchLayer defined by the core Taverna 2
-specification.
-</body>
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationStrategyImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationStrategyImpl.java
deleted file mode 100644
index 8a90aa4..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationStrategyImpl.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration.impl;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.swing.tree.TreeNode;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.reference.ContextualizedT2Reference;
-import net.sf.taverna.t2.reference.ReferenceService;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.AbstractIterationStrategyNode;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.CrossProduct;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.DotProduct;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategy;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.NamedInputPortNode;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.PrefixDotProduct;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.TerminalNode;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializationConstants;
-
-import org.jdom.Element;
-
-/**
- * A single layer of iteration strategy, consuming individual named inputs and
- * combining these into Job objects to be consumed by the dispatch stack
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- * 
- */
-public class IterationStrategyImpl implements IterationStrategy {
-
-	Set<NamedInputPortNode> inputs;
-
-	private boolean wrapping = false;
-
-	protected IterationStrategyStackImpl stack = null;
-
-	private TerminalNodeImpl terminal = new TerminalNodeImpl();
-
-	/**
-	 * The terminal node is used internally as the root of the iteration
-	 * strategy tree, it is responsible for forwarding all events up to the
-	 * iteration strategy itself which can then propogate them to the strategy
-	 * stack.
-	 */
-	public class TerminalNodeImpl extends TerminalNode {
-
-		public void receiveCompletion(int inputIndex, Completion completion) {
-			if (wrapping) {
-				pushEvent(completion.popIndex());
-			} else {
-				pushEvent(completion);
-			}
-
-		}
-
-		public void receiveJob(int inputIndex, Job newJob) {
-			if (wrapping) {
-				pushEvent(newJob.popIndex());
-			} else {
-				pushEvent(newJob);
-			}
-		}
-
-		public void receiveBypassCompletion(Completion completion) {
-			pushEvent(completion);
-		}
-
-		private void pushEvent(
-				IterationInternalEvent<? extends IterationInternalEvent<?>> e) {
-			if (stack != null) {
-				IterationStrategyImpl below = stack
-						.layerBelow(IterationStrategyImpl.this);
-				if (below == null) {
-					stack.receiveEventFromStrategy(e);
-				} else {
-					below.receiveEvent(e);
-				}
-			}
-		}
-
-		public int getIterationDepth(Map<String, Integer> inputDepths)
-				throws IterationTypeMismatchException {
-			if (getChildCount() == 0) {
-				return -1;
-			} else {
-				return getChildAt(0).getIterationDepth(inputDepths);
-			}
-		}
-
-	}
-
-	public IterationStrategyImpl() {
-		inputs = new HashSet<NamedInputPortNode>();
-	}
-
-	public TerminalNode getTerminalNode() {
-		return terminal;
-	}
-
-	/**
-	 * Get the XML element defining the state of this iteration strategy
-	 * 
-	 * @return
-	 */
-	protected Element asXML() {
-		Element strategyElement = new Element("strategy",
-				XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-		if (terminal.getChildCount() > 0) {
-			AbstractIterationStrategyNode node = (AbstractIterationStrategyNode) (terminal
-					.getChildAt(0));
-			strategyElement.addContent(elementForNode(node));
-		}
-		return strategyElement;
-	}
-
-	private static Element elementForNode(AbstractIterationStrategyNode node) {
-		Element nodeElement = null;
-		if (node instanceof DotProduct) {
-			nodeElement = new Element("dot",
-					XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-		} else if (node instanceof CrossProduct) {
-			nodeElement = new Element("cross",
-					XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-		} else if (node instanceof PrefixDotProduct) {
-			nodeElement = new Element("prefix",
-					XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-		} else if (node instanceof NamedInputPortNode) {
-			NamedInputPortNode nipn = (NamedInputPortNode) node;
-			nodeElement = new Element("port",
-					XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-			nodeElement.setAttribute("name", nipn.getPortName());
-			nodeElement.setAttribute("depth", nipn.getCardinality() + "");
-		} else {
-			throw new IllegalArgumentException("Unknown node " + node);
-		}
-		Enumeration<?> children = node.children();
-		while (children.hasMoreElements()) {
-			TreeNode tn = (TreeNode) children.nextElement();
-			nodeElement
-					.addContent(elementForNode((AbstractIterationStrategyNode) tn));
-		}
-		return nodeElement;
-	}
-
-	/**
-	 * Configure from an XML element
-	 * 
-	 * @param strategyElement
-	 */
-	@SuppressWarnings("unchecked")
-	protected void configureFromXML(Element strategyElement) {
-		inputs.clear();
-		terminal.clear();
-		if (!strategyElement.getChildren().isEmpty()) {
-			for (Element childElement : (List<Element>) strategyElement
-					.getChildren()) {
-				AbstractIterationStrategyNode node = nodeForElement(childElement);
-				node.setParent(terminal);
-			}
-		}
-	}
-
-	private AbstractIterationStrategyNode nodeForElement(Element e) {
-		AbstractIterationStrategyNode node = null;
-		String eName = e.getName();
-		if (eName.equals("dot")) {
-			node = new DotProduct();
-		} else if (eName.equals("cross")) {
-			node = new CrossProduct();
-		} else if (eName.equals("prefix")) {
-			node = new PrefixDotProduct();
-		} else if (eName.equals("port")) {
-			String portName = e.getAttributeValue("name");
-			int portDepth = Integer.parseInt(e.getAttributeValue("depth"));
-			node = new NamedInputPortNode(portName, portDepth);
-			addInput((NamedInputPortNode) node);
-		}
-		for (Object child : e.getChildren()) {
-			Element childElement = (Element) child;
-			nodeForElement(childElement).setParent(node);
-		}
-		return node;
-	}
-
-	/**
-	 * Receive a single job from an upstream IterationStrategyImpl in the stack.
-	 * This job will have one or more data parts where the cardinality doesn't
-	 * match that defined by the NamedInputPortNode and will need to be split up
-	 * appropriately
-	 * 
-	 * @param j
-	 */
-	@SuppressWarnings("unchecked")
-	// suppressed to avoid jdk1.5 compilation errors caused by the declaration
-	// IterationInternalEvent<? extends IterationInternalEvent<?>> e
-	protected void receiveEvent(IterationInternalEvent e) {
-		// If we ever get this method called we know we're not the top layer in
-		// the dispatch stack and that we need to perform wrap / unwrap of data
-		// as it comes in. This boolean flag informs the behaviour of the
-		// terminal
-		// node in the strategy.
-		wrapping = true;
-		// If this is a Job object then we'll need to split it up and push it
-		// through the iteration system to get multiple child jobs followed by a
-		// completion event otherwise we can just push the completion event all
-		// the way through the system.
-		if (e instanceof Job) {
-			Job j = ((Job) e).pushIndex();
-			// Now have to split this job up into a number of distinct events!
-			String owningProcess = j.getOwningProcess();
-			for (String portName : j.getData().keySet()) {
-				T2Reference dataRef = j.getData().get(portName);
-				ReferenceService rs = e.getContext().getReferenceService();
-				NamedInputPortNode ipn = nodeForName(portName);
-				int desiredDepth = ipn.getCardinality();
-				Iterator<ContextualizedT2Reference> ids = rs.traverseFrom(
-						dataRef, desiredDepth);
-				while (ids.hasNext()) {
-					ContextualizedT2Reference ci = ids.next();
-					int[] indexArray = ci.getIndex();
-					T2Reference childDataRef = ci.getReference();
-					receiveData(portName, owningProcess, indexArray,
-							childDataRef, e.getContext());
-				}
-				receiveCompletion(portName, owningProcess, new int[] {}, e
-						.getContext());
-			}
-		}
-		// Event was a completion event, push it through unmodified to the
-		// terminal node. Intermediate completion events from the split of an
-		// input Job into multiple events through data structure traversal are
-		// unwrapped but as this one is never wrapped in the first place we need
-		// a way to mark it as such, the call to the bypass method achieves this
-		else {
-			terminal.receiveBypassCompletion((Completion) e);
-		}
-	}
-
-	/**
-	 * Receive a single data event from an upstream process. This method is only
-	 * ever called on the first layer in the IterationStrategyStackImpl, other
-	 * layers are passed entire Job objects
-	 * 
-	 * @param inputPortName
-	 * @param owningProcess
-	 * @param indexArray
-	 * @param dataReference
-	 * @throws WorkflowStructureException
-	 */
-	public void receiveData(String inputPortName, String owningProcess,
-			int[] indexArray, T2Reference dataReference,
-			InvocationContext context) throws WorkflowStructureException {
-		Map<String, T2Reference> dataMap = new HashMap<String, T2Reference>();
-		dataMap.put(inputPortName, dataReference);
-		Job newJob = new Job(owningProcess, indexArray, dataMap, context);
-		nodeForName(inputPortName).receiveJob(0, newJob);
-	}
-
-	public void receiveCompletion(String inputPortName, String owningProcess,
-			int[] completionArray, InvocationContext context)
-			throws WorkflowStructureException {
-		nodeForName(inputPortName).receiveCompletion(0,
-				new Completion(owningProcess, completionArray, context));
-	}
-
-	public void addInput(NamedInputPortNode nipn) {
-		synchronized (inputs) {
-			this.inputs.add(nipn);
-		}
-	}
-
-	public void removeInput(NamedInputPortNode nipn) {
-		synchronized (inputs) {
-			this.inputs.remove(nipn);
-		}
-	}
-
-	public void removeInputByName(String name) {
-		synchronized (inputs) {
-			NamedInputPortNode removeMe = null;
-			for (NamedInputPortNode nipn : inputs) {
-				if (nipn.getPortName().equals(name)) {
-					removeMe = nipn;
-				}
-			}
-			if (removeMe != null) {
-				this.inputs.remove(removeMe);
-				removeMe.removeFromParent();
-			}
-		}
-	}
-
-	private NamedInputPortNode nodeForName(String portName)
-			throws WorkflowStructureException {
-		for (NamedInputPortNode node : inputs) {
-			if (node.getPortName().equals(portName)) {
-				return node;
-			}
-		}
-		throw new WorkflowStructureException("No port found with name '"
-				+ portName + "'");
-	}
-
-	public void setIterationStrategyStack(IterationStrategyStackImpl stack) {
-		this.stack = stack;
-	}
-
-	/**
-	 * Connect up a new named input port node to the first child of the terminal
-	 * node. If the terminal node doesn't have any children then create a new
-	 * cross product node, connect it to the terminal and connect the new input
-	 * port node to the cross product (saneish default behaviour)
-	 * 
-	 * @param nipn
-	 */
-	public synchronized void connectDefault(NamedInputPortNode nipn) {
-		if (terminal.getChildCount() == 0) {
-			CrossProduct cp = new CrossProduct();
-			cp.setParent(terminal);
-			nipn.setParent(cp);
-		} else {
-			AbstractIterationStrategyNode node = (AbstractIterationStrategyNode) (terminal
-					.getChildAt(0));
-			nipn.setParent(node);
-		}
-	}
-
-	public int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException {
-		return getTerminalNode().getIterationDepth(inputDepths);
-	}
-
-	public Map<String, Integer> getDesiredCardinalities() {
-		Map<String, Integer> result = new HashMap<String, Integer>();
-		for (NamedInputPortNode nipn : inputs) {
-			result.put(nipn.getPortName(), nipn.getCardinality());
-		}
-		return result;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationStrategyStackImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationStrategyStackImpl.java
deleted file mode 100644
index 15a80b9..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationStrategyStackImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.WorkflowStructureException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategy;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.MissingIterationInputException;
-import net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializationConstants;
-
-import org.jdom.Element;
-
-/**
- * Contains an ordered list of IterationStrategyImpl objects. The top of the
- * list is fed data directly, all other nodes are fed complete Job objects and
- * Completion events from the layer above. The bottom layer pushes events onto
- * the processor event queue to be consumed by the dispatch stack.
- * 
- * @author Tom Oinn
- * 
- */
-public class IterationStrategyStackImpl implements IterationStrategyStack {
-
-	private List<IterationStrategyImpl> strategies = new ArrayList<IterationStrategyImpl>();
-
-	/**
-	 * The iteration depth here is calculated by taking first the top iteration
-	 * strategy and applying the actual input types to it, then for each
-	 * subsequent strategy in the stack using the 'desired cardinality' of the
-	 * input nodes for each layer to work out the increase in index array
-	 * length.
-	 * 
-	 * @param inputDepths
-	 * @return
-	 * @throws IterationTypeMismatchException
-	 */
-	public int getIterationDepth(Map<String, Integer> inputDepths)
-			throws IterationTypeMismatchException,
-			MissingIterationInputException {
-		// If there are no iteration strategies or no inputs then by definition
-		// there's no iteration, no wrapping and the depth of wrapping must be
-		// zero
-		if (strategies.isEmpty()) {
-			return 0;
-		}
-		if (strategies.get(0).inputs.isEmpty()) {
-			return 0;
-		}
-		IterationStrategyImpl strategy = strategies.get(0);
-		int depth = strategy.getIterationDepth(inputDepths);
-		for (int index = 1; index < strategies.size(); index++) {
-			// Construct the input depths for the staged iteration strategies
-			// after the first one by looking at the previous iteration
-			// strategy's desired cardinalities on its input ports.
-			Map<String, Integer> stagedInputDepths = strategy
-					.getDesiredCardinalities();
-			strategy = strategies.get(index);
-			depth += strategy.getIterationDepth(stagedInputDepths);
-		}
-		return depth;
-	}
-
-	public void addStrategy(IterationStrategy is) {
-		if (is instanceof IterationStrategyImpl) {
-			IterationStrategyImpl isi = (IterationStrategyImpl) is;
-			strategies.add(isi);
-			isi.setIterationStrategyStack(this);
-		} else {
-			throw new WorkflowStructureException(
-					"IterationStrategyStackImpl can only hold IterationStrategyImpl objects");
-		}
-	}
-
-	public List<IterationStrategyImpl> getStrategies() {
-		return Collections.unmodifiableList(this.strategies);
-	}
-
-	public void clear() {
-		strategies.clear();		
-	}
-	
-	public void receiveData(String inputPortName, String owningProcess,
-			int[] indexArray, T2Reference dataReference, InvocationContext context) {
-		if (!strategies.isEmpty()) {
-			strategies.get(0).receiveData(inputPortName, owningProcess,
-					indexArray, dataReference, context);
-		}
-	}
-
-	public void receiveCompletion(String inputPortName, String owningProcess,
-			int[] completionArray, InvocationContext context) {
-		if (!strategies.isEmpty()) {
-			strategies.get(0).receiveCompletion(inputPortName, owningProcess,
-					completionArray, context);
-		}
-	}
-
-	public Element asXML() {
-		Element strategyStackElement = new Element("iteration",XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-		for (IterationStrategyImpl is : strategies) {
-			strategyStackElement.addContent(is.asXML());
-		}
-		return strategyStackElement;
-	}
-
-	public void configureFromElement(Element e) {
-		strategies.clear();
-		for (Object child : e.getChildren("strategy",XMLSerializationConstants.T2_WORKFLOW_NAMESPACE)) {
-			Element strategyElement = (Element) child;
-			IterationStrategyImpl strategy = new IterationStrategyImpl();
-			strategy.configureFromXML(strategyElement);
-			addStrategy(strategy);
-		}
-	}
-
-	/**
-	 * Return the layer below the specified one, or null if there is no lower
-	 * layer
-	 * 
-	 * @return
-	 */
-	protected IterationStrategyImpl layerBelow(IterationStrategyImpl that) {
-		int index = strategies.indexOf(that);
-		if (index == (strategies.size() - 1)) {
-			return null;
-		} else {
-			return strategies.get(index + 1);
-		}
-	}
-
-	/**
-	 * Called by the final iteration strategy to push events onto the
-	 * dispatcher's queue
-	 * 
-	 * @param e
-	 */
-	protected void receiveEventFromStrategy(IterationInternalEvent<? extends IterationInternalEvent<?>> e) {
-		// TODO - push events onto dispatch queue
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/package.html b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/package.html
deleted file mode 100644
index 86a65ae..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-Implementation logic for the iteration system.
-</body>
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLDeserializer.java
deleted file mode 100644
index 17219e3..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLDeserializer.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.raven.appconfig.ApplicationRuntime;
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.ArtifactNotFoundException;
-import net.sf.taverna.raven.repository.ArtifactStateException;
-import net.sf.taverna.raven.repository.BasicArtifact;
-import net.sf.taverna.raven.repository.Repository;
-import net.sf.taverna.raven.repository.impl.DummyRepository;
-import net.sf.taverna.raven.spi.Profile;
-import net.sf.taverna.raven.spi.ProfileFactory;
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
-
-/**
- * An abstract base class that contains deserialisation methods common across all dataflow elements.
- * 
- * @author Stuart Owen
- *
- */
-public abstract class AbstractXMLDeserializer implements
-		XMLSerializationConstants {
-
-	private static final String T2_ACTIVITIES_GROUPID = "net.sf.taverna.t2.activities";
-
-	private static final String T2_GROUPID = "net.sf.taverna.t2";
-
-	private static Logger logger = Logger.getLogger(AbstractXMLDeserializer.class);
-	
-	protected Edits edits = new EditsImpl();
-
-	protected Object createBean(Element element, ClassLoader cl) {
-		Element configElement;
-		
-		// Note - don't check for CONFIG_BEAN/T2_WORKFLOW_NAMESPACE as 
-		// the annotations are such beans, but they are not in a <configBean> element.
-			
-		// Instead, we simply check if the "encoding" attribute is there, which it 
-		// should be
-		if (element.getAttribute(BEAN_ENCODING) != null) {
-			configElement = element;
-		} else {
-			// Find it one element below
-			configElement = element
-					.getChild(CONFIG_BEAN, T2_WORKFLOW_NAMESPACE);
-			if (configElement == null) {
-				throw new IllegalArgumentException("Can't find bean element {" + 
-						T2_WORKFLOW_NAMESPACE + "}" + CONFIG_BEAN);
-			}
-		}
-		
-		String encoding = configElement.getAttributeValue(BEAN_ENCODING);
-		Object result = null;
-		if (encoding.equals(XSTREAM_ENCODING)) {
-			if (configElement.getChildren().isEmpty()) {
-				throw new IllegalArgumentException("XStream encoding expected in element");
-			}
-			Element beanElement = (Element) configElement.getChildren().get(0);
-			XStream xstream = new XStream(new DomDriver());
-			xstream.setClassLoader(cl);
-			result = xstream.fromXML(new XMLOutputter()
-					.outputString(beanElement));
-		} else if (encoding.equals(JDOMXML_ENCODING)) {
-			if (configElement.getChildren().isEmpty()) {
-				throw new IllegalArgumentException("XML encoding expected in element");
-			}
-			result = (Element) configElement.getChildren().get(0);
-		//} else if (encoding.equals(DATAFLOW_ENCODING)) {
-		//	// Oh noe
-		} else {
-			throw new IllegalArgumentException("Unknown encoding " + encoding);
-		}
-
-		return result;
-
-	}
-
-	protected ClassLoader getRavenLoader(Element element)
-			throws ArtifactNotFoundException, ArtifactStateException {
-		// Try to get the current Repository object, if there isn't one we can't
-		// do this here
-		Repository repository = ApplicationRuntime.getInstance().getRavenRepository();
-		if (repository instanceof DummyRepository) { 
-			return myClassLoader();
-			// TODO - should probably warn that this is happening as it's likely
-			// to be because of an error in API usage. There are times it won't
-			// be though so leave it for now.
-		}
-		
-		Element ravenElement;
-		if (element.getName().equals(RAVEN) && element.getNamespace().equals(T2_WORKFLOW_NAMESPACE)) {
-			ravenElement = element;			
-		} else {
-			ravenElement = element.getChild(RAVEN, T2_WORKFLOW_NAMESPACE);
-			if (ravenElement == null) {
-				// Not found in XML
-				return myClassLoader();
-			}
-		}
-		
-		String groupId = ravenElement.getChildTextTrim(GROUP,
-				T2_WORKFLOW_NAMESPACE);
-		String artifactId = ravenElement.getChildTextTrim(ARTIFACT,
-				T2_WORKFLOW_NAMESPACE);
-		String version = ravenElement.getChildTextTrim(VERSION,
-				T2_WORKFLOW_NAMESPACE);
-		
-		Artifact artifact;
-		// Always use the version of the profile
-		Profile profile = ProfileFactory.getInstance().getProfile();
-		artifact = profile.discoverArtifact(groupId, artifactId, repository);
-		if (artifact == null && groupId.equals(T2_GROUPID)) {
-			logger.info("Could not find artifact for " + groupId + ":" + artifactId 
-					+ ", attempting compatability groupID " + T2_ACTIVITIES_GROUPID);
-			artifact = profile.discoverArtifact(T2_ACTIVITIES_GROUPID, artifactId, repository);
-		}
-		
-		if (artifact != null) {
-			if (! (artifact.getVersion().equals(version))) {
-				String desired = groupId + ":" + artifactId + ":" + version;
-				String actual = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion();	
-				logger.warn("XML specified " + desired + " instead using from profile " + actual);
-				// TODO: pop up an actual warning box
-			}
-				
-		} else {
-			logger.warn("Can't discover artifact for " + groupId + ":" + artifactId);
-			artifact = new BasicArtifact(groupId, artifactId, version);
-		}
-		return repository.getLoader(artifact, null);
-	}
-	
-	private ClassLoader myClassLoader() {
-		ClassLoader classLoader = getClass().getClassLoader();
-		if (classLoader != null) {
-			return classLoader;
-		}
-		return ClassLoader.getSystemClassLoader();
-	}
-
-	protected String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-	
-	@SuppressWarnings("unchecked")
-	protected void annotationsFromXml(Annotated<?> annotated, Element parent,
-			ClassLoader cl) {
-		Element annotationsElement = parent.getChild(ANNOTATIONS,
-				T2_WORKFLOW_NAMESPACE);
-		if (annotationsElement != null) {
-			Set<AnnotationChain> newAnnotationChains = new HashSet<AnnotationChain>();
-			for (Element annotationChainElement : (List<Element>) (annotationsElement
-					.getChildren(ANNOTATION_CHAIN, T2_WORKFLOW_NAMESPACE))) {
-				if (annotationChainElement == null) {
-					logger.info("annotationChainElement is null");
-					continue;
-				}
-				if (cl == null) {
-					logger.info("ClassLoader is null");
-					continue;
-				}
-				AnnotationChain ac = (AnnotationChain) createBean(
-						annotationChainElement, XMLDeserializerImpl.class
-								.getClassLoader());
-				if ((ac == null) || (ac.getAssertions() == null)
-						|| (ac.getAssertions().size() == 0)) {
-					logger.warn("Null or empty annotation chain");
-					continue;
-				}
-				newAnnotationChains.add(ac);
-
-			}
-			annotated.setAnnotations(newAnnotationChains);
-		}
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLSerializer.java
deleted file mode 100644
index 9deacb8..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLSerializer.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-import java.io.StringReader;
-
-import net.sf.taverna.raven.repository.Artifact;
-import net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader;
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
-
-/**
- * An abstract base class that contains serialisation methods common across all dataflow elements.
- * 
- * @author Stuart Owen
- *
- */
-public abstract class AbstractXMLSerializer implements XMLSerializationConstants {
-
-	@SuppressWarnings("unused")
-	private static Logger logger = Logger.getLogger(AbstractXMLSerializer.class);
-
-	/**
-	 * Create the &lt;raven&gt; element for a given local artifact classloader.
-	 * 
-	 * @param classLoader
-	 *            The {@link LocalArtifactClassLoader} for the artifact
-	 * @return Populated &lt;raven&gt; element
-	 */
-	protected Element ravenElement(LocalArtifactClassLoader classLoader) {
-		Element element = new Element(RAVEN, T2_WORKFLOW_NAMESPACE);
-		Artifact artifact = classLoader.getArtifact();
-		// Group
-		Element groupIdElement = new Element(GROUP, T2_WORKFLOW_NAMESPACE);
-		groupIdElement.setText(artifact.getGroupId());
-		element.addContent(groupIdElement);
-		// Artifact ID
-		Element artifactIdElement = new Element(ARTIFACT, T2_WORKFLOW_NAMESPACE);
-		artifactIdElement.setText(artifact.getArtifactId());
-		element.addContent(artifactIdElement);
-		// Version
-		Element versionElement = new Element(VERSION, T2_WORKFLOW_NAMESPACE);
-		versionElement.setText(artifact.getVersion());
-		element.addContent(versionElement);
-		// Return assembled raven element
-		return element;
-	}
-
-	protected Element beanAsElement(Object obj) throws JDOMException,
-			IOException {
-		Element bean = new Element(CONFIG_BEAN, T2_WORKFLOW_NAMESPACE);
-		if (obj instanceof Element) {
-			populateBeanElementForElement((Element)obj, bean);
-		} 
-		else if (obj instanceof Dataflow) {
-			populateBeanElementForDataflow((Dataflow)obj, bean);
-		} 
-		else {
-			populateBeanElementFromXStream(obj, bean);
-		}
-		return bean;
-	}
-
-	private void populateBeanElementFromXStream(Object obj, Element bean)
-			throws JDOMException, IOException {
-		bean.setAttribute(BEAN_ENCODING, XSTREAM_ENCODING);
-		XStream xstream = new XStream(new DomDriver());
-		SAXBuilder builder = new SAXBuilder();
-		Element configElement = builder.build(
-				new StringReader(xstream.toXML(obj))).getRootElement();
-		configElement.getParent().removeContent(configElement);
-		bean.addContent(configElement);
-	}
-
-	private void populateBeanElementForDataflow(Dataflow dataflow, Element bean) {
-		
-		bean.setAttribute(BEAN_ENCODING,DATAFLOW_ENCODING);
-		Element dataflowElement = new Element(DATAFLOW,T2_WORKFLOW_NAMESPACE);
-		
-		dataflowElement.setAttribute(DATAFLOW_REFERENCE,dataflow.getInternalIdentier());
-		
-		bean.addContent(dataflowElement);
-	}
-
-	private void populateBeanElementForElement(Element el, Element bean) {
-		bean.setAttribute(BEAN_ENCODING, JDOMXML_ENCODING);
-		bean.addContent((Element)el.clone());
-	}
-	
-	protected Element annotationsToXML(Annotated<?> annotated) throws JDOMException, IOException {
-		Element result = new Element(ANNOTATIONS, T2_WORKFLOW_NAMESPACE);
-		for (AnnotationChain a : annotated.getAnnotations()) {
-			Element annotationChainElement = new Element(ANNOTATION_CHAIN,T2_WORKFLOW_NAMESPACE);
-			populateBeanElementFromXStream(a, annotationChainElement);
-			result.addContent(annotationChainElement);
-		}
-		return result;
-	}
-	
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLDeserializer.java
deleted file mode 100644
index a2702f0..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLDeserializer.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-
-public class ActivityXMLDeserializer extends AbstractXMLDeserializer {
-	private static ActivityXMLDeserializer instance = new ActivityXMLDeserializer();
-
-	private static Logger logger = Logger.getLogger(ActivityXMLDeserializer.class);
-	
-	public static ActivityXMLDeserializer getInstance() {
-		return instance;
-	}
-
-	protected ActivityXMLDeserializer() {
-
-	}
-
-	@SuppressWarnings("unchecked")
-	public Activity<?> deserializeActivity(Element element,
-			Map<String, Element> innerDataflowElements, ClassLoader classLoader) throws ClassNotFoundException, InstantiationException, IllegalAccessException, EditException, DeserializationException, ActivityConfigurationException {
-		Element ravenElement = element.getChild(RAVEN, T2_WORKFLOW_NAMESPACE);
-		ClassLoader cl = classLoader;
-		if (cl == null) {
-			cl = getClass().getClassLoader();
-		}
-		if (ravenElement != null) {
-			try {
-				cl = getRavenLoader(ravenElement);
-			} catch (Exception ex) {
-				logger.warn("Could not load raven classloader " + ravenElement + " for activity", ex);
-				// TODO - handle this properly, either by logging correctly or
-				// by going back to the repository and attempting to fetch the
-				// offending missing artifacts
-			}
-		}
-		String className = element.getChild(CLASS, T2_WORKFLOW_NAMESPACE)
-				.getTextTrim();
-		Class<? extends Activity> c = (Class<? extends Activity>) cl
-				.loadClass(className);
-		Activity<Object> activity = c.newInstance();
-		
-		// Handle the configuration of the activity
-		Element configElement = element.getChild(CONFIG_BEAN,
-				T2_WORKFLOW_NAMESPACE);
-		Object configObject=null;
-		if (DATAFLOW_ENCODING.equals(configElement.getAttributeValue(BEAN_ENCODING))) {
-			String ref = configElement.getChild(DATAFLOW,T2_WORKFLOW_NAMESPACE).getAttributeValue(DATAFLOW_REFERENCE);
-			configObject = resolveDataflowReference(ref,innerDataflowElements);
-		}
-		else {
-			configObject = createBean(configElement, cl);
-		}
-		activity.configure(configObject);
-
-		//port mappings
-		Element ipElement = element.getChild(INPUT_MAP, T2_WORKFLOW_NAMESPACE);
-		for (Element mapElement : (List<Element>) (ipElement.getChildren(MAP,
-				T2_WORKFLOW_NAMESPACE))) {
-			String processorInputName = mapElement.getAttributeValue(FROM);
-			String activityInputName = mapElement.getAttributeValue(TO);
-			activity.getInputPortMapping().put(processorInputName,
-					activityInputName);
-		}
-
-		Element opElement = element.getChild(OUTPUT_MAP, T2_WORKFLOW_NAMESPACE);
-		for (Element mapElement : (List<Element>) (opElement.getChildren(MAP,
-				T2_WORKFLOW_NAMESPACE))) {
-			String activityOutputName = mapElement.getAttributeValue(FROM);
-			String processorOutputName = mapElement.getAttributeValue(TO);
-			activity.getOutputPortMapping().put(activityOutputName,
-					processorOutputName);
-		}
-
-		annotationsFromXml(activity, element, activity.getClass().getClassLoader());
-		return activity;
-	}
-
-	public Activity<?> deserializeActivity(Element element,Map<String,Element> innerDataflowElements)
-			throws ActivityConfigurationException, ClassNotFoundException,
-			InstantiationException, IllegalAccessException, EditException, DeserializationException {
-		return deserializeActivity(element, innerDataflowElements, null);
-	}
-
-	private Object resolveDataflowReference(String ref,
-			Map<String, Element> innerDataflowElements) throws EditException, DeserializationException, ActivityConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException {
-		Element dfElement = innerDataflowElements.get(ref);
-		return DataflowXMLDeserializer.getInstance().deserializeDataflow(dfElement, innerDataflowElements);
-	}
-
-	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLSerializer.java
deleted file mode 100644
index 89988d8..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLSerializer.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-
-import net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-public class ActivityXMLSerializer extends AbstractXMLSerializer {
-	private static ActivityXMLSerializer instance = new ActivityXMLSerializer();
-
-	public static ActivityXMLSerializer getInstance() {
-		return instance;
-	}
-
-	public Element activityToXML(Activity<?> activity) throws JDOMException,
-			IOException {
-		Element activityElem = new Element(ACTIVITY, T2_WORKFLOW_NAMESPACE);
-
-		ClassLoader cl = activity.getClass().getClassLoader();
-		if (cl instanceof LocalArtifactClassLoader) {
-			activityElem
-					.addContent(ravenElement((LocalArtifactClassLoader) cl));
-		}
-		Element classNameElement = new Element(CLASS, T2_WORKFLOW_NAMESPACE);
-		classNameElement.setText(activity.getClass().getName());
-		activityElem.addContent(classNameElement);
-
-		// Write out the mappings (processor input -> activity input, activity
-		// output -> processor output)
-		Element ipElement = new Element(INPUT_MAP, T2_WORKFLOW_NAMESPACE);
-		for (String processorInputName : activity.getInputPortMapping()
-				.keySet()) {
-			Element mapElement = new Element(MAP, T2_WORKFLOW_NAMESPACE);
-			mapElement.setAttribute(FROM, processorInputName);
-			mapElement.setAttribute(TO, activity.getInputPortMapping().get(
-					processorInputName));
-			ipElement.addContent(mapElement);
-		}
-		activityElem.addContent(ipElement);
-
-		Element opElement = new Element(OUTPUT_MAP, T2_WORKFLOW_NAMESPACE);
-		for (String activityOutputName : activity.getOutputPortMapping()
-				.keySet()) {
-			Element mapElement = new Element(MAP, T2_WORKFLOW_NAMESPACE);
-			mapElement.setAttribute(FROM, activityOutputName);
-			mapElement.setAttribute(TO, activity.getOutputPortMapping().get(
-					activityOutputName));
-			opElement.addContent(mapElement);
-		}
-		activityElem.addContent(opElement);
-
-		// Get element for configuration
-		Object o = activity.getConfiguration();
-		Element configElement = beanAsElement(o);
-		activityElem.addContent(configElement);
-
-		// annotations
-		activityElem.addContent(annotationsToXML(activity));
-		
-		return activityElem;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLDeserializer.java
deleted file mode 100644
index 697c726..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLDeserializer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.jdom.Element;
-
-public class ConditionXMLDeserializer extends AbstractXMLDeserializer {
-	private static ConditionXMLDeserializer instance = new ConditionXMLDeserializer();
-
-	private ConditionXMLDeserializer() {
-
-	}
-
-	public static ConditionXMLDeserializer getInstance() {
-		return instance;
-	}
-	
-	@SuppressWarnings("unchecked")
-	public void buildConditions(Dataflow df, Element conditionsElement,
-			Map<String, Processor> createdProcessors) throws DeserializationException, EditException {
-		for (Element conditionElement : (List<Element>)conditionsElement.getChildren(CONDITION,T2_WORKFLOW_NAMESPACE)) {
-			String control=conditionElement.getAttributeValue("control");
-			String target=conditionElement.getAttributeValue("target");
-			Processor controlProcessor=createdProcessors.get(control);
-			Processor targetProcessor=createdProcessors.get(target);
-			if (controlProcessor==null) throw new DeserializationException("Unable to find start service for control link, named:"+control);
-			if (targetProcessor==null) throw new DeserializationException("Unable to find target service for control link, named:"+target);
-			edits.getCreateConditionEdit(controlProcessor, targetProcessor).doEdit();
-		}		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLSerializer.java
deleted file mode 100644
index 94ec6fc..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLSerializer.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-import org.jdom.Element;
-
-public class ConditionXMLSerializer extends AbstractXMLSerializer {
-	private static ConditionXMLSerializer instance = new ConditionXMLSerializer();
-
-	private ConditionXMLSerializer() {
-
-	}
-
-	public static ConditionXMLSerializer getInstance() {
-		return instance;
-	}
-	
-	public Element conditionsToXML(List<? extends Processor> processors) {
-		Element result = new Element(CONDITIONS, T2_WORKFLOW_NAMESPACE);
-
-		// gather conditions
-		Set<Condition> conditions = new HashSet<Condition>();
-		for (Processor p : processors) {
-			for (Condition c : p.getControlledPreconditionList()) {
-				conditions.add(c);
-			}
-		}
-		for (Condition c : conditions) {
-			Element conditionElement = new Element(CONDITION,
-					T2_WORKFLOW_NAMESPACE);
-			conditionElement.setAttribute("control", c.getControl()
-					.getLocalName());
-			conditionElement.setAttribute("target", c.getTarget()
-					.getLocalName());
-			result.addContent(conditionElement);
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLDeserializer.java
deleted file mode 100644
index c7faee1..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLDeserializer.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.jdom.Element;
-
-public class DataflowXMLDeserializer extends AbstractXMLDeserializer {
-	private static DataflowXMLDeserializer instance = new DataflowXMLDeserializer();
-
-	private DataflowXMLDeserializer() {
-
-	}
-
-	public static DataflowXMLDeserializer getInstance() {
-		return instance;
-	}
-	
-	@SuppressWarnings("unchecked")
-	public Dataflow deserializeDataflow(Element element,Map<String,Element> innerDataflowElements) throws EditException, DeserializationException, ActivityConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException {
-		Dataflow df = edits.createDataflow();
-		
-		String name = element.getChildText(NAME,T2_WORKFLOW_NAMESPACE);
-		String id = element.getAttributeValue(DATAFLOW_ID);
-		edits.getUpdateDataflowNameEdit(df, name).doEdit();
-		edits.getUpdateDataflowInternalIdentifierEdit(df, id).doEdit();
-		
-		Element inputPorts = element.getChild(DATAFLOW_INPUT_PORTS,T2_WORKFLOW_NAMESPACE);
-		Element outputPorts = element.getChild(DATAFLOW_OUTPUT_PORTS,T2_WORKFLOW_NAMESPACE);
-		
-		//dataflow ports
-		addDataflowPorts(df,inputPorts,outputPorts);
-		
-		Map<String,Processor> createdProcessors = new HashMap<String, Processor>();
-		//processors
-		Element processorsElement = element.getChild(PROCESSORS,T2_WORKFLOW_NAMESPACE);
-		for(Element procElement : (List<Element>)processorsElement.getChildren(PROCESSOR,T2_WORKFLOW_NAMESPACE)) {
-			Processor p = ProcessorXMLDeserializer.getInstance().deserializeProcessor(procElement,innerDataflowElements);
-			createdProcessors.put(p.getLocalName(),p);
-			edits.getAddProcessorEdit(df, p).doEdit();
-		}
-		
-		//conditions
-		Element conditions = element.getChild(CONDITIONS,T2_WORKFLOW_NAMESPACE);
-		ConditionXMLDeserializer.getInstance().buildConditions(df,conditions,createdProcessors);		
-		
-		//datalinks
-		Element datalinks = element.getChild(DATALINKS,T2_WORKFLOW_NAMESPACE);
-		DatalinksXMLDeserializer.getInstance().buildDatalinks(df,createdProcessors,datalinks);
-		
-		//annotations
-		annotationsFromXml(df, element, df.getClass().getClassLoader());
-		return df;
-	}
-
-	@SuppressWarnings("unchecked")
-	private void addDataflowPorts(Dataflow df, Element inputPortsElement,Element outputPortsElement) throws EditException {
-		for (Element port : (List<Element>)inputPortsElement.getChildren(DATAFLOW_PORT,T2_WORKFLOW_NAMESPACE)) {
-			String name=port.getChildText(NAME,T2_WORKFLOW_NAMESPACE);
-			int portDepth = Integer.valueOf(port.getChildText(DEPTH,T2_WORKFLOW_NAMESPACE));
-			int granularDepth = Integer.valueOf(port.getChildText(GRANULAR_DEPTH,T2_WORKFLOW_NAMESPACE));
-			DataflowInputPort dataflowInputPort = edits.createDataflowInputPort(name, portDepth, granularDepth, df);
-			// add annotations
-			annotationsFromXml(dataflowInputPort, port, df.getClass().getClassLoader());
-			edits.getAddDataflowInputPortEdit(df, dataflowInputPort).doEdit();
-//			edits.getCreateDataflowInputPortEdit(df, name, portDepth, granularDepth).doEdit();
-		}
-		
-		for (Element port : (List<Element>)outputPortsElement.getChildren(DATAFLOW_PORT,T2_WORKFLOW_NAMESPACE)) {
-			String name=port.getChildText(NAME,T2_WORKFLOW_NAMESPACE);
-			DataflowOutputPort dataflowOutputPort = edits.createDataflowOutputPort(name, df);
-			// add annotations
-			annotationsFromXml(dataflowOutputPort, port, df.getClass().getClassLoader());
-			edits.getAddDataflowOutputPortEdit(df, dataflowOutputPort).doEdit();
-//			edits.getCreateDataflowOutputPortEdit(df, name).doEdit();
-		}
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLSerializer.java
deleted file mode 100644
index edbbcc4..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLSerializer.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.serialization.SerializationException;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-public class DataflowXMLSerializer extends AbstractXMLSerializer {
-	private static DataflowXMLSerializer instance = new DataflowXMLSerializer();
-
-	private DataflowXMLSerializer() {
-
-	}
-
-	public static DataflowXMLSerializer getInstance() {
-		return instance;
-	}
-
-	public Element serializeDataflow(Dataflow df)
-			throws SerializationException {
-		Element result = new Element(DATAFLOW, T2_WORKFLOW_NAMESPACE);
-		result.setAttribute(DATAFLOW_ID,df.getInternalIdentier());
-		try {
-			
-			Element name=new Element(NAME,T2_WORKFLOW_NAMESPACE);
-			name.setText(df.getLocalName());
-			result.addContent(name);
-
-			// do dataflow inputs and outputs
-			result.addContent(dataflowInputPorts(df.getInputPorts()));
-			result.addContent(dataflowOutputPorts(df.getOutputPorts()));
-			// do processors
-			Element processors = new Element(PROCESSORS, T2_WORKFLOW_NAMESPACE);
-
-			for (Processor processor : df.getProcessors()) {
-				processors.addContent(processorToXML(processor));
-			}
-			result.addContent(processors);
-
-			// do conditions
-			result.addContent(conditionsToXML(df.getProcessors()));
-			// do datalinks
-			result.addContent(DatalinksXMLSerializer.getInstance().datalinksToXML(df.getLinks()));
-			// do annotations
-			result.addContent(annotationsToXML(df));
-			
-		}
-		// FIXME: improve error reporting
-		catch (JDOMException jdomException) {
-			throw new SerializationException(
-					"There was a problem generating the XML for the workflow: " + jdomException.toString(),
-					jdomException);
-		} catch (IOException ioException) {
-			throw new SerializationException(
-					"There was a problem generating the XML for the workflow: " + ioException.toString(),
-					ioException);
-		}
-		return result;
-	}
-
-	private Element conditionsToXML(List<? extends Processor> processors) {
-		return ConditionXMLSerializer.getInstance().conditionsToXML(processors);
-	}
-
-	private Element processorToXML(Processor processor) throws IOException,
-			JDOMException {
-		return ProcessorXMLSerializer.getInstance().processorToXML(processor);
-	}
-
-	protected Element dataflowInputPorts(
-			List<? extends DataflowInputPort> inputPorts) throws JDOMException, IOException {
-		Element result = new Element(DATAFLOW_INPUT_PORTS,
-				T2_WORKFLOW_NAMESPACE);
-		for (DataflowInputPort port : inputPorts) {
-			Element portElement = new Element(DATAFLOW_PORT,
-					T2_WORKFLOW_NAMESPACE);
-			Element name = new Element(NAME, T2_WORKFLOW_NAMESPACE);
-			Element depth = new Element(DEPTH, T2_WORKFLOW_NAMESPACE);
-			Element granularDepth = new Element(GRANULAR_DEPTH,
-					T2_WORKFLOW_NAMESPACE);
-
-			name.setText(port.getName());
-			depth.setText(String.valueOf(port.getDepth()));
-			granularDepth.setText(String.valueOf(port.getGranularInputDepth()));
-
-			portElement.addContent(name);
-			portElement.addContent(depth);
-			portElement.addContent(granularDepth);
-			// do annotations
-			portElement.addContent(annotationsToXML(port));
-			result.addContent(portElement);
-		}
-		return result;
-	}
-
-	protected Element dataflowOutputPorts(
-			List<? extends DataflowOutputPort> outputPorts) throws JDOMException, IOException {
-		Element result = new Element(DATAFLOW_OUTPUT_PORTS,
-				T2_WORKFLOW_NAMESPACE);
-		for (DataflowOutputPort port : outputPorts) {
-			Element portElement = new Element(DATAFLOW_PORT,
-					T2_WORKFLOW_NAMESPACE);
-			Element name = new Element(NAME, T2_WORKFLOW_NAMESPACE);
-			name.setText(port.getName());
-
-			portElement.addContent(name);
-			// do annotations
-			portElement.addContent(annotationsToXML(port));
-			result.addContent(portElement);
-		}
-		return result;
-
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLDeserializer.java
deleted file mode 100644
index 7ae6363..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLDeserializer.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeOutputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jdom.Element;
-
-public class DatalinksXMLDeserializer extends AbstractXMLDeserializer {
-	private static DatalinksXMLDeserializer instance = new DatalinksXMLDeserializer();
-	
-	private Log logger = LogFactory.getLog(DatalinksXMLDeserializer.class);
-
-
-	private DatalinksXMLDeserializer() {
-
-	}
-
-	public static DatalinksXMLDeserializer getInstance() {
-		return instance;
-	}
-
-	@SuppressWarnings("unchecked")
-	public void buildDatalinks(Dataflow dataflow,
-			Map<String, Processor> createdProcessors, Element datalinks)
-			throws DeserializationException, EditException {
-		for (Element datalink : (List<Element>) datalinks.getChildren(DATALINK,
-				T2_WORKFLOW_NAMESPACE)) {
-			Element sink = datalink.getChild(SINK, T2_WORKFLOW_NAMESPACE);
-			Element source = datalink.getChild(SOURCE, T2_WORKFLOW_NAMESPACE);
-			if (sink == null)
-				throw new DeserializationException(
-						"No sink defined for datalink:"
-								+ elementToString(datalink));
-			if (source == null)
-				throw new DeserializationException(
-						"No source defined for datalink:"
-								+ elementToString(datalink));
-			String sinkType = sink.getAttributeValue(DATALINK_TYPE);
-
-			EventForwardingOutputPort sourcePort = determineLinkSourcePort(
-					source, dataflow, createdProcessors);
-			EventHandlingInputPort sinkPort = determineLinkSinkPort(sink,
-					dataflow, createdProcessors);
-
-			if (sourcePort == null)
-				throw new DeserializationException(
-						"Unable to determine source port for:"
-								+ elementToString(datalink));
-			if (sinkPort == null)
-				throw new DeserializationException(
-						"Unable to determine sink port for:"
-								+ elementToString(datalink));
-			if (sinkType.equals(DATALINK_TYPES.MERGE.toString())) {
-				Merge merge;
-				if (sinkPort.getIncomingLink() == null) {
-					merge = edits.createMerge(dataflow);
-					edits.getAddMergeEdit(dataflow, merge).doEdit();
-				} else {
-					if (sinkPort.getIncomingLink().getSource() instanceof MergeOutputPort) {
-						merge = ((MergeOutputPort) sinkPort.getIncomingLink()
-								.getSource()).getMerge();
-					} else {
-						throw new DeserializationException(
-								"There was a merge port execpted to be connected to "
-										+ sinkPort);
-					}
-				}
-				if (merge == null)
-					throw new DeserializationException(
-							"Unable to find or create Merge for "
-									+ elementToString(datalink));
-				try {
-					edits.getConnectMergedDatalinkEdit(merge, sourcePort, sinkPort)
-					.doEdit();
-				}
-				catch(Exception e) {
-					logger.error(e);
-				}
-			} else {
-				Datalink link = edits.createDatalink(sourcePort, sinkPort);
-				edits.getConnectDatalinkEdit(link).doEdit();
-			}
-		}
-
-	}
-
-	private EventForwardingOutputPort determineLinkSourcePort(Element source,
-			Dataflow dataflow, Map<String, Processor> createdProcessors)
-			throws DeserializationException, EditException {
-		EventForwardingOutputPort result = null;
-		String sourceType = source.getAttributeValue(DATALINK_TYPE);
-		String portName = source.getChildText(PORT, T2_WORKFLOW_NAMESPACE);
-		if (sourceType.equals(DATALINK_TYPES.PROCESSOR.toString())) {
-			String processorName = source.getChildText(PROCESSOR,
-					T2_WORKFLOW_NAMESPACE);
-			result = findProcessorOutputPort(createdProcessors, portName,
-					processorName);
-		} else if (sourceType.equals(DATALINK_TYPES.DATAFLOW.toString())) {
-			for (DataflowInputPort port : dataflow.getInputPorts()) {
-				if (port.getName().equals(portName)) {
-					result = port.getInternalOutputPort();
-					break;
-				}
-			}
-		} else if (sourceType.equals(DATALINK_TYPES.MERGE.toString())) {
-			throw new DeserializationException(
-					"The source type is marked as merge for:"
-							+ elementToString(source) + " but should never be");
-		} else {
-			throw new DeserializationException(
-					"Unable to recognise datalink type:" + sourceType);
-		}
-		return result;
-	}
-
-	private EventHandlingInputPort determineLinkSinkPort(Element sink,
-			Dataflow dataflow, Map<String, Processor> createdProcessors)
-			throws DeserializationException, EditException {
-		EventHandlingInputPort result = null;
-		String portName = sink.getChildText(PORT, T2_WORKFLOW_NAMESPACE);
-		String processorName = sink.getChildText(PROCESSOR, T2_WORKFLOW_NAMESPACE);
-		if ((processorName == null) || processorName.equals("")) {
-			for (DataflowOutputPort port : dataflow.getOutputPorts()) {
-				if (port.getName().equals(portName)) {
-					result = port.getInternalInputPort();
-					break;
-				}
-			}
-		} else {
-			EventHandlingInputPort processorInputPort = findProcessorInputPort(
-					createdProcessors, portName, processorName);
-			result = processorInputPort;
-		} 
-		return result;
-	}
-
-	private EventHandlingInputPort findProcessorInputPort(
-			Map<String, Processor> createdProcessors, String portName,
-			String processorName) throws DeserializationException {
-		EventHandlingInputPort result = null;
-		Processor p = createdProcessors.get(processorName);
-		if (p == null)
-			throw new DeserializationException(
-					"Unable to find processor named:" + processorName);
-		for (ProcessorInputPort port : p.getInputPorts()) {
-			if (port.getName().equals(portName)) {
-				result = port;
-				break;
-			}
-		}
-		return result;
-	}
-
-	private EventForwardingOutputPort findProcessorOutputPort(
-			Map<String, Processor> createdProcessors, String portName,
-			String processorName) throws DeserializationException {
-		EventForwardingOutputPort result = null;
-		Processor p = createdProcessors.get(processorName);
-		if (p == null)
-			throw new DeserializationException(
-					"Unable to find processor named:" + processorName);
-		for (ProcessorOutputPort port : p.getOutputPorts()) {
-			if (port.getName().equals(portName)) {
-				result = port;
-				break;
-			}
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLSerializer.java
deleted file mode 100644
index 2d8a850..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLSerializer.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-import net.sf.taverna.t2.workflowmodel.MergeOutputPort;
-import net.sf.taverna.t2.workflowmodel.Port;
-import net.sf.taverna.t2.workflowmodel.ProcessorPort;
-import net.sf.taverna.t2.workflowmodel.impl.BasicEventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.impl.MergeInputPortImpl;
-import net.sf.taverna.t2.workflowmodel.serialization.SerializationException;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-
-public class DatalinksXMLSerializer extends AbstractXMLSerializer {
-	private static DatalinksXMLSerializer instance = new DatalinksXMLSerializer();
-	
-	private static Logger logger = Logger.getLogger(DatalinksXMLSerializer.class);
-
-
-	private DatalinksXMLSerializer() {
-
-	}
-
-	public static DatalinksXMLSerializer getInstance() {
-		return instance;
-	}
-
-	public Element datalinkToXML(Datalink link) throws SerializationException {
-		Element element = new Element(DATALINK, T2_WORKFLOW_NAMESPACE);
-		Element sink = new Element(SINK, T2_WORKFLOW_NAMESPACE);
-		Element source = new Element(SOURCE, T2_WORKFLOW_NAMESPACE);
-
-		DATALINK_TYPES dataLinkSinkType = determineDatalinkType(link.getSink());
-		sink.setAttribute(DATALINK_TYPE, dataLinkSinkType.toString());
-		Datalink effectiveLink = link;
-		
-		if (dataLinkSinkType == DATALINK_TYPES.MERGE) {
-			Merge m = ((MergeInputPortImpl) link.getSink()).getMerge();
-			effectiveLink = (Datalink) m
-					.getOutputPort().getOutgoingLinks().toArray()[0];
-			dataLinkSinkType = determineDatalinkType(effectiveLink.getSink());
-		}
-
-		if (dataLinkSinkType == DATALINK_TYPES.PROCESSOR) {
-			ProcessorPort port = (ProcessorPort) effectiveLink.getSink();
-			Element proc = new Element(PROCESSOR, T2_WORKFLOW_NAMESPACE);
-			proc.setText(port.getProcessor().getLocalName());
-			sink.addContent(proc);
-			Element portElement = new Element(PROCESSOR_PORT,
-					T2_WORKFLOW_NAMESPACE);
-			portElement.setText(effectiveLink.getSink().getName());
-			sink.addContent(portElement);
-		}  else if (dataLinkSinkType == DATALINK_TYPES.DATAFLOW) {
-			Element portElement = new Element(PORT, T2_WORKFLOW_NAMESPACE);
-			portElement.setText(effectiveLink.getSink().getName());
-			sink.addContent(portElement);
-		}
-
-		DATALINK_TYPES dataLinkSourceType = determineDatalinkType(link
-				.getSource());
-		source.setAttribute(DATALINK_TYPE, dataLinkSourceType.toString());
-
-		if (dataLinkSourceType == DATALINK_TYPES.PROCESSOR) {
-			ProcessorPort port = (ProcessorPort) link.getSource();
-			Element proc = new Element(PROCESSOR, T2_WORKFLOW_NAMESPACE);
-			proc.setText(port.getProcessor().getLocalName());
-			source.addContent(proc);
-			Element portElement = new Element(PROCESSOR_PORT,
-					T2_WORKFLOW_NAMESPACE);
-			portElement.setText(link.getSource().getName());
-			source.addContent(portElement);
-		} else if (dataLinkSourceType == DATALINK_TYPES.MERGE) {
-			logger.error("Not expecting DATALINK_TYPES.MERGE");
-		} else if (dataLinkSourceType == DATALINK_TYPES.DATAFLOW) {
-			Element portElement = new Element(PORT, T2_WORKFLOW_NAMESPACE);
-			portElement.setText(link.getSource().getName());
-			source.addContent(portElement);
-		}
-
-		element.addContent(sink);
-		element.addContent(source);
-
-		return element;
-	}
-
-	private DATALINK_TYPES determineDatalinkType(Port port)
-			throws SerializationException {
-		if (port instanceof MergeInputPort || port instanceof MergeOutputPort) {
-			return DATALINK_TYPES.MERGE;
-		} else if (port instanceof ProcessorPort) {
-			return DATALINK_TYPES.PROCESSOR;
-		} else if (port instanceof BasicEventForwardingOutputPort
-				|| port instanceof EventHandlingInputPort) {
-			return DATALINK_TYPES.DATAFLOW;
-		} else {
-			throw new SerializationException(
-					"Unable to determine link type connected to/from " + port);
-		}
-	}
-
-	public Element datalinksToXML(List<? extends Datalink> links)
-			throws SerializationException {
-		Element result = new Element(DATALINKS, T2_WORKFLOW_NAMESPACE);
-		for (Datalink link : links) {
-			if (determineDatalinkType(link.getSource()) != DATALINK_TYPES.MERGE) {
-				result.addContent(datalinkToXML(link));
-			}
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLDeserializer.java
deleted file mode 100644
index 65849a4..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLDeserializer.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import net.sf.taverna.raven.log.Log;
-import net.sf.taverna.raven.repository.impl.LocalRepository;
-import net.sf.taverna.t2.workflowmodel.ConfigurationException;
-import net.sf.taverna.t2.workflowmodel.impl.Tools;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-
-import org.jdom.Element;
-
-public class DispatchLayerXMLDeserializer extends AbstractXMLDeserializer {
-	private static DispatchLayerXMLDeserializer instance = new DispatchLayerXMLDeserializer();
-
-	private static Log logger = Log.getLogger(DispatchLayerXMLDeserializer.class);
-
-	private DispatchLayerXMLDeserializer() {
-
-	}
-
-	public static DispatchLayerXMLDeserializer getInstance() {
-		return instance;
-	}
-	
-	@SuppressWarnings("unchecked")
-	public DispatchLayer<?> deserializeDispatchLayer(Element element) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
-		Element ravenElement = element.getChild(RAVEN,T2_WORKFLOW_NAMESPACE);
-		ClassLoader cl = Tools.class.getClassLoader();
-		if (ravenElement != null) {
-			try {
-				cl = getRavenLoader(ravenElement);
-			} catch (Exception ex) {
-				logger.error(ex);
-				// TODO - handle this properly, either by logging correctly or
-				// by going back to the repository and attempting to fetch the
-				// offending missing artifacts
-			}
-		}
-		String className = element.getChild(CLASS,T2_WORKFLOW_NAMESPACE).getTextTrim();
-		Class<? extends DispatchLayer> c = (Class<? extends DispatchLayer>) cl
-				.loadClass(className);
-		DispatchLayer<Object> layer = c.newInstance();
-
-		// Handle the configuration of the dispatch layer
-		Element configElement = element.getChild(CONFIG_BEAN,T2_WORKFLOW_NAMESPACE);
-		Object configObject = createBean(configElement, cl);
-		try {
-			layer.configure(configObject);
-		} catch (ConfigurationException e) {
-			// TODO - handle this properly
-			logger.error(e);
-		}
-
-		return layer;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLSerializer.java
deleted file mode 100644
index dfda7bb..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLSerializer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-
-import net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-public class DispatchLayerXMLSerializer extends AbstractXMLSerializer {
-
-	private static DispatchLayerXMLSerializer instance = new DispatchLayerXMLSerializer();
-	
-	public static DispatchLayerXMLSerializer getInstance() {
-		return instance;
-	}
-	
-	public Element dispatchLayerToXML(DispatchLayer<?> layer)
-			throws IOException, JDOMException {
-		Element result = new Element(DISPATCH_LAYER, T2_WORKFLOW_NAMESPACE);
-
-		appendObjectDetails(layer, result);
-
-		// Get element for configuration
-		Object o = layer.getConfiguration();
-		Element configElement = beanAsElement(o);
-		result.addContent(configElement);
-		return result;
-	}
-	
-	private void appendObjectDetails(DispatchLayer<?> layer, Element result) {
-		ClassLoader cl = layer.getClass().getClassLoader();
-		if (cl instanceof LocalArtifactClassLoader) {
-			result.addContent(ravenElement((LocalArtifactClassLoader) cl));
-		}
-		Element classNameElement = new Element(CLASS, T2_WORKFLOW_NAMESPACE);
-		classNameElement.setText(layer.getClass().getName());
-		result.addContent(classNameElement);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLDeserializer.java
deleted file mode 100644
index d16b894..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLDeserializer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-
-import org.jdom.Element;
-
-public class DispatchStackXMLDeserializer extends AbstractXMLDeserializer {
-	private static DispatchStackXMLDeserializer instance = new DispatchStackXMLDeserializer();
-
-	private DispatchStackXMLDeserializer() {
-
-	}
-
-	public static DispatchStackXMLDeserializer getInstance() {
-		return instance;
-	}
-	
-	@SuppressWarnings("unchecked")
-	public void deserializeDispatchStack(Processor processor,
-			Element dispatchStack) throws ClassNotFoundException, InstantiationException, IllegalAccessException, EditException {
-		int layers=0;
-		for (Element layer : (List<Element>)dispatchStack.getChildren(DISPATCH_LAYER,T2_WORKFLOW_NAMESPACE)) {
-			DispatchLayer<?> dispatchLayer = DispatchLayerXMLDeserializer.getInstance().deserializeDispatchLayer(layer);
-			edits.getAddDispatchLayerEdit(processor.getDispatchStack(), dispatchLayer, layers++).doEdit();
-		}
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLSerializer.java
deleted file mode 100644
index bc7f698..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLSerializer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-public class DispatchStackXMLSerializer extends AbstractXMLSerializer {
-
-	private static DispatchStackXMLSerializer instance = new DispatchStackXMLSerializer();
-
-	public static DispatchStackXMLSerializer getInstance() {
-		return instance;
-	}
-
-	public Element dispatchStackToXML(DispatchStack stack) throws IOException,
-			JDOMException {
-		Element result = new Element(DISPATCH_STACK, T2_WORKFLOW_NAMESPACE);
-		for (DispatchLayer<?> layer : stack.getLayers()) {
-			result.addContent(dispatchLayerToXML(layer));
-		}
-		return result;
-	}
-
-	protected Element dispatchLayerToXML(DispatchLayer<?> layer)
-			throws IOException, JDOMException {
-		return DispatchLayerXMLSerializer.getInstance().dispatchLayerToXML(
-				layer);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLDeserializer.java
deleted file mode 100644
index fc02ea9..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLDeserializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyStackImpl;
-
-import org.jdom.Element;
-
-public class IterationStrategyStackXMLDeserializer implements XMLSerializationConstants{
-	private static IterationStrategyStackXMLDeserializer instance = new IterationStrategyStackXMLDeserializer();
-
-	private IterationStrategyStackXMLDeserializer() {
-
-	}
-
-	public static IterationStrategyStackXMLDeserializer getInstance() {
-		return instance;
-	}
-	
-	public void deserializeIterationStrategyStack(Element element,IterationStrategyStack stack) {
-		((IterationStrategyStackImpl)stack).configureFromElement(element.getChild(ITERATION_STRATEGY,T2_WORKFLOW_NAMESPACE));
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLSerializer.java
deleted file mode 100644
index 5f2d269..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLSerializer.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyStackImpl;
-
-import org.jdom.Element;
-
-public class IterationStrategyStackXMLSerializer extends AbstractXMLSerializer {
-	
-	private static IterationStrategyStackXMLSerializer instance = new IterationStrategyStackXMLSerializer();
-
-	private IterationStrategyStackXMLSerializer() {
-		
-	}
-	
-	public Element iterationStrategyStackToXML(
-			IterationStrategyStack strategyStack) {
-		Element result = new Element(ITERATION_STRATEGY_STACK,
-				T2_WORKFLOW_NAMESPACE);
-		result.addContent(((IterationStrategyStackImpl) strategyStack).asXML());
-		return result;
-	}
-
-	public static IterationStrategyStackXMLSerializer getInstance() {
-		return instance;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLDeserializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLDeserializer.java
deleted file mode 100644
index caa684b..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLDeserializer.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.jdom.Element;
-
-public class ProcessorXMLDeserializer extends AbstractXMLDeserializer {
-	private static ProcessorXMLDeserializer instance = new ProcessorXMLDeserializer();
-
-	private ProcessorXMLDeserializer() {
-
-	}
-
-	public static ProcessorXMLDeserializer getInstance() {
-		return instance;
-	}
-	
-	@SuppressWarnings("unchecked")
-	public Processor deserializeProcessor(Element el,Map<String,Element>innerDataflowElements) throws EditException, ActivityConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException, DeserializationException {
-		String name=el.getChildText(NAME,T2_WORKFLOW_NAMESPACE);
-		Processor result=edits.createProcessor(name);
-		
-		//activities
-		Element activities=el.getChild(ACTIVITIES,T2_WORKFLOW_NAMESPACE);
-		for (Element activity : (List<Element>)activities.getChildren(ACTIVITY,T2_WORKFLOW_NAMESPACE)) {
-			Activity<?> a = ActivityXMLDeserializer.getInstance().deserializeActivity(activity,innerDataflowElements);
-			edits.getAddActivityEdit(result, a).doEdit();
-		}
-		
-		//ports
-		Element inputPorts = el.getChild(PROCESSOR_INPUT_PORTS,T2_WORKFLOW_NAMESPACE);
-		Element outputPorts = el.getChild(PROCESSOR_OUTPUT_PORTS,T2_WORKFLOW_NAMESPACE);
-		
-		for (Element inputPort : (List<Element>)inputPorts.getChildren(PROCESSOR_PORT,T2_WORKFLOW_NAMESPACE)) {
-			String portName=inputPort.getChildText(NAME,T2_WORKFLOW_NAMESPACE);
-			int portDepth = Integer.valueOf(inputPort.getChildText(DEPTH,T2_WORKFLOW_NAMESPACE));
-			ProcessorInputPort port = edits.createProcessorInputPort(result, portName, portDepth);
-			edits.getAddProcessorInputPortEdit(result, port).doEdit();
-		}
-		
-		for (Element outputPort : (List<Element>)outputPorts.getChildren(PROCESSOR_PORT,T2_WORKFLOW_NAMESPACE)) {
-			String portName=outputPort.getChildText(NAME,T2_WORKFLOW_NAMESPACE);
-			int portDepth = Integer.valueOf(outputPort.getChildText(DEPTH,T2_WORKFLOW_NAMESPACE));
-			int granularDepth = Integer.valueOf(outputPort.getChildText(GRANULAR_DEPTH,T2_WORKFLOW_NAMESPACE));
-			ProcessorOutputPort port = edits.createProcessorOutputPort(result, portName, portDepth, granularDepth);
-			edits.getAddProcessorOutputPortEdit(result,port).doEdit();
-		}
-		
-		//TODO: annotations
-		
-		//Dispatch stack
-		Element dispatchStack = el.getChild(DISPATCH_STACK,T2_WORKFLOW_NAMESPACE);
-		DispatchStackXMLDeserializer.getInstance().deserializeDispatchStack(result, dispatchStack);
-		
-		
-		//Iteration strategy
-		Element iterationStrategyStack = el.getChild(ITERATION_STRATEGY_STACK,T2_WORKFLOW_NAMESPACE);
-		IterationStrategyStackXMLDeserializer.getInstance().deserializeIterationStrategyStack(iterationStrategyStack, result.getIterationStrategy());
-		
-		return result;
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLSerializer.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLSerializer.java
deleted file mode 100644
index 19c2dd5..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLSerializer.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-public class ProcessorXMLSerializer extends AbstractXMLSerializer {
-	private static ProcessorXMLSerializer instance = new ProcessorXMLSerializer();
-
-	private ProcessorXMLSerializer() {
-
-	}
-
-	public static ProcessorXMLSerializer getInstance() {
-		return instance;
-	}
-
-	public Element processorToXML(Processor processor) throws IOException,
-			JDOMException {
-
-		Element result = new Element(PROCESSOR, T2_WORKFLOW_NAMESPACE);
-		Element nameElement = new Element(NAME, T2_WORKFLOW_NAMESPACE);
-		nameElement.setText(processor.getLocalName());
-		result.addContent(nameElement);
-
-		// input and output ports
-		Element inputPorts = processorInputPortsToXML(processor);
-		Element outputPorts = processorOutputPortsToXML(processor);
-		result.addContent(inputPorts);
-		result.addContent(outputPorts);
-
-		// annotations
-		result.addContent(annotationsToXML(processor));
-
-		// list of activities
-		Element activities = new Element(ACTIVITIES, T2_WORKFLOW_NAMESPACE);
-		for (Activity<?> activity : processor.getActivityList()) {
-			activities.addContent(activityToXML(activity));
-		}
-		result.addContent(activities);
-
-		// dispatch stack
-		result.addContent(dispatchStackToXML(processor.getDispatchStack()));
-
-		// iteration strategy
-		result.addContent(iterationStrategyStackToXML(processor
-				.getIterationStrategy()));
-
-		return result;
-	}
-
-	protected Element dispatchStackToXML(DispatchStack stack)
-			throws IOException, JDOMException {
-		return DispatchStackXMLSerializer.getInstance().dispatchStackToXML(
-				stack);
-	}
-
-	protected Element iterationStrategyStackToXML(
-			IterationStrategyStack strategyStack) {
-		return IterationStrategyStackXMLSerializer.getInstance()
-				.iterationStrategyStackToXML(strategyStack);
-	}
-
-	protected Element activityToXML(Activity<?> activity) throws JDOMException,
-			IOException {
-		return ActivityXMLSerializer.getInstance().activityToXML(activity);
-	}
-	
-	private Element processorOutputPortsToXML(Processor processor) {
-		Element outputPorts = new Element(PROCESSOR_OUTPUT_PORTS,
-				T2_WORKFLOW_NAMESPACE);
-		for (ProcessorOutputPort port : processor.getOutputPorts()) {
-			Element portElement = new Element(PROCESSOR_PORT,
-					T2_WORKFLOW_NAMESPACE);
-			Element name = new Element(NAME, T2_WORKFLOW_NAMESPACE);
-			Element depth = new Element(DEPTH, T2_WORKFLOW_NAMESPACE);
-			Element granularDepth = new Element(GRANULAR_DEPTH,
-					T2_WORKFLOW_NAMESPACE);
-			name.setText(port.getName());
-			depth.setText(String.valueOf(port.getDepth()));
-			granularDepth.setText(String.valueOf(port.getGranularDepth()));
-			portElement.addContent(name);
-			portElement.addContent(depth);
-			portElement.addContent(granularDepth);
-			outputPorts.addContent(portElement);
-		}
-		return outputPorts;
-	}
-
-	private Element processorInputPortsToXML(Processor processor) {
-		Element inputPorts = new Element(PROCESSOR_INPUT_PORTS,
-				T2_WORKFLOW_NAMESPACE);
-		for (ProcessorInputPort port : processor.getInputPorts()) {
-			Element portElement = new Element(PROCESSOR_PORT,
-					T2_WORKFLOW_NAMESPACE);
-			Element name = new Element(NAME, T2_WORKFLOW_NAMESPACE);
-			Element depth = new Element(DEPTH, T2_WORKFLOW_NAMESPACE);
-			name.setText(port.getName());
-			depth.setText(String.valueOf(port.getDepth()));
-			portElement.addContent(name);
-			portElement.addContent(depth);
-			inputPorts.addContent(portElement);
-		}
-		return inputPorts;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializerImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializerImpl.java
deleted file mode 100644
index 85802ea..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLDeserializerImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
-
-import org.jdom.Element;
-
-/**
- * Implementation class that acts as the main entry point for deserialising a complete XML dataflow document into a dataflow instance.
- * @author Stuart Owen
- *
- */
-public class XMLDeserializerImpl implements XMLDeserializer, XMLSerializationConstants {
-	
-	Edits edits = new EditsImpl();
-	
-	public XMLDeserializerImpl() {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see net.sf.taverna.t2.workflowmodel.serialization.xml.XMLDeserializer#deserializeDataflow(org.jdom.Element)
-	 */
-	public Dataflow deserializeDataflow(Element element)
-			throws DeserializationException,EditException {
-		Element topDataflow = findTopDataflow(element);
-		if (topDataflow==null) throw new DeserializationException("No top level workflow defined in the XML document");
-		Map<String,Element> innerDataflowElements = gatherInnerDataflows(element);
-		try {
-			return DataflowXMLDeserializer.getInstance().deserializeDataflow(topDataflow,innerDataflowElements);
-		} catch (Exception e) {
-			throw new DeserializationException("An error occurred deserializing the workflow:"+e.getMessage(),e);
-		}
-	}
-
-	private Element findTopDataflow(Element element) {
-		Element result = null;
-		for (Object elObj : element.getChildren(DATAFLOW,T2_WORKFLOW_NAMESPACE)) {
-			Element dataflowElement = (Element)elObj;
-			if (DATAFLOW_ROLE_TOP.equals(dataflowElement.getAttribute(DATAFLOW_ROLE).getValue())) {
-				result=dataflowElement;
-			}
-		}
-		return result;
-	}
-
-	private Map<String, Element> gatherInnerDataflows(Element element) throws DeserializationException {
-		Map<String,Element> result=new HashMap<String, Element>();
-		for (Object elObj : element.getChildren(DATAFLOW,T2_WORKFLOW_NAMESPACE)) {
-			Element dataflowElement = (Element)elObj;
-			if (DATAFLOW_ROLE_NESTED.equals(dataflowElement.getAttribute(DATAFLOW_ROLE).getValue())) {
-				String id = dataflowElement.getAttributeValue(DATAFLOW_ID);
-				if (result.containsKey(id)) throw new DeserializationException("Duplicate workflow id:"+id);
-				result.put(id,dataflowElement);
-			}
-		}
-		return result;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializationConstants.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializationConstants.java
deleted file mode 100644
index 017dab8..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializationConstants.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import org.jdom.Namespace;
-
-public interface XMLSerializationConstants {
-
-	static final String WORKFLOW_DOCUMENT_MIMETYPE="application/vnd.taverna.t2flow+xml";
-	
-	static final Namespace T2_WORKFLOW_NAMESPACE=Namespace.getNamespace("http://taverna.sf.net/2008/xml/t2flow");
-	
-	// XML element names
-	static final String WORKFLOW = "workflow";
-	static final String WORKFLOW_VERSION = "version";
-	
-	
-	static final String DATAFLOW = "dataflow";
-	static final String DATAFLOW_INPUT_PORTS="inputPorts";
-	static final String DATAFLOW_OUTPUT_PORTS="outputPorts";
-	static final String DATAFLOW_PORT="port";
-	
-	static final String PROCESSOR = "processor";
-	static final String PROCESSORS = "processors";
-	static final String PROCESSOR_INPUT_PORTS = "inputPorts";
-	static final String PROCESSOR_OUTPUT_PORTS = "outputPorts";
-	
-	static final String DISPATCH_LAYER = "dispatchLayer";
-	
-	static final String ACTIVITIES = "activities";
-	static final String ACTIVITY = "activity";
-	static final String CONFIG_BEAN="configBean";
-	
-	static final String NAME="name";
-	
-	static final String JAVA = "java";
-	static final String OUTPUT_MAP = "outputMap";
-	static final String TO = "to";
-	static final String FROM = "from";
-	static final String MAP = "map";
-	static final String INPUT_MAP = "inputMap";
-	static final String CLASS = "class";
-	static final String VERSION = "version";
-	static final String ARTIFACT = "artifact";
-	static final String GROUP = "group";
-	static final String RAVEN = "raven";
-	static final String DISPATCH_STACK = "dispatchStack";
-	static final String ITERATION_STRATEGY_STACK = "iterationStrategyStack";
-	static final String ITERATION_STRATEGY = "iteration";
-	static final String CONDITIONS = "conditions";
-	static final String CONDITION = "condition";
-	static final String ANNOTATIONS = "annotations";
-	static final String ANNOTATION = "annotation";
-	static final String ANNOTATION_CHAIN = "annotation_chain";
-	
-	static final String DATALINK = "datalink";
-	static final String DATALINKS = "datalinks";
-	static final String DATALINK_TYPE="type";
-	
-	public enum DATALINK_TYPES {
-		PROCESSOR("processor"),
-		DATAFLOW("dataflow"),
-		MERGE("merge");
-		
-		String value;
-		DATALINK_TYPES(String value) {
-			this.value=value;
-		}
-		
-		public String toString() {
-			return value;
-		}
-	};
-	
-	static final String SINK = "sink";
-	static final String SOURCE = "source";
-	static final String PORT = "port";
-	static final String PROCESSOR_PORT = "port";
-	static final String DEPTH="depth";
-	static final String GRANULAR_DEPTH="granularDepth";
-	
-	static final String MERGE="merge";
-	static final String MERGES="merges";
-	
-	//Attribute names
-	static final String BEAN_ENCODING="encoding";
-	
-	static final String JDOMXML_ENCODING="jdomxml";
-	static final String XSTREAM_ENCODING="xstream";
-	static final String DATAFLOW_ENCODING="dataflow";
-	
-	static final String DATAFLOW_ROLE="role";
-	static final String DATAFLOW_REFERENCE="ref";
-	static final String DATAFLOW_ID="id";
-	
-	static final String PRODUCED_BY="producedBy";
-	
-	//Attribute values
-	static final String DATAFLOW_ROLE_TOP="top";
-	static final String DATAFLOW_ROLE_NESTED="nested";
-    static final String UNSPECIFIED = "unspecified";	
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializerImpl.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializerImpl.java
deleted file mode 100644
index a1b2c80..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/XMLSerializerImpl.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.serialization.SerializationException;
-
-import org.jdom.Element;
-
-/**
- * Implementation of the XML serialisation framework for serialising a dataflow instance into a jdom XML element.
- * <br>
- * 
- * @author Stuart Owen
- *
- */
-public class XMLSerializerImpl implements XMLSerializer, XMLSerializationConstants {
-	
-	public XMLSerializerImpl() {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializer#serializeDataflow(net.sf.taverna.t2.workflowmodel.Dataflow)
-	 */
-	public Element serializeDataflow(Dataflow dataflow)
-			throws SerializationException {
-		Set<Dataflow> innerDataflows = new HashSet<Dataflow>();
-		
-		gatherDataflows(dataflow,innerDataflows);
-		
-		Element result = new Element(WORKFLOW, T2_WORKFLOW_NAMESPACE);
-		// For future use
-		result.setAttribute(WORKFLOW_VERSION, "1");
-		result.setAttribute(PRODUCED_BY, this.getProducedBy());
-		Element dataflowElement = DataflowXMLSerializer.getInstance().serializeDataflow(dataflow);
-		dataflowElement.setAttribute(DATAFLOW_ROLE, DATAFLOW_ROLE_TOP);
-		result.addContent(dataflowElement);
-		
-		Set<String> outputIds = new HashSet<String>();
-		for (Dataflow innerDataflow : innerDataflows) {
-			String currentId = innerDataflow.getInternalIdentier();
-			if (outputIds.add(currentId)) {
-				Element innerDataflowElement = DataflowXMLSerializer.getInstance().serializeDataflow(innerDataflow);
-				innerDataflowElement.setAttribute(DATAFLOW_ROLE,DATAFLOW_ROLE_NESTED);
-				result.addContent(innerDataflowElement);
-			}
-		}
-
-		return result;
-	}
-
-	private void gatherDataflows(Dataflow dataflow, Set<Dataflow> innerDataflows) {
-		for (Processor p : dataflow.getProcessors()) {
-			for (Activity<?> a : p.getActivityList()) {
-				if (a.getConfiguration() instanceof Dataflow) {
-					Dataflow df = (Dataflow) a.getConfiguration();
-					if (!innerDataflows.contains(df)) {
-						innerDataflows.add(df);
-						gatherDataflows(df, innerDataflows);	
-					}
-				}
-			}
-		}
-		
-	}
-
-	private String producedBy = UNSPECIFIED;
-
-	public void setProducedBy(String producedBy) {
-		this.producedBy = producedBy;
-	}
-	
-	public String getProducedBy() {
-		return this.producedBy;
-	}
-
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/package.html b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/package.html
deleted file mode 100644
index a75ce76..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/serialization/xml/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-A collection of utility classes responsible for the serialization/deserializtion to and from XML for a dataflow as a whole, and its internal components.
-</body>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/AnnotationTools.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/AnnotationTools.java
deleted file mode 100644
index 37014bd..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/AnnotationTools.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package net.sf.taverna.t2.workflowmodel.utils;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import net.sf.taverna.raven.appconfig.ApplicationRuntime;
-import net.sf.taverna.raven.spi.SpiRegistry;
-import net.sf.taverna.t2.annotation.Annotated;
-import net.sf.taverna.t2.annotation.AnnotationAssertion;
-import net.sf.taverna.t2.annotation.AnnotationBeanSPI;
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.annotation.AppliesTo;
-import net.sf.taverna.t2.annotation.annotationbeans.AbstractTextualValueAssertion;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EditsRegistry;
-
-import org.apache.log4j.Logger;
-
-public class AnnotationTools {
-
-	private static Logger logger = Logger.getLogger(AnnotationTools.class);
-
-	@SuppressWarnings("unchecked")
-	private Iterable<Class> annotationBeanRegistry;
-
-	private Edits edits;
-
-	public AnnotationTools() {
-		setAnnotationBeanRegistry(getSpiRegistry());
-		setEdits(EditsRegistry.getEdits());
-	}
-
-	protected static Iterable<Class> getSpiRegistry() {
-		return new SpiRegistry(ApplicationRuntime
-				.getInstance().getRavenRepository(), AnnotationBeanSPI.class
-				.getCanonicalName(), AnnotationTools.class.getClassLoader());
-	}
-
-	@SuppressWarnings("unchecked")
-	public AnnotationTools(Iterable<Class> annotationBeanRegistry, Edits edits) {
-		setAnnotationBeanRegistry(annotationBeanRegistry);
-		setEdits(edits);
-	}
-
-	public Edit<?> addAnnotation(Annotated<?> annotated, AnnotationBeanSPI a) {
-		return getEdits().getAddAnnotationChainEdit(annotated, a);
-	}
-
-	private Edits getEdits() {
-		return edits;
-	}
-
-	@SuppressWarnings("unchecked")
-	public AnnotationBeanSPI getAnnotation(Annotated<?> annotated,
-			Class annotationClass) {
-		AnnotationBeanSPI result = null;
-		Date latestDate = null;
-		for (AnnotationChain chain : annotated.getAnnotations()) {
-			for (AnnotationAssertion<?> assertion : chain.getAssertions()) {
-				AnnotationBeanSPI detail = assertion.getDetail();
-				if (annotationClass.isInstance(detail)) {
-					Date assertionDate = assertion.getCreationDate();
-					if ((latestDate == null)
-							|| latestDate.before(assertionDate)) {
-						result = detail;
-						latestDate = assertionDate;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	@SuppressWarnings("unchecked")
-	public Iterable<Class<? extends AnnotationBeanSPI>> getAnnotationBeanClasses() {
-		// Mega casting mega trick!
-		Iterable registry = getAnnotationBeanRegistry();
-		return (Iterable<Class<? extends AnnotationBeanSPI>>) registry;
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T> List<Class<? extends T>> getAnnotationBeanClasses(
-			Class<T> superClass) {
-		List<Class<? extends T>> results = new ArrayList<Class<? extends T>>();
-		for (Class<? extends AnnotationBeanSPI> annotationBeanClass : getAnnotationBeanClasses()) {
-			if (superClass.isAssignableFrom(annotationBeanClass)) {
-				results.add((Class<? extends T>) annotationBeanClass);
-			}
-		}
-		return results;
-	}
-
-	@SuppressWarnings("unchecked")
-	public List<Class> getAnnotatingClasses(Annotated annotated) {
-		List<Class> result = new ArrayList<Class>();
-		for (Class<? extends AbstractTextualValueAssertion> c : getAnnotationBeanClasses(AbstractTextualValueAssertion.class)) {
-			AppliesTo appliesToAnnotation = (AppliesTo) c
-					.getAnnotation(AppliesTo.class);
-			if (appliesToAnnotation == null) {
-				continue;
-			}
-			for (Class<?> target : appliesToAnnotation.targetObjectType()) {
-				if (target.isInstance(annotated)) {
-					result.add(c);
-				}
-			}
-		}
-		return result;
-	}
-
-	public Edit<?> setAnnotationString(Annotated<?> annotated, Class<?> c,
-			String value) {
-		AbstractTextualValueAssertion a = null;
-		try {
-			logger.info("Setting " + c.getCanonicalName() + " to " + value);
-			a = (AbstractTextualValueAssertion) c.newInstance();
-		} catch (InstantiationException e) {
-			// TODO Auto-generated catch block
-			logger.error(e);
-		} catch (IllegalAccessException e) {
-			// TODO Auto-generated catch block
-			logger.error(e);
-		}
-		a.setText(value);
-		return (addAnnotation(annotated, a));
-	}
-
-	@SuppressWarnings("unchecked")
-	public String getAnnotationString(Annotated<?> annotated,
-			Class annotationClass, String missingValue) {
-		AbstractTextualValueAssertion a = (AbstractTextualValueAssertion) getAnnotation(
-				annotated, annotationClass);
-		if (a == null) {
-			return missingValue;
-		}
-		return a.getText();
-	}
-
-	public void setEdits(Edits edits) {
-		this.edits = edits;
-	}
-
-	public void setAnnotationBeanRegistry(Iterable<Class> annotationBeanRegistry) {
-		this.annotationBeanRegistry = annotationBeanRegistry;
-	}
-
-	public Iterable<Class> getAnnotationBeanRegistry() {
-		return annotationBeanRegistry;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/NamedWorkflowEntityComparator.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/NamedWorkflowEntityComparator.java
deleted file mode 100644
index a3fb9a7..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/NamedWorkflowEntityComparator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- **********************************************************************/
-package net.sf.taverna.t2.workflowmodel.utils;
-
-import java.util.Comparator;
-
-import net.sf.taverna.t2.workflowmodel.NamedWorkflowEntity;
-
-/**
- * Compare two named workflow entities (such as a Processor) by their local
- * name.
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class NamedWorkflowEntityComparator implements
-		Comparator<NamedWorkflowEntity> {
-	public int compare(NamedWorkflowEntity o1, NamedWorkflowEntity o2) {
-		return o1.getLocalName().compareToIgnoreCase(o2.getLocalName());
-	}
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/PortComparator.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/PortComparator.java
deleted file mode 100644
index 9f42da2..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/PortComparator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * Copyright (C) 2009 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- **********************************************************************/
-package net.sf.taverna.t2.workflowmodel.utils;
-
-import java.util.Comparator;
-
-import net.sf.taverna.t2.workflowmodel.Port;
-
-/**
- * Compare two workflow ports by their name.
- * 
- * @author Stian Soiland-Reyes
- * 
- */
-public class PortComparator implements Comparator<Port> {
-
-	public int compare(Port o1, Port o2) {
-		return o1.getName().compareToIgnoreCase(o2.getName());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/Tools.java b/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/Tools.java
deleted file mode 100644
index 037581e..0000000
--- a/trunk/workflowmodel-impl/src/main/java/net/sf/taverna/t2/workflowmodel/utils/Tools.java
+++ /dev/null
@@ -1,955 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.utils;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import net.sf.taverna.t2.workflowmodel.CompoundEdit;
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EditsRegistry;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.InputPort;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-import net.sf.taverna.t2.workflowmodel.MergeOutputPort;
-import net.sf.taverna.t2.workflowmodel.NamedWorkflowEntity;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.Port;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.TokenProcessingEntity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.NestedDataflow;
-
-/**
- * Various workflow model tools that can be helpful when constructing a
- * dataflow.
- * <p>
- * Not to be confused with the @deprecated
- * {@link net.sf.taverna.t2.workflowmodel.impl.Tools}
- * 
- * @author David Withers
- * @author Stian Soiland-Reyes
- * 
- */
-public class Tools {
-
-	private static Edits edits = EditsRegistry.getEdits();
-
-	/**
-	 * Find (and possibly create) an EventHandlingInputPort.
-	 * <p>
-	 * If the given inputPort is an instance of {@link EventHandlingInputPort},
-	 * it is returned directly. If it is an ActivityInputPort - the owning
-	 * processors (found by searching the dataflow) will be searced for a mapped
-	 * input port. If this cannot be found, one will be created and mapped. The
-	 * edits for this will be added to the editList and needs to be executed by
-	 * the caller.
-	 * 
-	 * @see #findEventHandlingOutputPort(List, Dataflow, OutputPort)
-	 * @param editList
-	 *            List of {@link Edit}s to append any required edits (yet to be
-	 *            performed) to
-	 * @param dataflow
-	 *            Dataflow containing the processors
-	 * @param inputPort
-	 *            An EventHandlingInputPort or ActivityInputPort
-	 * @return The found or created EventHandlingInputPort
-	 */
-	@SuppressWarnings("unchecked")
-	protected static EventHandlingInputPort findEventHandlingInputPort(
-			List<Edit<?>> editList, Dataflow dataflow, InputPort inputPort) {
-		if (inputPort instanceof EventHandlingInputPort) {
-			return (EventHandlingInputPort) inputPort;
-		} else if (!(inputPort instanceof ActivityInputPort)) {
-			throw new IllegalArgumentException("Unknown input port type for "
-					+ inputPort);
-		}
-		ActivityInputPort activityInput = (ActivityInputPort) inputPort;
-		Collection<Processor> processors = Tools
-				.getProcessorsWithActivityInputPort(dataflow, activityInput);
-		if (processors.isEmpty()) {
-			throw new IllegalArgumentException("Can't find ActivityInputPort "
-					+ activityInput.getName() + " in workflow " + dataflow);
-		}
-		// FIXME: Assumes only one matching processor
-		Processor processor = processors.iterator().next();
-		Activity activity = null;
-		for (Activity checkActivity : processor.getActivityList()) {
-			if (checkActivity.getInputPorts().contains(activityInput)) {
-				activity = checkActivity;
-				break;
-			}
-		}
-		if (activity == null) {
-			throw new IllegalArgumentException("Can't find activity for port "
-					+ activityInput.getName() + "within processor " + processor);
-		}
-
-		ProcessorInputPort input = Tools.getProcessorInputPort(processor,
-				activity, activityInput);
-		if (input != null) {
-			return input;
-		}
-		// port doesn't exist so create a processor port and map it
-		String processorPortName = uniquePortName(activityInput.getName(),
-				processor.getInputPorts());
-		ProcessorInputPort processorInputPort = edits.createProcessorInputPort(
-				processor, processorPortName, activityInput.getDepth());
-		editList.add(edits.getAddProcessorInputPortEdit(processor,
-				processorInputPort));
-		editList.add(edits.getAddActivityInputPortMappingEdit(activity,
-				processorPortName, activityInput.getName()));
-		return processorInputPort;
-	}
-
-	/**
-	 * Find (and possibly create) an EventForwardingOutputPort.
-	 * <p>
-	 * If the given outputPort is an instance of
-	 * {@link EventForwardingOutputPort}, it is returned directly. If it is an
-	 * ActivityOutputPort - the owning processors (found by searching the
-	 * dataflow) will be searced for a mapped output port. If this cannot be
-	 * found, one will be created and mapped. The edits for this will be added
-	 * to the editList and needs to be executed by the caller.
-	 * 
-	 * @see #findEventHandlingInputPort(List, Dataflow, InputPort)
-	 * @param editList
-	 *            List of {@link Edit}s to append any required edits (yet to be
-	 *            performed) to
-	 * @param dataflow
-	 *            Dataflow containing the processors
-	 * @param outputPort
-	 *            An EventForwardingOutputPort or ActivityOutputPort
-	 * @return The found or created EventForwardingOutputPort
-	 */
-	@SuppressWarnings("unchecked")
-	protected static EventForwardingOutputPort findEventHandlingOutputPort(
-			List<Edit<?>> editList, Dataflow dataflow, OutputPort outputPort) {
-		if (outputPort instanceof EventForwardingOutputPort) {
-			return (EventForwardingOutputPort) outputPort;
-		} else if (!(outputPort instanceof ActivityOutputPort)) {
-			throw new IllegalArgumentException("Unknown output port type for "
-					+ outputPort);
-		}
-		ActivityOutputPort activityOutput = (ActivityOutputPort) outputPort;
-		Collection<Processor> processors = Tools
-				.getProcessorsWithActivityOutputPort(dataflow, activityOutput);
-		if (processors.isEmpty()) {
-			throw new IllegalArgumentException("Can't find ActivityOutputPort "
-					+ activityOutput.getName() + " in workflow " + dataflow);
-		}
-		// FIXME: Assumes only one matching processor
-		Processor processor = processors.iterator().next();
-		Activity activity = null;
-		for (Activity checkActivity : processor.getActivityList()) {
-			if (checkActivity.getOutputPorts().contains(activityOutput)) {
-				activity = checkActivity;
-				break;
-			}
-		}
-		if (activity == null) {
-			throw new IllegalArgumentException("Can't find activity for port "
-					+ activityOutput.getName() + "within processor "
-					+ processor);
-		}
-
-		ProcessorOutputPort processorOutputPort = Tools.getProcessorOutputPort(
-				processor, activity, activityOutput);
-		if (processorOutputPort != null) {
-			return processorOutputPort;
-		}
-		// port doesn't exist so create a processor port and map it
-		String processorPortName = uniquePortName(activityOutput.getName(),
-				processor.getOutputPorts());
-		processorOutputPort = edits.createProcessorOutputPort(processor,
-				processorPortName, activityOutput.getDepth(), activityOutput
-						.getGranularDepth());
-		editList.add(edits.getAddProcessorOutputPortEdit(processor,
-				processorOutputPort));
-		editList.add(edits.getAddActivityOutputPortMappingEdit(activity,
-				processorPortName, activityOutput.getName()));
-
-		return processorOutputPort;
-	}
-
-	/**
-	 * Creates an Edit that creates a Datalink between a source and sink port
-	 * and connects the Datalink.
-	 * 
-	 * If the sink port already has a Datalink connected this method checks if a
-	 * new Merge is required and creates and connects the required Datalinks.
-	 * 
-	 * @param dataflow
-	 *            the Dataflow to add the Datalink to
-	 * @param source
-	 *            the source of the Datalink
-	 * @param sink
-	 *            the source of the Datalink
-	 * @return an Edit that creates a Datalink between a source and sink port
-	 *         and connects the Datalink
-	 */
-	public static Edit<?> getCreateAndConnectDatalinkEdit(Dataflow dataflow,
-			EventForwardingOutputPort source, EventHandlingInputPort sink) {
-		Edit<?> edit = null;
-
-		Datalink incomingLink = sink.getIncomingLink();
-		if (incomingLink == null) {
-			Datalink datalink = edits.createDatalink(source, sink);
-			edit = edits.getConnectDatalinkEdit(datalink);
-		} else {
-			List<Edit<?>> editList = new ArrayList<Edit<?>>();
-
-			Merge merge = null;
-			int counter = 0; // counter for merge input port names
-			if (incomingLink.getSource() instanceof MergeOutputPort) {
-				merge = ((MergeOutputPort) incomingLink.getSource()).getMerge();
-			} else {
-				merge = edits.createMerge(dataflow);
-				editList.add(edits.getAddMergeEdit(dataflow, merge));
-				editList.add(edits.getDisconnectDatalinkEdit(incomingLink));
-				MergeInputPort mergeInputPort = edits.createMergeInputPort(
-						merge, getUniqueMergeInputPortName(merge, incomingLink
-								.getSource().getName()
-								+ "To" + merge.getLocalName() + "_input",
-								counter++), incomingLink.getSink().getDepth());
-				editList.add(edits.getAddMergeInputPortEdit(merge,
-						mergeInputPort));
-				Datalink datalink = edits.createDatalink(incomingLink
-						.getSource(), mergeInputPort);
-				editList.add(edits.getConnectDatalinkEdit(datalink));
-				datalink = edits.createDatalink(merge.getOutputPort(),
-						incomingLink.getSink());
-				editList.add(edits.getConnectDatalinkEdit(datalink));
-			}
-			MergeInputPort mergeInputPort = edits.createMergeInputPort(merge,
-					getUniqueMergeInputPortName(merge, source.getName() + "To"
-							+ merge.getLocalName() + "_input", counter), sink
-							.getDepth());
-			editList.add(edits.getAddMergeInputPortEdit(merge, mergeInputPort));
-			Datalink datalink = edits.createDatalink(source, mergeInputPort);
-			editList.add(edits.getConnectDatalinkEdit(datalink));
-
-			edit = new CompoundEdit(editList);
-		}
-
-		return edit;
-	}
-
-	/**
-	 * Get an {@link Edit} that will link the given output port to the given
-	 * input port.
-	 * <p>
-	 * The output port can be an {@link EventForwardingOutputPort} (such as an
-	 * {@link ProcessorOutputPort}, or an {@link ActivityOutputPort}. The input
-	 * port can be an {@link EventHandlingInputPort} (such as an
-	 * {@link ProcessorInputPort}, or an {@link ActivityInputPort}.
-	 * <p>
-	 * If an input and/or output port is an activity port, processors in the
-	 * given dataflow will be searched for matching mappings, create the
-	 * processor port and mapping if needed, before constructing the edits for
-	 * adding the datalink.
-	 * 
-	 * @param dataflow
-	 *            Dataflow (indirectly) containing ports
-	 * @param outputPort
-	 *            An {@link EventForwardingOutputPort} or an
-	 *            {@link ActivityOutputPort}
-	 * @param inputPort
-	 *            An {@link EventHandlingInputPort} or an
-	 *            {@link ActivityInputPort}
-	 * @return A compound edit for creating and connecting the datalink and any
-	 *         neccessary processor ports and mappings
-	 */
-	public static Edit<?> getCreateAndConnectDatalinkEdit(Dataflow dataflow,
-			OutputPort outputPort, InputPort inputPort) {
-
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-		EventHandlingInputPort sink = findEventHandlingInputPort(editList,
-				dataflow, inputPort);
-		EventForwardingOutputPort source = findEventHandlingOutputPort(
-				editList, dataflow, outputPort);
-		editList.add(getCreateAndConnectDatalinkEdit(dataflow, source, sink));
-		return new CompoundEdit(editList);
-	}
-
-	/**
-	 * Find a unique port name given a list of existing ports.
-	 * <p>
-	 * If needed, the returned port name will be prefixed with an underscore and a number, 
-	 * starting from 2. (The original being 'number 1')
-	 * <p>
-	 * Although not strictly needed by Taverna, for added user friendliness the
-	 * case of the existing port names are ignored when checking for uniqueness.
-	 * 
-	 * @see #uniqueProcessorName(String, Dataflow)
-	 * 
-	 * @param suggestedPortName
-	 *            Port name suggested for new port
-	 * @param existingPorts
-	 *            Collection of existing {@link Port}s
-	 * @return A port name unique for the given collection of port
-	 */
-	public static String uniquePortName(String suggestedPortName,
-			Collection<? extends Port> existingPorts) {
-		// Make sure we have a unique port name
-		Set<String> existingNames = new HashSet<String>();
-		for (Port existingPort : existingPorts) {
-			existingNames.add(existingPort.getName().toLowerCase());
-		}
-		String candidateName = suggestedPortName;
-		long counter = 2;
-		while (existingNames.contains(candidateName.toLowerCase())) {
-			candidateName = suggestedPortName + "_" + counter++;
-		}
-		return candidateName;
-	}
-
-	public static Edit<?> getMoveDatalinkSinkEdit(Dataflow dataflow,
-			Datalink datalink, EventHandlingInputPort sink) {
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-		editList.add(edits.getDisconnectDatalinkEdit(datalink));
-		if (datalink.getSink() instanceof ProcessorInputPort) {
-			editList
-					.add(getRemoveProcessorInputPortEdit((ProcessorInputPort) datalink
-							.getSink()));
-		}
-		editList.add(getCreateAndConnectDatalinkEdit(dataflow, datalink
-				.getSource(), sink));
-		return new CompoundEdit(editList);
-	}
-
-	public static Edit<?> getDisconnectDatalinkAndRemovePortsEdit(
-			Datalink datalink) {
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-		editList.add(edits.getDisconnectDatalinkEdit(datalink));
-		if (datalink.getSource() instanceof ProcessorOutputPort) {
-			ProcessorOutputPort processorOutputPort = (ProcessorOutputPort) datalink
-					.getSource();
-			if (processorOutputPort.getOutgoingLinks().size() == 1) {
-				editList
-						.add(getRemoveProcessorOutputPortEdit(processorOutputPort));
-			}
-		}
-		if (datalink.getSink() instanceof ProcessorInputPort) {
-			editList
-					.add(getRemoveProcessorInputPortEdit((ProcessorInputPort) datalink
-							.getSink()));
-		}
-		return new CompoundEdit(editList);
-	}
-
-	public static Edit<?> getRemoveProcessorOutputPortEdit(
-			ProcessorOutputPort port) {
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-		Processor processor = port.getProcessor();
-		editList.add(edits.getRemoveProcessorOutputPortEdit(
-				port.getProcessor(), port));
-		for (Activity<?> activity : processor.getActivityList()) {
-			editList.add(edits.getRemoveActivityOutputPortMappingEdit(activity,
-					port.getName()));
-		}
-		return new CompoundEdit(editList);
-	}
-
-	public static Edit<?> getRemoveProcessorInputPortEdit(
-			ProcessorInputPort port) {
-		List<Edit<?>> editList = new ArrayList<Edit<?>>();
-		Processor processor = port.getProcessor();
-		editList.add(edits.getRemoveProcessorInputPortEdit(port.getProcessor(),
-				port));
-		for (Activity<?> activity : processor.getActivityList()) {
-			editList.add(edits.getRemoveActivityInputPortMappingEdit(activity,
-					port.getName()));
-		}
-		return new CompoundEdit(editList);
-	}
-
-	public static ProcessorInputPort getProcessorInputPort(Processor processor,
-			Activity<?> activity, InputPort activityInputPort) {
-		ProcessorInputPort result = null;
-		for (Entry<String, String> mapEntry : activity.getInputPortMapping()
-				.entrySet()) {
-			if (mapEntry.getValue().equals(activityInputPort.getName())) {
-				for (ProcessorInputPort processorInputPort : processor
-						.getInputPorts()) {
-					if (processorInputPort.getName().equals(mapEntry.getKey())) {
-						result = processorInputPort;
-						break;
-					}
-				}
-				break;
-			}
-		}
-		return result;
-	}
-
-	public static ProcessorOutputPort getProcessorOutputPort(
-			Processor processor, Activity<?> activity,
-			OutputPort activityOutputPort) {
-		ProcessorOutputPort result = null;
-		for (Entry<String, String> mapEntry : activity.getOutputPortMapping()
-				.entrySet()) {
-			if (mapEntry.getValue().equals(activityOutputPort.getName())) {
-				for (ProcessorOutputPort processorOutputPort : processor
-						.getOutputPorts()) {
-					if (processorOutputPort.getName().equals(mapEntry.getKey())) {
-						result = processorOutputPort;
-						break;
-					}
-				}
-				break;
-			}
-		}
-		return result;
-	}
-
-	public static ActivityInputPort getActivityInputPort(Activity<?> activity,
-			String portName) {
-		ActivityInputPort activityInputPort = null;
-		for (ActivityInputPort inputPort : activity.getInputPorts()) {
-			if (inputPort.getName().equals(portName)) {
-				activityInputPort = inputPort;
-				break;
-			}
-		}
-		return activityInputPort;
-	}
-
-	public static OutputPort getActivityOutputPort(Activity<?> activity,
-			String portName) {
-		OutputPort activityOutputPort = null;
-		for (OutputPort outputPort : activity.getOutputPorts()) {
-			if (outputPort.getName().equals(portName)) {
-				activityOutputPort = outputPort;
-				break;
-			}
-		}
-		return activityOutputPort;
-	}
-
-	public static String getUniqueMergeInputPortName(Merge merge, String name,
-			int count) {
-		String uniqueName = name + count;
-		for (MergeInputPort mergeInputPort : merge.getInputPorts()) {
-			if (mergeInputPort.getName().equals(uniqueName)) {
-				return getUniqueMergeInputPortName(merge, name, ++count);
-			}
-		}
-		return uniqueName;
-	}
-
-	public static Collection<Processor> getProcessorsWithActivity(
-			Dataflow dataflow, Activity<?> activity) {
-		Set<Processor> processors = new HashSet<Processor>();
-		for (Processor processor : dataflow.getProcessors()) {
-			if (processor.getActivityList().contains(activity)) {
-				processors.add(processor);
-			}
-		}
-		return processors;
-
-	}
-
-	public static Collection<Processor> getProcessorsWithActivityInputPort(
-			Dataflow dataflow, ActivityInputPort inputPort) {
-
-		Set<Processor> processors = new HashSet<Processor>();
-		for (Processor processor : dataflow.getProcessors()) {
-
-			// Does it contain a nested workflow?
-			if (containsNestedWorkflow(processor)) {
-				// Get the nested workflow and check all its nested processors
-				Dataflow nestedWorkflow = ((NestedDataflow) processor
-						.getActivityList().get(0)).getNestedDataflow();
-				Collection<Processor> nested_processors = getProcessorsWithActivityInputPort(
-						nestedWorkflow, inputPort);
-				if (!nested_processors.isEmpty())
-					processors.addAll(nested_processors);
-			}
-
-			// Check all processor's activities (even if the processor contained
-			// a nested workflow,
-			// as its dataflow activity still contains input and output ports)
-			for (Activity<?> activity : processor.getActivityList()) {
-
-				if (activity.getInputPorts().contains(inputPort)) {
-					processors.add(processor);
-				}
-			}
-		}
-		return processors;
-	}
-
-	public static Collection<Processor> getProcessorsWithActivityOutputPort(
-			Dataflow dataflow, OutputPort outputPort) {
-		Set<Processor> processors = new HashSet<Processor>();
-		for (Processor processor : dataflow.getProcessors()) {
-
-			// Does it contain a nested workflow?
-			if (containsNestedWorkflow(processor)) {
-				// Get the nested workflow and check all its nested processors
-				Dataflow nestedWorkflow = ((NestedDataflow) processor
-						.getActivityList().get(0)).getNestedDataflow();
-				Collection<Processor> nested_processors = getProcessorsWithActivityOutputPort(
-						nestedWorkflow, outputPort);
-				if (!nested_processors.isEmpty())
-					processors.addAll(nested_processors);
-			}
-
-			// Check all processor's activities (even if the processor contained
-			// a nested workflow,
-			// as its dataflow activity still contains input and output ports)
-			for (Activity<?> activity : processor.getActivityList()) {
-
-				if (activity.getOutputPorts().contains(outputPort)) {
-					processors.add(processor);
-				}
-			}
-		}
-		return processors;
-	}
-
-	/**
-	 * Get the TokenProcessingEntity (Processor, Merge or Dataflow) from the
-	 * workflow that contains the given EventForwardingOutputPort. This can be
-	 * an output port of a Processor or a Merge or an input port of a Dataflow
-	 * that has an internal EventForwardingOutputPort attached to it.
-	 * 
-	 * @param port
-	 * @param workflow
-	 * @return
-	 */
-	public static TokenProcessingEntity getTokenProcessingEntityWithEventForwardingOutputPort(
-			EventForwardingOutputPort port, Dataflow workflow) {
-
-		// First check the workflow's inputs
-		for (DataflowInputPort input : workflow.getInputPorts()) {
-			if (input.getInternalOutputPort().equals(port)) {
-				return workflow;
-			}
-		}
-
-		// Check workflow's merges
-		List<? extends Merge> merges = workflow.getMerges();
-		for (Merge merge : merges) {
-			if (merge.getOutputPort().equals(port)) {
-				return merge;
-			}
-		}
-
-		// Check workflow's processors
-		List<? extends Processor> processors = workflow.getProcessors();
-		for (Processor processor : processors) {
-			for (OutputPort output : processor.getOutputPorts()) {
-				if (output.equals(port)) {
-					return processor;
-				}
-			}
-
-			// If processor contains a nested workflow - descend into it
-			if (containsNestedWorkflow(processor)) {
-				Dataflow nestedWorkflow = ((NestedDataflow) processor
-						.getActivityList().get(0)).getNestedDataflow();
-				TokenProcessingEntity entity = getTokenProcessingEntityWithEventForwardingOutputPort(
-						port, nestedWorkflow);
-				if (entity != null) {
-					return entity;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Get the TokenProcessingEntity (Processor, Merge or Dataflow) from the
-	 * workflow that contains the given target EventHandlingInputPort. This can
-	 * be an input port of a Processor or a Merge or an output port of a
-	 * Dataflow that has an internal EventHandlingInputPort attached to it.
-	 * 
-	 * @param port
-	 * @param workflow
-	 * @return
-	 */
-	public static TokenProcessingEntity getTokenProcessingEntityWithEventHandlingInputPort(
-			EventHandlingInputPort port, Dataflow workflow) {
-
-		// First check the workflow's outputs
-		for (DataflowOutputPort output : workflow.getOutputPorts()) {
-			if (output.getInternalInputPort().equals(port)) {
-				return workflow;
-			}
-		}
-
-		// Check workflow's merges
-		List<? extends Merge> merges = workflow.getMerges();
-		for (Merge merge : merges) {
-			for (EventHandlingInputPort input : merge.getInputPorts()) {
-				if (input.equals(port)) {
-					return merge;
-				}
-			}
-		}
-
-		// Check workflow's processors
-		List<? extends Processor> processors = workflow.getProcessors();
-		for (Processor processor : processors) {
-			for (EventHandlingInputPort output : processor.getInputPorts()) {
-				if (output.equals(port)) {
-					return processor;
-				}
-			}
-
-			// If processor contains a nested workflow - descend into it
-			if (containsNestedWorkflow(processor)) {
-				Dataflow nestedWorkflow = ((NestedDataflow) processor
-						.getActivityList().get(0)).getNestedDataflow();
-				TokenProcessingEntity entity = getTokenProcessingEntityWithEventHandlingInputPort(
-						port, nestedWorkflow);
-				if (entity != null) {
-					return entity;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns true if processor contains a nested workflow.
-	 */
-	public static boolean containsNestedWorkflow(Processor processor) {
-		return ((!processor.getActivityList().isEmpty()) && processor
-				.getActivityList().get(0) instanceof NestedDataflow);
-	}
-
-	/**
-	 * Find processors that a given processor can connect to downstream.
-	 * <p>
-	 * This is calculated as all processors in the dataflow, except the
-	 * processor itself, and any processor <em>upstream</em>, following both
-	 * data links and conditional links.
-	 * 
-	 * @see #possibleUpStreamProcessors(Dataflow, Processor)
-	 * @see #splitProcessors(Collection, Processor)
-	 * 
-	 * @param dataflow
-	 *            Dataflow from where to find processors
-	 * @param processor
-	 *            Processor which is to be connected
-	 * @return A set of possible downstream processors
-	 */
-	public static Set<Processor> possibleDownStreamProcessors(
-			Dataflow dataflow, Processor processor) {
-		ProcessorSplit splitProcessors = splitProcessors(dataflow
-				.getProcessors(), processor);
-		Set<Processor> possibles = new HashSet<Processor>(splitProcessors
-				.getUnconnected());
-		possibles.addAll(splitProcessors.getDownStream());
-		return possibles;
-	}
-
-	/**
-	 * Find processors that a given processor can connect to upstream.
-	 * <p>
-	 * This is calculated as all processors in the dataflow, except the
-	 * processor itself, and any processor <em>downstream</em>, following both
-	 * data links and conditional links.
-	 * 
-	 * @see #possibleDownStreamProcessors(Dataflow, Processor)
-	 * @see #splitProcessors(Collection, Processor)
-	 * 
-	 * @param dataflow
-	 *            Dataflow from where to find processors
-	 * @param processor
-	 *            Processor which is to be connected
-	 * @return A set of possible downstream processors
-	 */
-	public static Set<Processor> possibleUpStreamProcessors(Dataflow dataflow,
-			Processor firstProcessor) {
-		ProcessorSplit splitProcessors = splitProcessors(dataflow
-				.getProcessors(), firstProcessor);
-		Set<Processor> possibles = new HashSet<Processor>(splitProcessors
-				.getUnconnected());
-		possibles.addAll(splitProcessors.getUpStream());
-		return possibles;
-	}
-
-	/**
-	 * 
-	 * @param processors
-	 * @param splitPoint
-	 * @return
-	 */
-	public static ProcessorSplit splitProcessors(
-			Collection<? extends Processor> processors, Processor splitPoint) {
-		Set<Processor> upStream = new HashSet<Processor>();
-		Set<Processor> downStream = new HashSet<Processor>();
-		Set<TokenProcessingEntity> queue = new HashSet<TokenProcessingEntity>();
-
-		queue.add(splitPoint);
-
-		// First let's go upstream
-		while (!queue.isEmpty()) {
-			TokenProcessingEntity investigate = queue.iterator().next();
-			queue.remove(investigate);
-			if (investigate instanceof Processor) {
-				Processor processor = (Processor) investigate;
-				List<? extends Condition> preConditions = processor
-						.getPreconditionList();
-				for (Condition condition : preConditions) {
-					Processor upstreamProc = condition.getControl();
-					if (!upStream.contains(upstreamProc)) {
-						upStream.add(upstreamProc);
-						queue.add(upstreamProc);
-					}
-				}
-			}
-			for (EventHandlingInputPort inputPort : investigate.getInputPorts()) {
-				Datalink incomingLink = inputPort.getIncomingLink();
-				if (incomingLink == null) {
-					continue;
-				}
-				EventForwardingOutputPort source = incomingLink.getSource();
-				if (source instanceof ProcessorOutputPort) {
-					Processor upstreamProc = ((ProcessorOutputPort) source)
-							.getProcessor();
-					if (!upStream.contains(upstreamProc)) {
-						upStream.add(upstreamProc);
-						queue.add(upstreamProc);
-					}
-				} else if (source instanceof MergeOutputPort) {
-					Merge merge = ((MergeOutputPort) source).getMerge();
-					queue.add(merge);
-					// The merge it self doesn't count as a processor
-				} else {
-					// Ignore
-				}
-			}
-		}
-		// Then downstream
-		queue.add(splitPoint);
-		while (!queue.isEmpty()) {
-			TokenProcessingEntity investigate = queue.iterator().next();
-			queue.remove(investigate);
-			if (investigate instanceof Processor) {
-				Processor processor = (Processor) investigate;
-				List<? extends Condition> controlledConditions = processor
-						.getControlledPreconditionList();
-				for (Condition condition : controlledConditions) {
-					Processor downstreamProc = condition.getTarget();
-					if (!downStream.contains(downstreamProc)) {
-						downStream.add(downstreamProc);
-						queue.add(downstreamProc);
-					}
-				}
-			}
-
-			for (EventForwardingOutputPort outputPort : investigate
-					.getOutputPorts()) {
-				for (Datalink datalink : outputPort.getOutgoingLinks()) {
-					EventHandlingInputPort sink = datalink.getSink();
-					if (sink instanceof ProcessorInputPort) {
-						Processor downstreamProcc = ((ProcessorInputPort) sink)
-								.getProcessor();
-						if (!downStream.contains(downstreamProcc)) {
-							downStream.add(downstreamProcc);
-							queue.add(downstreamProcc);
-						}
-					} else if (sink instanceof MergeInputPort) {
-						Merge merge = ((MergeInputPort) sink).getMerge();
-						queue.add(merge);
-						// The merge it self doesn't count as a processor
-					} else {
-						// Ignore dataflow ports
-					}
-				}
-			}
-		}
-		Set<Processor> undecided = new HashSet<Processor>(processors);
-		undecided.remove(splitPoint);
-		undecided.removeAll(upStream);
-		undecided.removeAll(downStream);
-		return new ProcessorSplit(splitPoint, upStream, downStream, undecided);
-	}
-
-	/**
-	 * Find the first processor that contains an activity that has the given
-	 * activity input port. See #get
-	 * 
-	 * @param dataflow
-	 * @param targetPort
-	 * @return
-	 */
-	public static Processor getFirstProcessorWithActivityInputPort(
-			Dataflow dataflow, ActivityInputPort targetPort) {
-		Collection<Processor> processorsWithActivityPort = getProcessorsWithActivityInputPort(
-				dataflow, targetPort);
-		for (Processor processor : processorsWithActivityPort) {
-			return processor;
-		}
-		return null;
-	}
-
-	public static Processor getFirstProcessorWithActivityOutputPort(
-			Dataflow dataflow, ActivityOutputPort targetPort) {
-		Collection<Processor> processorsWithActivityPort = getProcessorsWithActivityOutputPort(
-				dataflow, targetPort);
-		for (Processor processor : processorsWithActivityPort) {
-			return processor;
-		}
-		return null;
-	}
-
-	/**
-	 * Find a unique processor name for the supplied Dataflow, based upon the
-	 * preferred name. If needed, an underscore and a numeric suffix is added to
-	 * the preferred name, and incremented until it is unique, starting from 2.
-	 * (The original being 'number 1')
-	 * <p>
-	 * Note that this method checks the uniqueness against the names of all
-	 * {@link NamedWorkflowEntity}s, including {@link Merge}s.
-	 * <p>
-	 * Although not strictly needed by Taverna, for added user friendliness the
-	 * case of the existing port names are ignored when checking for uniqueness.
-	 * 
-	 * @param preferredName
-	 *            the preferred name for the Processor
-	 * @param dataflow
-	 *            the dataflow for which the Processor name needs to be unique
-	 * @return A unique processor name
-	 */
-	public static String uniqueProcessorName(String preferredName,
-			Dataflow dataflow) {
-
-		Set<String> existingNames = new HashSet<String>();
-
-		for (NamedWorkflowEntity entity : dataflow
-				.getEntities(NamedWorkflowEntity.class)) {
-			existingNames.add(entity.getLocalName().toLowerCase());
-		}
-		String uniqueName = preferredName;
-		long suffix = 2;
-		while (existingNames.contains(uniqueName.toLowerCase())) {
-			uniqueName = preferredName + "_" + suffix++;
-		}
-		return uniqueName;
-	}
-
-	/**
-	 * Result bean returned from
-	 * {@link Tools#splitProcessors(Collection, Processor)}.
-	 * 
-	 * @author Stian Soiland-Reyes
-	 * 
-	 */
-	public static class ProcessorSplit {
-
-		private final Processor splitPoint;
-		private final Set<Processor> upStream;
-		private final Set<Processor> downStream;
-		private final Set<Processor> unconnected;
-
-		/**
-		 * Processor that was used as a split point.
-		 * 
-		 * @return Split point processor
-		 */
-		public Processor getSplitPoint() {
-			return splitPoint;
-		}
-
-		/**
-		 * Processors that are upstream from the split point.
-		 * 
-		 * @return Upstream processors
-		 */
-		public Set<Processor> getUpStream() {
-			return upStream;
-		}
-
-		/**
-		 * Processors that are downstream from the split point.
-		 * 
-		 * @return Downstream processors
-		 */
-		public Set<Processor> getDownStream() {
-			return downStream;
-		}
-
-		/**
-		 * Processors that are unconnected to the split point.
-		 * <p>
-		 * These are processors in the dataflow that are neither upstream,
-		 * downstream or the split point itself.
-		 * <p>
-		 * Note that this does not imply a total graph separation, for instance
-		 * processors in {@link #getUpStream()} might have some of these
-		 * unconnected processors downstream, but not along the path to the
-		 * {@link #getSplitPoint()}, or they could be upstream from any
-		 * processor in {@link #getDownStream()}.
-		 * 
-		 * @return Processors unconnected from the split point
-		 */
-		public Set<Processor> getUnconnected() {
-			return unconnected;
-		}
-
-		/**
-		 * Construct a new processor split result.
-		 * 
-		 * @param splitPoint
-		 *            Processor used as split point
-		 * @param upStream
-		 *            Processors that are upstream from split point
-		 * @param downStream
-		 *            Processors that are downstream from split point
-		 * @param unconnected
-		 *            The rest of the processors, that are by definition
-		 *            unconnected to split point
-		 */
-		public ProcessorSplit(Processor splitPoint, Set<Processor> upStream,
-				Set<Processor> downStream, Set<Processor> unconnected) {
-			this.splitPoint = splitPoint;
-			this.upStream = upStream;
-			this.downStream = downStream;
-			this.unconnected = unconnected;
-		}
-
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.AnnotationBeanSPI b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.AnnotationBeanSPI
deleted file mode 100644
index 513d59e..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.AnnotationBeanSPI
+++ /dev/null
@@ -1,8 +0,0 @@
-net.sf.taverna.t2.annotation.annotationbeans.Author
-net.sf.taverna.t2.annotation.annotationbeans.DescriptiveTitle
-net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription
-net.sf.taverna.t2.annotation.annotationbeans.HostInstitution
-#net.sf.taverna.t2.annotation.annotationbeans.MimeType
-net.sf.taverna.t2.annotation.annotationbeans.DocumentationUrl
-net.sf.taverna.t2.annotation.annotationbeans.Optional
-net.sf.taverna.t2.annotation.annotationbeans.ExampleValue
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.AnnotationSourceSPI b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.AnnotationSourceSPI
deleted file mode 100644
index 051c82b..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.AnnotationSourceSPI
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.annotation.URISource
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.CurationEventBeanSPI b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.CurationEventBeanSPI
deleted file mode 100644
index e812aec..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.annotation.CurationEventBeanSPI
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.annotation.DisputeEventDetails
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.Edits b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.Edits
deleted file mode 100644
index 96c39a9..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.Edits
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.workflowmodel.impl.EditsImpl
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
deleted file mode 100644
index 66797ac..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.workflowmodel.impl.ProcessorHealthChecker
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.serialization.xml.XMLDeserializer b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.serialization.xml.XMLDeserializer
deleted file mode 100644
index e695d96..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.serialization.xml.XMLDeserializer
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.workflowmodel.serialization.xml.XMLDeserializerImpl
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializer b/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializer
deleted file mode 100755
index 1333a57..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializer
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.workflowmodel.serialization.xml.XMLSerializerImpl
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/main/resources/provenanceContext.xml b/trunk/workflowmodel-impl/src/main/resources/provenanceContext.xml
deleted file mode 100644
index 9533e0f..0000000
--- a/trunk/workflowmodel-impl/src/main/resources/provenanceContext.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- Context providing ProvenanceItems for the workflow facade and dispatch stack -->
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:raven="http://taverna.sf.net/schema/artifact-support"
-	xsi:schemaLocation="http://www.springframework.org/schema/beans 
-	http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
-	http://taverna.sf.net/schema/artifact-support 
-	http://taverna.sf.net/schema/artifact-support/artifact-support.xsd">
-
-	<!--<import resource="context-parts/raven_local.xml" />
-	<import resource="context-parts/dao_inmemory.xml" />
-	<import resource="context-parts/componentservices.xml" />
-	<import resource="context-parts/referenceservice.xml" />
-
-	-->
-	<bean id="workflowProvenanceItem"
-		raven:artifact="net.sf.taverna.t2.core:provenanceconnector-impl:0.8"
-		raven:repository="raven.repository"
-		class="net.sf.taverna.t2.provenance.item.WorkflowProvenanceItem" />
-
-</beans>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/annotation/TestAnnotationRegistries.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/annotation/TestAnnotationRegistries.java
deleted file mode 100644
index 206b97d..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/annotation/TestAnnotationRegistries.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import net.sf.taverna.t2.annotation.spi.AnnotationBeanRegistry;
-import net.sf.taverna.t2.annotation.spi.AnnotationSourceRegistry;
-import net.sf.taverna.t2.annotation.spi.CurationEventBeanRegistry;
-
-import org.junit.Test;
-
-public class TestAnnotationRegistries {
-	
-	@Test
-	public void testAnnotationBeanSPI() {
-		
-		AnnotationBeanRegistry registry = new AnnotationBeanRegistry();
-		for (AnnotationBeanSPI bean:registry.getInstances()){
-			System.out.println(bean.getClass().getCanonicalName());
-		}
-		
-	}
-	
-	@Test
-	public void testAnnotationSourceSPICurationEventBeanSPI() {
-		
-		AnnotationSourceRegistry registry = new AnnotationSourceRegistry();
-		for (AnnotationSourceSPI source:registry.getInstances()) {
-			System.out.println(source.getClass().getCanonicalName());
-		}
-		
-	}
-	
-	@Test
-	public void testCurationEventBeanSPI() {
-		
-		CurationEventBeanRegistry registry = new CurationEventBeanRegistry();
-		for (CurationEventBeanSPI bean:registry.getInstances()) {
-			System.out.println(bean.getClass().getCanonicalName());
-		}
-		
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/annotation/TestAnnotations.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/annotation/TestAnnotations.java
deleted file mode 100644
index c1f8324..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/annotation/TestAnnotations.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.annotation;
-
-import static org.junit.Assert.*;
-
-import java.lang.annotation.Annotation;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription;
-import net.sf.taverna.t2.annotation.annotationbeans.MimeType;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EditsRegistry;
-import net.sf.taverna.t2.workflowmodel.impl.DummyDataflow;
-
-import org.junit.Test;
-
-public class TestAnnotations {
-
-	@SuppressWarnings("unchecked")
-	@Test
-	public void getAnnotationsForADataFlow() {
-
-		Edits edits = EditsRegistry.getEdits();
-
-		FreeTextDescription freeTextDescription = new FreeTextDescription();
-		freeTextDescription.setText("i am the mime type for some object");
-		MimeType mimeType = new MimeType();
-		mimeType.setText("text/plain");
-		Person person1 = new PersonImpl("A person");
-		Person person2 = new PersonImpl("Another person");
-		List<Person> personList = new ArrayList<Person>();
-		personList.add(person1);
-		personList.add(person2);
-
-		@SuppressWarnings("unused")
-		AnnotationSourceSPI annotationSource = null;
-		try {
-			annotationSource = new URISource(new URI("http://google.com"));
-		} catch (URISyntaxException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		}
-		AnnotationAssertion annotationAssertionImpl = new AnnotationAssertionImpl();
-		Edit<AnnotationAssertion> addAnnotationBean = edits
-				.getAddAnnotationBean(annotationAssertionImpl,
-						mimeType);
-
-		
-		
-		try {
-			addAnnotationBean.doEdit();
-		} catch (EditException e2) {
-			// TODO Auto-generated catch block
-			e2.printStackTrace();
-		}
-
-		// AnnotationAssertion<FreeTextDescription> annotationAssertion = new
-		// AnnotationAssertionImpl(
-		// freeTextDescription, AnnotationRole.INITIAL_ASSERTION,
-		// personList, annotationSource);
-
-		AnnotationChain annotationChain = new AnnotationChainImpl();
-		// not 100% convinced that the edits should be in the EditsImpl but it
-		// doesn't seem to fit in with AbstractAnnotatedThing either
-
-		Edit<AnnotationChain> addAnnotationAssertionEdit = edits
-				.getAddAnnotationAssertionEdit(annotationChain,
-						annotationAssertionImpl);
-		try {
-			addAnnotationAssertionEdit.doEdit();
-		} catch (EditException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		}
-
-		assertFalse("There were no assertions", annotationChain.getAssertions().isEmpty());
-
-		addAnnotationAssertionEdit.undo();
-
-		assertTrue("There were assertions", annotationChain.getAssertions().isEmpty());
-
-		try {
-			addAnnotationAssertionEdit.doEdit();
-		} catch (EditException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		}
-
-		assertFalse("There were no assertions", annotationChain.getAssertions().isEmpty());
-
-		Dataflow dataflow = new DummyDataflow();
-
-		Edit<? extends Dataflow> addAnnotationEdit = dataflow
-				.getAddAnnotationEdit(annotationChain);
-
-		try {
-			addAnnotationEdit.doEdit();
-		} catch (EditException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-
-		for (AnnotationChain chain : dataflow.getAnnotations()) {
-			for (AnnotationAssertion assertion : chain.getAssertions()) {
-				// assume we do some sort of SPI lookup to figure out the
-				// classes!!
-				AnnotationBeanSPI detail = assertion.getDetail();
-				System.out.println(((MimeType) detail).getText());
-			}
-		}
-
-		for (Annotation annotation : freeTextDescription.getClass()
-				.getAnnotations()) {
-			if (annotation.annotationType() == AppliesTo.class) {
-				System.out.println("It's an applies to");
-				Class<?>[] targetObjectType = ((AppliesTo) annotation)
-						.targetObjectType();
-				for (Class clazz : targetObjectType) {
-					System.out.println(clazz.getCanonicalName());
-				}
-			}
-		}
-
-		for (AnnotationAssertion assertion : annotationChain.getAssertions()) {
-			System.out.println(assertion.getDetail().getClass());
-
-		}
-
-		Set<? extends AnnotationChain> annotations = dataflow.getAnnotations();
-
-		for (AnnotationChain chain : annotations) {
-			for (AnnotationAssertion assertion : chain.getAssertions()) {
-				System.out.println("class: " + assertion.getClass().getName());
-				// Do we need some sort of SPI look up thing to do this because
-				// we don't know what type of AnnotationBean we will be getting
-				// System.out.println("Detail: "
-				// + ((AnnotationAssertionImpl) assertion).getDetail()
-				// .getText());
-				
-				
-				
-				System.out.println("Creation date: "
-						+ assertion.getCreationDate());
-
-				// int x = 1;
-				// for (Person person : assertion.getCreators()) {
-				// System.out.println("Person " + x);
-				// x++;
-				// }
-				// for (CurationEvent event : assertion.getCurationAssertions())
-				// {
-				// System.out
-				// .println("CurationBeanSPI - what do you do with it?");
-				// }
-
-				System.out.println("Role: " + assertion.getRole());
-
-			}
-		}
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/monitor/impl/MonitorTreeModelTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/monitor/impl/MonitorTreeModelTest.java
deleted file mode 100644
index f9c7e90..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/monitor/impl/MonitorTreeModelTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.monitor.impl;
-
-import static org.junit.Assert.fail;
-
-import java.util.HashSet;
-
-import net.sf.taverna.t2.monitor.MonitorableProperty;
-
-import org.junit.Test;
-
-public class MonitorTreeModelTest {
-
-	@Test
-	public void testAddNodes() throws InterruptedException {
-		MonitorTreeModel m = MonitorTreeModel.getInstance();
-		m.registerNode(this, new String[] { "foo" },
-				new HashSet<MonitorableProperty<?>>());
-		m.registerNode(this, new String[] { "foo", "bar" },
-				new HashSet<MonitorableProperty<?>>());
-	}
-
-	@Test
-	public void testAddNodesShouldFail() {
-		MonitorTreeModel m = MonitorTreeModel.getInstance();
-		m.registerNode(this, new String[] { "foo" },
-				new HashSet<MonitorableProperty<?>>());
-		try {
-			m.registerNode(this, new String[] { "bar", "wibble" },
-					new HashSet<MonitorableProperty<?>>());
-			fail("Should have thrown index out of bounds exception");
-		} catch (IndexOutOfBoundsException ioobe) {
-			// Okay, should see this
-		}
-
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDatalinkEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDatalinkEditTest.java
deleted file mode 100644
index df07d9f..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/AbstractDatalinkEditTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author David Withers
- * 
- */
-public class AbstractDatalinkEditTest {
-
-	private Datalink datalink;
-	private boolean editDone;
-
-	@Before
-	public void setUp() throws Exception {
-		datalink = new DatalinkImpl(null, null);
-		editDone = false;
-	}
-
-	@Test
-	public void testAbstractDatalinkEdit() {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		assertEquals(datalink, edit.getSubject());
-	}
-
-	@Test(expected = RuntimeException.class)
-	public void testAbstractDatalinkEditWithNull() {
-		new AbstractDatalinkEdit(null) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-	}
-
-	@Test
-	public void testDoEdit() throws EditException {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-				editDone = true;
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		assertFalse(editDone);
-		assertFalse(edit.isApplied());
-		assertEquals(datalink, edit.doEdit());
-		assertTrue(editDone);
-		assertTrue(edit.isApplied());
-	}
-
-	@Test(expected = EditException.class)
-	public void testDoEditTwice() throws EditException {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		edit.doEdit();
-		edit.doEdit();
-	}
-
-	@Test(expected = EditException.class)
-	public void testDoEditWithWrongImpl() throws EditException {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(new Datalink() {
-
-			public int getResolvedDepth() {
-				return 0;
-			}
-
-			public EventHandlingInputPort getSink() {
-				return null;
-			}
-
-			public EventForwardingOutputPort getSource() {
-				return null;
-			}
-
-			public Edit<? extends Datalink> getAddAnnotationEdit(
-					AnnotationChain newAnnotation) {
-				// TODO Auto-generated method stub
-				return null;
-			}
-
-			public Set<? extends AnnotationChain> getAnnotations() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-
-			public Edit<? extends Datalink> getRemoveAnnotationEdit(
-					AnnotationChain annotationToRemove) {
-				// TODO Auto-generated method stub
-				return null;
-			}
-
-			public void setAnnotations(Set<AnnotationChain> annotations) {
-				// TODO Auto-generated method stub
-				
-			}
-
-		}) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		edit.doEdit();
-	}
-
-	@Test
-	public void testGetSubject() {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		assertEquals(datalink, edit.getSubject());
-	}
-
-	@Test
-	public void testIsApplied() throws EditException {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		assertFalse(edit.isApplied());
-		edit.doEdit();
-		assertTrue(edit.isApplied());
-		edit.undo();
-		assertFalse(edit.isApplied());
-	}
-
-	@Test
-	public void testUndo() throws EditException {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-				editDone = true;
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-				editDone = false;
-			}
-		};
-		assertFalse(editDone);
-		assertFalse(edit.isApplied());
-		edit.doEdit();
-		assertTrue(editDone);
-		assertTrue(edit.isApplied());
-		edit.undo();
-		assertFalse(editDone);
-		assertFalse(edit.isApplied());
-	}
-
-	@Test(expected = RuntimeException.class)
-	public void testUndoBeforeDoEdit() {
-		AbstractDatalinkEdit edit = new AbstractDatalinkEdit(datalink) {
-			@Override
-			protected void doEditAction(DatalinkImpl datalink)
-					throws EditException {
-			}
-
-			@Override
-			protected void undoEditAction(DatalinkImpl datalink) {
-			}
-		};
-		edit.undo();
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorEditTest.java
deleted file mode 100644
index d2def28..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/AddProcessorEditTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.NamingException;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class AddProcessorEditTest {
-
-	private Processor processor;
-	
-	@Before
-	public void createProcessor() {
-		processor = new EditsImpl().createProcessor("the_processor");
-	}
-	
-	@Test
-	public void testAddingOfProcessor() throws Exception {
-		Dataflow f = new DataflowImpl();
-		
-		AddProcessorEdit edit = new AddProcessorEdit(f,processor);
-		edit.doEdit();
-		
-		assertEquals(1,f.getProcessors().size());
-		assertEquals(processor,f.getProcessors().get(0));
-	}
-	
-	@Test(expected=EditException.class)
-	public void testCantEditTwice() throws Exception {
-		Dataflow f = new DataflowImpl();
-		AddProcessorEdit edit = new AddProcessorEdit(f,processor);
-		edit.doEdit();
-		edit.doEdit();
-	}
-	
-	@Test
-	public void testUndo() throws Exception {
-		Dataflow f = new DataflowImpl();
-		AddProcessorEdit edit = new AddProcessorEdit(f,processor);
-		edit.doEdit();
-		edit.undo();
-		
-		assertEquals(0,f.getProcessors().size());
-	}
-	
-	@Test
-	public void testUndo2() throws Exception {
-		//checks the right one is removed
-		Dataflow f = new DataflowImpl();
-		AddProcessorEdit edit = new AddProcessorEdit(f,processor);
-		edit.doEdit();
-		
-		ProcessorImpl badProcessor = new ProcessorImpl();
-		badProcessor.setName("bad_processor");
-		AddProcessorEdit edit2 = new AddProcessorEdit(f,badProcessor);
-		edit2.doEdit();
-		
-		assertEquals(2,f.getProcessors().size());
-		edit2.undo();
-		assertEquals(processor,f.getProcessors().get(0));
-	}
-	
-	@Test(expected=NamingException.class)
-	public void testDuplicateName() throws Exception {
-		Dataflow f = new DataflowImpl();
-		AddProcessorEdit edit = new AddProcessorEdit(f,processor);
-		edit.doEdit();
-		
-		ProcessorImpl processor2=new ProcessorImpl();
-		processor2.setName(processor.getLocalName());
-		AddProcessorEdit edit2 = new AddProcessorEdit(f,processor2);
-		edit2.doEdit();
-	}
-	
-	@Test
-	public void testThroughEditsImpl() throws Exception {
-		//Essentially the same as testAddingOfProcessor, but a sanity test that it works correctly through the Edits API
-		Dataflow f = new DataflowImpl();
-		new EditsImpl().getAddProcessorEdit(f, processor).doEdit();
-		
-		assertEquals(1,f.getProcessors().size());
-		assertEquals(processor,f.getProcessors().get(0));
-	}
-	
-	@Test
-	public void testRedo() throws Exception {
-		Dataflow f = new DataflowImpl();
-		AddProcessorEdit edit = new AddProcessorEdit(f,processor);
-		edit.doEdit();
-		
-		assertEquals(1,f.getProcessors().size());
-		assertEquals(processor,f.getProcessors().get(0));
-		
-		edit.undo();
-		
-		assertEquals(0,f.getProcessors().size());
-		
-		edit.doEdit();
-		
-		assertEquals(1,f.getProcessors().size());
-		assertEquals(processor,f.getProcessors().get(0));
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortDepthEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortDepthEditTest.java
deleted file mode 100644
index 1263c28..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortDepthEditTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author David Withers
- *
- */
-public class ChangeDataflowInputPortDepthEditTest {
-
-	private DataflowInputPortImpl dataflowInputPort;
-	
-	private int depth;
-	
-	private int granularDepth;
-	
-	@Before
-	public void setUp() throws Exception {
-		depth = 3;
-		granularDepth = 1;
-		dataflowInputPort = new DataflowInputPortImpl("port name", depth, granularDepth, null);
-	}
-
-	@Test
-	public void testDoEditAction() throws EditException {
-		int newDepth = 2;
-		ChangeDataflowInputPortDepthEdit edit = new ChangeDataflowInputPortDepthEdit(dataflowInputPort, newDepth);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());		
-		edit.doEditAction(dataflowInputPort);
-		assertEquals(newDepth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());
-	}
-
-	@Test
-	public void testUndoEditAction() throws EditException {
-		int newDepth = 2;
-		ChangeDataflowInputPortDepthEdit edit = new ChangeDataflowInputPortDepthEdit(dataflowInputPort, newDepth);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());		
-		edit.doEditAction(dataflowInputPort);
-		edit.undoEditAction(dataflowInputPort);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());
-	}
-
-	@Test
-	public void testCreateDataflowInputPortEdit() {
-		ChangeDataflowInputPortDepthEdit edit = new ChangeDataflowInputPortDepthEdit(dataflowInputPort, 0);
-		assertEquals(dataflowInputPort, edit.getSubject());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortGranularDepthEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortGranularDepthEditTest.java
deleted file mode 100644
index 453e502..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ChangeDataflowInputPortGranularDepthEditTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author David Withers
- *
- */
-public class ChangeDataflowInputPortGranularDepthEditTest {
-
-	private DataflowInputPortImpl dataflowInputPort;
-	
-	private int depth;
-	
-	private int granularDepth;
-	
-	@Before
-	public void setUp() throws Exception {
-		depth = 3;
-		granularDepth = 1;
-		dataflowInputPort = new DataflowInputPortImpl("port name", depth, granularDepth, null);
-	}
-
-	@Test
-	public void testDoEditAction() throws EditException {
-		int newGranularDepth = 2;
-		ChangeDataflowInputPortGranularDepthEdit edit = new ChangeDataflowInputPortGranularDepthEdit(dataflowInputPort, newGranularDepth);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());		
-		edit.doEditAction(dataflowInputPort);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(newGranularDepth, dataflowInputPort.getGranularInputDepth());
-	}
-
-	@Test
-	public void testUndoEditAction() throws EditException {
-		int newGranularDepth = 2;
-		ChangeDataflowInputPortGranularDepthEdit edit = new ChangeDataflowInputPortGranularDepthEdit(dataflowInputPort, newGranularDepth);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());		
-		edit.doEditAction(dataflowInputPort);
-		edit.undoEditAction(dataflowInputPort);
-		assertEquals(depth, dataflowInputPort.getDepth());
-		assertEquals(granularDepth, dataflowInputPort.getGranularInputDepth());
-	}
-
-	@Test
-	public void testCreateDataflowInputPortEdit() {
-		ChangeDataflowInputPortDepthEdit edit = new ChangeDataflowInputPortDepthEdit(dataflowInputPort, 0);
-		assertEquals(dataflowInputPort, edit.getSubject());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureActivityEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureActivityEditTest.java
deleted file mode 100644
index 929e6ea..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConfigureActivityEditTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.*;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class ConfigureActivityEditTest {
-
-	DummyActivity activity;
-	
-	@Before
-	public void setup() throws Exception {
-		activity=new DummyActivity();
-	}
-	
-	@Test
-	public void testDoEdit() throws Exception {
-		String bean = "bob";
-		Edit<?> edit = new ConfigureActivityEdit(activity,bean);
-		edit.doEdit();
-		assertTrue(activity.isConfigured);
-		assertEquals("bob",activity.getConfiguration());
-	}
-	
-	@Test
-	public void testUndo() throws Exception {
-		String bean = "bob";
-		activity.configure("fred");
-		Edit<?> edit = new ConfigureActivityEdit(activity,bean);
-		edit.doEdit();
-		
-		assertEquals("bob",activity.getConfiguration());
-		edit.undo();
-		
-		assertEquals("fred",activity.getConfiguration());
-		assertFalse(edit.isApplied());
-	}
-	
-	@Test
-	public void testIsApplied()  throws Exception {
-		String bean = "bob";
-		Edit<?> edit = new ConfigureActivityEdit(activity,bean);
-		assertFalse(edit.isApplied());
-		edit.doEdit();
-		assertTrue(edit.isApplied());
-	}
-	
-	@Test
-	public void testSubject() {
-		String bean = "bob";
-		Edit<?> edit = new ConfigureActivityEdit(activity,bean);
-		assertEquals(activity,edit.getSubject());
-	}
-	
-	class DummyActivity extends AbstractActivity<Object> {
-		public boolean isConfigured=false;
-		public Object configBean=null;
-		@Override
-		public void configure(Object conf)
-				throws ActivityConfigurationException {
-			isConfigured=true;
-			configBean=conf;
-		}
-
-		@Override
-		public Object getConfiguration() {
-			return configBean;
-		}
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConnectDatalinkEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConnectDatalinkEditTest.java
deleted file mode 100644
index 05156f6..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConnectDatalinkEditTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author David Withers
- * 
- */
-public class ConnectDatalinkEditTest {
-
-	private DatalinkImpl datalink;
-	private EventForwardingOutputPort source;
-	private EventHandlingInputPort sink;
-
-	@Before
-	public void setUp() throws Exception {
-		source = new BasicEventForwardingOutputPort("output", 0, 0);
-		sink = new DataflowInputPortImpl("input", 0, 0, null);
-		datalink = new DatalinkImpl(source, sink);
-	}
-
-	@Test
-	public void testDoEditAction() throws EditException {
-		ConnectDatalinkEdit edit = new ConnectDatalinkEdit(datalink);
-		assertEquals(0, datalink.getSource().getOutgoingLinks().size());
-		assertNull(datalink.getSink().getIncomingLink());
-		edit.doEditAction(datalink);
-		assertEquals(1, datalink.getSource().getOutgoingLinks().size());
-		assertEquals(datalink, datalink.getSource().getOutgoingLinks()
-				.iterator().next());
-		assertEquals(datalink, datalink.getSink().getIncomingLink());
-	}
-
-	@Test
-	public void testUndoEditAction() throws EditException {
-		ConnectDatalinkEdit edit = new ConnectDatalinkEdit(datalink);
-		assertEquals(0, datalink.getSource().getOutgoingLinks().size());
-		assertNull(datalink.getSink().getIncomingLink());
-		edit.doEditAction(datalink);
-		edit.undoEditAction(datalink);
-		assertEquals(0, datalink.getSource().getOutgoingLinks().size());
-		assertNull(datalink.getSink().getIncomingLink());
-	}
-
-	@Test
-	public void testConnectDatalinkEdit() {
-		ConnectDatalinkEdit edit = new ConnectDatalinkEdit(datalink);
-		assertEquals(datalink, edit.getSubject());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConnectMergedDatalinkEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConnectMergedDatalinkEditTest.java
deleted file mode 100644
index 97a6d82..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ConnectMergedDatalinkEditTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-import net.sf.taverna.t2.workflowmodel.MergeOutputPort;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class ConnectMergedDatalinkEditTest {
-
-	EventForwardingOutputPort sourcePort;
-	EventHandlingInputPort sinkPort;
-	Merge merge;
-	
-	
-	@Before
-	public void setup() throws Exception {
-		merge = new MergeImpl("theMerge");
-		ProcessorImpl p1 = new ProcessorImpl();
-		ProcessorImpl p2 = new ProcessorImpl();
-		sourcePort=new ProcessorOutputPortImpl(p1,"source_port",0,0);
-		sinkPort=new ProcessorInputPortImpl(p2,"sink_port",0);
-	}
-	
-	@Test
-	public void applyEdit() throws Exception {
-		Edit<Merge> theEdit = new ConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
-		assertEquals(0,merge.getInputPorts().size());
-		assertNotNull(merge.getOutputPort());
-		assertTrue(merge.getOutputPort() instanceof MergeOutputPort);
-		assertEquals(0,merge.getOutputPort().getOutgoingLinks().size());
-		
-		assertSame(merge,((MergeOutputPort)merge.getOutputPort()).getMerge());
-		
-		theEdit.doEdit();
-		assertEquals(1,merge.getInputPorts().size());
-		assertTrue(merge.getInputPorts().get(0) instanceof MergeInputPort);
-		assertEquals("source_portTotheMerge_input0",merge.getInputPorts().get(0).getName());
-		assertSame(sourcePort,merge.getInputPorts().get(0).getIncomingLink().getSource());
-		
-		assertEquals(1,merge.getOutputPort().getOutgoingLinks().size());
-		assertSame(sinkPort,merge.getOutputPort().getOutgoingLinks().toArray(new Datalink[]{})[0].getSink());
-		
-		assertEquals(1,sourcePort.getOutgoingLinks().size());
-		assertTrue(sourcePort.getOutgoingLinks().toArray(new Datalink[]{})[0].getSink() instanceof MergeInputPort);
-		assertTrue(sinkPort.getIncomingLink().getSource() instanceof MergeOutputPort);
-		
-		assertSame(merge.getInputPorts().get(0),sourcePort.getOutgoingLinks().toArray(new Datalink[]{})[0].getSink());
-		assertSame(sinkPort.getIncomingLink().getSource(),merge.getOutputPort());
-		
-		ProcessorImpl p3=new ProcessorImpl();
-		ProcessorOutputPortImpl sourcePort2=new ProcessorOutputPortImpl(p3,"source_port2",0,0);
-		
-		Edit<Merge> theEdit2 = new ConnectMergedDatalinkEdit(merge,sourcePort2,sinkPort);
-		theEdit2.doEdit();
-		assertEquals(1,merge.getOutputPort().getOutgoingLinks().size());
-		assertEquals(2,merge.getInputPorts().size());
-		assertTrue(merge.getInputPorts().get(1) instanceof MergeInputPort);
-		assertEquals("source_port2TotheMerge_input0",merge.getInputPorts().get(1).getName());
-		assertSame(sourcePort2,merge.getInputPorts().get(1).getIncomingLink().getSource());
-	}
-	
-	@Test
-	public void undo() throws Exception {
-		Edit<Merge> theEdit = new ConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
-		theEdit.doEdit();
-		theEdit.undo();
-		assertEquals(0,merge.getInputPorts().size());
-		assertEquals(0,merge.getOutputPort().getOutgoingLinks().size());
-		assertEquals(0,sourcePort.getOutgoingLinks().size());
-		assertNull(sinkPort.getIncomingLink());
-	}
-	
-	/**
-	 * Check that the outgoing link to the sink port is retained when undoing a second merged input.
-	 */
-	@Test
-	public void undoSecond() throws Exception {
-		Edit<Merge> theEdit = new ConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
-		theEdit.doEdit();
-		ProcessorImpl p3=new ProcessorImpl();
-		ProcessorOutputPortImpl sourcePort2=new ProcessorOutputPortImpl(p3,"source_port2",0,0);
-		Edit<Merge> theEdit2 = new ConnectMergedDatalinkEdit(merge,sourcePort2,sinkPort);
-		theEdit2.doEdit();
-		theEdit2.undo();
-		assertEquals(1,merge.getInputPorts().size());
-		assertEquals(1,merge.getOutputPort().getOutgoingLinks().size());
-	}
-	
-	@Test
-	public void redo() throws Exception {
-		Edit<Merge> theEdit = new ConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
-		theEdit.doEdit();
-		theEdit.undo();
-		theEdit.doEdit();
-		
-		assertEquals(1,merge.getInputPorts().size());
-		assertTrue(merge.getInputPorts().get(0) instanceof MergeInputPort);
-		assertSame(sourcePort,merge.getInputPorts().get(0).getIncomingLink().getSource());
-		
-		assertEquals(1,merge.getOutputPort().getOutgoingLinks().size());
-		assertSame(sinkPort,merge.getOutputPort().getOutgoingLinks().toArray(new Datalink[]{})[0].getSink());
-		
-		assertEquals(1,sourcePort.getOutgoingLinks().size());
-		assertTrue(sourcePort.getOutgoingLinks().toArray(new Datalink[]{})[0].getSink() instanceof MergeInputPort);
-		assertTrue(sinkPort.getIncomingLink().getSource() instanceof MergeOutputPort);
-		
-		assertSame(merge.getInputPorts().get(0),sourcePort.getOutgoingLinks().toArray(new Datalink[]{})[0].getSink());
-		assertSame(sinkPort.getIncomingLink().getSource(),merge.getOutputPort());
-	}
-	
-	@Test(expected=RuntimeException.class)
-	public void nullMerge() throws Exception {
-		new ConnectMergedDatalinkEdit(null,sourcePort,sinkPort);
-	}
-	
-	@Test(expected=RuntimeException.class)
-	public void nullSourcePort() throws Exception {
-		Merge merge = new MergeImpl("merge");
-		new ConnectMergedDatalinkEdit(merge,sourcePort,null);
-	}
-	
-	@Test(expected=RuntimeException.class)
-	public void nullSinkPort() throws Exception {
-		Merge merge = new MergeImpl("merge");
-		new ConnectMergedDatalinkEdit(merge,null,sinkPort);
-	}
-	
-	@Test(expected=EditException.class)
-	public void invalidSinkPort() throws Exception {
-		Edit<Merge> theEdit = new ConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
-		theEdit.doEdit();
-		
-		ProcessorImpl p2=new ProcessorImpl();
-		ProcessorInputPortImpl sinkPort2=new ProcessorInputPortImpl(p2,"sink_port2",0);
-		theEdit = new ConnectMergedDatalinkEdit(merge,sourcePort,sinkPort2);
-		theEdit.doEdit();
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowInputPortEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowInputPortEditTest.java
deleted file mode 100644
index 41076f1..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowInputPortEditTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author David Withers
- *
- */
-public class CreateDataflowInputPortEditTest {
-
-	private DataflowImpl dataflow;
-	
-	private String portName;
-
-	private int portDepth;
-	
-	private int portGranularDepth;
-
-	@Before
-	public void setUp() throws Exception {
-		dataflow = new DataflowImpl();
-		portName = "port name";
-		portDepth = 3;
-		portGranularDepth = 2;
-	}
-
-	@Test
-	public void testDoEditAction() throws EditException {
-		CreateDataflowInputPortEdit edit = new CreateDataflowInputPortEdit(dataflow, portName, portDepth, portGranularDepth);
-		assertEquals(0, dataflow.getInputPorts().size());
-		edit.doEditAction(dataflow);
-		assertEquals(1, dataflow.getInputPorts().size());
-		DataflowInputPort inputPort = dataflow.getInputPorts().get(0);
-		assertSame(dataflow, inputPort.getDataflow());
-		assertEquals(portName, inputPort.getName());
-		assertEquals(portDepth, inputPort.getDepth());
-		assertEquals(portGranularDepth, inputPort.getGranularInputDepth());
-	}
-
-	@Test
-	public void testUndoEditAction() throws EditException {
-		CreateDataflowInputPortEdit edit = new CreateDataflowInputPortEdit(dataflow, portName, portDepth, portGranularDepth);
-		assertEquals(0, dataflow.getInputPorts().size());
-		edit.doEditAction(dataflow);
-		edit.undoEditAction(dataflow);
-		assertEquals(0, dataflow.getInputPorts().size());
-	}
-
-	@Test
-	public void testCreateDataflowInputPortEdit() {
-		CreateDataflowInputPortEdit edit = new CreateDataflowInputPortEdit(dataflow, portName, portDepth, portGranularDepth);
-		assertEquals(dataflow, edit.getSubject());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowOutputPortEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowOutputPortEditTest.java
deleted file mode 100644
index f06d9e8..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/CreateDataflowOutputPortEditTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.EditException;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author David Withers
- *
- */
-public class CreateDataflowOutputPortEditTest {
-
-	private DataflowImpl dataflow;
-	
-	private String portName;
-
-	@Before
-	public void setUp() throws Exception {
-		dataflow = new DataflowImpl();
-		portName = "port name";
-	}
-
-	@Test
-	public void testDoEditAction() throws EditException {
-		CreateDataflowOutputPortEdit edit = new CreateDataflowOutputPortEdit(dataflow, portName);
-		assertEquals(0, dataflow.getOutputPorts().size());
-		edit.doEditAction(dataflow);
-		assertEquals(1, dataflow.getOutputPorts().size());
-		DataflowOutputPort outputPort = dataflow.getOutputPorts().get(0);
-		assertSame(dataflow, outputPort.getDataflow());
-		assertEquals(portName, outputPort.getName());
-	}
-
-	@Test
-	public void testUndoEditAction() throws EditException {
-		CreateDataflowOutputPortEdit edit = new CreateDataflowOutputPortEdit(dataflow, portName);
-		assertEquals(0, dataflow.getOutputPorts().size());
-		edit.doEditAction(dataflow);
-		edit.undoEditAction(dataflow);
-		assertEquals(0, dataflow.getOutputPorts().size());
-	}
-
-	@Test
-	public void testCreateDataflowOutputPortEdit() {
-		CreateDataflowOutputPortEdit edit = new CreateDataflowOutputPortEdit(dataflow, portName);
-		assertEquals(dataflow, edit.getSubject());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DataflowImplTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DataflowImplTest.java
deleted file mode 100644
index db2a88a..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DataflowImplTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class DataflowImplTest {
-	DataflowImpl df = new DataflowImpl();
-	
-	@Test
-	public void testInternalIdentifer() {
-		assertNotNull("the identifier should be created at construction time",df.getInternalIdentier());
-	}
-	
-	@Test
-	public void testRefreshInternalIndentifier() {
-		String oldId=df.getInternalIdentier();
-		df.refreshInternalIdentifier();
-		assertNotNull("the new identifier should not be null",df.getInternalIdentier());
-		assertFalse("the identifier should have changed",oldId.equals(df.getInternalIdentier()));
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DefaultDispatchStackEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DefaultDispatchStackEditTest.java
deleted file mode 100644
index 1304f1b..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DefaultDispatchStackEditTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class DefaultDispatchStackEditTest {
-	
-	private ProcessorImpl processor;
-	private DefaultDispatchStackEdit defaultDispatchStackEdit;
-
-	@Before
-	public void setup() {
-		processor = new ProcessorImpl();
-		defaultDispatchStackEdit = new DefaultDispatchStackEdit(processor);
-	}
-	@Test
-	public void testEdit() throws Exception {
-		assertEquals(0,processor.getDispatchStack().getLayers().size());
-		defaultDispatchStackEdit.doEdit();
-		assertTrue(processor.getDispatchStack().getLayers().size()>0);
-	}
-	
-	@Test
-	public void testUndo() throws Exception {
-		defaultDispatchStackEdit.doEdit();
-		assertTrue(processor.getDispatchStack().getLayers().size()>0);
-		defaultDispatchStackEdit.undo();
-		assertEquals(0,processor.getDispatchStack().getLayers().size());
-	}
-	
-	@Test
-	public void testSubject() throws Exception {
-		assertSame(processor,defaultDispatchStackEdit.getSubject());
-		defaultDispatchStackEdit.doEdit();
-		assertSame(processor,defaultDispatchStackEdit.getSubject());
-		defaultDispatchStackEdit.undo();
-		assertSame(processor,defaultDispatchStackEdit.getSubject());
-		defaultDispatchStackEdit.doEdit();
-		assertSame(processor,defaultDispatchStackEdit.getSubject());
-	}
-	
-	@Test
-	public void testApplied() throws Exception {
-		assertFalse(defaultDispatchStackEdit.isApplied());
-		defaultDispatchStackEdit.doEdit();
-		assertTrue(defaultDispatchStackEdit.isApplied());
-		defaultDispatchStackEdit.undo();
-		assertFalse(defaultDispatchStackEdit.isApplied());
-		defaultDispatchStackEdit.doEdit();
-		assertTrue(defaultDispatchStackEdit.isApplied());
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflow.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflow.java
deleted file mode 100644
index 3292648..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflow.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.FailureTransmitter;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.NamedWorkflowEntity;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-
-public class DummyDataflow extends AbstractAnnotatedThing<Dataflow> implements
-		Dataflow {
-
-	public List<DataflowInputPort> inputPorts = new ArrayList<DataflowInputPort>();
-	public List<DataflowOutputPort> outputPorts = new ArrayList<DataflowOutputPort>();
-	public List<Processor> processors = new ArrayList<Processor>();
-	public List<Merge> merges = new ArrayList<Merge>();
-
-	public DataflowValidationReport checkValidity() {
-		return new DummyValidationReport(true);
-	}
-
-	public <T extends NamedWorkflowEntity> List<? extends T> getEntities(
-			Class<T> entityType) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<? extends DataflowInputPort> getInputPorts() {
-		return inputPorts;
-	}
-
-	public List<? extends Datalink> getLinks() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<? extends DataflowOutputPort> getOutputPorts() {
-		return outputPorts;
-	}
-
-	public List<? extends Processor> getProcessors() {
-		return processors;
-	}
-
-	public List<? extends Merge> getMerges() {
-		return merges;
-	}
-
-	public String getLocalName() {
-		return "test_dataflow";
-	}
-
-	public void fire(String owningProcess, InvocationContext context) {
-		String newOwningProcess = owningProcess + ":" + getLocalName();
-		for (Processor p : processors) {
-			if (p.getInputPorts().isEmpty()) {
-				p.fire(newOwningProcess, context);
-			}
-		}
-	}
-
-	public FailureTransmitter getFailureTransmitter() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean doTypeCheck() throws IterationTypeMismatchException {
-		throw new UnsupportedOperationException(
-				"Not implemented for this class");
-	}
-
-	public String getInternalIdentier() {
-		return "an id";
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflowInputPort.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflowInputPort.java
deleted file mode 100644
index 4fe52ed..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflowInputPort.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-public class DummyDataflowInputPort extends DataflowInputPortImpl {
-
-	public String tokenOwningProcess;
-	
-	public DummyDataflowInputPort(String name, int depth, int granularDepth,
-			Dataflow df) {
-		super(name, depth, granularDepth, df);
-	}
-
-	@Override
-	public void receiveEvent(WorkflowDataToken t) {
-		tokenOwningProcess=t.getOwningProcess();
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflowOutputPort.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflowOutputPort.java
deleted file mode 100644
index a6a4496..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyDataflowOutputPort.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.List;
-
-import net.sf.taverna.t2.facade.ResultListener;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-
-public class DummyDataflowOutputPort extends DataflowOutputPortImpl {
-	
-	public DummyDataflowOutputPort(String portName, Dataflow dataflow) {
-		super(portName, dataflow);
-	}
-
-	public List<ResultListener> getResultListeners() {
-		return resultListeners;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyProcessor.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyProcessor.java
deleted file mode 100644
index 3224cea..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyProcessor.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import net.sf.taverna.t2.annotation.AnnotationChain;
-import net.sf.taverna.t2.invocation.InvocationContext;
-import net.sf.taverna.t2.lang.observer.Observer;
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorFinishedEvent;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-
-public class DummyProcessor implements Processor{
-
-	public HealthReport checkProcessorHealth() {
-		return new ProcessorHealthReport("",new ArrayList<HealthReport>());
-	}
-
-	public String firedOwningProcess = null;
-	
-	public List<Condition> preConditionList = new ArrayList<Condition>();
-	public List<ProcessorInputPort> inputPorts = new ArrayList<ProcessorInputPort>();
-	
-	public boolean doTypeCheck() throws IterationTypeMismatchException {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public void fire(String owningProcess, InvocationContext context) {
-		firedOwningProcess=owningProcess;
-		
-	}
-
-	public List<? extends Activity<?>> getActivityList() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<? extends Condition> getControlledPreconditionList() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public DispatchStack getDispatchStack() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<? extends ProcessorInputPort> getInputPorts() {
-		return inputPorts;
-	}
-
-	public IterationStrategyStack getIterationStrategy() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<? extends ProcessorOutputPort> getOutputPorts() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<? extends Condition> getPreconditionList() {
-		return preConditionList;
-	}
-
-	public String getLocalName() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Edit<? extends Processor> getAddAnnotationEdit(
-			AnnotationChain newAnnotation) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Set<? extends AnnotationChain> getAnnotations() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Edit<? extends Processor> getRemoveAnnotationEdit(
-			AnnotationChain annotationToRemove) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void setAnnotations(Set<AnnotationChain> annotations) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void addObserver(Observer<ProcessorFinishedEvent> observer) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public List<Observer<ProcessorFinishedEvent>> getObservers() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void removeObserver(Observer<ProcessorFinishedEvent> observer) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyValidationReport.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyValidationReport.java
deleted file mode 100644
index aca6300..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/DummyValidationReport.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-/**
- * 
- */
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.TokenProcessingEntity;
-
-public class DummyValidationReport implements DataflowValidationReport {
-	private final boolean valid;
-
-	public DummyValidationReport(boolean valid) {
-		this.valid = valid;
-	}
-
-	public boolean isValid() {
-		return valid;
-	}
-
-	public List<? extends TokenProcessingEntity> getUnsatisfiedEntities() {
-		return null;
-	}
-
-	public List<? extends DataflowOutputPort> getUnresolvedOutputs() {
-		return null;
-	}
-
-	public List<? extends TokenProcessingEntity> getFailedEntities() {
-		return null;
-	}
-
-	public Map<TokenProcessingEntity, DataflowValidationReport> getInvalidDataflows() {
-		return null;
-	}
-
-	public boolean isWorkflowIncomplete() {
-		return false;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EditRegistryTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EditRegistryTest.java
deleted file mode 100644
index aa96425..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EditRegistryTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.EditsRegistry;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-public class EditRegistryTest {
-
-	@Test
-	public void testOneAndOnlyOne() throws Exception {
-		assertEquals("There should be 1 instance",1,EditsRegistry.getInstance().getInstances().size());
-	}
-	@Test
-	public void testImplFound() {
-		Edits edits = EditsRegistry.getEdits();
-		assertTrue("The edit should be an instance of EditsImpl",edits instanceof EditsImpl);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EditsImplTests.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EditsImplTests.java
deleted file mode 100644
index 9aeea62..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EditsImplTests.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.processor.AsynchEchoActivity;
-import net.sf.taverna.t2.workflowmodel.processor.EchoConfig;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class EditsImplTests {
-	public class InvalidDummyDataflow extends DummyDataflow {
-		@Override
-		public DataflowValidationReport checkValidity() {
-			return new DummyValidationReport(false);
-		}
-	}
-
-	private static Edits edits;
-	
-	@BeforeClass
-	public static void createEditsInstance() {
-		edits=new EditsImpl();
-	}
-	
-	@Test
-	public void createDataflow() {
-		Dataflow df = edits.createDataflow();
-		assertNotNull(df.getInternalIdentier());
-	}
-	
-	@Test
-	public void testGetConfigureActivityEdit() {
-		Edit<?> edit = edits.getConfigureActivityEdit(new AsynchEchoActivity(), new EchoConfig());
-		assertTrue(edit instanceof ConfigureActivityEdit);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EventKeeper.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EventKeeper.java
deleted file mode 100644
index ac615e6..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/EventKeeper.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007-2008 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.processor.DiagnosticEventHandler;
-
-public final class EventKeeper extends DiagnosticEventHandler {
-	public List<WorkflowDataToken> events = new ArrayList<WorkflowDataToken>();
-
-	@Override
-	public synchronized void receiveEvent(WorkflowDataToken token) {
-		super.receiveEvent(token);
-		events.add(token);
-	}
-}
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/MapProcessorPortsToActivityEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/MapProcessorPortsToActivityEditTest.java
deleted file mode 100644
index cc96cff..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/MapProcessorPortsToActivityEditTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.workflowmodel.OutputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort;
-import net.sf.taverna.t2.workflowmodel.serialization.DummyActivity;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class MapProcessorPortsToActivityEditTest {
-
-	ProcessorImpl p;
-	EditsImpl edits = new EditsImpl();
-	MapProcessorPortsForActivityEdit edit;
-	
-	@Before
-	public void setupProcessorAndEdit() throws Exception {
-		p=new ProcessorImpl();
-		ProcessorInputPort ip1=edits.createProcessorInputPort(p, "inputPort1", 1);
-		ProcessorInputPort ip2=edits.createProcessorInputPort(p, "inputPort2", 1);
-		ProcessorOutputPort op1 = edits.createProcessorOutputPort(p, "outputPort1", 1, 1);
-		ProcessorOutputPort op2 = edits.createProcessorOutputPort(p, "outputPort2", 1, 1);
-		edits.getAddProcessorOutputPortEdit(p, op1).doEdit();
-		edits.getAddProcessorOutputPortEdit(p, op2).doEdit();
-		edits.getAddProcessorInputPortEdit(p, ip1).doEdit();
-		edits.getAddProcessorInputPortEdit(p, ip2).doEdit();
-		
-		Activity<?> a = new DummyActivity();
-		ActivityInputPort aip1 = edits.createActivityInputPort("inputPort1", 1, true, new ArrayList<Class<? extends ExternalReferenceSPI>>(), String.class);
-		ActivityInputPort aip2 = edits.createActivityInputPort("newInputPort", 0, true, new ArrayList<Class<? extends ExternalReferenceSPI>>(), String.class);
-		edits.getAddActivityInputPortEdit(a, aip1).doEdit();
-		edits.getAddActivityInputPortEdit(a, aip2).doEdit();
-		
-		OutputPort aop1 = edits.createActivityOutputPort("outputPort1", 1, 1);
-		OutputPort aop2 = edits.createActivityOutputPort("newOutputPort", 0, 0);
-		edits.getAddActivityOutputPortEdit(a, aop1).doEdit();
-		edits.getAddActivityOutputPortEdit(a, aop2).doEdit();
-		
-		edits.getAddActivityEdit(p, a).doEdit();
-		
-		new AddActivityInputPortMappingEdit(a,"inputPort1","inputPort1").doEdit();
-		new AddActivityInputPortMappingEdit(a,"inputPort2","inputPort2").doEdit();
-		new AddActivityOutputPortMappingEdit(a,"outputPort1","outputPort1").doEdit();
-		new AddActivityOutputPortMappingEdit(a,"outputPort2","outputPort2").doEdit();
-		
-		edit = new MapProcessorPortsForActivityEdit(p);
-	}
-	
-	
-	@Test
-	public void testIsApplied() throws Exception {
-		assertFalse(edit.isApplied());
-		edit.doEdit();
-		assertTrue(edit.isApplied());
-		edit.undo();
-		assertFalse(edit.isApplied());
-	}
-	
-	@Test
-	public void testDoEdit() throws Exception {
-		edit.doEdit();
-		assertEquals("there should now be 1 input port",1,p.getInputPorts().size());
-		assertEquals("there should now be 1 output port",1,p.getOutputPorts().size());
-	}
-	
-	@Test
-	public void testUndo() throws Exception {
-		edit.doEdit();
-		edit.undo();
-		assertEquals("there should now be 2 input ports",2,p.getInputPorts().size());
-		assertEquals("there should now be 2 output ports",2,p.getOutputPorts().size());
-	}
-	
-	@Test
-	public void testMapping() throws Exception {
-		Activity<?>a = p.getActivityList().get(0);
-		
-		assertEquals(2,a.getInputPortMapping().size());
-		assertEquals("inputPort1",a.getInputPortMapping().get("inputPort1"));
-		assertEquals("inputPort2",a.getInputPortMapping().get("inputPort2"));
-		assertEquals(2,a.getOutputPortMapping().size());
-		assertEquals("outputPort1",a.getOutputPortMapping().get("outputPort1"));
-		assertEquals("outputPort2",a.getOutputPortMapping().get("outputPort2"));
-		
-		edit.doEdit();
-		
-		assertEquals(1,a.getInputPortMapping().size());
-		
-		assertEquals("inputPort1",a.getInputPortMapping().get("inputPort1"));
-		
-		assertEquals(1,a.getOutputPortMapping().size());
-		assertEquals("outputPort1",a.getOutputPortMapping().get("outputPort1"));
-		
-		edit.undo();
-		
-		assertEquals(2,a.getInputPortMapping().size());
-		assertEquals("inputPort1",a.getInputPortMapping().get("inputPort1"));
-		assertEquals("inputPort2",a.getInputPortMapping().get("inputPort2"));
-		assertEquals(2,a.getOutputPortMapping().size());
-		assertEquals("outputPort1",a.getOutputPortMapping().get("outputPort1"));
-		assertEquals("outputPort2",a.getOutputPortMapping().get("outputPort2"));
-	}
-	
-	@Test 
-	public void testUnchangedPortsRemain() throws Exception {
-		ProcessorOutputPort op1 = p.getOutputPortWithName("outputPort1");
-		ProcessorInputPort ip1 = p.getInputPortWithName("inputPort1");
-		edit.doEdit();
-		assertSame(ip1,p.getInputPortWithName("inputPort1"));
-		assertSame(op1,p.getOutputPortWithName("outputPort1"));
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthReportTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthReportTest.java
deleted file mode 100644
index 84b4823..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/ProcessorHealthReportTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport.Status;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class ProcessorHealthReportTest {
-
-	List<HealthReport> activityReports;
-	ProcessorHealthReport report;
-	
-	@Before
-	public void setUp() throws Exception {
-		activityReports = new ArrayList<HealthReport>();
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.OK));
-		
-		report = new ProcessorHealthReport("processor subject",activityReports);
-	}
-
-	@Test
-	public void testProcessorHealthReportImpl() {
-		assertEquals("There should be 3 activity reports",3,report.getSubReports().size());
-	}
-
-	@Test
-	public void testGetActivityHealthReports() {
-		assertEquals("There should be 3 activity reports",3,report.getSubReports().size());
-		assertSame(activityReports.get(0),report.getSubReports().get(0));
-		assertSame(activityReports.get(1),report.getSubReports().get(1));
-		assertSame(activityReports.get(2),report.getSubReports().get(2));
-	}
-
-	@Ignore("Not yet implented, flagged as Ignore to allow commit")
-	@Test
-	public void testGetMessage() {
-		fail("Not yet implemented");
-	}
-
-	@Test
-	public void testGetStatusAllOK() {
-		List<HealthReport> activityReports = new ArrayList<HealthReport>();
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.OK));
-		
-		ProcessorHealthReport report = new ProcessorHealthReport("processor subject",activityReports);
-		
-		assertEquals("the status should be OK",Status.OK,report.getStatus());
-	}
-	
-	@Test
-	public void testGetStatusContainsWarning() {
-		List<HealthReport> activityReports = new ArrayList<HealthReport>();
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.WARNING));
-		
-		ProcessorHealthReport report = new ProcessorHealthReport("processor subject",activityReports);
-		
-		assertEquals("the status should be WARNING",Status.WARNING,report.getStatus());
-	}
-	
-	@Test
-	public void testGetStatusContainsSevere() {
-		List<HealthReport> activityReports = new ArrayList<HealthReport>();
-		activityReports.add(new HealthReport("","",Status.OK));
-		activityReports.add(new HealthReport("","",Status.SEVERE));
-		activityReports.add(new HealthReport("","",Status.OK));
-		
-		ProcessorHealthReport report = new ProcessorHealthReport("",activityReports);
-		
-		assertEquals("the status should be WARNING",Status.WARNING,report.getStatus());
-	}
-	
-	@Test
-	public void testGetStatusAllSevere() {
-		List<HealthReport> activityReports = new ArrayList<HealthReport>();
-		activityReports.add(new HealthReport("","",Status.SEVERE));
-		activityReports.add(new HealthReport("","",Status.SEVERE));
-		activityReports.add(new HealthReport("","",Status.SEVERE));
-		
-		ProcessorHealthReport report = new ProcessorHealthReport("",activityReports);
-		
-		assertEquals("the status should be SEVERE",Status.SEVERE,report.getStatus());
-	}
-	
-	@Test
-	public void testGetSubject() {
-		assertEquals("processor subject",report.getSubject());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorInputPortEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorInputPortEditTest.java
deleted file mode 100644
index e0c155e..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorInputPortEditTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-public class RemoveProcessorInputPortEditTest {
-
-	EditsImpl edits = new EditsImpl();
-	private Processor processor;
-	private ProcessorInputPort inputPort;
-	private RemoveProcessorInputPortEdit removeProcessorInputPortEdit;
-	
-	@Before
-	public void setup() throws Exception {
-		processor = edits.createProcessor("test");
-		inputPort = edits.createProcessorInputPort(processor, "port", 1);
-		edits.getAddProcessorInputPortEdit(processor, inputPort).doEdit();
-		removeProcessorInputPortEdit = new RemoveProcessorInputPortEdit(processor,inputPort);
-	}
-	
-	@Test
-	public void testDoEdit() throws Exception {
-		assertFalse(removeProcessorInputPortEdit.isApplied());
-		Processor p = removeProcessorInputPortEdit.doEdit();
-		assertTrue(removeProcessorInputPortEdit.isApplied());
-		assertSame(p,processor);
-		assertEquals(0,processor.getInputPorts().size());
-	}
-	
-	@Test
-	public void testUndo() throws Exception {
-		assertFalse(removeProcessorInputPortEdit.isApplied());
-		removeProcessorInputPortEdit.doEdit();
-		assertTrue(removeProcessorInputPortEdit.isApplied());
-		removeProcessorInputPortEdit.undo();
-		assertFalse(removeProcessorInputPortEdit.isApplied());
-		assertEquals(1,processor.getInputPorts().size());
-		assertSame(inputPort,processor.getInputPorts().get(0));
-	}
-	
-	@Test
-	public void testSubject() throws Exception {
-		assertSame(processor,removeProcessorInputPortEdit.getSubject());
-		removeProcessorInputPortEdit.doEdit();
-		assertSame(processor,removeProcessorInputPortEdit.getSubject());
-		removeProcessorInputPortEdit.undo();
-		assertSame(processor,removeProcessorInputPortEdit.getSubject());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorOutputPortEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorOutputPortEditTest.java
deleted file mode 100644
index 33bb46c..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/RemoveProcessorOutputPortEditTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class RemoveProcessorOutputPortEditTest {
-
-	EditsImpl edits = new EditsImpl();
-	private Processor processor;
-	private ProcessorOutputPort outputPort;
-	private RemoveProcessorOutputPortEdit removeProcessorOutputPortEdit;
-	
-	@Before
-	public void setup() throws Exception {
-		processor = edits.createProcessor("test");
-		outputPort = edits.createProcessorOutputPort(processor, "port", 1,1);
-		edits.getAddProcessorOutputPortEdit(processor, outputPort).doEdit();
-		removeProcessorOutputPortEdit = new RemoveProcessorOutputPortEdit(processor,outputPort);
-	}
-	
-	@Test
-	public void testDoEdit() throws Exception {
-		assertFalse(removeProcessorOutputPortEdit.isApplied());
-		Processor p = removeProcessorOutputPortEdit.doEdit();
-		assertTrue(removeProcessorOutputPortEdit.isApplied());
-		assertSame(p,processor);
-		assertEquals(0,processor.getOutputPorts().size());
-	}
-	
-	@Test
-	public void testUndo() throws Exception {
-		assertFalse(removeProcessorOutputPortEdit.isApplied());
-		removeProcessorOutputPortEdit.doEdit();
-		assertTrue(removeProcessorOutputPortEdit.isApplied());
-		removeProcessorOutputPortEdit.undo();
-		assertFalse(removeProcessorOutputPortEdit.isApplied());
-		assertEquals(1,processor.getOutputPorts().size());
-		assertSame(outputPort,processor.getOutputPorts().get(0));
-	}
-	
-	@Test
-	public void testSubject() throws Exception {
-		assertSame(processor,removeProcessorOutputPortEdit.getSubject());
-		removeProcessorOutputPortEdit.doEdit();
-		assertSame(processor,removeProcessorOutputPortEdit.getSubject());
-		removeProcessorOutputPortEdit.undo();
-		assertSame(processor,removeProcessorOutputPortEdit.getSubject());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowInternalIdentifierEditTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowInternalIdentifierEditTest.java
deleted file mode 100644
index 40b6a48..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/impl/UpdateDataflowInternalIdentifierEditTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.impl;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Edit;
-import net.sf.taverna.t2.workflowmodel.Edits;
-
-import org.junit.Test;
-
-
-public class UpdateDataflowInternalIdentifierEditTest {
-	private static Edits edits = new EditsImpl();
-	
-	@Test
-	public void testDoEdit() throws Exception {
-		Dataflow df = edits.createDataflow();
-		edits.getUpdateDataflowInternalIdentifierEdit(df, "123").doEdit();
-		assertEquals("The internal id should be 123","123",df.getInternalIdentier());
-	}
-	
-	@Test 
-	public void testUndo() throws Exception {
-		Dataflow df = edits.createDataflow();
-		Edit<?> edit = edits.getUpdateDataflowInternalIdentifierEdit(df, "123");
-		String oldID=df.getInternalIdentier();
-		edit.doEdit();
-		edit.undo();
-		assertEquals("The id should be reset to its original value",oldID,df.getInternalIdentier());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/AsynchEchoActivity.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/AsynchEchoActivity.java
deleted file mode 100644
index 896c8da..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/AsynchEchoActivity.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import net.sf.taverna.t2.reference.ExternalReferenceSPI;
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport;
-import net.sf.taverna.t2.workflowmodel.health.HealthReport.Status;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback;
-
-public class AsynchEchoActivity extends
-		AbstractAsynchronousActivity<EchoConfig> implements
-		AsynchronousActivity<EchoConfig> {
-
-	private EchoConfig config;
-
-	@Override
-	public void configure(EchoConfig conf) throws ActivityConfigurationException {
-		addInput("input",0, true, new ArrayList<Class<? extends ExternalReferenceSPI>>(), String.class);
-		addOutput("output",0,0);
-		this.config = conf;
-	}
-
-	@Override
-	public void executeAsynch(Map<String, T2Reference> data,
-			AsynchronousActivityCallback callback) {
-		T2Reference inputID = data.get("input");
-		Map<String, T2Reference> outputMap = new HashMap<String, T2Reference>();
-		outputMap.put("output", inputID);
-		callback.receiveResult(outputMap, new int[0]);
-	}
-
-	@Override
-	public EchoConfig getConfiguration() {
-		return config;
-	}
-
-	public HealthReport checkActivityHealth() {
-		return new HealthReport("AsynchEchoActivity",
-				"Everything is hunky dorey", Status.OK);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/DiagnosticEventHandler.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/DiagnosticEventHandler.java
deleted file mode 100644
index ac14154..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/DiagnosticEventHandler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-/**
- * 
- */
-package net.sf.taverna.t2.workflowmodel.processor;
-
-import org.apache.log4j.Logger;
-
-import net.sf.taverna.t2.annotation.AbstractAnnotatedThing;
-import net.sf.taverna.t2.invocation.WorkflowDataToken;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
-import net.sf.taverna.t2.workflowmodel.Port;
-
-public class DiagnosticEventHandler extends AbstractAnnotatedThing<Port> implements EventHandlingInputPort {
-
-	private static Logger logger = Logger.getLogger(DiagnosticEventHandler.class);
-	
-	protected int eventCount = 0;
-
-	public synchronized void receiveEvent(WorkflowDataToken token) {
-		eventCount++;
-		logger.debug(token);
-	}
-
-	public int getEventCount() {
-		return this.eventCount;
-	}
-
-	public synchronized void reset() {
-		this.eventCount = 0;
-	}
-
-	public int getDepth() {
-		return 0;
-	}
-
-	public String getName() {
-		return "Test port";
-	}
-
-	public Datalink getIncomingLink() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/EchoConfig.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/EchoConfig.java
deleted file mode 100644
index 10fd615..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/EchoConfig.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor;
-
-/**
- * Trivial property class to configure the echo activity. As the echo activity
- * actually has no configuration whatsoever I've put some dummy properties
- * in here to test the serialization framework.
- * 
- * @author Tom
- * 
- */
-public class EchoConfig {
-
-	private String foo = "wibble!";
-	
-	public String getFoo() {
-		return this.foo;
-	}
-	
-	public void setFoo(String newFoo) {
-		this.foo = newFoo;
-	}
-	
-	public EchoConfig() {
-		//
-	}
-
-	public EchoConfig(String newFoo) {
-		super();
-		this.foo = newFoo;
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/NaiveProcessorConstructionTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/NaiveProcessorConstructionTest.java
deleted file mode 100644
index e98ce31..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/NaiveProcessorConstructionTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor;
-
-import java.io.IOException;
-
-import junit.framework.TestCase;
-import net.sf.taverna.t2.workflowmodel.EditException;
-import net.sf.taverna.t2.workflowmodel.impl.Tools;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-
-import org.jdom.JDOMException;
-
-/**
- * Tests the processor factory along with activity serialisation logic
- * 
- * @author Tom Oinn
- * 
- */
-public class NaiveProcessorConstructionTest extends TestCase {
-
-	public void testProcessorFactory() throws EditException, JDOMException,
-			IOException, ActivityConfigurationException {
-		AsynchEchoActivity activity = new AsynchEchoActivity();
-		activity.configure(new EchoConfig("blah"));
-		Tools.buildFromActivity(activity);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DiagnosticLayer.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DiagnosticLayer.java
deleted file mode 100644
index f6a73aa..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/dispatch/DiagnosticLayer.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.dispatch;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchCompletionEvent;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.events.DispatchResultEvent;
-
-/**
- * Debug dispatch stack layer, prints to stdout when it receives a result or
- * completion and when the cache purge message is sent from the parent dispatch
- * stack.
- * 
- * @author Tom
- * 
- */
-public class DiagnosticLayer extends AbstractDispatchLayer<Object> {
-
-	public DiagnosticLayer() {
-		super();
-	}
-
-	@Override
-	public void receiveResult(DispatchResultEvent resultEvent) {
-		System.out.println("  "
-				+ new Job(resultEvent.getOwningProcess(), resultEvent
-						.getIndex(), resultEvent.getData(), resultEvent
-						.getContext()));
-		getAbove().receiveResult(resultEvent);
-	}
-
-	@Override
-	public void receiveResultCompletion(DispatchCompletionEvent completionEvent) {
-		System.out.println("  "
-				+ new Completion(completionEvent.getOwningProcess(),
-						completionEvent.getIndex(), completionEvent
-								.getContext()));
-		getAbove().receiveResultCompletion(completionEvent);
-	}
-
-	@Override
-	public void finishedWith(String process) {
-		System.out.println("  Purging caches for " + process);
-	}
-
-	public void configure(Object config) {
-		// Do nothing
-	}
-
-	public Object getConfiguration() {
-		return null;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/DiagnosticIterationStrategyNode.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/DiagnosticIterationStrategyNode.java
deleted file mode 100644
index 3a9d276..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/DiagnosticIterationStrategyNode.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.taverna.t2.invocation.Completion;
-import net.sf.taverna.t2.invocation.IterationInternalEvent;
-import net.sf.taverna.t2.workflowmodel.processor.activity.Job;
-
-/**
- * Iteration strategy node that logs job and completion events for analysis
- * during debugging.
- * 
- * @author Tom Oinn
- * 
- */
-@SuppressWarnings("unchecked") //suppressed to avoid jdk1.5 compilation errors caused by the declaration IterationInternalEvent<? extends IterationInternalEvent<?>> e
-public class DiagnosticIterationStrategyNode extends
-		AbstractIterationStrategyNode {
-
-	private Map<String, List<IterationInternalEvent>> ownerToJobList;
-
-	public DiagnosticIterationStrategyNode() {
-		this.ownerToJobList = new HashMap<String, List<IterationInternalEvent>>();
-	}
-
-	@Override
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		for (String owner : ownerToJobList.keySet()) {
-			sb.append(owner + "\n");
-			List<IterationInternalEvent> jobs = ownerToJobList.get(owner);
-			for (IterationInternalEvent<?> w : jobs) {
-				sb.append("  " + w.toString() + "\n");
-			}
-		}
-		return sb.toString();
-	}
-
-	public int jobsReceived(String string) {
-		if (ownerToJobList.containsKey(string) == false) {
-			return 0;
-		}
-		int number = 0;
-		for (IterationInternalEvent w : ownerToJobList.get(string)) {
-			if (w instanceof Job) {
-				number++;
-			}
-		}
-		return number;
-	}
-
-	public boolean containsJob(String owningProcess, int[] jobIndex) {
-		List<IterationInternalEvent> jobs = ownerToJobList.get(owningProcess);
-		if (jobs == null) {
-			return false;
-		}
-		for (IterationInternalEvent w : jobs) {
-			if (w instanceof Job) {
-				Job j = (Job)w;
-				if (compareArrays(j.getIndex(), jobIndex)
-						&& j.getOwningProcess().equals(owningProcess)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private static boolean compareArrays(int[] a1, int[] a2) {
-		if (a1.length != a2.length) {
-			return false;
-		}
-		for (int i = 0; i < a1.length; i++) {
-			if (a1[i] != a2[i]) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public synchronized void receiveCompletion(int inputIndex,
-			Completion completion) {
-		String owningProcess = completion.getOwningProcess();
-		List<IterationInternalEvent> jobs = ownerToJobList.get(owningProcess);
-		if (jobs == null) {
-			jobs = new ArrayList<IterationInternalEvent>();
-			ownerToJobList.put(owningProcess, jobs);
-		}
-		jobs.add(completion);
-	}
-
-	public synchronized void receiveJob(int inputIndex, Job newJob) {
-		List<IterationInternalEvent> jobs = ownerToJobList.get(newJob.getOwningProcess());
-		if (jobs == null) {
-			jobs = new ArrayList<IterationInternalEvent>();
-			ownerToJobList.put(newJob.getOwningProcess(), jobs);
-		}
-		jobs.add(newJob);
-	}
-
-	public int getIterationDepth(Map<String, Integer> inputDepths) throws IterationTypeMismatchException {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationTypeCheckerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationTypeCheckerTest.java
deleted file mode 100644
index 26db007..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/processor/iteration/impl/IterationTypeCheckerTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.processor.iteration.impl;
-
-import net.sf.taverna.t2.workflowmodel.processor.iteration.CrossProduct;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.DotProduct;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.MissingIterationInputException;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.NamedInputPortNode;
-import junit.framework.TestCase;
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * Test the type check functionality now built into the iteration system,
- * exercises the iteration strategy and the strategy stack with a combination of
- * simple and staged iteration to check whether the type checker is getting
- * sensible results out.
- * 
- * @author Tom Oinn
- * 
- */
-public class IterationTypeCheckerTest extends TestCase {
-
-	private IterationStrategyImpl getISDot(int depthA, int depthB) {
-		IterationStrategyImpl is1 = new IterationStrategyImpl();
-		NamedInputPortNode nipn1 = new NamedInputPortNode("a", depthA);
-		NamedInputPortNode nipn2 = new NamedInputPortNode("b", depthB);
-		is1.addInput(nipn1);
-		is1.addInput(nipn2);
-		DotProduct dp = new DotProduct();
-		nipn1.setParent(dp);
-		nipn2.setParent(dp);
-		dp.setParent(is1.getTerminalNode());
-		return is1;
-	}
-
-	private IterationStrategyImpl getISCross(int depthA, int depthB) {
-		IterationStrategyImpl is1 = new IterationStrategyImpl();
-		NamedInputPortNode nipn1 = new NamedInputPortNode("a", depthA);
-		NamedInputPortNode nipn2 = new NamedInputPortNode("b", depthB);
-		is1.addInput(nipn1);
-		is1.addInput(nipn2);
-		CrossProduct cp = new CrossProduct();
-		nipn1.setParent(cp);
-		nipn2.setParent(cp);
-		cp.setParent(is1.getTerminalNode());
-		return is1;
-	}
-
-	private Map<String, Integer> getDepths(String[] names, int[] depths) {
-		Map<String, Integer> result = new HashMap<String, Integer>();
-		for (int i = 0; i < names.length; i++) {
-			result.put(names[i], depths[i]);
-		}
-		return result;
-	}
-
-	/**
-	 * Test simple iteration type check based on dot products
-	 * 
-	 * @throws IterationTypeMismatchException
-	 */
-	public void testDotUnstagedIteration()
-			throws IterationTypeMismatchException {
-		IterationStrategyImpl isi = getISDot(0, 0);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 1, 1 })) == 1);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 2, 2 })) == 2);
-
-		isi = getISDot(0, 1);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 1, 2 })) == 1);
-	}
-
-	/**
-	 * Test a simple iteration based on a cross product
-	 * 
-	 * @throws IterationTypeMismatchException
-	 */
-	public void testCrossUnstagedIteration()
-			throws IterationTypeMismatchException {
-		IterationStrategyImpl isi = getISCross(0, 0);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 1, 1 })) == 2);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 2, 2 })) == 4);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 1, 2 })) == 3);
-
-		isi = getISCross(0, 1);
-
-		assertTrue(isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 1, 2 })) == 2);
-	}
-
-	/**
-	 * Test that attempting to typecheck a mismatched dot product produces a
-	 * type mismatch exception
-	 * 
-	 */
-	public void testValidationFailureWithDot() {
-		try {
-			IterationStrategyImpl isi = getISDot(0, 0);
-			isi.getIterationDepth(getDepths(new String[] { "a", "b" },
-					new int[] { 1, 2 }));
-			fail("should have failed due to mismatch");
-		} catch (IterationTypeMismatchException itme) {
-			// Correct behaviour, this should cause a mismatch
-		}
-	}
-
-	/**
-	 * Fundamentally pointless, combining two cross product iteration strategies
-	 * is the same as using the last one directly but we can check this
-	 * 
-	 * @throws IterationTypeMismatchException
-	 * @throws MissingIterationInputException
-	 */
-	public void testStagedCombinationOfCross()
-			throws IterationTypeMismatchException,
-			MissingIterationInputException {
-		IterationStrategyStackImpl iss;
-
-		iss = new IterationStrategyStackImpl();
-		iss.addStrategy(getISCross(1, 1));
-		iss.addStrategy(getISCross(0, 0));
-
-		assertTrue(iss.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 2, 2 })) == 4);
-
-	}
-
-	/**
-	 * Fundamentally pointless, combining two dot product iteration strategies
-	 * is the same as using the last one directly but we can check this
-	 * 
-	 * @throws IterationTypeMismatchException
-	 * @throws MissingIterationInputException
-	 */
-	public void testStagedCombinationOfDot()
-			throws IterationTypeMismatchException,
-			MissingIterationInputException {
-		IterationStrategyStackImpl iss;
-
-		iss = new IterationStrategyStackImpl();
-		iss.addStrategy(getISDot(1, 1));
-		iss.addStrategy(getISDot(0, 0));
-
-		assertTrue(iss.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 2, 2 })) == 2);
-
-		// Should pass because the single items (depth 0) are promoted to single
-		// item lists before being passed into the iteration system so are
-		// effectively both depth 1 going into the second stage which then
-		// iterates to produce an index array length of 1
-		assertTrue(iss.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 0, 0 })) == 1);
-
-		// Slightly strange superficially that this should work, but in fact
-		// what happens is that the first single item is lifted to a list before
-		// being passed to the iteration strategy. The result is that it's fine
-		// to match with the dot product against the other list as neither at
-		// this point have index arrays, then in the second stage both are lists
-		// to be iterated over and both have single length index arrays.
-		assertTrue(iss.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 1, 0 })) == 1);
-	}
-
-	/**
-	 * Test whether Paul's example of iterating with dot product then cross
-	 * product can typecheck in a single staged iteration. This was an example
-	 * where the user had two lists of folders (a1, a2, b1, b2, c1, c2) and
-	 * wanted to compare all the contents of each 'a' folder with the other 'a'
-	 * folder and so on, doing a dot match to only compare a1 and a2 then a
-	 * cross product join within each pair to compare all contents of a1 with
-	 * all contents of a2. This appears to work!
-	 */
-	public void testStagedCombinationOfDotAndCross()
-			throws IterationTypeMismatchException,
-			MissingIterationInputException {
-		IterationStrategyStackImpl iss;
-
-		iss = new IterationStrategyStackImpl();
-		iss.addStrategy(getISDot(1, 1));
-		iss.addStrategy(getISCross(0, 0));
-
-		assertTrue(iss.getIterationDepth(getDepths(new String[] { "a", "b" },
-				new int[] { 2, 2 })) == 3);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/DummyActivity.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/DummyActivity.java
deleted file mode 100644
index 85df25a..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/DummyActivity.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-
-public class DummyActivity extends AbstractActivity<Integer> {
-
-	private Integer bean=null;
-	
-	@Override
-	public void configure(Integer conf) throws ActivityConfigurationException {
-		bean=conf;
-	}
-
-	@Override
-	public Integer getConfiguration() {
-		return bean;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/DummyBean.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/DummyBean.java
deleted file mode 100644
index 3408090..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/DummyBean.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization;
-
-public class DummyBean {
-	private int id;
-	private String name;
-	private InnerBean innerBean;
-	public int getId() {
-		return id;
-	}
-	public void setId(int id) {
-		this.id = id;
-	}
-	public String getName() {
-		return name;
-	}
-	public void setName(String name) {
-		this.name = name;
-	}
-	public InnerBean getInnerBean() {
-		return innerBean;
-	}
-	public void setInnerBean(InnerBean innerBean) {
-		this.innerBean = innerBean;
-	}
-	
-	
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/InnerBean.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/InnerBean.java
deleted file mode 100644
index 9e8b28d..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/InnerBean.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization;
-
-public class InnerBean {
-	private String stuff;
-
-	public String getStuff() {
-		return stuff;
-	}
-
-	public void setStuff(String stuff) {
-		this.stuff = stuff;
-	}	
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLDeserializerTest.java
deleted file mode 100644
index 15e08d4..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLDeserializerTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.StringReader;
-
-import net.sf.taverna.t2.workflowmodel.serialization.DummyBean;
-
-import org.jdom.Element;
-import org.jdom.input.SAXBuilder;
-import org.junit.Test;
-
-public class AbstractXMLDeserializerTest {
-	AbstractXMLDeserializer deserializer = new AbstractXMLDeserializer() {};
-	
-	@Test
-	public void testCreateBeanSimple() throws Exception {
-		Element el = new Element(XMLSerializationConstants.CONFIG_BEAN, XMLSerializationConstants.T2_WORKFLOW_NAMESPACE);
-		el.setAttribute("encoding","xstream");
-		Element elString = new Element("string");
-		elString.setText("12345");
-		el.addContent(elString);
-		
-		Object bean = deserializer.createBean(el, XMLDeserializerImpl.class.getClassLoader());
-		assertTrue("bean should be a String",bean instanceof String);
-		assertEquals("string should equal 12345","12345",((String)bean));
-	}
-	
-	@Test
-	public void testCreateBeanComplex() throws Exception {
-		String xml="<configBean xmlns='http://taverna.sf.net/2008/xml/t2flow' encoding=\"xstream\"><net.sf.taverna.t2.workflowmodel.serialization.DummyBean><id>1</id><name>bob</name><innerBean><stuff>xyz</stuff></innerBean></net.sf.taverna.t2.workflowmodel.serialization.DummyBean></configBean>";
-		Element el = new SAXBuilder().build(new StringReader(xml)).detachRootElement();
-		
-		Object bean = deserializer.createBean(el, XMLDeserializerImpl.class.getClassLoader());
-		assertTrue("bean should be a DummyBean",bean instanceof DummyBean);
-		DummyBean dummyBean = (DummyBean)bean;
-		
-		assertEquals("id should be 1",1,dummyBean.getId());
-		assertEquals("namne should be bob","bob",dummyBean.getName());
-		assertEquals("stuff should by xyz","xyz",dummyBean.getInnerBean().getStuff());
-	}
-	
-	@Test
-	public void testCreateBeanJDomXML() throws Exception {
-		String xml="<configBean xmlns='http://taverna.sf.net/2008/xml/t2flow'  encoding=\"jdomxml\"><fred><child1/><child2/></fred></configBean>";
-		Element el = new SAXBuilder().build(new StringReader(xml)).detachRootElement();
-		
-		Object bean = deserializer.createBean(el, XMLDeserializerImpl.class.getClassLoader());
-		assertNotNull("There bean should not be null",bean);
-		assertTrue("Bean should be an instance of Element",bean instanceof Element);
-		el = (Element)bean;
-		assertEquals("The root element should be named fred","fred",el.getName());
-		assertEquals("There should be 2 child elements",2,el.getChildren().size());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLSerializerTest.java
deleted file mode 100644
index 1ff4d4c..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/AbstractXMLSerializerTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import net.sf.taverna.t2.workflowmodel.serialization.DummyBean;
-import net.sf.taverna.t2.workflowmodel.serialization.InnerBean;
-
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.junit.Test;
-
-
-
-public class AbstractXMLSerializerTest {
-	AbstractXMLSerializer serializer = new AbstractXMLSerializer() {};
-	
-	@Test
-	public void testBeanAsElementComplex() throws Exception {
-		DummyBean bean = new DummyBean();
-		InnerBean bean2 = new InnerBean();
-		bean.setName("name");
-		bean.setId(5);
-		bean2.setStuff("stuff");
-		bean.setInnerBean(bean2);
-		Element el = serializer.beanAsElement(bean);
-		assertEquals("root should be configBean","configBean",el.getName());
-		assertEquals("the type should be xstream","xstream",el.getAttribute("encoding").getValue());
-		assertEquals("there should be 1 DummyBean child",1,el.getChildren("net.sf.taverna.t2.workflowmodel.serialization.DummyBean").size());
-		Element beanElement = el.getChild("net.sf.taverna.t2.workflowmodel.serialization.DummyBean");
-		assertNotNull("there should be a child id",beanElement.getChild("id"));
-		assertEquals("id child should have value 5","5",beanElement.getChild("id").getText());
-		assertNotNull("there should be a child name",beanElement.getChild("name"));
-		assertEquals("name child should have text name","name",beanElement.getChild("name").getText());
-		assertNotNull("there should be a child innerBean",beanElement.getChild("innerBean"));
-		Element innerBeanElement = beanElement.getChild("innerBean");
-		assertNotNull("innerBean should have a child stuff",innerBeanElement.getChild("stuff"));
-		assertEquals("stuff child should have text stuff","stuff",innerBeanElement.getChild("stuff").getText());
-		
-	}
-	
-	@Test
-	public void testElementBean() throws Exception {
-		Element person = new Element("person");
-		person.addContent(new Element("name"));
-		person.getChild("name").setText("fred smith");
-		
-		Element el = serializer.beanAsElement(person);
-		assertEquals("root should be configBean","configBean",el.getName());
-		assertEquals("the type should be jdomxml","jdomxml",el.getAttribute("encoding").getValue());
-		assertEquals("there should be 1 person",1,el.getChildren("person").size());
-		
-		Element person2=el.getChild("person");
-		
-		assertEquals("XML for person should match",elementToString(person),elementToString(person2));
-		
-	}
-	
-	@Test
-	public void testBeanAsElementSimple() throws Exception {
-		String helloWorld="hello world";
-		Element el = serializer.beanAsElement(helloWorld);
-		assertEquals("root should be configBean","configBean",el.getName());
-		assertEquals("the type should be xstream","xstream",el.getAttribute("encoding").getValue());
-		assertEquals("there should be 1 string",1,el.getChildren("string").size());
-		String innerXML=elementToString(el.getChild("string"));
-		assertEquals("Unexpected xml for the string","<string>hello world</string>",innerXML);
-	}
-	
-	private String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLDeserializerTest.java
deleted file mode 100644
index 033b6eb..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLDeserializerTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-
-import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
-import net.sf.taverna.t2.workflowmodel.serialization.DummyActivity;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-
-public class ActivityXMLDeserializerTest extends DeserializerTestsHelper {
-		ActivityXMLDeserializer deserializer = ActivityXMLDeserializer.getInstance();
-
-		@Test
-		public void testActivityDeserialization() throws Exception {
-			Element el = loadXMLFragment("activity.xml");
-			Activity<?> activity = deserializer.deserializeActivity(el,new HashMap<String,Element>());
-			
-			assertNotNull("The activity should not be NULL",activity);
-			assertTrue("should be a DummyActivity",activity instanceof DummyActivity);
-			assertTrue("bean should be an Integer",activity.getConfiguration() instanceof Integer);
-			assertEquals("bean should equal 5",5,((Integer)activity.getConfiguration()).intValue());
-			
-			assertEquals("there should be 1 input port mapping",1,activity.getInputPortMapping().size());
-			assertEquals("there should be 1 output port mapping",1,activity.getOutputPortMapping().size());
-			
-			assertEquals("input in is mapped to in","in",activity.getInputPortMapping().get("in"));
-			assertEquals("output out is mapped to out","out",activity.getOutputPortMapping().get("out"));
-		}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLSerializerTest.java
deleted file mode 100644
index 28c8081..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ActivityXMLSerializerTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.impl.DataflowImpl;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-import net.sf.taverna.t2.workflowmodel.serialization.DummyActivity;
-
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.junit.Test;
-
-
-public class ActivityXMLSerializerTest implements XMLSerializationConstants {
-	ActivityXMLSerializer serializer = ActivityXMLSerializer.getInstance();
-	Edits edits = new EditsImpl();
-	
-	@Test
-	public void testActivitySerialization() throws Exception
-	{
-		DummyActivity activity=new DummyActivity();
-		activity.getInputPortMapping().put("in", "in");
-		activity.getOutputPortMapping().put("out", "out");
-		activity.configure(new Integer(5));
-		Element el = serializer.activityToXML(activity);
-		
-		assertEquals("root element should be activity","activity",el.getName());
-		Element classChild = el.getChild("class",T2_WORKFLOW_NAMESPACE);
-		assertNotNull("there should be a child called class",classChild);
-		assertEquals("incorrect activity class name","net.sf.taverna.t2.workflowmodel.serialization.DummyActivity",classChild.getText());
-		assertEquals("there should be 1 inputMap child",1,el.getChildren("inputMap",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be 1 outputMap child",1,el.getChildren("outputMap",T2_WORKFLOW_NAMESPACE).size());
-		
-		Element inputMap=el.getChild("inputMap",T2_WORKFLOW_NAMESPACE);
-		Element outputMap=el.getChild("outputMap",T2_WORKFLOW_NAMESPACE);
-		
-		Element map=inputMap.getChild("map",T2_WORKFLOW_NAMESPACE);
-		assertEquals("map to should be 'in'","in",map.getAttribute("to").getValue());
-		assertEquals("map from should be 'in'","in",map.getAttribute("from").getValue());
-		
-		map=outputMap.getChild("map",T2_WORKFLOW_NAMESPACE);
-		assertEquals("map to should be 'out'","out",map.getAttribute("to").getValue());
-		assertEquals("map from should be 'out'","out",map.getAttribute("from").getValue());
-		
-		Element bean = el.getChild("configBean",T2_WORKFLOW_NAMESPACE);
-		assertNotNull("there should be a child called configBean",bean);
-		
-		Element intChild = bean.getChild("int");
-		assertNotNull("bean should have a child called int",intChild);
-		assertEquals("java child should describe an int with value 5","<int>5</int>",elementToString(intChild));
-	}
-	
-	@Test
-	public void testDataflowBasedActivity() throws Exception {
-		DummyDataflowActivity dummyDataflowActivity = new DummyDataflowActivity();
-		Dataflow df = edits.createDataflow();
-		((DataflowImpl)df).setLocalName("test");
-		dummyDataflowActivity.configure(df);
-		
-		Element el = serializer.activityToXML(dummyDataflowActivity);
-		
-		assertEquals("There should be 1 configBean child element",1,el.getChildren("configBean",T2_WORKFLOW_NAMESPACE).size());
-		
-		Element configBeanEl = el.getChild("configBean",T2_WORKFLOW_NAMESPACE);
-		assertEquals("The encoding type should be dataflow","dataflow",configBeanEl.getAttribute("encoding").getValue());
-		assertEquals("There should be 1 child called dataflow",1,configBeanEl.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).size());
-		Element dataflowEl = configBeanEl.getChild("dataflow",T2_WORKFLOW_NAMESPACE);
-		assertNotNull("there should be the attribute ref",dataflowEl.getAttribute("ref"));
-	}
-	
-	private String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLSerializerTest.java
deleted file mode 100644
index f7ff90a..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ConditionXMLSerializerTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.junit.Test;
-
-
-public class ConditionXMLSerializerTest implements XMLSerializationConstants {
-	
-	private ConditionXMLSerializer serializer = ConditionXMLSerializer.getInstance();
-	private Edits edits = new EditsImpl();
-	
-	private String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-	
-	@Test
-	public void testConditions() throws Exception {
-		Processor control = edits.createProcessor("control");
-		Processor target = edits.createProcessor("target");
-		edits.getCreateConditionEdit(control, target).doEdit();
-		
-		
-		List<Processor> processors = new ArrayList<Processor>();
-		processors.add(control);
-		processors.add(target);
-		
-		Element el = serializer.conditionsToXML(processors);
-		
-		assertEquals("root name should be conditions","conditions",el.getName());
-		assertEquals("there should be 1 child condition",1,el.getChildren("condition",T2_WORKFLOW_NAMESPACE).size());
-		Element condition = el.getChild("condition",T2_WORKFLOW_NAMESPACE);
-		condition.setNamespace(null); //remove the default namespace
-		assertEquals("incorrect condition xml","<condition control=\"control\" target=\"target\" />",elementToString(condition));
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLDeserializerTest.java
deleted file mode 100644
index 237818a..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLDeserializerTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-
-import net.sf.taverna.t2.workflowmodel.Condition;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.MergeInputPort;
-import net.sf.taverna.t2.workflowmodel.Processor;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-public class DataflowXMLDeserializerTest extends DeserializerTestsHelper {
-	DataflowXMLDeserializer deserializer = DataflowXMLDeserializer.getInstance();
-	
-	@Test
-	public void testMerge() throws Exception {
-		Element el = loadXMLFragment("dataflow_with_merge.xml");
-		Dataflow df = deserializer.deserializeDataflow(el,new HashMap<String, Element>());
-		
-		assertEquals("There should be 2 processors",2,df.getProcessors().size());
-		Processor top=df.getProcessors().get(0);
-		Processor bottom=df.getProcessors().get(1);
-		
-		assertEquals("Top processor should be called top","top",top.getLocalName());
-		assertEquals("Bottom processor should be called top","bottom",bottom.getLocalName());
-		
-		assertEquals("Top should have 1 output port",1,top.getOutputPorts().size());
-		
-		assertEquals("There should be 1 outgoing link",1,top.getOutputPorts().get(0).getOutgoingLinks().size());
-		
-		Datalink link = top.getOutputPorts().get(0).getOutgoingLinks().iterator().next();
-		
-		assertTrue("Link sink should be Merge port",link.getSink() instanceof MergeInputPort);
-	}
-	
-	@Test 
-	public void testDataflowNameAndId() throws Exception {
-		Element element = loadXMLFragment("empty_dataflow_with_ports.xml");
-		Dataflow df = deserializer.deserializeDataflow(element,new HashMap<String, Element>());
-		assertEquals("Dataflow should have an id of 123","123",df.getInternalIdentier());
-		assertEquals("dataflow should have the name george","george",df.getLocalName());
-	}
-	
-	@Test
-	public void testDataflowPorts() throws Exception {
-		Element element = loadXMLFragment("empty_dataflow_with_ports.xml");
-		Dataflow df = deserializer.deserializeDataflow(element,new HashMap<String, Element>());
-		
-		assertEquals("there should be 2 input ports",2,df.getInputPorts().size());
-		assertEquals("there should be 1 output port",1,df.getOutputPorts().size());
-		
-		DataflowInputPort port = df.getInputPorts().get(0);
-		assertEquals("Name should be input1","input1",port.getName());
-		assertEquals("depth should be 0",0,port.getDepth());
-		assertEquals("granular depth should be 0",0,port.getGranularInputDepth());
-		
-		port = df.getInputPorts().get(1);
-		assertEquals("Name should be input2","input2",port.getName());
-		assertEquals("depth should be 1",1,port.getDepth());
-		assertEquals("granular depth should be 1",1,port.getGranularInputDepth());
-		
-		DataflowOutputPort outputPort = df.getOutputPorts().get(0);
-		assertEquals("Name should be output","output",outputPort.getName());
-	}
-	
-	@Test
-	public void testDataflowConditionLink() throws Exception {
-		Element element = loadXMLFragment("dataflow_with_condition.xml");
-		Dataflow df = deserializer.deserializeDataflow(element,new HashMap<String, Element>());
-		
-		assertEquals("There should be 2 processors",2,df.getProcessors().size());
-		Processor pA = df.getProcessors().get(0);
-		Processor pB = df.getProcessors().get(1);
-		if (!pB.getLocalName().equals("b_processor")) {
-			pB=df.getProcessors().get(0);
-			pA=df.getProcessors().get(1);
-		}
-		assertEquals("There should be 1 precondition",1,pB.getPreconditionList().size());
-		Condition con = pB.getPreconditionList().get(0);
-		assertSame("the control processor shoudl be a_processor",pA, con.getControl());
-	}
-	
-	@Test
-	public void testDataflowProcessor() throws Exception {
-		Element element = loadXMLFragment("dataflow_with_unlinked_processor.xml");
-		Dataflow df = deserializer.deserializeDataflow(element,new HashMap<String, Element>());
-		assertEquals("There should be 1 processor",1,df.getProcessors().size());
-		assertEquals("Processor name should be a_processor","a_processor",df.getProcessors().get(0).getLocalName());	
-	}
-	
-	
-	@Test
-	public void testDataflowDataLinks() throws Exception {
-		Element el = loadXMLFragment("dataflow_datalinks.xml");
-		Dataflow df = deserializer.deserializeDataflow(el,new HashMap<String, Element>());
-		
-		assertEquals("There should be 2 processors",2,df.getProcessors().size());
-		assertEquals("There should be 2 datalinks",2,df.getLinks().size());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLSerializerTest.java
deleted file mode 100644
index 6c2f8af..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DataflowXMLSerializerTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.impl.DataflowImpl;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-
-public class DataflowXMLSerializerTest implements XMLSerializationConstants {
-	DataflowXMLSerializer serializer = DataflowXMLSerializer.getInstance();
-	Edits edits = new EditsImpl();
-	
-	@Test
-	public void testDataflowInputPorts() throws Exception {
-		Dataflow df = edits.createDataflow();
-		edits.getCreateDataflowInputPortEdit(df, "dataflow_in", 1, 0).doEdit();
-		
-		Element el = serializer.dataflowInputPorts(df.getInputPorts());
-		
-		
-		assertEquals("root name should be inputPorts","inputPorts",el.getName());
-		assertEquals("there should be 1 child called port",1,el.getChildren("port",T2_WORKFLOW_NAMESPACE).size());
-		Element port=el.getChild("port",T2_WORKFLOW_NAMESPACE);
-		assertEquals("name should be dataflow_in","dataflow_in",port.getChild("name",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("depth should be 1","1",port.getChild("depth",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("granular depth should be 0","0",port.getChild("granularDepth",T2_WORKFLOW_NAMESPACE).getText());
-		
-	}
-	
-	@Test
-	public void testDataflowNameandId() throws Exception {
-		Dataflow df = edits.createDataflow();
-		((DataflowImpl)df).setLocalName("the-name");
-		Element el = serializer.serializeDataflow(df);
-		assertEquals("there should be 1 child called name",1,el.getChildren("name",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("the name should be the-name","the-name",el.getChildText("name",T2_WORKFLOW_NAMESPACE));
-		assertNotNull("there should be an id attribute set",el.getAttributeValue("id"));
-		assertEquals("there should be an id attribute set that matches the dataflow",df.getInternalIdentier(),el.getAttributeValue("id"));
-	}
-	
-	@Test
-	public void testDataflowOutputPorts() throws Exception {
-		Dataflow df = edits.createDataflow();
-		edits.getCreateDataflowOutputPortEdit(df, "dataflow_out").doEdit();
-		Element el = serializer.dataflowOutputPorts(df.getOutputPorts());
-		
-		assertEquals("root name should be outputPorts","outputPorts",el.getName());
-		assertEquals("there should be 1 child called port",1,el.getChildren("port",T2_WORKFLOW_NAMESPACE).size());
-		Element port=el.getChild("port",T2_WORKFLOW_NAMESPACE);
-		assertEquals("name should be dataflow_out","dataflow_out",port.getChild("name",T2_WORKFLOW_NAMESPACE).getText());
-	}
-	
-	@Test
-	public void testDataflowNamespace() throws Exception {
-		Dataflow df = edits.createDataflow();
-		Element el = serializer.serializeDataflow(df);
-		assertEquals("Incorrect namespace","http://taverna.sf.net/2008/xml/t2flow",el.getNamespace().getURI());
-		
-		Element child = el.getChild("inputPorts",T2_WORKFLOW_NAMESPACE);
-		assertEquals("Children should also have the correct namespace","http://taverna.sf.net/2008/xml/t2flow",child.getNamespace().getURI());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLSerializerTest.java
deleted file mode 100644
index 208a72b..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DatalinksXMLSerializerTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Datalink;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.Merge;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.junit.Test;
-
-public class DatalinksXMLSerializerTest implements XMLSerializationConstants {
-	DatalinksXMLSerializer serializer = DatalinksXMLSerializer.getInstance();
-	private Edits edits = new EditsImpl();
-
-	private String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-
-	@Test
-	public void testDatalinks() throws Exception {
-		Processor p = edits.createProcessor("top");
-		Processor p2 = edits.createProcessor("bottom");
-		ProcessorInputPort iPort = edits.createProcessorInputPort(p2, "input", 0);
-		ProcessorOutputPort oPort = edits.createProcessorOutputPort(p, "output", 0, 0);
-		edits.getAddProcessorInputPortEdit(p2, iPort).doEdit();
-		edits.getAddProcessorOutputPortEdit(p, oPort).doEdit();
-		Datalink link = edits.createDatalink(p.getOutputPorts().get(0), p2
-				.getInputPorts().get(0));
-		List<Datalink> links = new ArrayList<Datalink>();
-		links.add(link);
-
-		Element el = serializer.datalinksToXML(links);
-
-		assertEquals("Root name should be datalinks", "datalinks", el.getName());
-		assertEquals("there should be 1 child named datalink", 1, el
-				.getChildren("datalink", T2_WORKFLOW_NAMESPACE).size());
-
-	}
-
-	@Test
-	public void testDatalinkMerge() throws Exception {
-		Dataflow df = edits.createDataflow();
-		Processor p = edits.createProcessor("top");
-		Processor p2 = edits.createProcessor("bottom");
-		edits.getAddProcessorEdit(df, p).doEdit();
-		edits.getAddProcessorEdit(df, p2).doEdit();
-		ProcessorInputPort iPort = edits.createProcessorInputPort(p2, "input", 0);
-		ProcessorOutputPort oPort = edits.createProcessorOutputPort(p, "output", 0, 0);
-		edits.getAddProcessorInputPortEdit(p2, iPort).doEdit();
-		edits.getAddProcessorOutputPortEdit(p, oPort).doEdit();
-		Merge m = edits.createMerge(df);
-		edits.getAddMergeEdit(df, m).doEdit();
-
-		edits.getConnectMergedDatalinkEdit(m, p.getOutputPorts().get(0),
-				p2.getInputPorts().get(0)).doEdit();
-
-		Element el = serializer.datalinksToXML(df.getLinks());
-
-		assertEquals("root element should be datalinks", "datalinks", el
-				.getName());
-		assertEquals("there should be 1 child datalink", 1, el.getChildren(
-				"datalink", T2_WORKFLOW_NAMESPACE).size());
-
-		String xml = elementToString(el);
-		String expected = "<datalinks xmlns=\""
-				+ T2_WORKFLOW_NAMESPACE.getURI()
-				+ "\"><datalink><sink type=\"merge\"><processor>bottom</processor><port>input</port></sink><source type=\"processor\"><processor>top</processor><port>output</port></source></datalink></datalinks>";
-		assertEquals("Unexpected xml generated", expected, xml);
-	}
-
-	@Test
-	public void testLinkedDataflowInputPort() throws Exception {
-		Dataflow df = edits.createDataflow();
-		edits.getCreateDataflowInputPortEdit(df, "dataflow_in", 0, 0).doEdit();
-		Processor p = edits.createProcessor("p");
-		ProcessorInputPort port = edits.createProcessorInputPort(p,"p_in",0);
-		edits.getAddProcessorInputPortEdit(p, port).doEdit();
-		Datalink link = edits.createDatalink(df.getInputPorts().get(0)
-				.getInternalOutputPort(), p.getInputPorts().get(0));
-		edits.getConnectDatalinkEdit(link).doEdit();
-		List<Datalink> links = new ArrayList<Datalink>();
-		links.add(link);
-
-		Element el = serializer.datalinksToXML(links);
-		
-		assertEquals("Root name should be datalinks", "datalinks", el.getName());
-		assertEquals("there should be 1 child named datalink", 1, el
-				.getChildren("datalink", T2_WORKFLOW_NAMESPACE).size());
-		Element elLink = el.getChild("datalink", T2_WORKFLOW_NAMESPACE);
-		assertEquals("There should be 1 sink", 1, elLink.getChildren("sink",
-				T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("There should be 1 source", 1, elLink.getChildren(
-				"source", T2_WORKFLOW_NAMESPACE).size());
-
-		Element elSink = elLink.getChild("sink", T2_WORKFLOW_NAMESPACE);
-		assertEquals("type should be processor", "processor", elSink
-				.getAttribute("type").getValue());
-		assertEquals("processor name should be p", "p", elSink.getChildText(
-				"processor", T2_WORKFLOW_NAMESPACE));
-		assertEquals("port name should be p_in", "p_in", elSink.getChildText(
-				"port", T2_WORKFLOW_NAMESPACE));
-
-		Element elSource = elLink.getChild("source", T2_WORKFLOW_NAMESPACE);
-		assertEquals("type should be dataflow", "dataflow", elSource
-				.getAttribute("type").getValue());
-		assertEquals("port name should be dataflow_in", "dataflow_in", elSource
-				.getChildText("port", T2_WORKFLOW_NAMESPACE));
-
-	}
-
-	@Test
-	public void testLinkedDataflowOutputPort() throws Exception {
-		Dataflow df = edits.createDataflow();
-		edits.getCreateDataflowOutputPortEdit(df, "dataflow_out").doEdit();
-		Processor p = edits.createProcessor("p");
-		ProcessorOutputPort port = edits.createProcessorOutputPort(p, "p_out", 0, 0);
-		edits.getAddProcessorOutputPortEdit(p, port).doEdit();
-		Datalink link = edits.createDatalink(p.getOutputPorts().get(0), df
-				.getOutputPorts().get(0).getInternalInputPort());
-		edits.getConnectDatalinkEdit(link).doEdit();
-		List<Datalink> links = new ArrayList<Datalink>();
-		links.add(link);
-
-		Element el = serializer.datalinksToXML(links);
-		
-		assertEquals("Root name should be datalinks", "datalinks", el.getName());
-		assertEquals("there should be 1 child named datalink", 1, el
-				.getChildren("datalink", T2_WORKFLOW_NAMESPACE).size());
-		Element elLink = el.getChild("datalink", T2_WORKFLOW_NAMESPACE);
-		assertEquals("There should be 1 sink", 1, elLink.getChildren("sink",
-				T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("There should be 1 source", 1, elLink.getChildren(
-				"source", T2_WORKFLOW_NAMESPACE).size());
-
-		Element elSink = elLink.getChild("sink", T2_WORKFLOW_NAMESPACE);
-		assertEquals("type should be dataflow", "dataflow", elSink
-				.getAttribute("type").getValue());
-		assertEquals("port name should be dataflow_out", "dataflow_out", elSink
-				.getChildText("port", T2_WORKFLOW_NAMESPACE));
-
-		Element elSource = elLink.getChild("source", T2_WORKFLOW_NAMESPACE);
-		assertEquals("type should be processor", "processor", elSource
-				.getAttribute("type").getValue());
-		assertEquals("processor name should be p", "p", elSource.getChildText(
-				"processor", T2_WORKFLOW_NAMESPACE));
-		assertEquals("port name should be p_in", "p_out", elSource
-				.getChildText("port", T2_WORKFLOW_NAMESPACE));
-	}
-	
-	@Test
-	public void testDatalink() throws Exception {
-		Processor p = edits.createProcessor("top");
-		Processor p2 = edits.createProcessor("bottom");
-		ProcessorInputPort iPort = edits.createProcessorInputPort(p2, "input", 0);
-		edits.getAddProcessorInputPortEdit(p2, iPort).doEdit();
-		ProcessorOutputPort oPort = edits.createProcessorOutputPort(p, "output", 0, 0);
-		edits.getAddProcessorOutputPortEdit(p, oPort).doEdit();
-		Datalink link = edits.createDatalink(p.getOutputPorts().get(0), p2.getInputPorts().get(0));
-		edits.getConnectDatalinkEdit(link).doEdit();
-		
-		Element el = serializer.datalinkToXML(link);
-		
-		assertEquals("root name should be datalink","datalink",el.getName());
-		assertEquals("there should be 1 child called source",1,el.getChildren("source",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be 1 child called sink",1,el.getChildren("sink",T2_WORKFLOW_NAMESPACE).size());
-		Element sink=el.getChild("sink",T2_WORKFLOW_NAMESPACE);
-		Element source=el.getChild("source",T2_WORKFLOW_NAMESPACE);
-		
-		assertEquals("source processor should be called 'top'","top",source.getChild("processor",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("sink processor should be called 'bottom'","bottom",sink.getChild("processor",T2_WORKFLOW_NAMESPACE).getText());
-		
-		assertEquals("source port should be called 'output'","output",source.getChild("port",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("sink port should be called 'input'","input",sink.getChild("port",T2_WORKFLOW_NAMESPACE).getText());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DeserializerImplTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DeserializerImplTest.java
deleted file mode 100644
index c0f90b0..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DeserializerImplTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.DataflowInputPort;
-import net.sf.taverna.t2.workflowmodel.DataflowOutputPort;
-
-import org.jdom.Element;
-import org.jdom.Namespace;
-import org.junit.Before;
-import org.junit.Test;
-
-public class DeserializerImplTest extends DeserializerTestsHelper {
-
-	private XMLDeserializerImpl deserializer = new XMLDeserializerImpl();
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@Test
-	public void testDeserialize() throws Exception {
-		
-			Element element = new Element("workflow",Namespace.getNamespace("http://taverna.sf.net/2008/xml/t2flow"));
-			Element innerDataflow = loadXMLFragment("empty_dataflow_with_ports.xml");
-			innerDataflow.setAttribute("role","top");
-			element.addContent(innerDataflow);
-			Dataflow df = deserializer.deserializeDataflow(element);
-			
-			assertEquals("there should be 2 input ports",2,df.getInputPorts().size());
-			assertEquals("there should be 1 output port",1,df.getOutputPorts().size());
-			
-			DataflowInputPort port = df.getInputPorts().get(0);
-			assertEquals("Name should be input1","input1",port.getName());
-			assertEquals("depth should be 0",0,port.getDepth());
-			assertEquals("granular depth should be 0",0,port.getGranularInputDepth());
-			
-			port = df.getInputPorts().get(1);
-			assertEquals("Name should be input2","input2",port.getName());
-			assertEquals("depth should be 1",1,port.getDepth());
-			assertEquals("granular depth should be 1",1,port.getGranularInputDepth());
-			
-			DataflowOutputPort outputPort = df.getOutputPorts().get(0);
-			assertEquals("Name should be output","output",outputPort.getName());
-		
-	}
-	
-	
-	
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DeserializerTestsHelper.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DeserializerTestsHelper.java
deleted file mode 100644
index 4da1717..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DeserializerTestsHelper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.jdom.Element;
-import org.jdom.input.SAXBuilder;
-
-public class DeserializerTestsHelper {
-
-	protected Edits edits = new EditsImpl();
-	
-	protected Element loadXMLFragment(String resourceName) throws Exception {
-		InputStream inStream = DeserializerImplTest.class
-				.getResourceAsStream("/serialized-fragments/" + resourceName);
-
-		if (inStream==null) throw new IOException("Unable to find resource for serialized fragment :"+resourceName);
-		SAXBuilder builder = new SAXBuilder();
-		return builder.build(inStream).detachRootElement();
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLDeserializerTest.java
deleted file mode 100644
index 43473e9..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLDeserializerTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.DispatchLayer;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-public class DispatchLayerXMLDeserializerTest extends DeserializerTestsHelper {
-	DispatchLayerXMLDeserializer deserializer = DispatchLayerXMLDeserializer.getInstance();
-	
-	@Test
-	public void testDispatchLayer() throws Exception {
-		Element el = loadXMLFragment("dispatchLayer.xml");
-		DispatchLayer<?> layer = deserializer.deserializeDispatchLayer(el);
-		assertTrue("Should be a Parallelize layer",layer instanceof Parallelize);
-		Parallelize para = (Parallelize)layer;
-		assertTrue("config should be ParellizeConfig",para.getConfiguration() instanceof ParallelizeConfig);
-		assertEquals("max jobs should be 7",7,((ParallelizeConfig)para.getConfiguration()).getMaximumJobs());
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLSerializerTest.java
deleted file mode 100644
index d022322..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchLayerXMLSerializerTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-public class DispatchLayerXMLSerializerTest implements XMLSerializationConstants {
-	DispatchLayerXMLSerializer serializer = DispatchLayerXMLSerializer.getInstance();
-	
-	@Test
-	public void testDispatchLayerSerialization() throws Exception {
-		Parallelize layer = new Parallelize();
-		layer.configure(new ParallelizeConfig());
-		Element el = serializer.dispatchLayerToXML(layer);
-		
-		assertEquals("element should have name dispatchLayer","dispatchLayer",el.getName());
-		Element classChild = el.getChild("class",T2_WORKFLOW_NAMESPACE);
-		
-		assertNotNull("There should be a child called class",classChild);
-		assertEquals("Incorrect class name for Parellalize","net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize",classChild.getText());
-		
-		Element bean = el.getChild("configBean",T2_WORKFLOW_NAMESPACE);
-		assertNotNull("there should be a child called configBean",bean);
-		assertEquals("the type should be xstream","xstream",bean.getAttribute("encoding").getValue());
-		assertEquals("there should be 1 child that describes the class",1,bean.getChildren().size());
-		
-		classChild=(Element)bean.getChildren().get(0);
-		assertEquals("the element name should describe the Parallelize child","net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig",classChild.getName());
-	}
-	
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLDeserializerTest.java
deleted file mode 100644
index c638495..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLDeserializerTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-public class DispatchStackXMLDeserializerTest extends DeserializerTestsHelper {
-	DispatchStackXMLDeserializer deserializer = DispatchStackXMLDeserializer.getInstance();
-	
-	@Test
-	public void testDispatchStack() throws Exception {
-		Element el = loadXMLFragment("dispatchStack.xml");
-		Processor p = edits.createProcessor("p");
-		deserializer.deserializeDispatchStack(p, el);
-		assertEquals("there should be 5 layers",5,p.getDispatchStack().getLayers().size());
-		assertTrue("first layer should be parallelize, but was "+p.getDispatchStack().getLayers().get(0),p.getDispatchStack().getLayers().get(0) instanceof Parallelize);
-		assertTrue("2nd layer should be ErrorBounce, but was "+p.getDispatchStack().getLayers().get(1),p.getDispatchStack().getLayers().get(1) instanceof ErrorBounce);
-		assertTrue("3rd layer should be Failover, but was "+p.getDispatchStack().getLayers().get(2),p.getDispatchStack().getLayers().get(2) instanceof Failover);
-		assertTrue("4th layer should be Retry, but was "+p.getDispatchStack().getLayers().get(3),p.getDispatchStack().getLayers().get(3) instanceof Retry);
-		assertTrue("5th layer should be Invoke, but was "+p.getDispatchStack().getLayers().get(4),p.getDispatchStack().getLayers().get(4) instanceof Invoke);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLSerializerTest.java
deleted file mode 100644
index 4eec8fa..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DispatchStackXMLSerializerTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover;
-import net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-
-public class DispatchStackXMLSerializerTest implements XMLSerializationConstants {
-	DispatchStackXMLSerializer serializer = DispatchStackXMLSerializer.getInstance();
-	Edits edits = new EditsImpl();
-	
-	@Test
-	public void testDispatchStackSerialization() throws Exception {
-		Processor p = edits.createProcessor("test");
-		edits.getAddDispatchLayerEdit(p.getDispatchStack(), new Invoke(), 0).doEdit();
-		edits.getAddDispatchLayerEdit(p.getDispatchStack(), new Failover(), 1).doEdit();
-		Element el = serializer.dispatchStackToXML(p.getDispatchStack());
-		
-		
-		assertEquals("root name should be dispatchStack","dispatchStack",el.getName());
-		assertEquals("there should be 2 inner layer elements",2,el.getChildren("dispatchLayer",T2_WORKFLOW_NAMESPACE).size());
-		
-		Element firstLayer = (Element)el.getChildren("dispatchLayer",T2_WORKFLOW_NAMESPACE).get(0);
-		assertEquals("child for layer define the class for the Invoke layer","net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke",firstLayer.getChild("class",T2_WORKFLOW_NAMESPACE).getText());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DummyDataflowActivity.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DummyDataflowActivity.java
deleted file mode 100644
index b8bc2f3..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/DummyDataflowActivity.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import java.util.Map;
-
-import net.sf.taverna.t2.reference.T2Reference;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousActivity;
-import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException;
-import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback;
-
-public class DummyDataflowActivity extends AbstractAsynchronousActivity<Dataflow> {
-	Dataflow df;
-	@Override
-	public void configure(Dataflow conf) throws ActivityConfigurationException {
-		this.df=conf;
-		
-	}
-
-	@Override
-	public void executeAsynch(Map<String, T2Reference> data,
-			AsynchronousActivityCallback callback) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public Dataflow getConfiguration() {
-		return df;
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStragegyStackXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStragegyStackXMLDeserializerTest.java
deleted file mode 100644
index 896e949..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStragegyStackXMLDeserializerTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategy;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-public class IterationStragegyStackXMLDeserializerTest extends DeserializerTestsHelper {
-	private IterationStrategyStackXMLDeserializer deserializer = IterationStrategyStackXMLDeserializer.getInstance();
-	
-	@Test
-	public void testCrossProducts() throws Exception {
-		Element el = loadXMLFragment("2_port_cross_product.xml");
-		Processor p =edits.createProcessor("test");
-		
-		deserializer.deserializeIterationStrategyStack(el, p.getIterationStrategy());
-		assertEquals("There should be 1 strategy",1,p.getIterationStrategy().getStrategies().size());
-		
-		IterationStrategy strat = p.getIterationStrategy().getStrategies().get(0);
-		
-		assertNotNull(strat.getDesiredCardinalities());
-		assertNotNull(strat.getDesiredCardinalities().get("nested_beanshell_in"));
-		assertNotNull(strat.getDesiredCardinalities().get("nested_beanshell_in2"));
-		
-		assertEquals("cardinality should be 0",Integer.valueOf(0),strat.getDesiredCardinalities().get("nested_beanshell_in"));
-		assertEquals("cardinality should be 1",Integer.valueOf(1),strat.getDesiredCardinalities().get("nested_beanshell_in2"));
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLSerializerTest.java
deleted file mode 100644
index a32801b..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/IterationStrategyStackXMLSerializerTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.DotProduct;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.NamedInputPortNode;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyImpl;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.impl.IterationStrategyStackImpl;
-
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.junit.Test;
-
-
-
-public class IterationStrategyStackXMLSerializerTest implements XMLSerializationConstants {
-	IterationStrategyStackXMLSerializer serializer = IterationStrategyStackXMLSerializer.getInstance();
-	
-	@Test
-	public void testIterationStrategyStack() throws Exception {
-		NamedInputPortNode nipn1 = new NamedInputPortNode("a", 0);
-		NamedInputPortNode nipn2 = new NamedInputPortNode("b", 0);
-		IterationStrategyImpl strat = new IterationStrategyImpl();
-		
-		DotProduct dp = new DotProduct();
-		nipn1.setParent(dp);
-		nipn2.setParent(dp);
-		dp.setParent(strat.getTerminalNode());
-		IterationStrategyImpl is = new IterationStrategyImpl();
-		is.addInput(nipn1);
-		is.addInput(nipn2);
-		
-		IterationStrategyStackImpl stack = new IterationStrategyStackImpl();
-		stack.addStrategy(strat);
-		
-		Element el = serializer.iterationStrategyStackToXML(stack);
-		
-		assertEquals("root name should be iterationStrategyStack","iterationStrategyStack",el.getName());
-		assertEquals("child name should be iteration","iteration",el.getChild("iteration",T2_WORKFLOW_NAMESPACE).getName());
-		Element iteration=el.getChild("iteration",T2_WORKFLOW_NAMESPACE);
-		assertEquals("there should be 1 child named strategy",1,iteration.getChildren("strategy",T2_WORKFLOW_NAMESPACE).size());
-		Element strategy=iteration.getChild("strategy",T2_WORKFLOW_NAMESPACE);
-		assertEquals("there should be 1 child named dot",1,strategy.getChildren("dot",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be no child named cross",0,strategy.getChildren("cross",T2_WORKFLOW_NAMESPACE).size());
-		Element dot=strategy.getChild("dot",T2_WORKFLOW_NAMESPACE);
-		dot.setNamespace(null);
-		for (Object child : dot.getChildren()) {
-			((Element)child).setNamespace(null);
-		}
-		assertEquals("wrong xml for dot","<dot><port name=\"a\" depth=\"0\" /><port name=\"b\" depth=\"0\" /></dot>",elementToString(dot));
-		
-	}
-	
-	private String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-
-	
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLDeserializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLDeserializerTest.java
deleted file mode 100644
index 7b04585..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLDeserializerTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.util.HashMap;
-
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationStrategyStack;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-public class ProcessorXMLDeserializerTest extends DeserializerTestsHelper {
-	ProcessorXMLDeserializer deserializer = ProcessorXMLDeserializer.getInstance();
-	
-	@Test
-	public void testProcessor() throws Exception {
-		Element el = loadXMLFragment("processor.xml");
-		Processor p = deserializer.deserializeProcessor(el,new HashMap<String, Element>());
-		
-		assertEquals("Local name should be george","george",p.getLocalName());
-		assertEquals("there should be 1 input port",1,p.getInputPorts().size());
-		assertEquals("there should be 0 activities",0,p.getActivityList().size());
-		assertEquals("there should be 1 output port",1,p.getOutputPorts().size());
-		assertNotNull("there should be an iteration strategy",p.getIterationStrategy());
-		assertEquals("there should be no dispatch stack layers",0,p.getDispatchStack().getLayers().size());
-		
-		ProcessorInputPort processorInputPort = p.getInputPorts().get(0);
-		assertEquals("name should be input","input",processorInputPort.getName());
-		assertEquals("depth should be 0",0,processorInputPort.getDepth());
-		
-		ProcessorOutputPort processorOutputPort = p.getOutputPorts().get(0);
-		assertEquals("name should be output","output",processorOutputPort.getName());
-		assertEquals("depth should be 1",1,processorOutputPort.getDepth());
-		assertEquals("granular depth should be 0",0,processorOutputPort.getGranularDepth());
-		
-		IterationStrategyStack stack=p.getIterationStrategy();
-		assertEquals("There should be 1 iteration strategy defined",1,stack.getStrategies().size());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLSerializerTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLSerializerTest.java
deleted file mode 100644
index b1606ae..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/ProcessorXMLSerializerTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import net.sf.taverna.t2.workflowmodel.Edits;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.ProcessorInputPort;
-import net.sf.taverna.t2.workflowmodel.ProcessorOutputPort;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.jdom.Element;
-import org.junit.Test;
-
-
-
-public class ProcessorXMLSerializerTest implements XMLSerializationConstants {
-	Edits edits = new EditsImpl();
-	
-	ProcessorXMLSerializer serializer = ProcessorXMLSerializer.getInstance();
-	
-	@Test
-	public void testProcessorSerialization() throws Exception {
-		Processor p = edits.createProcessor("fred");
-		ProcessorInputPort iPort = edits.createProcessorInputPort(p, "input", 0);
-		ProcessorOutputPort oPort = edits.createProcessorOutputPort(p, "output", 1, 0);
-		edits.getAddProcessorInputPortEdit(p, iPort).doEdit();
-		edits.getAddProcessorOutputPortEdit(p, oPort).doEdit();
-		
-		Element el = serializer.processorToXML(p);
-
-		
-		assertNotNull("Element should not be null",el);
-		
-		assertEquals("root element should be processor","processor",el.getName());
-		Element name=el.getChild("name",T2_WORKFLOW_NAMESPACE);
-		assertNotNull("There should be a child called name",name);
-		assertEquals("name should be fred","fred",name.getText());
-		
-		assertEquals("there should be an annotations child (even if its empty)",1,el.getChildren("annotations",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be an activities child (even if its empty)",1,el.getChildren("activities",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be an dispatch statck child (even if its empty)",1,el.getChildren("dispatchStack",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be an iteration strategy stack child (even if its empty)",1,el.getChildren("iterationStrategyStack",T2_WORKFLOW_NAMESPACE).size());
-		assertEquals("there should be an input ports child (even if its empty)",1,el.getChildren("inputPorts",T2_WORKFLOW_NAMESPACE).size());
-		Element inputPorts = el.getChild("inputPorts",T2_WORKFLOW_NAMESPACE);
-		assertEquals("there should be 1 port element",1,inputPorts.getChildren("port",T2_WORKFLOW_NAMESPACE).size());
-		Element port = inputPorts.getChild("port",T2_WORKFLOW_NAMESPACE);
-		assertEquals("name should be input","input",port.getChild("name",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("depth should be 0","0",port.getChild("depth",T2_WORKFLOW_NAMESPACE).getText());
-		Element outputPorts = el.getChild("outputPorts",T2_WORKFLOW_NAMESPACE);
-		assertEquals("there should be an output ports child (even if its empty)",1,el.getChildren("outputPorts",T2_WORKFLOW_NAMESPACE).size());
-		port = outputPorts.getChild("port",T2_WORKFLOW_NAMESPACE);
-		assertEquals("name should be output","output",port.getChild("name",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("depth should be 1","1",port.getChild("depth",T2_WORKFLOW_NAMESPACE).getText());
-		assertEquals("granularDepth should be 0","0",port.getChild("granularDepth",T2_WORKFLOW_NAMESPACE).getText());
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/SerializerImplTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/SerializerImplTest.java
deleted file mode 100644
index f0639ee..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/SerializerImplTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.*;
-import net.sf.taverna.t2.workflowmodel.Dataflow;
-import net.sf.taverna.t2.workflowmodel.Processor;
-import net.sf.taverna.t2.workflowmodel.impl.DataflowImpl;
-import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
-
-import org.apache.log4j.Logger;
-import org.jdom.Element;
-import org.jdom.output.XMLOutputter;
-import org.junit.Test;
-
-public class SerializerImplTest implements XMLSerializationConstants{
-	
-	private static Logger logger = Logger.getLogger(SerializerImplTest.class);
-	
-	private XMLSerializerImpl serializer=new XMLSerializerImpl();
-	private EditsImpl edits = new EditsImpl();
-	
-	@Test
-	public void testDataflowSerialization() throws Exception {
-		//FIXME: Update to include name - a Dataflow has a LocalName
-		Dataflow df = edits.createDataflow();
-		Element el = serializer.serializeDataflow(df);
-		
-		logger.info("workflow serialization xml = "+elementToString(el));
-		
-		assertEquals("root should be workflow","workflow",el.getName());
-		assertEquals("there should be 1 child 'dataflow'",1,el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).size());
-		Element dfElement = el.getChild("dataflow",T2_WORKFLOW_NAMESPACE);
-		assertEquals("the inner dataflow should have a role as 'top'","top",dfElement.getAttribute("role").getValue());
-	}
-	
-	
-	private String elementToString(Element element) {
-		return new XMLOutputter().outputString(element);
-	}
-	
-	@Test
-	public void testWithNested() throws Exception {
-		DataflowImpl df = (DataflowImpl)edits.createDataflow();
-		df.setLocalName("main_dataflow");
-		DataflowImpl innerDf = (DataflowImpl)edits.createDataflow();
-		innerDf.setLocalName("inner_dataflow");
-		DummyDataflowActivity a = new DummyDataflowActivity();
-		a.configure(innerDf);
-		Processor p = edits.createProcessor("proc");
-		edits.getAddActivityEdit(p, a).doEdit();
-		edits.getAddProcessorEdit(df, p).doEdit();
-		
-		Element el = serializer.serializeDataflow(df);
-		assertEquals("root should be workflow","workflow",el.getName());
-		assertEquals("there should be 2 child 'dataflow'",2,el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).size());
-		
-		Element elOuterDf = (Element)el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).get(0);
-		Element elInnerDf = (Element)el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).get(1);
-		
-		assertEquals("first df should be role=top","top",elOuterDf.getAttribute("role").getValue());
-		assertEquals("inner df should be role=nested","nested",elInnerDf.getAttribute("role").getValue());
-		assertNotNull("inner df should have attribute id=inner_dataflow",elInnerDf.getAttributeValue("id"));	
-	}
-	
-	@Test
-	//test for df that has a df activity that itself contains a df activity
-	public void testWithNestedNested() throws Exception
-	{
-		DataflowImpl df = (DataflowImpl)edits.createDataflow();
-		df.setLocalName("main_dataflow");
-		DataflowImpl innerDf = (DataflowImpl)edits.createDataflow();
-		innerDf.setLocalName("inner_dataflow");
-		DummyDataflowActivity a = new DummyDataflowActivity();
-		a.configure(innerDf);
-		Processor p = edits.createProcessor("proc");
-		edits.getAddActivityEdit(p, a).doEdit();
-		edits.getAddProcessorEdit(df, p).doEdit();
-		
-		DataflowImpl innerInnerDf = (DataflowImpl)edits.createDataflow();
-		innerInnerDf.setLocalName("inner_inner_dataflow");
-		DummyDataflowActivity a2 = new DummyDataflowActivity();
-		a2.configure(innerInnerDf);
-		Processor p2 = edits.createProcessor("proc2");
-		edits.getAddActivityEdit(p2, a2).doEdit();
-		edits.getAddProcessorEdit(innerDf, p2).doEdit();
-		
-		Element el = serializer.serializeDataflow(df);
-		assertEquals("root should be workflow","workflow",el.getName());
-		assertEquals("there should be 3 child 'dataflow'",3,el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).size());
-		
-		Element elOuterDf = (Element)el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).get(0);
-		Element elInnerDf = (Element)el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).get(1);
-		Element elInnerInnerDf = (Element)el.getChildren("dataflow",T2_WORKFLOW_NAMESPACE).get(2);
-		
-		assertEquals("first df should be role=top","top",elOuterDf.getAttribute("role").getValue());
-		assertEquals("inner df should be role=nested","nested",elInnerDf.getAttribute("role").getValue());
-		assertNotNull("inner df should have attribute id=inner_dataflow",elInnerDf.getAttributeValue("id"));
-		
-		assertEquals("inner inner df should be role=nested","nested",elInnerInnerDf.getAttribute("role").getValue());
-		assertNotNull("inner inner df should have attribute id=inner_dataflow",elInnerInnerDf.getAttributeValue("id"));
-		
-	}
-}
diff --git a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/SerializerRegistryTest.java b/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/SerializerRegistryTest.java
deleted file mode 100755
index d1d78ae..0000000
--- a/trunk/workflowmodel-impl/src/test/java/net/sf/taverna/t2/workflowmodel/serialization/xml/SerializerRegistryTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package net.sf.taverna.t2.workflowmodel.serialization.xml;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-public class SerializerRegistryTest {
-	
-	@Test
-	public void getSerializer() {
-		XMLSerializer serializer = XMLSerializerRegistry.getInstance().getSerializer();
-		assertNotNull(serializer);
-	}
-	
-	@Test
-	public void getDeserializer() {
-		XMLDeserializer deserializer = XMLDeserializerRegistry.getInstance().getDeserializer();
-		assertNotNull(deserializer);
-	}
-
-}
diff --git a/trunk/workflowmodel-impl/src/test/resources/log4j.properties b/trunk/workflowmodel-impl/src/test/resources/log4j.properties
deleted file mode 100644
index 2fba8c6..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-log4j.rootLogger=WARN, CONSOLE
-log4j.logger.net.sf.taverna.t2=DEBUG
-#log4j.logger.net.sf.taverna.t2.ui=DEBUG
-
-#log4j.logger.org.apache.commons.httpclient=ERROR
-
-# Default output to console
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=%-5p %d{ISO8601} (%c:%L) - %m%n
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/2_port_cross_product.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/2_port_cross_product.xml
deleted file mode 100644
index 603685e..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/2_port_cross_product.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<iterationStrategyStack xmlns="http://taverna.sf.net/2008/xml/t2flow">
-	<iteration>
-		<strategy>
-			<cross>
-				<port name="nested_beanshell_in" depth="0" />
-				<port name="nested_beanshell_in2" depth="1" />
-			</cross>
-		</strategy>
-	</iteration>
-</iterationStrategyStack>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/activity.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/activity.xml
deleted file mode 100644
index 3d0d426..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/activity.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<activity xmlns="http://taverna.sf.net/2008/xml/t2flow">
-	<class>
-		net.sf.taverna.t2.workflowmodel.serialization.DummyActivity
-	</class>
-	<inputMap>
-		<map from="in" to="in" />
-	</inputMap>
-	<outputMap>
-		<map from="out" to="out" />
-	</outputMap>
-	<configBean encoding="xstream">
-		<int xmlns="">5</int>
-	</configBean>
-</activity>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_datalinks.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_datalinks.xml
deleted file mode 100644
index b7b7d58..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_datalinks.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<dataflow role="top" xmlns="http://taverna.sf.net/2008/xml/t2flow">
-	<inputPorts/>
-	<outputPorts>
-		<port>
-			<name>df_output</name>
-		</port>
-	</outputPorts>
-	<processors>
-		<processor>
-			<name>a_processor</name>
-			<inputPorts />
-			<outputPorts>
-				<port>
-					<name>a_output</name>
-					<depth>0</depth>
-					<granularDepth>0</granularDepth>
-				</port>
-			</outputPorts>
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy>
-						<cross>
-							<port name="input" depth="0" />
-						</cross>
-					</strategy>
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-		<processor>
-			<name>b_processor</name>
-			<inputPorts>
-				<port>
-					<name>b_input</name>
-					<depth>0</depth>
-				</port>
-			</inputPorts>
-			<outputPorts>
-				<port>
-					<name>b_output</name>
-					<depth>0</depth>
-					<granularDepth>0</granularDepth>
-				</port>
-			</outputPorts>
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy>
-						<cross>
-							<port name="input" depth="0" />
-						</cross>
-					</strategy>
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-	</processors>
-	<conditions />
-	<datalinks xmlns="http://taverna.sf.net/2008/xml/t2flow">
-		<datalink>
-			<sink type="processor">
-				<processor>b_processor</processor>
-				<port>b_input</port>
-			</sink>
-			<source type="processor">
-				<processor>a_processor</processor>
-				<port>a_output</port>
-			</source>
-		</datalink>
-		<datalink>
-			<sink type="dataflow">
-				<port>df_output</port>
-			</sink>
-			<source type="processor">
-				<processor>b_processor</processor>
-				<port>b_output</port>
-			</source>
-		</datalink>
-	</datalinks>
-</dataflow>
-
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_condition.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_condition.xml
deleted file mode 100644
index 608d1ec..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_condition.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<dataflow role="top" xmlns="http://taverna.sf.net/2008/xml/t2flow" id="123">
-	<inputPorts />
-	<outputPorts />
-	<processors>
-		<processor>
-			<name>a_processor</name>
-			<inputPorts>
-				<port>
-					<name>input</name>
-					<depth>0</depth>
-				</port>
-			</inputPorts>
-			<outputPorts>
-				<port>
-					<name>output</name>
-					<depth>1</depth>
-					<granularDepth>0</granularDepth>
-				</port>
-			</outputPorts>
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy>
-						<cross>
-							<port name="input" depth="0" />
-						</cross>
-					</strategy>
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-		<processor>
-			<name>b_processor</name>
-			<inputPorts>
-				<port>
-					<name>input</name>
-					<depth>0</depth>
-				</port>
-			</inputPorts>
-			<outputPorts>
-				<port>
-					<name>output</name>
-					<depth>1</depth>
-					<granularDepth>0</granularDepth>
-				</port>
-			</outputPorts>
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy>
-						<cross>
-							<port name="input" depth="0" />
-						</cross>
-					</strategy>
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-	</processors>
-	<conditions>
-		<condition control="a_processor" target="b_processor"/>
-	</conditions>
-	<datalinks />
-</dataflow>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_merge.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_merge.xml
deleted file mode 100644
index be0cca4..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_merge.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<dataflow xmlns="http://taverna.sf.net/2008/xml/t2flow" id="123">
-	<inputPorts />
-	<outputPorts />
-	<processors>
-		<processor>
-			<name>top</name>
-			<inputPorts />
-			<outputPorts>
-				<port>
-					<name>output</name>
-					<depth>0</depth>
-					<granularDepth>0</granularDepth>
-				</port>
-			</outputPorts>
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy />
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-		<processor>
-			<name>bottom</name>
-			<inputPorts>
-				<port>
-					<name>input</name>
-					<depth>0</depth>
-				</port>
-			</inputPorts>
-			<outputPorts />
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy>
-						<cross>
-							<port name="input" depth="0" />
-						</cross>
-					</strategy>
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-	</processors>
-	<conditions />
-	<datalinks>
-		<datalink>
-			<sink type="merge">
-				<processor>bottom</processor>
-				<port>input</port>
-			</sink>
-			<source type="processor">
-				<processor>top</processor>
-				<port>output</port>
-			</source>
-		</datalink>
-	</datalinks>
-</dataflow>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_unlinked_processor.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_unlinked_processor.xml
deleted file mode 100644
index 2abafe7..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dataflow_with_unlinked_processor.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<dataflow role="top" xmlns="http://taverna.sf.net/2008/xml/t2flow" id="123">
-	<inputPorts />
-	<outputPorts />
-	<processors>
-		<processor>
-			<name>a_processor</name>
-			<inputPorts>
-				<port>
-					<name>input</name>
-					<depth>0</depth>
-				</port>
-			</inputPorts>
-			<outputPorts>
-				<port>
-					<name>output</name>
-					<depth>1</depth>
-					<granularDepth>0</granularDepth>
-				</port>
-			</outputPorts>
-			<annotations />
-			<activities />
-			<dispatchStack />
-			<iterationStrategyStack>
-				<iteration>
-					<strategy>
-						<cross>
-							<port name="input" depth="0" />
-						</cross>
-					</strategy>
-				</iteration>
-			</iterationStrategyStack>
-		</processor>
-	</processors>
-	<conditions />
-	<datalinks />
-</dataflow>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dispatchLayer.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dispatchLayer.xml
deleted file mode 100644
index 572f3f4..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dispatchLayer.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<dispatchLayer xmlns="http://taverna.sf.net/2008/xml/t2flow">
-	<class>
-		net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize
-	</class>
-	<configBean encoding="xstream">
-		<net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig
-			xmlns="">
-			<maxJobs>7</maxJobs>
-		</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig>
-	</configBean>
-</dispatchLayer>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dispatchStack.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dispatchStack.xml
deleted file mode 100644
index 20184dc..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/dispatchStack.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<dispatchStack xmlns="http://taverna.sf.net/2008/xml/t2flow">
-	<dispatchLayer>
-		<class>
-			net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize
-		</class>
-		<configBean encoding="xstream">
-			<net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig
-				xmlns="">
-				<maxJobs>1</maxJobs>
-			</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig>
-		</configBean>
-	</dispatchLayer>
-	<dispatchLayer>
-		<class>
-			net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce
-		</class>
-		<configBean encoding="xstream">
-			<null xmlns="" />
-		</configBean>
-	</dispatchLayer>
-	<dispatchLayer>
-		<class>
-			net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover
-		</class>
-		<configBean encoding="xstream">
-			<null xmlns="" />
-		</configBean>
-	</dispatchLayer>
-	<dispatchLayer>
-		<class>
-			net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry
-		</class>
-		<configBean encoding="xstream">
-			<net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig
-				xmlns="">
-				<backoffFactor>1.0</backoffFactor>
-				<initialDelay>0</initialDelay>
-				<maxDelay>0</maxDelay>
-				<maxRetries>0</maxRetries>
-			</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig>
-		</configBean>
-	</dispatchLayer>
-	<dispatchLayer>
-		<class>
-			net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke
-		</class>
-		<configBean encoding="xstream">
-			<null xmlns="" />
-		</configBean>
-	</dispatchLayer>
-</dispatchStack>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/empty_dataflow_with_ports.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/empty_dataflow_with_ports.xml
deleted file mode 100644
index 33a9746..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/empty_dataflow_with_ports.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<dataflow role="top" xmlns="http://taverna.sf.net/2008/xml/t2flow" id="123">
-	<name>george</name>
-	<inputPorts>
-		<port>
-			<name>input1</name>
-			<depth>0</depth>
-			<granularDepth>0</granularDepth>
-		</port>
-		<port>
-			<name>input2</name>
-			<depth>1</depth>
-			<granularDepth>1</granularDepth>
-		</port>
-	</inputPorts>
-	<outputPorts>
-		<port>
-			<name>output</name>
-		</port>
-	</outputPorts>
-	<processors />
-	<conditions />
-	<datalinks />
-</dataflow>
\ No newline at end of file
diff --git a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/processor.xml b/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/processor.xml
deleted file mode 100644
index 30d541b..0000000
--- a/trunk/workflowmodel-impl/src/test/resources/serialized-fragments/processor.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<processor xmlns="http://taverna.sf.net/2008/xml/t2flow">
-	<name>george</name>
-	<inputPorts>
-		<port>
-			<name>input</name>
-			<depth>0</depth>
-		</port>
-	</inputPorts>
-	<outputPorts>
-		<port>
-			<name>output</name>
-			<depth>1</depth>
-			<granularDepth>0</granularDepth>
-		</port>
-	</outputPorts>
-	<annotations />
-	<activities />
-	<dispatchStack />
-	<iterationStrategyStack>
-		<iteration>
-			<strategy>
-				<cross>
-					<port name="input" depth="0" />
-				</cross>
-			</strategy>
-		</iteration>
-	</iterationStrategyStack>
-</processor>
\ No newline at end of file
