Skip to content
Snippets Groups Projects
DirectedGraphTranslator.java 224 KiB
Newer Older
                                    ;

                                }

                            } else {
                                sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName();
                            }

                            if (writeChannel.getChannel(j).getDestinationPort().getName().contains("FORKPORTDESTINATION")) {

                                checkchannel = writeChannel.getChannel(j).getDestinationPort().getName().split("_S_");

                                if (checkchannel.length > 2) {

                                    receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION",
                                            "FORKCHANNEL");
                                } else if (checkchannel.length <= 2) {

                                    receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION",
                                            "");

                                    receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                                }

                            } else if (writeChannel.getChannel(j).getDestinationPort().getName().contains("JOINPORTDESTINATION")) {

                                checkchannel = writeChannel.getChannel(j).getDestinationPort().getName().split("_S_");

                                if (checkchannel.length > 2) {

                                    receiveDataPortdetails = "JOINCHANNEL_S_" + checkchannel[1] + "__" + checkchannel[2];

                                } else if (checkchannel.length <= 2) {
                                    receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName().replace("JOINPORTDESTINATION",
                                            "");

                                    receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                                }

                            } else {
                                receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName();

                            }

                        } else {

                            // writeChannel.getChannel(j);
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName();
                            receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName();
                        }

                        if (!sendingDataPortdetails.equals(receiveDataPortdetails)) {

                            sendData.put(sendingDataPortdetails, receiveDataPortdetails);
                        }

                    }
                }
                // get the names and params of wait events per task and their corresponding send
                // events

                for (TMLWaitEvent waitEvent : task.getWaitEvents()) {
                    // TMLCPrimitivePort portdetails = waitEvent.getEvent().port;
                    TMLCPrimitivePort sendingPortdetails = waitEvent.getEvent().port;
                    TMLCPrimitivePort receivePortdetails = waitEvent.getEvent().port2;

                    String receivePortparams = waitEvent.getAllParams();

                    // tmlcdp.tmlctdp.getAllPortsConnectedTo(portdetails);

                    waitEvt.put("waitevent:" + receivePortdetails.getPortName() + "(" + receivePortparams + ")", new ArrayList<String>());

                    TMLTask originTasks = waitEvent.getEvent().getOriginTask();

                    for (TMLSendEvent wait_sendEvent : originTasks.getSendEvents()) {

                        String sendingPortparams = wait_sendEvent.getAllParams();

                        waitEvt.get("waitevent:" + receivePortdetails.getPortName() + "(" + receivePortparams + ")")
                                .add("sendevent:" + sendingPortdetails.getPortName() + "(" + sendingPortparams + ")");

                    }

                }

                // add the name of the task as a vertex
maysam zoor's avatar
maysam zoor committed

                if (!g.vertexSet().contains(getvertex(key))) {
                    g.addVertex(vertex(key));
maysam zoor's avatar
maysam zoor committed
                    updatemainBar(key);
                }
                if (!g.vertexSet().contains(getvertex(task.getName()))) {
                    g.addVertex(vertex(task.getName()));
maysam zoor's avatar
maysam zoor committed
                    updatemainBar(task.getName());
                }
                g.addEdge(getvertex(key), getvertex(task.getName()));

                activity = task.getActivityDiagram();
                int count = 1;
                currentElement = activity.getFirst();
                String taskStartName = "";
                String taskEndName = "";

                HashMap<String, List<String>> forLoopNextValues = new HashMap<String, List<String>>();

                // loop over all the activites corresponding to a task
                while (count <= activity.nElements()) {

                    String eventName = null;
                    String preEventName;

                    if (currentElement.getName().equals("Stop after infinite loop")) {
                        count++;

                        if (count <= activity.nElements()) {
                            if (currentElement.getNexts().size() == 1) {

                                currentElement = currentElement.getNexts().firstElement();

                            } else if (!multiNexts.isEmpty()) {
                                currentElement = multiNexts.get(0);

                                multiNexts.remove(0);

                            }

                            continue;
                        } else {
                            break;
                        }
                    } else if (currentElement.getName().equals("startOfFork") || currentElement.getName().equals("junctionOfFork")
                            || currentElement.getName().equals("startOfJoin") || currentElement.getName().equals("junctionOfJoin")) {
                        count++;

                        currentElement = currentElement.getNexts().firstElement();

                        continue;
                    } else if (task.getName().startsWith("FORKTASK_S_") && currentElement.getName().equals("ReadOfFork")) {

                        if (!g.containsVertex(getvertex(((TMLReadChannel) (currentElement)).getChannel(0).getName()))) {
                            g.addVertex(vertex(((TMLReadChannel) (currentElement)).getChannel(0).getName()));

                        }

                        g.addEdge(getvertex(task.getName()), getvertex(((TMLReadChannel) (currentElement)).getChannel(0).getName()));

                        HashSet<String> readForkVertex = new HashSet<String>();
                        readForkVertex.add(((TMLReadChannel) (currentElement)).getChannel(0).getName());

                        if (forkreadEdges.containsKey(task.getName())) {

                            if (!forkreadEdges.get(task.getName()).contains(((TMLReadChannel) (currentElement)).getChannel(0).getName())) {
                                forkreadEdges.get(task.getName()).add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
                            }

                        } else {

                            forkreadEdges.put(task.getName(), readForkVertex);

                        }

                        count++;

                        currentElement = currentElement.getNexts().firstElement();

                        continue;

                    } else if (task.getName().startsWith("FORKTASK_S_") && currentElement.getName().startsWith("WriteOfFork_S")) {

                        if (!g.containsVertex(getvertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()))) {
                            g.addVertex(vertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()));

                        }

                        HashSet<String> writeForkVertex = new HashSet<String>();
                        writeForkVertex.add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());

                        if (forkwriteEdges.containsKey(task.getName())) {

                            if (!forkwriteEdges.get(task.getName()).contains(((TMLWriteChannel) (currentElement)).getChannel(0).getName())) {
                                forkwriteEdges.get(task.getName()).add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());
                            }

                        } else {

                            forkwriteEdges.put(task.getName(), writeForkVertex);

                        }

                        // g.addEdge(getvertex(task.getName()),getvertex(((TMLWriteChannel)(currentElement)).getChannel(0).getName()));

                        count++;

                        currentElement = currentElement.getNexts().firstElement();

                        continue;

                    } else if (currentElement.getName().equals("stopOfFork") || currentElement.getName().equals("stop2OfFork")
                            || currentElement.getName().equals("stopOfJoin")) {
                        count++;

                        continue;
                    } else if (task.getName().startsWith("JOINTASK_S_") && currentElement.getName().startsWith("ReadOfJoin")) {
                        if (!g.containsVertex(getvertex(((TMLReadChannel) (currentElement)).getChannel(0).getName()))) {
                            g.addVertex(vertex(((TMLReadChannel) (currentElement)).getChannel(0).getName()));

                        }

                        HashSet<String> writeForkVertex = new HashSet<String>();
                        writeForkVertex.add(((TMLReadChannel) (currentElement)).getChannel(0).getName());

                        if (joinreadEdges.containsKey(task.getName())) {

                            if (!joinreadEdges.get(task.getName()).contains(((TMLReadChannel) (currentElement)).getChannel(0).getName())) {
                                joinreadEdges.get(task.getName()).add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
                            }

                        } else {

                            joinreadEdges.put(task.getName(), writeForkVertex);

                        }

                        // g.addEdge(getvertex(task.getName()),getvertex(((TMLWriteChannel)(currentElement)).getChannel(0).getName()));

                        count++;

                        currentElement = currentElement.getNexts().firstElement();

                        continue;
                    } else if (task.getName().startsWith("JOINTASK_S_") && currentElement.getName().equals("WriteOfJoin")) {

                        if (!g.containsVertex(getvertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()))) {
                            g.addVertex(vertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()));

                        }

                        g.addEdge(getvertex(task.getName()), getvertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()));

                        HashSet<String> readForkVertex = new HashSet<String>();
                        readForkVertex.add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());

                        if (joinwriteEdges.containsKey(task.getName())) {

                            if (!joinwriteEdges.get(task.getName()).contains(((TMLWriteChannel) (currentElement)).getChannel(0).getName())) {
                                joinwriteEdges.get(task.getName()).add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());
                            }

                        } else {

                            joinwriteEdges.put(task.getName(), readForkVertex);

                        }

                        count++;

                        currentElement = currentElement.getNexts().firstElement();

                        continue;

                    } else if (currentElement.getReferenceObject() instanceof TMLADRandom) {
                        eventName = task.getName() + "__" + currentElement.getName() + "__" + currentElement.getID();

                    } else {
                        eventName = task.getName() + "__" + currentElement.getReferenceObject().toString() + "__" + currentElement.getID();

                    }

maysam zoor's avatar
maysam zoor committed
                    updatemainBar(eventName);

                    if (currentElement.getNexts().size() > 1) {
                        for (TMLActivityElement ae : currentElement.getNexts()) {
                            multiNexts.add(ae);

                        }

                    }

                    // in case an end was encountered , the previous activities should be checked:
                    // in
                    // case it is an end for a loop or sequence speavial edges should be added

                    if (currentElement.getReferenceObject() instanceof TMLADStopState) {

                        taskEndName = task.getName() + "__" + currentElement.getName() + "__" + currentElement.getID();

                        if (activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADRandom) {
                            preEventName = task.getName() + "__" + activity.getPrevious(currentElement).getName() + "__"
                                    + activity.getPrevious(currentElement).getID();

                        } else {
                            preEventName = task.getName() + "__" + activity.getPrevious(currentElement).getReferenceObject().toString() + "__"
                                    + activity.getPrevious(currentElement).getID();
maysam zoor's avatar
maysam zoor committed

                        g.addVertex(vertex(taskEndName));
                        // gVertecies.add(vertex(taskEndName));
                        getvertex(eventName).setType(vertex.TYPE_END);
                        getvertex(eventName).setTaintFixedNumber(1);
                        // allTasks.add(taskEndName);

                        if (!(activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADSequence)) {
                            g.addEdge(getvertex(preEventName), getvertex(taskEndName));

                        @SuppressWarnings({ "unchecked", "rawtypes" })
                        AllDirectedPaths<vertex, DefaultEdge> allPaths = new AllDirectedPaths<vertex, DefaultEdge>(g);
                        if (orderedSequenceList.size() > 0) {

                            int noForLoop = 0;
                            // get path from sequence to end
                            for (Entry<String, ArrayList<String>> sequenceListEntry : orderedSequenceList.entrySet()) {

                                int directlyConnectedSeq = 0;

                                if (g.containsVertex(vertex(sequenceListEntry.getKey()))) {
                                    List<GraphPath<vertex, DefaultEdge>> path = allPaths.getAllPaths(getvertex(sequenceListEntry.getKey()),
                                            getvertex(taskEndName), false, g.vertexSet().size());

                                    for (Entry<String, ArrayList<String>> othersequenceListEntryValue : orderedSequenceList.entrySet()) {

                                        for (int i = 0; i < path.size(); i++) {

                                            if (!othersequenceListEntryValue.getKey().equals(sequenceListEntry.getKey())) {

                                                if (path.get(i).getVertexList().contains(getvertex(othersequenceListEntryValue.getKey()))) {

                                                    directlyConnectedSeq++;

                                                }
                                            }
                                        }
                                    }

                                    if (path.size() > 0 && sequenceListEntry.getValue().size() > 0 && directlyConnectedSeq == 0) {

                                        for (int i = 0; i < path.size(); i++) {

                                            for (String sequenceListEntryValue : sequenceListEntry.getValue()) {

                                                if (g.containsVertex(getvertex(sequenceListEntryValue))) {
                                                    if (path.get(i).getVertexList().contains(getvertex(sequenceListEntryValue))) {

                                                        if (forLoopNextValues.size() > 0) {

                                                            for (Entry<String, List<String>> forloopListEntry : forLoopNextValues.entrySet()) {

                                                                if ((path.get(i).getVertexList()
                                                                        .contains(getvertex(forloopListEntry.getValue().get(0)))
                                                                        && getvertex(forloopListEntry.getValue().get(0))
                                                                                .getId() != sequenceListEntry.getKey())

                                                                        || path.get(i).getVertexList().contains(getvertex(sequenceListEntry.getValue()
                                                                                .get(sequenceListEntry.getValue().size() - 1)))) {

                                                                    noForLoop++;
                                                                }
                                                            }
                                                        }

                                                        if (forEverLoopList.size() > 0) {

                                                            for (String forloopListEntry : forEverLoopList) {

                                                                if (path.get(i).getVertexList().contains(getvertex(forloopListEntry))) {

                                                                    noForLoop++;
                                                                }
                                                            }
                                                        }

                                                        if (noForLoop == 0) {

                                                            int nextIndex = sequenceListEntry.getValue().indexOf(sequenceListEntryValue) + 1;

                                                            if (nextIndex < sequenceListEntry.getValue().size()) {

                                                                HashSet<String> endSequenceVertex = new HashSet<String>();
                                                                endSequenceVertex.add(sequenceListEntry.getValue().get(nextIndex));

                                                                if (sequenceEdges.containsKey(taskEndName)) {

                                                                    if (!sequenceEdges.get(taskEndName)
                                                                            .contains(sequenceListEntry.getValue().get(nextIndex))) {
                                                                        sequenceEdges.get(taskEndName)
                                                                                .add(sequenceListEntry.getValue().get(nextIndex));
                                                                    }

                                                                } else {

                                                                    sequenceEdges.put(eventName, endSequenceVertex);

                                                                }

                                                            } else if (nextIndex == sequenceListEntry.getValue().size()
                                                                    && orderedSequenceList.size() > 1) {

                                                                for (Entry<String, ArrayList<String>> othersequenceListEntryValue : orderedSequenceList
                                                                        .entrySet()) {

                                                                    if (!othersequenceListEntryValue.getKey().equals(sequenceListEntry.getKey())) {

                                                                        int connectedSeq = 0;

                                                                        List<GraphPath<vertex, DefaultEdge>> pathBetweenSeq = allPaths.getAllPaths(
                                                                                getvertex(othersequenceListEntryValue.getKey()),
                                                                                getvertex(taskEndName), false, g.vertexSet().size());

                                                                        for (int j = 0; j < pathBetweenSeq.size(); j++) {

                                                                            for (Entry<String, ArrayList<String>> adjacentsequenceListEntryValue : orderedSequenceList
                                                                                    .entrySet()) {
                                                                                if (!adjacentsequenceListEntryValue.getKey()
                                                                                        .equals(sequenceListEntry.getKey())
                                                                                        && !adjacentsequenceListEntryValue.getKey()
                                                                                                .equals(othersequenceListEntryValue.getKey())) {
                                                                                    if (path.get(i).getVertexList().contains(
                                                                                            getvertex(adjacentsequenceListEntryValue.getKey()))) {

                                                                                        connectedSeq++;

                                                                                    }

                                                                                }
                                                                            }

                                                                        }

                                                                        if (connectedSeq == 0 && pathBetweenSeq.size() > 0) {

                                                                            for (String othersequenceListValue : othersequenceListEntryValue
                                                                                    .getValue()) {

                                                                                List<GraphPath<vertex, DefaultEdge>> pathToNextValue = allPaths
                                                                                        .getAllPaths(getvertex(othersequenceListValue),
                                                                                                getvertex(taskEndName), false, g.vertexSet().size());

                                                                                if (pathToNextValue.size() > 0)

                                                                                {

                                                                                    int nextAdjIndex = othersequenceListEntryValue.getValue()
                                                                                            .indexOf(othersequenceListValue) + 1;

                                                                                    if (nextAdjIndex < othersequenceListEntryValue.getValue()
                                                                                            .size()) {

                                                                                        HashSet<String> nextSequenceVertex = new HashSet<String>();
                                                                                        nextSequenceVertex.add(othersequenceListEntryValue.getValue()
                                                                                                .get(nextAdjIndex));

                                                                                        if (sequenceEdges.containsKey(taskEndName)) {

                                                                                            if (!sequenceEdges.get(taskEndName)
                                                                                                    .contains(othersequenceListEntryValue.getValue()
                                                                                                            .get(nextAdjIndex))) {
                                                                                                sequenceEdges.get(taskEndName)
                                                                                                        .add(othersequenceListEntryValue.getValue()
                                                                                                                .get(nextAdjIndex));
                                                                                            }

                                                                                        } else {

                                                                                            sequenceEdges.put(eventName, nextSequenceVertex);

                                                                                        }
                                                                                    }

                                                                                }

                                                                            }

                                                                        }

                                                                    }

                                                                }
                                                            }

                                                        }

                                                    }

                                                }

                                            }

                                        }

                                    }

                                }
                            }

                        }

                        if (unOrderedSequenceList.size() > 0) {

                            // get path from sequence to end
                            for (Entry<String, ArrayList<String>> sequenceListEntry : unOrderedSequenceList.entrySet()) {

                                if (g.containsVertex(vertex(sequenceListEntry.getKey()))) {
                                    List<GraphPath<vertex, DefaultEdge>> path = allPaths.getAllPaths(getvertex(sequenceListEntry.getKey()),
                                            getvertex(taskEndName), false, g.vertexSet().size());

                                    for (int i = 0; i < path.size(); i++) {

                                        if (path.size() > 0 && sequenceListEntry.getValue().size() > 0) {

                                            if (forLoopNextValues.size() > 0) {

                                                for (Entry<String, List<String>> forloopListEntry : forLoopNextValues.entrySet()) {

                                                    if (path.get(i).getVertexList().contains(getvertex(forloopListEntry.getKey()))) {

                                                        if (path.get(i).getVertexList().contains(getvertex(forloopListEntry.getValue().get(0))))

                                                        {
                                                            noForLoop++;

                                                        }

                                                    }
                                                }
                                            }

                                            if (forEverLoopList.size() > 0) {

                                                for (String forloopListEntry : forEverLoopList) {

                                                    if (path.get(i).getVertexList().contains(getvertex(forloopListEntry))) {
                                            for (Entry<String, ArrayList<String>> seqEntry : orderedSequenceList.entrySet()) {
                                                if (path.get(i).getVertexList().contains(getvertex(seqEntry.getKey()))) {

                                                    if (path.get(i).getVertexList()
                                                            .contains(getvertex(seqEntry.getValue().get(seqEntry.getValue().size() - 1))))

                                                    {

                                                    } else {
                                                        noForLoop++;
                                                    }

                                                }

                                            }

                                            if (noForLoop == 0) {

                                                HashSet<String> endSequenceVertex = new HashSet<String>();
                                                endSequenceVertex.add(sequenceListEntry.getKey());

                                                if (unOrderedSequenceEdges.containsKey(taskEndName)) {

                                                    if (!unOrderedSequenceEdges.get(taskEndName).contains(sequenceListEntry.getKey())) {
                                                        unOrderedSequenceEdges.get(taskEndName).add(sequenceListEntry.getKey());
                                                    }

                                                } else {

                                                    unOrderedSequenceEdges.put(eventName, endSequenceVertex);

                                                }

                                            }
                                        }
                                    }
                                }
                            }
                        }

                        // add if sequence on path of multiple for

                        if (forLoopNextValues.size() > 0) {

                            for (Entry<String, List<String>> forloopListEntry : forLoopNextValues.entrySet()) {

                                if (g.containsVertex(vertex(forloopListEntry.getValue().get(0)))) {
                                    List<GraphPath<vertex, DefaultEdge>> path = allPaths.getAllPaths(getvertex(forloopListEntry.getValue().get(0)),
                                            getvertex(taskEndName), false, g.vertexSet().size());

                                    for (int i = 0; i < path.size(); i++) {
                                        int forloopCount = 0;

                                        for (Entry<String, List<String>> forEntry : forLoopNextValues.entrySet()) {

                                            if (!forloopListEntry.getKey().equals(forEntry.getKey())) {
                                                if (path.get(i).getVertexList().contains(getvertex(forEntry.getKey()))) {

                                                    forloopCount++;

                                                }

                                            }

                                        }

                                        for (Entry<String, ArrayList<String>> seqEntry : orderedSequenceList.entrySet()) {

                                            if (path.get(i).getVertexList().contains(getvertex(seqEntry.getKey()))) {
                                                if (path.get(i).getVertexList()
                                                        .contains(getvertex(seqEntry.getValue().get(seqEntry.getValue().size() - 1))))

                                                {

                                                } else {
                                                    forloopCount++;
                                                }

                                            }

                                        }

                                        for (Entry<String, ArrayList<String>> unOrderedseqEntry : unOrderedSequenceList.entrySet()) {

                                            if (path.get(i).getVertexList().contains(getvertex(unOrderedseqEntry.getKey()))) {
                                                forloopCount++;

                                                HashSet<String> forLoopName = new HashSet<String>();
                                                forLoopName.add(forloopListEntry.getKey());

                                                if (unOrderedSequenceEdges.containsKey(unOrderedseqEntry.getKey())) {

                                                    if (unOrderedSequenceEdges.get(unOrderedseqEntry.getKey()).contains(forloopListEntry.getKey())) {
                                                        unOrderedSequenceEdges.get(unOrderedseqEntry.getKey()).add(forloopListEntry.getKey());
                                                    }

                                                } else {

                                                    unOrderedSequenceEdges.put(unOrderedseqEntry.getKey(), forLoopName);

                                                }

                                            }

                                        }
                                        String forvertexName = forloopListEntry.getKey();
                                        if (forloopCount == 0 && !g.containsEdge(getvertex(taskEndName), getvertex(forvertexName))) {
                                if (g.containsVertex(vertex(forloopListEntry.getValue().get(1))) && forLoopNextValues.size() > 1) {
                                    List<GraphPath<vertex, DefaultEdge>> path = allPaths.getAllPaths(getvertex(forloopListEntry.getValue().get(1)),
                                            getvertex(taskEndName), false, g.vertexSet().size());

                                    if (path.size() > 0) {

                                        for (Entry<String, List<String>> previousForLoop : forLoopNextValues.entrySet()) {
                                            if (g.containsVertex(vertex(previousForLoop.getValue().get(0)))
                                                    && !previousForLoop.getKey().equals(forloopListEntry.getKey())) {

                                                List<GraphPath<vertex, DefaultEdge>> previousForpath = allPaths.getAllPaths(
                                                        getvertex(previousForLoop.getValue().get(0)), getvertex(taskEndName), false,
                                                        g.vertexSet().size());

                                                for (int i = 0; i < previousForpath.size(); i++) {
                                                    int forloopCount = 0;

                                                    for (Entry<String, List<String>> forEntry : forLoopNextValues.entrySet()) {

                                                        if (previousForpath.get(i).getVertexList().contains(getvertex(forEntry.getKey()))
                                                                && !forloopListEntry.getKey().equals(forEntry.getKey())) {

                                                            forloopCount++;

                                                        }

                                                    }

                                                    String forvertexName = previousForLoop.getKey();
                                                    if (forloopCount == 0

                                                            && !g.containsEdge(vertex(taskEndName), vertex(forvertexName))) {

                                                        addedEdges.put(taskEndName, forvertexName);

                                                    }
                                                }
                                            }
                                        }
                                    }

                                }

                            }

                        }

                        if (!forEverLoopList.isEmpty())

                        {

                            for (String loopforEver : forEverLoopList) {

                                List<GraphPath<vertex, DefaultEdge>> pathforloopforever = allPaths.getAllPaths(getvertex(loopforEver),
                                        getvertex(taskEndName), false, g.vertexSet().size());

                                if (pathforloopforever.size() > 0) {

                                    for (int i = 0; i < pathforloopforever.size(); i++) {
                                        int forloopCount = 0;

                                        for (Entry<String, List<String>> previousForLoop : forLoopNextValues.entrySet()) {

                                            if (pathforloopforever.get(i).getVertexList().contains(getvertex(previousForLoop.getValue().get(0)))) {

                                                forloopCount++;

                                            }
                                        }

                                        for (Entry<String, ArrayList<String>> seqEntry : orderedSequenceList.entrySet()) {

                                            if (pathforloopforever.get(i).getVertexList().contains(getvertex(seqEntry.getKey()))) {

                                                if (pathforloopforever.get(i).getVertexList()
                                                        .contains(getvertex(seqEntry.getValue().get(seqEntry.getValue().size() - 1))))

                                                {

                                                } else {
                                                    forloopCount++;
                                                }

                                            }

                                        }

                                        for (Entry<String, ArrayList<String>> unOrderedseqEntry : unOrderedSequenceList.entrySet()) {

                                            if (pathforloopforever.get(i).getVertexList().contains(getvertex(unOrderedseqEntry.getKey()))) {
                                                forloopCount++;

                                                HashSet<String> forLoopName = new HashSet<String>();
                                                forLoopName.add(loopforEver);

                                                if (unOrderedSequenceEdges.containsKey(unOrderedseqEntry.getKey())) {

                                                    if (unOrderedSequenceEdges.get(unOrderedseqEntry.getKey()).contains(loopforEver)) {
                                                        unOrderedSequenceEdges.get(unOrderedseqEntry.getKey()).add(loopforEver);
                                                    }

                                                } else {

                                                    unOrderedSequenceEdges.put(unOrderedseqEntry.getKey(), forLoopName);

                                                }

                                            }
                                        }

                                        if (forloopCount == 0) {

                                            addedEdges.put(taskEndName, loopforEver);

                                        }
                                    }
                                }
                            }

                        }

                        count++;

                    }

                    // start activity is added as a vertex
                    if (currentElement.getReferenceObject() instanceof TMLADStartState) {

                        taskStartName = task.getName() + "__" + currentElement.getName() + "__" + currentElement.getID();

                        g.addVertex(vertex(taskStartName));
                        // gVertecies.add(vertex(taskStartName));
                        getvertex(taskStartName).setType(vertex.TYPE_START);
                        getvertex(taskStartName).setTaintFixedNumber(1);
                        g.addEdge(getvertex(task.getName()), getvertex(taskStartName));

                        count++;

                        if (!nameIDTaskList.containsKey(currentElement.getID())) {
                            nameIDTaskList.put(String.valueOf(currentElement.getID()), eventName);
                        }

                    }

                    // the below activities are added as vertex with the required edges
                    // these activities can be used to check later for latency

                    else if (currentElement.getReferenceObject() instanceof TMLADSendEvent
                            || currentElement.getReferenceObject() instanceof TMLADWaitEvent
                            || currentElement.getReferenceObject() instanceof TMLADForLoop
                            || currentElement.getReferenceObject() instanceof TMLADForStaticLoop
                            || currentElement.getReferenceObject() instanceof TMLADChoice
                            || currentElement.getReferenceObject() instanceof TMLADForEverLoop
                            || (currentElement.getReferenceObject() instanceof TMLADExecI && !currentElement.getValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADExecC && !currentElement.getValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADDelay
                                    && !((TMLADDelay) currentElement.getReferenceObject()).getDelayValue().equals("0"))
                            || currentElement.getReferenceObject() instanceof TMLADSendRequest
                            || currentElement.getReferenceObject() instanceof TMLADReadRequestArg
                            || currentElement.getReferenceObject() instanceof TMLADActionState
                            || (currentElement.getReferenceObject() instanceof TMLADDelayInterval
                                    && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                    && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADExecCInterval
                                    && !((TMLADExecCInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                    && !((TMLADExecCInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADExecIInterval
                                    && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                    && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                            || currentElement.getReferenceObject() instanceof TMLADNotifiedEvent
                            || currentElement.getReferenceObject() instanceof TMLADRandom
                            || currentElement.getReferenceObject() instanceof TMLADReadChannel
                            || currentElement.getReferenceObject() instanceof TMLADWriteChannel
                            || currentElement.getReferenceObject() instanceof TMLADSequence
                            || currentElement.getReferenceObject() instanceof TMLADUnorderedSequence
                            || currentElement.getReferenceObject() instanceof TMLADSelectEvt
                            || currentElement.getReferenceObject() instanceof TMLADDecrypt
                            || currentElement.getReferenceObject() instanceof TMLADEncrypt) {

                        if (activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADRandom) {
                            preEventName = task.getName() + "__" + activity.getPrevious(currentElement).getName() + "__"
                                    + activity.getPrevious(currentElement).getID();

                        } else {
                            preEventName = task.getName() + "__" + activity.getPrevious(currentElement).getReferenceObject().toString() + "__"
                                    + activity.getPrevious(currentElement).getID();

                        }

                        if (((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecI
                                || activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecC)
                                && activity.getPrevious(currentElement).getValue().equals("0"))
                                || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADDelay)
                                        && ((TMLADDelay) activity.getPrevious(currentElement).getReferenceObject()).getDelayValue().equals("0"))

                                || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADDelayInterval)
                                        && (((TMLADDelayInterval) activity.getPrevious(currentElement).getReferenceObject()).getMinDelayValue()
                                                .equals("0")
                                                && ((TMLADDelayInterval) activity.getPrevious(currentElement).getReferenceObject()).getMaxDelayValue()
                                                        .equals("0")))

                                || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecCInterval)
                                        && (((TMLADExecCInterval) activity.getPrevious(currentElement).getReferenceObject()).getMinDelayValue()
                                                .equals("0")
                                                && ((TMLADExecCInterval) activity.getPrevious(currentElement).getReferenceObject()).getMaxDelayValue()
                                                        .equals("0"))

                                        || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecIInterval)
                                                && (((TMLADExecIInterval) activity.getPrevious(currentElement).getReferenceObject())
                                                        .getMinDelayValue().equals("0")
                                                        && ((TMLADExecIInterval) activity.getPrevious(currentElement).getReferenceObject())
                                                                .getMaxDelayValue().equals("0")))))

                        {

                            if (activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject() instanceof TMLADRandom) {
                                preEventName = task.getName() + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getName() + "__"
                                        + activity.getPrevious(activity.getPrevious(currentElement)).getID();

                            } else {
                                preEventName = task.getName() + "__"
                                        + activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject().toString() + "__"
                                        + activity.getPrevious(activity.getPrevious(currentElement)).getID();

                            }

                        }

                        if (!nameIDTaskList.containsKey(currentElement.getID())) {
                            nameIDTaskList.put(String.valueOf(currentElement.getID()), eventName);
                        }

                        if (g.containsVertex(getvertex(preEventName))) {
                            g.addVertex(vertex(eventName));
                            // gVertecies.add(vertex(eventName));
                            g.addEdge(getvertex(preEventName), getvertex(eventName));
                        } else if ((activity.getPrevious(currentElement).getName().equals("start")) && g.containsVertex(vertex(taskStartName))) {
                            g.addVertex(vertex(eventName));
                            // gVertecies.add(vertex(eventName));
                            g.addEdge(getvertex(taskStartName), getvertex(eventName));
                            count++;

                        }

                        if (currentElement.getReferenceObject() instanceof TMLADSendEvent
                                || currentElement.getReferenceObject() instanceof TMLADWaitEvent
                                || currentElement.getReferenceObject() instanceof TMLADSendRequest
                                || currentElement.getReferenceObject() instanceof TMLADNotifiedEvent
                                || currentElement.getReferenceObject() instanceof TMLADReadChannel
                                || currentElement.getReferenceObject() instanceof TMLADWriteChannel
                                || (currentElement.getReferenceObject() instanceof TMLADExecI && !currentElement.getValue().equals("0"))
                                || (currentElement.getReferenceObject() instanceof TMLADExecC && !currentElement.getValue().equals("0"))
                                || (currentElement.getReferenceObject() instanceof TMLADDelay
                                        && !((TMLADDelay) currentElement.getReferenceObject()).getDelayValue().equals("0"))
                                || (currentElement.getReferenceObject() instanceof TMLADDelayInterval
                                        && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                        && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))

                                || (currentElement.getReferenceObject() instanceof TMLADExecCInterval
                                        && !((TMLADExecCInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                        && ((TMLADExecCInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                                || (currentElement.getReferenceObject() instanceof TMLADExecIInterval
                                        && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                        && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                                || currentElement.getReferenceObject() instanceof TMLADEncrypt
                                || currentElement.getReferenceObject() instanceof TMLADDecrypt
                                || currentElement.getReferenceObject() instanceof TMLADReadRequestArg) {

                            allLatencyTasks.add(eventName);
                            getvertex(eventName).setType(vertex.TYPE_TRANSACTION);
                            getvertex(eventName).setTaintFixedNumber(1);

                        } else if (currentElement.getReferenceObject() instanceof TMLADRandom) {
                            getvertex(eventName).setType(vertex.TYPE_CTRL);
                            getvertex(eventName).setTaintFixedNumber(1);
                        } else if (currentElement.getReferenceObject() instanceof TMLADSelectEvt) {
                            getvertex(eventName).setType(vertex.TYPE_CTRL);
                            getvertex(eventName).setTaintFixedNumber(1);

                        } else if (currentElement.getReferenceObject() instanceof TMLADActionState) {
                            getvertex(eventName).setType(vertex.TYPE_CTRL);
                            getvertex(eventName).setTaintFixedNumber(1);

                        }

                        if (currentElement.getReferenceObject() instanceof TMLADForEverLoop) {
                            forEverLoopList.add(eventName);

                            getvertex(eventName).setType(vertex.TYPE_FOR_EVER_LOOP);

                            getvertex(eventName).setTaintFixedNumber(Integer.MAX_VALUE);

                        }

                        if (currentElement.getReferenceObject() instanceof TMLADChoice) {

                            getvertex(eventName).setType(vertex.TYPE_CHOICE);
                            getvertex(eventName).setTaintFixedNumber(1);

                        }

                        if (currentElement.getReferenceObject() instanceof TMLADSendRequest) {

                            if (requestsOriginDestination.containsKey(task.getName())) {

                                for (String destinationTask : requestsOriginDestination.get(task.getName())) {

                                    if (requestsPorts.containsKey(destinationTask)) {

                                        for (String portNames : requestsPorts.get(destinationTask)) {

                                            String[] requestName = currentElement.getReferenceObject().toString().split(":");

                                            String[] portname = requestName[1].split("[(]");

                                            if (portname[0].replaceAll(" ", "").equals(portNames.replaceAll(" ", ""))) {

                                                for (String destinationTaskstartname : requestsDestination.get(destinationTask)) {

                                                    if (requestEdges.containsKey(eventName)) {

                                                        if (!requestEdges.get(eventName).contains(destinationTaskstartname)) {
                                                            requestEdges.get(eventName).add(destinationTaskstartname);
                                                        }

                                                    } else {

                                                        HashSet<String> destinationTaskoriginstart = new HashSet<String>();
                                                        destinationTaskoriginstart.add(destinationTaskstartname);