You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/23 11:10:16 UTC

[41/54] [partial] incubator-taverna-engine git commit: Revert "temporarily empty repository"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecution.java
----------------------------------------------------------------------
diff --git a/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecution.java b/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecution.java
new file mode 100644
index 0000000..cf94d39
--- /dev/null
+++ b/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecution.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (C) 2011 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.platform.execution.impl.remote;
+
+import org.purl.wf4ever.robundle.Bundle;
+
+import uk.org.taverna.platform.execution.api.AbstractExecution;
+import uk.org.taverna.platform.report.ActivityReport;
+import uk.org.taverna.platform.report.ProcessorReport;
+import uk.org.taverna.platform.report.WorkflowReport;
+import uk.org.taverna.scufl2.api.activity.Activity;
+import uk.org.taverna.scufl2.api.container.WorkflowBundle;
+import uk.org.taverna.scufl2.api.core.Processor;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.profiles.Profile;
+
+/**
+ * An {@link uk.org.taverna.platform.execution.api.Execution Execution} for executing a Taverna workflow on a Taverna Server.
+ *
+ * @author David Withers
+ */
+public class RemoteExecution extends AbstractExecution {
+
+	public RemoteExecution(WorkflowBundle workflowBundle, Workflow workflow, Profile profile,
+			Bundle inputs) {
+		super(workflowBundle, workflow, profile, inputs);
+		// TODO Auto-generated constructor stub
+	}
+
+	@Override
+	protected WorkflowReport createWorkflowReport(Workflow workflow) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	protected ProcessorReport createProcessorReport(Processor processor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	protected ActivityReport createActivityReport(Activity activity) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void start() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void pause() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void resume() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void cancel() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void delete() {
+		// TODO Auto-generated method stub
+
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecutionService.java
----------------------------------------------------------------------
diff --git a/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecutionService.java b/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecutionService.java
new file mode 100644
index 0000000..6ca8db7
--- /dev/null
+++ b/taverna-execution-remote/src/main/java/uk/org/taverna/platform/execution/impl/remote/RemoteExecutionService.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (C) 2011 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.platform.execution.impl.remote;
+
+import java.util.Collections;
+import java.util.Set;
+
+import org.purl.wf4ever.robundle.Bundle;
+
+import uk.org.taverna.platform.execution.api.AbstractExecutionService;
+import uk.org.taverna.platform.execution.api.Execution;
+import uk.org.taverna.platform.execution.api.ExecutionEnvironment;
+import uk.org.taverna.platform.execution.api.InvalidWorkflowException;
+import uk.org.taverna.scufl2.api.container.WorkflowBundle;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.profiles.Profile;
+
+/**
+ * Service for executing Taverna workflows on a Taverna Server.
+ *
+ * @author David Withers
+ */
+public class RemoteExecutionService extends AbstractExecutionService {
+
+	public RemoteExecutionService() {
+		super(RemoteExecutionService.class.getName(), "Taverna Remote Execution Service",
+				"Execution Service for executing Taverna workflows on a Taverna Server");
+	}
+
+	@Override
+	protected Execution createExecutionImpl(WorkflowBundle workflowBundle, Workflow workflow,
+			Profile profile, Bundle inputs)
+			throws InvalidWorkflowException {
+		return new RemoteExecution(workflowBundle, workflow, profile, inputs);
+	}
+
+	@Override
+	public Set<ExecutionEnvironment> getExecutionEnvironments() {
+		return Collections.<ExecutionEnvironment>emptySet();
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context-osgi.xml b/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context-osgi.xml
new file mode 100644
index 0000000..2bce13d
--- /dev/null
+++ b/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context-osgi.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xmlns:beans="http://www.springframework.org/schema/beans"
+             xsi:schemaLocation="http://www.springframework.org/schema/beans 
+                                 http://www.springframework.org/schema/beans/spring-beans.xsd
+                                 http://www.springframework.org/schema/osgi 
+                                 http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+    <service ref="remoteExecution" interface="uk.org.taverna.platform.execution.api.ExecutionService" />
+      
+</beans:beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context.xml
----------------------------------------------------------------------
diff --git a/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context.xml b/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context.xml
new file mode 100644
index 0000000..70f9f9d
--- /dev/null
+++ b/taverna-execution-remote/src/main/resources/META-INF/spring/execution-remote-context.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+                           http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<bean id="remoteExecution" class="uk.org.taverna.platform.execution.impl.remote.RemoteExecutionService" />
+
+</beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-integration-tests/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-integration-tests/pom.xml b/taverna-integration-tests/pom.xml
new file mode 100644
index 0000000..c1cd2be
--- /dev/null
+++ b/taverna-integration-tests/pom.xml
@@ -0,0 +1,92 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna.engine</groupId>
+		<artifactId>taverna-engine</artifactId>
+		<version>3.1.0-incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-integration-tests</artifactId>
+	<name>Apache Taverna Integration Tests</name>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-engine-product</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.xalan</groupId>
+					<artifactId>com.springsource.org.apache.xalan</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.apache.xerces</groupId>
+					<artifactId>com.springsource.org.apache.xerces</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-api</artifactId>
+			<version>${taverna.language.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-databundle</artifactId>
+			<version>${taverna.language.version}</version>
+			<exclusions>
+				<exclusion>
+					<groupId>log4j</groupId>
+					<artifactId>log4j</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-execution-api</artifactId>
+			<version>${project.parent.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-report-api</artifactId>
+			<version>${project.parent.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-run-api</artifactId>
+			<version>${project.parent.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.4</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>org.eclipse.osgi</artifactId>
+			<version>${osgi.equinox.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<version>${osgi.core.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.compendium</artifactId>
+			<version>${osgi.core.version}</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-integration-tests/src/test/java/uk/org/taverna/platform/ActivityIT.java
----------------------------------------------------------------------
diff --git a/taverna-integration-tests/src/test/java/uk/org/taverna/platform/ActivityIT.java b/taverna-integration-tests/src/test/java/uk/org/taverna/platform/ActivityIT.java
new file mode 100644
index 0000000..5574ee0
--- /dev/null
+++ b/taverna-integration-tests/src/test/java/uk/org/taverna/platform/ActivityIT.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (C) 2010 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.platform;
+
+import java.io.File;
+import java.net.URI;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+
+import uk.org.taverna.osgi.starter.TavernaStarter;
+import uk.org.taverna.platform.execution.api.ExecutionEnvironment;
+import uk.org.taverna.platform.run.api.RunService;
+
+public class ActivityIT extends PlatformIT {
+
+	private static TavernaStarter tavernaStarter;
+	private static BundleContext bundleContext;
+	private static RunService runService;
+
+	@BeforeClass
+	public static void setup() throws Exception {
+		tavernaStarter = new TavernaStarter(new File("/tmp"));
+		tavernaStarter.start();
+		runService = tavernaStarter.getRunService();
+	}
+
+	@AfterClass
+	public static void shutdown() throws Exception {
+		tavernaStarter.stop();
+	}
+
+	@Test
+	public void testGetActivityURIs() {
+		System.out.println("================= Available Activities ===================");
+		for (ExecutionEnvironment executionEnvironment : runService.getExecutionEnvironments()) {
+			for (URI uri : executionEnvironment.getActivityTypes()) {
+				System.out.println(uri);
+			}
+		}
+		System.out.println("==========================================================");
+		System.out.println("");
+	}
+
+	public void testCreateActivity() throws Exception {
+//		for (URI uri : activityService.getActivityTypes()) {
+//			System.out.println("Creating activity " + uri);
+//			Activity<?> activity = activityService.createActivity(uri, null);
+//		}
+	}
+
+	@Test
+	public void testGetActivityConfigurationDefinition() throws Exception {
+		System.out.println("============ Activity Configuration Definitions ==========");
+		for (ExecutionEnvironment executionEnvironment : runService.getExecutionEnvironments()) {
+			for (URI uri : executionEnvironment.getActivityTypes()) {
+				System.out.println(executionEnvironment.getActivityConfigurationSchema(uri));
+			}
+		}
+		System.out.println("==========================================================");
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-integration-tests/src/test/java/uk/org/taverna/platform/PlatformIT.java
----------------------------------------------------------------------
diff --git a/taverna-integration-tests/src/test/java/uk/org/taverna/platform/PlatformIT.java b/taverna-integration-tests/src/test/java/uk/org/taverna/platform/PlatformIT.java
new file mode 100644
index 0000000..24bcbdb
--- /dev/null
+++ b/taverna-integration-tests/src/test/java/uk/org/taverna/platform/PlatformIT.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (C) 2010 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.platform;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.Path;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.junit.Ignore;
+
+import uk.org.taverna.databundle.DataBundles;
+import uk.org.taverna.databundle.ErrorDocument;
+import uk.org.taverna.platform.report.State;
+import uk.org.taverna.platform.report.WorkflowReport;
+import uk.org.taverna.scufl2.api.container.WorkflowBundle;
+import uk.org.taverna.scufl2.api.io.WorkflowBundleIO;
+
+@Ignore
+public class PlatformIT {
+
+	public WorkflowBundle loadWorkflow(String t2FlowFile, WorkflowBundleIO workflowBundleIO)
+			throws Exception {
+		URL wfResource = getClass().getResource(t2FlowFile);
+		assertNotNull(wfResource);
+		return workflowBundleIO.readBundle(wfResource.openStream(), null);
+	}
+
+	public File loadFile(String fileName) throws IOException, FileNotFoundException {
+		File file = File.createTempFile("platform-test", null);
+		file.deleteOnExit();
+		FileUtils.copyURLToFile(getClass().getResource(fileName), file);
+		return file;
+	}
+
+	public void printErrors(Path error) {
+		try {
+			ErrorDocument errorDocument = DataBundles.getError(error);
+			String message = errorDocument.getMessage();
+			if (message != null) {
+				System.out.println(message);
+			}
+			String trace = errorDocument.getTrace();
+			if (trace != null) {
+				System.out.println(trace);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public boolean checkResult(Path result, String expectedResult) {
+		if (DataBundles.isError(result)) {
+			printErrors(result);
+			return false;
+		} else {
+			String resultValue;
+			if (DataBundles.isValue(result)) {
+				try {
+					resultValue = DataBundles.getStringValue(result);
+				} catch (IOException e) {
+					e.printStackTrace();
+					return false;
+				}
+			} else if (DataBundles.isReference(result)) {
+				try {
+					URI reference = DataBundles.getReference(result);
+					resultValue = IOUtils.toString(reference);
+				} catch (IOException e) {
+					e.printStackTrace();
+					return false;
+				}
+			} else {
+				System.out.println("Expected a value or reference");
+				return false;
+			}
+			if (resultValue.startsWith(expectedResult)) {
+				return true;
+			} else {
+				System.out.println("Expected: " + expectedResult + ", Actual: " + resultValue);
+				return false;
+			}
+		}
+	}
+
+	public boolean waitForState(WorkflowReport report, State state) throws InterruptedException {
+		return waitForState(report, state, true);
+	}
+
+	public boolean waitForState(WorkflowReport report, State state, boolean printReport)
+			throws InterruptedException {
+		int wait = 0;
+		while (!report.getState().equals(state) && wait++ < 30) {
+			if (printReport) {
+				System.out.println(report);
+			}
+			Thread.sleep(500);
+		}
+		if (printReport) {
+			System.out.println(report);
+		}
+		return report.getState().equals(state);
+	}
+
+	public void waitForResults(Path outputs, WorkflowReport report, String... ports)
+			throws InterruptedException {
+		int wait = 0;
+		while (!resultsReady(outputs, ports) && wait++ < 20) {
+			System.out.println(report);
+			Thread.sleep(500);
+		}
+	}
+
+	private boolean resultsReady(Path outputs, String... ports) {
+		for (String port : ports) {
+			try {
+				if (DataBundles.isMissing(DataBundles.getPort(outputs, port))) {
+					return false;
+				}
+			} catch (IOException e) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-engine/blob/246a16e2/taverna-integration-tests/src/test/java/uk/org/taverna/platform/RunIT.java
----------------------------------------------------------------------
diff --git a/taverna-integration-tests/src/test/java/uk/org/taverna/platform/RunIT.java b/taverna-integration-tests/src/test/java/uk/org/taverna/platform/RunIT.java
new file mode 100644
index 0000000..72cbe40
--- /dev/null
+++ b/taverna-integration-tests/src/test/java/uk/org/taverna/platform/RunIT.java
@@ -0,0 +1,954 @@
+/*******************************************************************************
+ * Copyright (C) 2010 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.platform;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.Path;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.List;
+import java.util.Set;
+
+import net.sf.taverna.t2.security.credentialmanager.CredentialManager;
+import net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider;
+import net.sf.taverna.t2.security.credentialmanager.UsernamePassword;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.purl.wf4ever.robundle.Bundle;
+
+import uk.org.taverna.databundle.DataBundles;
+import uk.org.taverna.osgi.starter.TavernaStarter;
+import uk.org.taverna.platform.execution.api.ExecutionEnvironment;
+import uk.org.taverna.platform.report.State;
+import uk.org.taverna.platform.report.WorkflowReport;
+import uk.org.taverna.platform.run.api.RunProfile;
+import uk.org.taverna.platform.run.api.RunService;
+import uk.org.taverna.scufl2.api.container.WorkflowBundle;
+import uk.org.taverna.scufl2.api.io.WorkflowBundleIO;
+
+public class RunIT extends PlatformIT {
+
+	private static TavernaStarter tavernaStarter;
+	private static BundleContext bundleContext;
+	private static WorkflowBundleIO workflowBundleIO;
+	private static CredentialManager credentialManager;
+	private static RunService runService;
+
+	public WorkflowBundle loadWorkflow(String t2FlowFile) throws Exception {
+		return super.loadWorkflow(t2FlowFile, workflowBundleIO);
+	}
+
+	@BeforeClass
+	public static void setup() throws Exception {
+		tavernaStarter = new TavernaStarter(new File("/tmp"));
+		tavernaStarter.start();
+		bundleContext = tavernaStarter.getContext();
+		runService = tavernaStarter.getRunService();
+		credentialManager = tavernaStarter.getCredentialManager();
+		workflowBundleIO = tavernaStarter.getWorkflowBundleIO();
+
+		bundleContext.registerService(
+				"net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider",
+				new MasterPasswordProvider() {
+					public String getMasterPassword(boolean firstTime) {
+						return "test";
+					}
+
+					public void setMasterPassword(String password) {
+					}
+
+					public int getProviderPriority() {
+						return 0;
+					}
+				}, null);
+
+	}
+
+	@AfterClass
+	public static void shutdown() throws Exception {
+		tavernaStarter.stop();
+	}
+
+	@Test
+	public void testRun() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/in-out.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			Path port = DataBundles.getPort(inputs, "in");
+			DataBundles.setStringValue(port, "test-input");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "test-input"));
+		}
+	}
+
+	@Test
+	public void testRunApiConsumer() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/apiconsumer.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			Path port = DataBundles.getPort(inputs, "in");
+			DataBundles.setStringValue(port, "test-input");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "TEST-INPUT"));
+		}
+	}
+
+	@Test
+	public void testRunBeanshell() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/beanshell.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			Path port = DataBundles.getPort(inputs, "in");
+			DataBundles.setStringValue(port, "test-input");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			Path outPort = DataBundles.getPort(outputs, "out");
+			assertTrue(DataBundles.isList(outPort));
+			List<Path> result = DataBundles.getList(outPort);
+			assertEquals(1000, result.size());
+			assertEquals("test-input:0", DataBundles.getStringValue(result.get(0)));
+		}
+	}
+
+	@Test
+	public void testRunBiomart() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/biomart.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			Path outPort = DataBundles.getPort(outputs, "out");
+			assertTrue(DataBundles.isList(outPort));
+			List<Path> result = DataBundles.getList(outPort);
+			assertEquals(6, result.size());
+			assertEquals("ENSBTAG00000018278", DataBundles.getStringValue(result.get(0)));
+		}
+	}
+
+	@Test
+	@Ignore
+	public void testRunBiomoby() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/biomoby.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assumeTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			Path outPort = DataBundles.getPort(outputs, "out");
+			assertTrue(DataBundles.isList(outPort));
+			List<Path> result = DataBundles.getList(outPort);
+			assertEquals(5, result.size());
+			assertEquals("ENSBTAG00000018854", DataBundles.getStringValue(result.get(0)));
+		}
+	}
+
+	@Test
+	public void testRunDataflow() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/dataflow.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			Path port = DataBundles.getPort(inputs, "in");
+			DataBundles.setStringValue(port, "test-input");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "nested dataflow : test-input"));
+		}
+	}
+
+	@Test
+	public void testRunLocalworker() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/localworker.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			Path port = DataBundles.getPort(inputs, "in");
+			DataBundles.setStringValue(port, "Tom");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "Hello Tom"));
+		}
+	}
+
+	@Test
+	public void testRunRest() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/rest.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			String outString = DataBundles.getStringValue(DataBundles.getPort(outputs, "out"));
+			assertTrue(outString.contains("<name>AATM_RABIT</name>"));
+		}
+	}
+
+	@Test
+	public void testRunRestSecureBasic() throws Exception {
+		credentialManager.addUsernameAndPasswordForService(new UsernamePassword("testuser",
+				"testpasswd"), URI
+				.create("http://heater.cs.man.ac.uk:7070/#Example+HTTP+BASIC+Authentication"));
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/secure-basic-authentication.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(
+					DataBundles.getPort(outputs, "out"),
+					"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
+							+ "<HTML><HEAD><TITLE>Apache Tomcat Examples</TITLE>\n"
+							+ "<META http-equiv=Content-Type content=\"text/html\">\n"
+							+ "</HEAD>\n"
+							+ "<BODY>\n"
+							+ "<P>\n"
+							+ "<H3>Secure Apache Tomcat Examples</H3>\n"
+							+ "<P>Congratulations! If you see this page that means that you have authenticated yourself successfully using HTTP Basic Authentication.</P>\n"
+							+ "</BODY></HTML>"));
+		}
+	}
+
+	@Test
+	public void testRunRestSecureBasicHttps() throws Exception {
+		credentialManager.addUsernameAndPasswordForService(new UsernamePassword("testuser",
+				"testpasswd"), URI
+				.create("https://heater.cs.man.ac.uk:7443/#Example+HTTP+BASIC+Authentication"));
+
+		URL trustedCertficateFileURL = getClass().getResource(
+				"/security/tomcat_heater_certificate.pem");
+		CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+		X509Certificate trustedCertficate = (X509Certificate) certFactory
+				.generateCertificate(trustedCertficateFileURL.openStream());
+		credentialManager.addTrustedCertificate(trustedCertficate);
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/secure-basic-authentication-https.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(
+					DataBundles.getPort(outputs, "out"),
+					"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
+							+ "<HTML><HEAD><TITLE>Apache Tomcat Examples</TITLE>\n"
+							+ "<META http-equiv=Content-Type content=\"text/html\">\n"
+							+ "</HEAD>\n"
+							+ "<BODY>\n"
+							+ "<P>\n"
+							+ "<H3>Secure Apache Tomcat Examples</H3>\n"
+							+ "<P>Congratulations! If you see this page that means that you have authenticated yourself successfully using HTTP Basic Authentication.</P>\n"
+							+ "</BODY></HTML>"));
+		}
+	}
+
+	@Test
+	public void testRunRestSecureDigest() throws Exception {
+		credentialManager.addUsernameAndPasswordForService(new UsernamePassword("testuser",
+				"testpasswd"), URI
+				.create("http://heater.cs.man.ac.uk:7070/#Example+HTTP+BASIC+Authentication"));
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/secure-digest-authentication.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(
+					DataBundles.getPort(outputs, "out"),
+					"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
+							+ "<HTML><HEAD><TITLE>Apache Tomcat Examples</TITLE>\n"
+							+ "<META http-equiv=Content-Type content=\"text/html\">\n"
+							+ "</HEAD>\n"
+							+ "<BODY>\n"
+							+ "<P>\n"
+							+ "<H3>Secure Apache Tomcat Examples</H3>\n"
+							+ "<P>Congratulations! If you see this page that means that you have authenticated yourself successfully using HTTP Digest Authentication.</P>\n"
+							+ "</BODY></HTML>"));
+		}
+	}
+
+	@Test
+	public void testRunRestSecureDigestHttps() throws Exception {
+		credentialManager.addUsernameAndPasswordForService(new UsernamePassword("testuser",
+				"testpasswd"), URI
+				.create("http://heater.cs.man.ac.uk:7443/#Example+HTTP+BASIC+Authentication"));
+
+		URL trustedCertficateFileURL = getClass().getResource(
+				"/security/tomcat_heater_certificate.pem");
+		CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+		X509Certificate trustedCertficate = (X509Certificate) certFactory
+				.generateCertificate(trustedCertficateFileURL.openStream());
+		credentialManager.addTrustedCertificate(trustedCertficate);
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/secure-digest-authentication-https.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(
+					DataBundles.getPort(outputs, "out"),
+					"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
+							+ "<HTML><HEAD><TITLE>Apache Tomcat Examples</TITLE>\n"
+							+ "<META http-equiv=Content-Type content=\"text/html\">\n"
+							+ "</HEAD>\n"
+							+ "<BODY>\n"
+							+ "<P>\n"
+							+ "<H3>Secure Apache Tomcat Examples</H3>\n"
+							+ "<P>Congratulations! If you see this page that means that you have authenticated yourself successfully using HTTP Digest Authentication.</P>\n"
+							+ "</BODY></HTML>"));
+		}
+	}
+
+	@Test
+	public void testRunSpreadsheetImport() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/spreadsheetimport.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			Path outPort = DataBundles.getPort(outputs, "out");
+			assertTrue(DataBundles.isList(outPort));
+			List<Path> result = DataBundles.getList(outPort);
+			assertEquals(35, result.size());
+			assertEquals("1971.0", DataBundles.getStringValue(result.get(1)));
+			assertEquals("2004.0", DataBundles.getStringValue(result.get(34)));
+		}
+	}
+
+	@Test
+	public void testRunSoaplab() throws Exception {
+		// TODO find new soaplab service for testing
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/soaplab.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "sequence"),
+					"ID   X52524; SV 1; linear; genomic DNA; STD; INV; 4507 BP."));
+		}
+	}
+
+	@Test
+	public void testRunStringConstant() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/stringconstant.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "Test Value"));
+		}
+	}
+
+	@Test
+	public void testRunTool() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/tool.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "HelloWorld"));
+		}
+	}
+
+	@Test
+	public void testRunIteration() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/iteration.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			Path port = DataBundles.getPort(inputs, "in");
+			DataBundles.setStringValue(port, "test");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			Path crossPort = DataBundles.getPort(outputs, "cross");
+			assertTrue(DataBundles.isList(crossPort));
+			List<Path> crossResult = DataBundles.getList(crossPort);
+			assertEquals(10, crossResult.size());
+			assertEquals(10, DataBundles.getList(crossResult.get(0)).size());
+			assertEquals(10, DataBundles.getList(crossResult.get(5)).size());
+			assertEquals("test:0test:0", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossPort, 0), 0)));
+			assertEquals("test:0test:1", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossPort, 0), 1)));
+			assertEquals("test:4test:2", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossPort, 4), 2)));
+			assertEquals("test:7test:6", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossPort, 7), 6)));
+
+			Path dotPort = DataBundles.getPort(outputs, "dot");
+			assertTrue(DataBundles.isList(dotPort));
+			List<Path> dotResult = DataBundles.getList(dotPort);
+			assertEquals(10, dotResult.size());
+			assertEquals("test:0test:0", DataBundles.getStringValue(DataBundles.getListItem(dotPort, 0)));
+			assertEquals("test:5test:5", DataBundles.getStringValue(DataBundles.getListItem(dotPort, 5)));
+
+			Path crossdotPort = DataBundles.getPort(outputs, "crossdot");
+			assertTrue(DataBundles.isList(crossdotPort));
+			List<Path> crossdotResult = DataBundles.getList(crossdotPort);
+			assertEquals(10, crossdotResult.size());
+			assertEquals(10, DataBundles.getList(crossdotResult.get(0)).size());
+			assertEquals(10, DataBundles.getList(crossdotResult.get(5)).size());
+			assertEquals("test:0test:0test", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossdotPort, 0), 0)));
+			assertEquals("test:0test:1test", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossdotPort, 0), 1)));
+			assertEquals("test:4test:2test", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossdotPort, 4), 2)));
+			assertEquals("test:7test:6test", DataBundles.getStringValue(DataBundles.getListItem(DataBundles.getListItem(crossdotPort, 7), 6)));
+
+			Path dotcrossPort = DataBundles.getPort(outputs, "dotcross");
+			assertTrue(DataBundles.isList(dotcrossPort));
+			List<Path> dotcrossResult = DataBundles.getList(crossdotPort);
+			assertEquals(10, dotcrossResult.size());
+			assertEquals("test:0test:0test", DataBundles.getStringValue(DataBundles.getListItem(dotcrossPort, 0)));
+			assertEquals("test:5test:5test", DataBundles.getStringValue(DataBundles.getListItem(dotcrossPort, 5)));
+
+			Path dotdotPort = DataBundles.getPort(outputs, "dotdot");
+			assertTrue(DataBundles.isList(dotdotPort));
+			List<Path> dotdotResult = DataBundles.getList(crossdotPort);
+			assertEquals(10, dotdotResult.size());
+			assertEquals("test:0test:0test:0", DataBundles.getStringValue(DataBundles.getListItem(dotdotPort, 0)));
+			assertEquals("test:5test:5test:5", DataBundles.getStringValue(DataBundles.getListItem(dotdotPort, 5)));
+		}
+	}
+
+	@Test
+	public void testRunWSDL() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/wsdl.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			// assertTrue(checkResult(results.get("out"),
+			// "Apache Axis version: 1.4\nBuilt on Apr 22, 2006 (06:55:48 PDT)"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"),
+					"Apache Axis version: 1.2\nBuilt on May 03, 2005 (02:20:24 EDT)"));
+		}
+	}
+
+	@Test
+	public void testRunWSDLSecure() throws Exception {
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("http://heater.cs.man.ac.uk:7070/axis/services/HelloService-PlaintextPassword?wsdl"));
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/wsdl-secure.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "Hello Alan!"));
+		}
+	}
+
+	@Test
+	public void testRunWSDLSecureFull() throws Exception {
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("http://heater.cs.man.ac.uk:7070/axis/services/HelloService-PlaintextPassword?wsdl"));
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("http://heater.cs.man.ac.uk:7070/axis/services/HelloService-DigestPassword?wsdl"));
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("http://heater.cs.man.ac.uk:7070/axis/services/HelloService-DigestPassword-Timestamp?wsdl"));
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("http://heater.cs.man.ac.uk:7070/axis/services/HelloService-PlaintextPassword-Timestamp?wsdl"));
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/secure-ws.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_plaintext"), "Hello Alan!"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_digest"), "Hello Stian!"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_digest_timestamp"), "Hello David!"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_plaintext_timestamp"), "Hello Alex!"));
+		}
+	}
+
+	@Test
+	public void testRunWSDLSecureSsh() throws Exception {
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("https://heater.cs.man.ac.uk:7443/axis/services/HelloService-PlaintextPassword?wsdl"));
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("https://heater.cs.man.ac.uk:7443/axis/services/HelloService-DigestPassword?wsdl"));
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("https://heater.cs.man.ac.uk:7443/axis/services/HelloService-DigestPassword-Timestamp?wsdl"));
+		credentialManager
+				.addUsernameAndPasswordForService(
+						new UsernamePassword("testuser", "testpasswd"),
+						URI.create("https://heater.cs.man.ac.uk:7443/axis/services/HelloService-PlaintextPassword-Timestamp?wsdl"));
+
+		URL trustedCertficateFileURL = getClass().getResource(
+				"/security/tomcat_heater_certificate.pem");
+		CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+		X509Certificate trustedCertficate = (X509Certificate) certFactory
+				.generateCertificate(trustedCertficateFileURL.openStream());
+		credentialManager.addTrustedCertificate(trustedCertficate);
+
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/secure-ws-https.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_plaintext"), "Hello Alan!"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_digest"), "Hello Stian!"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_digest_timestamp"), "Hello David!"));
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out_plaintext_timestamp"), "Hello Alex!"));
+		}
+	}
+
+	@Test
+	public void testRunXMLSplitter() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/xmlSplitter.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			DataBundles.setStringValue(DataBundles.getPort(inputs, "firstName"), "John");
+			DataBundles.setStringValue(DataBundles.getPort(inputs, "lastName"), "Smith");
+			DataBundles.setStringValue(DataBundles.getPort(inputs, "age"), "21");
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"),
+					"John Smith (21) of 40, Oxford Road. Manchester."));
+		}
+	}
+
+	@Test
+	public void testRunXPath() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/xpath.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			String runId = runService
+					.createRun(new RunProfile(executionEnvironment, workflowBundle, DataBundles.createBundle()));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "<test-element>test</test-element>"));
+		}
+	}
+
+	@Test
+	public void testRunFromFile() throws Exception {
+		WorkflowBundle workflowBundle = loadWorkflow("/t2flow/in-out.t2flow");
+
+		Set<ExecutionEnvironment> executionEnvironments = runService
+				.getExecutionEnvironments(workflowBundle);
+		assertTrue(executionEnvironments.size() > 0);
+		for (ExecutionEnvironment executionEnvironment : executionEnvironments) {
+			Bundle inputBundle = DataBundles.createBundle();
+			Path inputs = DataBundles.getInputs(inputBundle);
+			File file = loadFile("/t2flow/input.txt");
+			DataBundles.setReference(DataBundles.getPort(inputs, "in"), file.toURI());
+			assertTrue(DataBundles.isReference(DataBundles.getPort(inputs, "in")));
+			assertFalse(DataBundles.isValue(DataBundles.getPort(inputs, "in")));
+
+			String runId = runService.createRun(new RunProfile(executionEnvironment,
+					workflowBundle, inputBundle));
+			assertEquals(State.CREATED, runService.getState(runId));
+
+			WorkflowReport report = runService.getWorkflowReport(runId);
+			System.out.println(report);
+
+			runService.start(runId);
+			assertTrue(waitForState(report, State.COMPLETED));
+
+			Bundle outputBundle = runService.getDataBundle(runId);
+			assertNotNull(outputBundle);
+			Path outputs = DataBundles.getOutputs(outputBundle);
+
+			assertTrue(checkResult(DataBundles.getPort(outputs, "out"), "test input value"));
+		}
+	}
+
+}