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 2018/08/10 11:58:32 UTC

[1/6] incubator-taverna-language git commit: API: Add a tool to nest a workflow in a process

Repository: incubator-taverna-language
Updated Branches:
  refs/heads/master 9cd4b8781 -> fb5c41a89


API: Add a tool to nest a workflow in a process


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

Branch: refs/heads/master
Commit: edb12c6f7715de1ff78999a130b4038efb73cd9d
Parents: a5251d1
Author: Majdi Haouech <m....@criteo.com>
Authored: Wed Jul 18 23:39:21 2018 +0200
Committer: Majdi Haouech <m....@criteo.com>
Committed: Fri Jul 20 09:22:28 2018 +0200

----------------------------------------------------------------------
 .../taverna/scufl2/api/common/Scufl2Tools.java    | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/edb12c6f/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
index c7d4b11..1222733 100644
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
+++ b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
@@ -752,6 +752,24 @@ public class Scufl2Tools {
 		return activity;
 	}
 
+	public Configuration createNestedRelationship(Processor processor, Workflow childWorkflow, Profile profile) {
+		if(processor.getParent() == null) {
+			throw new IllegalStateException("Processor " + processor + " has no parent");
+		}
+		if(processor.getParent().getParent() != childWorkflow.getParent()) {
+			throw new IllegalStateException(
+					"Processor " + processor + " and workflow " + childWorkflow + " are not in the same Workflow bundle");
+		}
+		if(nestedWorkflowForProcessor(processor, profile) != null) {
+			throw new IllegalStateException("Processor " + processor + " already has a nested workflow");
+		}
+
+		Activity activity = createActivityFromProcessor(processor, profile);
+		activity.setType(NESTED_WORKFLOW);
+		Configuration configuration = createConfigurationFor(activity, NESTED_WORKFLOW);
+		return configuration;
+	}
+
 	public void removePortsBindingForUnknownPorts(ProcessorBinding binding) {
 		// First, remove ports no longer owned by processor
 		Iterator<ProcessorInputPortBinding> inputBindings = binding


[4/6] incubator-taverna-language git commit: Improve testing the nested workflow tool

Posted by st...@apache.org.
Improve testing the nested workflow tool

- Check if nesting processor doesn't already have a bound activity


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

Branch: refs/heads/master
Commit: 2530da3221a6317671367041c20e85709927b685
Parents: 3efbf08
Author: Majdi Haouech <m....@criteo.com>
Authored: Tue Aug 7 23:29:07 2018 +0200
Committer: Majdi Haouech <m....@criteo.com>
Committed: Tue Aug 7 23:29:07 2018 +0200

----------------------------------------------------------------------
 .../taverna/scufl2/api/common/Scufl2Tools.java   | 10 ++++------
 .../scufl2/api/common/TestScufl2Tools.java       | 19 +++++++------------
 2 files changed, 11 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/2530da32/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
index 0823e3b..bb5bcbe 100644
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
+++ b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
@@ -764,12 +764,10 @@ public class Scufl2Tools {
 		if(nestedWorkflowForProcessor(processor, profile) != null) {
 			throw new IllegalStateException("Processor " + processor + " already has a nested workflow");
 		}
-		try {
-			processor.getActivity(profile);
-			throw new IllegalStateException("Processor " + processor + " already has a bound activity");
-		} catch(IndexOutOfBoundsException e) {
-			// Processor should have no bound activity, which is the case here.
-		}
+        List<ProcessorBinding> processorBindings = processorBindingsForProcessor(processor, profile);
+        if(processorBindings.size() != 0) {
+            throw new IllegalStateException("Processor " + processor + "already has a binding")
+        }
 
 		Activity activity = createActivityFromProcessor(processor, profile);
 		activity.setType(NESTED_WORKFLOW);

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/2530da32/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
index 179553b..f336af0 100644
--- a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
+++ b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
@@ -51,6 +51,7 @@ import org.apache.taverna.scufl2.api.profiles.ProcessorPortBinding;
 import org.apache.taverna.scufl2.api.profiles.Profile;
 import org.junit.Before;
 import org.junit.Test;
+import sun.security.krb5.Config;
 
 
 public class TestScufl2Tools extends ExampleWorkflow {
@@ -81,19 +82,13 @@ public class TestScufl2Tools extends ExampleWorkflow {
 
 		assertEquals(child, nested);
 
-		boolean found = false;
+		ProcessorBinding binding = processor.getBinding(profile);
+		Activity activity = binding.getBoundActivity();
+        Configuration configuration = activity.getConfiguration();
 
-		for(Activity activity: profile.getActivities()) {
-			if(activity.getType().equals(Scufl2Tools.NESTED_WORKFLOW)) {
-				for(Configuration config: tools.configurationsFor(activity, profile)) {
-					String nestedWorkflowName = config.getJson().get("nestedWorkflow").asText();
-					Workflow wf = workflowBundle.getWorkflows().getByName(nestedWorkflowName);
-					found |= (wf != null && nestedWorkflowName.equals(child.getName()));
-				}
-			}
-		}
-
-		assertTrue(found);
+        assertEquals(activity.getType(), Scufl2Tools.NESTED_WORKFLOW);
+        String nestedWorkflowName = configuration.getJson().get("nestedWorkflow").asText();
+        assertEquals(nestedWorkflowName, child.getName());
 	}
 	
 	@Test


[2/6] incubator-taverna-language git commit: Add test for nested helper in Scufl2Tools

Posted by st...@apache.org.
Add test for nested helper in Scufl2Tools


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

Branch: refs/heads/master
Commit: d93452d7ab30dc36bf0cabafe923ff3707bb0c55
Parents: edb12c6
Author: Majdi Haouech <m....@criteo.com>
Authored: Sat Jul 28 14:28:08 2018 +0200
Committer: Majdi Haouech <m....@criteo.com>
Committed: Sat Jul 28 14:28:08 2018 +0200

----------------------------------------------------------------------
 .../taverna/scufl2/api/common/Scufl2Tools.java  |  7 +++++++
 .../scufl2/api/common/TestScufl2Tools.java      | 20 ++++++++++++++++++++
 2 files changed, 27 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/d93452d7/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
index 1222733..f7f7698 100644
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
+++ b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
@@ -65,6 +65,7 @@ import org.apache.taverna.scufl2.api.profiles.Profile;
 
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 /**
  * Utility methods for dealing with SCUFL2 models
@@ -767,6 +768,12 @@ public class Scufl2Tools {
 		Activity activity = createActivityFromProcessor(processor, profile);
 		activity.setType(NESTED_WORKFLOW);
 		Configuration configuration = createConfigurationFor(activity, NESTED_WORKFLOW);
+
+		ObjectNode json = configuration.getJsonAsObjectNode();
+		json.put("nestedWorkflow", childWorkflow.getName());
+
+		childWorkflow.setParent(processor.getParent().getParent());
+
 		return configuration;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/d93452d7/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
index 5880253..24fc788 100644
--- a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
+++ b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
@@ -41,6 +41,7 @@ import org.apache.taverna.scufl2.api.common.Visitor.VisitorWithPath;
 import org.apache.taverna.scufl2.api.container.WorkflowBundle;
 import org.apache.taverna.scufl2.api.core.ControlLink;
 import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
 import org.apache.taverna.scufl2.api.port.InputActivityPort;
 import org.apache.taverna.scufl2.api.port.InputProcessorPort;
 import org.apache.taverna.scufl2.api.port.OutputActivityPort;
@@ -63,6 +64,25 @@ public class TestScufl2Tools extends ExampleWorkflow {
 		makeWorkflowBundle();
 		assertNotNull(workflowBundle);
 	}
+
+	@Test
+	public void testNestedWorkflows() {
+		Workflow child = new Workflow();
+		child.setName("childWorkflow");
+		child.setParent(workflowBundle);
+
+		Workflow mainWorkflow = workflowBundle.getMainWorkflow();
+		Processor processor = new Processor();
+		processor.setParent(mainWorkflow);
+
+		Profile profile = workflowBundle.getMainProfile();
+
+		Scufl2Tools tools = new Scufl2Tools();
+		tools.createNestedRelationship(processor, child, profile);
+		Workflow nested = tools.nestedWorkflowForProcessor(processor, profile);
+
+		assertEquals(child, nested);
+	}
 	
 	@Test
 	public void controlLinksBlocking() {


[6/6] incubator-taverna-language git commit: Add method to create nested workflow

Posted by st...@apache.org.
Add method to create nested workflow

Contributed by Majdi Haouech (ICLA on file)
@haouech

See #41

Signed-off-by: Stian Soiland-Reyes <st...@apache.org>


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

Branch: refs/heads/master
Commit: fb5c41a89a55da3015ba5c9309860feb2a56a0b4
Parents: 9cd4b87 0ca7ac2
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Fri Aug 10 12:58:11 2018 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Fri Aug 10 12:58:11 2018 +0100

----------------------------------------------------------------------
 .../taverna/scufl2/api/common/Scufl2Tools.java  | 29 +++++++++
 .../scufl2/api/common/TestScufl2Tools.java      | 63 +++++++++++++++++++-
 2 files changed, 89 insertions(+), 3 deletions(-)
----------------------------------------------------------------------



[3/6] incubator-taverna-language git commit: Change nesting method name, Add a test

Posted by st...@apache.org.
Change nesting method name, Add a test


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

Branch: refs/heads/master
Commit: 3efbf0857f0ed3c8d7fa8b52f45bdc73af2ff747
Parents: d93452d
Author: Majdi Haouech <m....@criteo.com>
Authored: Mon Aug 6 23:59:57 2018 +0200
Committer: Majdi Haouech <m....@criteo.com>
Committed: Mon Aug 6 23:59:57 2018 +0200

----------------------------------------------------------------------
 .../taverna/scufl2/api/common/Scufl2Tools.java  |  8 +++++++-
 .../scufl2/api/common/TestScufl2Tools.java      | 20 ++++++++++++++++----
 2 files changed, 23 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/3efbf085/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
index f7f7698..0823e3b 100644
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
+++ b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
@@ -753,7 +753,7 @@ public class Scufl2Tools {
 		return activity;
 	}
 
-	public Configuration createNestedRelationship(Processor processor, Workflow childWorkflow, Profile profile) {
+	public Configuration setAsNestedWorkflow(Processor processor, Workflow childWorkflow, Profile profile) {
 		if(processor.getParent() == null) {
 			throw new IllegalStateException("Processor " + processor + " has no parent");
 		}
@@ -764,6 +764,12 @@ public class Scufl2Tools {
 		if(nestedWorkflowForProcessor(processor, profile) != null) {
 			throw new IllegalStateException("Processor " + processor + " already has a nested workflow");
 		}
+		try {
+			processor.getActivity(profile);
+			throw new IllegalStateException("Processor " + processor + " already has a bound activity");
+		} catch(IndexOutOfBoundsException e) {
+			// Processor should have no bound activity, which is the case here.
+		}
 
 		Activity activity = createActivityFromProcessor(processor, profile);
 		activity.setType(NESTED_WORKFLOW);

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/3efbf085/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
index 24fc788..179553b 100644
--- a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
+++ b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
@@ -34,10 +34,8 @@ import java.util.Set;
 
 import org.apache.taverna.scufl2.api.ExampleWorkflow;
 import org.apache.taverna.scufl2.api.activity.Activity;
-import org.apache.taverna.scufl2.api.common.Child;
-import org.apache.taverna.scufl2.api.common.Scufl2Tools;
-import org.apache.taverna.scufl2.api.common.WorkflowBean;
 import org.apache.taverna.scufl2.api.common.Visitor.VisitorWithPath;
+import org.apache.taverna.scufl2.api.configurations.Configuration;
 import org.apache.taverna.scufl2.api.container.WorkflowBundle;
 import org.apache.taverna.scufl2.api.core.ControlLink;
 import org.apache.taverna.scufl2.api.core.Processor;
@@ -78,10 +76,24 @@ public class TestScufl2Tools extends ExampleWorkflow {
 		Profile profile = workflowBundle.getMainProfile();
 
 		Scufl2Tools tools = new Scufl2Tools();
-		tools.createNestedRelationship(processor, child, profile);
+		tools.setAsNestedWorkflow(processor, child, profile);
 		Workflow nested = tools.nestedWorkflowForProcessor(processor, profile);
 
 		assertEquals(child, nested);
+
+		boolean found = false;
+
+		for(Activity activity: profile.getActivities()) {
+			if(activity.getType().equals(Scufl2Tools.NESTED_WORKFLOW)) {
+				for(Configuration config: tools.configurationsFor(activity, profile)) {
+					String nestedWorkflowName = config.getJson().get("nestedWorkflow").asText();
+					Workflow wf = workflowBundle.getWorkflows().getByName(nestedWorkflowName);
+					found |= (wf != null && nestedWorkflowName.equals(child.getName()));
+				}
+			}
+		}
+
+		assertTrue(found);
 	}
 	
 	@Test


[5/6] incubator-taverna-language git commit: Check that nested process has the same i/o ports as the child workflow

Posted by st...@apache.org.
Check that nested process has the same i/o ports as the child workflow


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

Branch: refs/heads/master
Commit: 0ca7ac29164e15f2a05aed6af1370b184fd25fd6
Parents: 2530da3
Author: Majdi Haouech <m....@criteo.com>
Authored: Wed Aug 8 12:08:54 2018 +0200
Committer: Majdi Haouech <m....@criteo.com>
Committed: Wed Aug 8 12:13:48 2018 +0200

----------------------------------------------------------------------
 .../taverna/scufl2/api/common/Scufl2Tools.java  |  8 ++--
 .../scufl2/api/common/TestScufl2Tools.java      | 40 +++++++++++++++++---
 2 files changed, 39 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/0ca7ac29/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
index bb5bcbe..e3b5d6e 100644
--- a/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
+++ b/taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/common/Scufl2Tools.java
@@ -764,10 +764,10 @@ public class Scufl2Tools {
 		if(nestedWorkflowForProcessor(processor, profile) != null) {
 			throw new IllegalStateException("Processor " + processor + " already has a nested workflow");
 		}
-        List<ProcessorBinding> processorBindings = processorBindingsForProcessor(processor, profile);
-        if(processorBindings.size() != 0) {
-            throw new IllegalStateException("Processor " + processor + "already has a binding")
-        }
+		List<ProcessorBinding> processorBindings = processorBindingsForProcessor(processor, profile);
+		if(processorBindings.size() != 0) {
+				throw new IllegalStateException("Processor " + processor + "already has a binding");
+		}
 
 		Activity activity = createActivityFromProcessor(processor, profile);
 		activity.setType(NESTED_WORKFLOW);

http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/0ca7ac29/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
----------------------------------------------------------------------
diff --git a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
index f336af0..d397168 100644
--- a/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
+++ b/taverna-scufl2-api/src/test/java/org/apache/taverna/scufl2/api/common/TestScufl2Tools.java
@@ -31,7 +31,10 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
 
+import java.util.stream.Collectors;
 import org.apache.taverna.scufl2.api.ExampleWorkflow;
 import org.apache.taverna.scufl2.api.activity.Activity;
 import org.apache.taverna.scufl2.api.common.Visitor.VisitorWithPath;
@@ -42,8 +45,10 @@ import org.apache.taverna.scufl2.api.core.Processor;
 import org.apache.taverna.scufl2.api.core.Workflow;
 import org.apache.taverna.scufl2.api.port.InputActivityPort;
 import org.apache.taverna.scufl2.api.port.InputProcessorPort;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
 import org.apache.taverna.scufl2.api.port.OutputActivityPort;
 import org.apache.taverna.scufl2.api.port.OutputProcessorPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
 import org.apache.taverna.scufl2.api.profiles.ProcessorBinding;
 import org.apache.taverna.scufl2.api.profiles.ProcessorInputPortBinding;
 import org.apache.taverna.scufl2.api.profiles.ProcessorOutputPortBinding;
@@ -51,7 +56,6 @@ import org.apache.taverna.scufl2.api.profiles.ProcessorPortBinding;
 import org.apache.taverna.scufl2.api.profiles.Profile;
 import org.junit.Before;
 import org.junit.Test;
-import sun.security.krb5.Config;
 
 
 public class TestScufl2Tools extends ExampleWorkflow {
@@ -84,11 +88,37 @@ public class TestScufl2Tools extends ExampleWorkflow {
 
 		ProcessorBinding binding = processor.getBinding(profile);
 		Activity activity = binding.getBoundActivity();
-        Configuration configuration = activity.getConfiguration();
+		Configuration configuration = activity.getConfiguration();
 
-        assertEquals(activity.getType(), Scufl2Tools.NESTED_WORKFLOW);
-        String nestedWorkflowName = configuration.getJson().get("nestedWorkflow").asText();
-        assertEquals(nestedWorkflowName, child.getName());
+		assertEquals(activity.getType(), Scufl2Tools.NESTED_WORKFLOW);
+		String nestedWorkflowName = configuration.getJson().get("nestedWorkflow").asText();
+		assertEquals(nestedWorkflowName, child.getName());
+	}
+
+	@Test
+	public void testNestedProcessHasCorrectStructure() {
+		Workflow child = new Workflow();
+		child.setName("childWorkflow");
+		child.setParent(workflowBundle);
+
+		Workflow mainWorkflow = workflowBundle.getMainWorkflow();
+		Processor processor = new Processor();
+		processor.setParent(mainWorkflow);
+
+		Profile profile = workflowBundle.getMainProfile();
+
+		Scufl2Tools tools = new Scufl2Tools();
+		tools.setAsNestedWorkflow(processor, child, profile);
+
+		Set<String> processorInputNames = processor.getInputPorts().stream().map(InputProcessorPort::getName).collect(Collectors.toSet());
+		Set<String> workflowInputNames = child.getInputPorts().stream().map(InputWorkflowPort::getName).collect(Collectors.toSet());
+
+		assertEquals(workflowInputNames, processorInputNames);
+
+		Set<String> processorOutputNames = processor.getOutputPorts().stream().map(OutputProcessorPort::getName).collect(Collectors.toSet());
+		Set<String> workflowOutputNames = child.getOutputPorts().stream().map(OutputWorkflowPort::getName).collect(Collectors.toSet());
+
+		assertEquals(workflowOutputNames, processorOutputNames);
 	}
 	
 	@Test