--- a
+++ b/test/net/timbusproject/extractors/test/ArchiUtilsTest.java
@@ -0,0 +1,252 @@
+package net.timbusproject.extractors.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.taverna.t2.commandline.exceptions.DatabaseConfigurationException;
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+import net.sf.taverna.t2.commandline.exceptions.OpenDataflowException;
+import net.sf.taverna.t2.commandline.exceptions.ReadInputException;
+import net.sf.taverna.t2.invocation.TokenOrderException;
+import net.sf.taverna.t2.security.credentialmanager.CMException;
+import net.sf.taverna.t2.workflowmodel.EditException;
+import net.sf.taverna.t2.workflowmodel.InvalidDataflowException;
+import net.sf.taverna.t2.workflowmodel.processor.iteration.IterationTypeMismatchException;
+import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
+import net.timbusproject.extractors.TavernaExtractor;
+import net.timbusproject.extractors.utils.ArchiUtils;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import uk.ac.bolton.archimate.model.IAccessRelationship;
+import uk.ac.bolton.archimate.model.IArchimateElement;
+import uk.ac.bolton.archimate.model.IBusinessObject;
+import uk.ac.bolton.archimate.model.IBusinessProcess;
+import uk.ac.bolton.archimate.model.IRelationship;
+import uk.ac.bolton.archimate.model.ITriggeringRelationship;
+
+import com.google.common.base.Joiner;
+
+public class ArchiUtilsTest {
+
+    /*
+     * Following constants are related to the matchbox.archi file found in the resource folder
+     */
+    final int RELATIONS_COUNT = 168;
+    final int TRIGGERING_RELATIONS_COUNT = 11;
+    final String ELEMENT_NAME = "stdout";
+
+    private static List<IRelationship> ALL_RELATIONS;
+    private static List<IArchimateElement> ALL_PROCESSES;
+    private static List<IArchimateElement> ALL_BUSINESSOBJECTS;
+    private static TavernaExtractor matchboxExtractor;
+    private static TavernaExtractor wsdlActivityExtractor;
+    private static TavernaExtractor beanshellActivityExtractor;
+    private static TavernaExtractor loopingExtractor;
+
+    // @BeforeClass
+    public static void customInit() throws EditException, OpenDataflowException, InvalidOptionException,
+            InvalidDataflowException, TokenOrderException, ReadInputException, DatabaseConfigurationException,
+            CMException, IOException, DeserializationException, IterationTypeMismatchException {
+
+        matchboxExtractor = new TavernaExtractor(true);
+
+        TavernaExtractor.setArchimateOutputPath(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "matchbox.archi"));
+        TavernaExtractor.setInputFileName(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "matchbox.t2flow"));
+
+        matchboxExtractor.process();
+        ALL_RELATIONS = matchboxExtractor.getRelations();
+        ALL_PROCESSES = matchboxExtractor.getBusinessProcesses();
+        ALL_BUSINESSOBJECTS = matchboxExtractor.getBusinessObjects();
+    }
+
+    @Test
+    public void test_Looping() throws EditException, OpenDataflowException, InvalidOptionException,
+            InvalidDataflowException, TokenOrderException, ReadInputException, DatabaseConfigurationException,
+            CMException, IOException, DeserializationException, IterationTypeMismatchException {
+
+        loopingExtractor = new TavernaExtractor(true);
+        TavernaExtractor.setArchimateOutputPath(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "looping.archimate"));
+        TavernaExtractor.setInputFileName(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "looping.t2flow"));
+
+        loopingExtractor.process();
+    }
+
+    @Test
+    public void test_processWSDLActivity() throws EditException, OpenDataflowException, InvalidOptionException,
+            InvalidDataflowException, TokenOrderException, ReadInputException, DatabaseConfigurationException,
+            CMException, IOException, DeserializationException, IterationTypeMismatchException {
+
+        wsdlActivityExtractor = new TavernaExtractor(true);
+        TavernaExtractor.setArchimateOutputPath(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "WSDLActivity.archimate"));
+        TavernaExtractor.setInputFileName(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "WSDLActivity.t2flow"));
+
+        wsdlActivityExtractor.process();
+    }
+
+    @Test
+    public void test_processLocalToolActivity() throws EditException, OpenDataflowException, InvalidOptionException,
+            InvalidDataflowException, TokenOrderException, ReadInputException, DatabaseConfigurationException,
+            CMException, IOException, DeserializationException, IterationTypeMismatchException {
+
+        wsdlActivityExtractor = new TavernaExtractor(true);
+        TavernaExtractor.setArchimateOutputPath(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "localTool.archimate"));
+        TavernaExtractor.setInputFileName(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "localTool.t2flow"));
+
+        wsdlActivityExtractor.process();
+    }
+
+    @Test
+    public void test_processSSHToolActivity() throws EditException, OpenDataflowException, InvalidOptionException,
+            InvalidDataflowException, TokenOrderException, ReadInputException, DatabaseConfigurationException,
+            CMException, IOException, DeserializationException, IterationTypeMismatchException {
+
+        wsdlActivityExtractor = new TavernaExtractor(true);
+        TavernaExtractor.setArchimateOutputPath(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "sshTool.archimate"));
+        TavernaExtractor.setInputFileName(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "sshTool.t2flow"));
+
+        wsdlActivityExtractor.process();
+    }
+
+    @Test
+    @Ignore
+    public void test_processBeanshellActivity() throws EditException, OpenDataflowException, InvalidOptionException,
+            InvalidDataflowException, TokenOrderException, ReadInputException, DatabaseConfigurationException,
+            CMException, IOException, DeserializationException, IterationTypeMismatchException {
+
+        beanshellActivityExtractor = new TavernaExtractor(true);
+        TavernaExtractor.setArchimateOutputPath(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "beanshellLActivity.archimate"));
+        TavernaExtractor.setInputFileName(Joiner.on(File.separator).skipNulls()
+                .join("test", "resources", "beanshellLActivity.t2flow"));
+
+        beanshellActivityExtractor.process();
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_getAllRelations() {
+
+        assertNotNull(ALL_RELATIONS);
+        assertEquals(ALL_RELATIONS.size(), RELATIONS_COUNT);
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_getTriggeringSubset() {
+
+        assertNotNull(ALL_RELATIONS);
+        assertEquals(TRIGGERING_RELATIONS_COUNT, ArchiUtils.ofClass(ALL_RELATIONS, ITriggeringRelationship.class)
+                .size());
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_getTriggeringSubsetForElement() {
+
+        List<IArchimateElement> businessProcesses = matchboxExtractor.getBusinessProcesses();
+        IBusinessProcess source = (IBusinessProcess) ArchiUtils.getElementsByname("matchbox_evaluate",
+                businessProcesses).get(0);
+
+        assertNotNull(ALL_RELATIONS);
+        assertEquals(3, ArchiUtils.ofClass(ALL_RELATIONS, ITriggeringRelationship.class, source).size());
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_getAllOutgoingAccessRelations() {
+
+        List<IArchimateElement> businessProcesses = matchboxExtractor.getBusinessProcesses();
+        IBusinessProcess source = (IBusinessProcess) ArchiUtils.getElementsByname("matchbox_evaluate",
+                businessProcesses).get(0);
+        int numberOfOutgoingAccessRelations = ArchiUtils
+                .ofClass(ALL_RELATIONS, IAccessRelationship.class, source, true).size();
+        assertEquals(7, numberOfOutgoingAccessRelations);
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_getAllIngoingAccessRelations() {
+
+        List<IArchimateElement> businessProcesses = matchboxExtractor.getBusinessProcesses();
+        IBusinessProcess source = (IBusinessProcess) ArchiUtils.getElementsByname("matchbox_evaluate",
+                businessProcesses).get(0);
+        int numberOfOutgoingAccessRelations = ArchiUtils.ofClass(ALL_RELATIONS, IAccessRelationship.class, source,
+                false).size();
+        assertEquals(2, numberOfOutgoingAccessRelations);
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_getElementsInBetween() {
+
+        IBusinessProcess source = (IBusinessProcess) ArchiUtils.getElementsByname("matchbox_evaluate", ALL_PROCESSES)
+                .get(0);
+        IBusinessProcess target = (IBusinessProcess) ArchiUtils.getElementsByname("report", ALL_PROCESSES).get(0);
+
+        List<IArchimateElement> elements = ArchiUtils.getElementsInBetween(source, target, ALL_RELATIONS);
+
+        assertNotNull(elements);
+
+        int numberOfElements = elements.size();
+        assertEquals(6, numberOfElements);
+
+        // dirty - check if each item is of type IBusinessObject and if
+        // the list contains the correct elements via their names
+        List<String> list = new ArrayList<String>();
+        for (IArchimateElement element : elements) {
+            assertTrue(element instanceof IBusinessObject);
+            list.add(element.getName());
+        }
+        ArrayList<String> expected_list = new ArrayList<String>() {
+            {
+                add("cid");
+                add("fm");
+                add("iid");
+                add("rec");
+                add("md");
+                add("prec");
+            }
+        };
+        assertTrue(list.containsAll(expected_list));
+    }
+
+    @Test
+    @Ignore("Grouping already implemented!")
+    public void test_isListComplete() {
+
+        IBusinessProcess source = (IBusinessProcess) ArchiUtils.getElementsByname("matchbox_evaluate", ALL_PROCESSES)
+                .get(0);
+        IBusinessProcess target = (IBusinessProcess) ArchiUtils.getElementsByname("report", ALL_PROCESSES).get(0);
+
+        List<IArchimateElement> completeList = ArchiUtils.getElementsInBetween(source, target, ALL_RELATIONS);
+
+        // testlist - get each element by name
+        List<IArchimateElement> testList = new ArrayList<IArchimateElement>();
+        testList.add(ArchiUtils.getElementsByname("cid", ALL_BUSINESSOBJECTS).get(0));
+        testList.add(ArchiUtils.getElementsByname("fm", ALL_BUSINESSOBJECTS).get(0));
+        testList.add(ArchiUtils.getElementsByname("iid", ALL_BUSINESSOBJECTS).get(0));
+        testList.add(ArchiUtils.getElementsByname("md", ALL_BUSINESSOBJECTS).get(0));
+        testList.add(ArchiUtils.getElementsByname("prec", ALL_BUSINESSOBJECTS).get(0));
+        testList.add(ArchiUtils.getElementsByname("rec", ALL_BUSINESSOBJECTS).get(0));
+
+        assertTrue(ArchiUtils.isListComplete(testList, completeList));
+    }
+}