Skip to content
Snippets Groups Projects
DirectedGraphTranslator.java 221 KiB
Newer Older
                            forkwriteEdges.put(taskName, writeForkVertex);

                        // g.addEdge(getvertex(taskName),getvertex(((TMLWriteChannel)(currentElement)).getChannel(0).getName()));
                        opCount++;
                        currentElement = currentElement.getNexts().firstElement();
                        continue;
                    } else if (currentElement.getName().equals("stopOfFork") || currentElement.getName().equals("stop2OfFork")
                            || currentElement.getName().equals("stopOfJoin")) {
                        opCount++;
                        continue;
                    } else if (taskName.startsWith("JOINTASK_S_") && currentElement.getName().startsWith("ReadOfJoin")) {
                        String vName = ((TMLReadChannel) (currentElement)).getChannel(0).getName();
                        int vid = ((TMLReadChannel) (currentElement)).getChannel(0).getID();
                        if (!g.containsVertex(getvertex(vName))) {
                            g.addVertex(vertex(vName, vid));
                        HashSet<String> writeForkVertex = new HashSet<String>();
                        writeForkVertex.add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
                        if (joinreadEdges.containsKey(taskName)) {
                            if (!joinreadEdges.get(taskName).contains(((TMLReadChannel) (currentElement)).getChannel(0).getName())) {
                                joinreadEdges.get(task.getName()).add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
                            }
                        } else {
                            joinreadEdges.put(taskName, writeForkVertex);
maysam zoor's avatar
maysam zoor committed

                        // g.addEdge(getvertex(task.getName()),getvertex(((TMLWriteChannel)(currentElement)).getChannel(0).getName()));
                        opCount++;
                        currentElement = currentElement.getNexts().firstElement();
                        continue;
                    } else if (taskName.startsWith("JOINTASK_S_") && currentElement.getName().equals("WriteOfJoin")) {
                        String vName = ((TMLWriteChannel) (currentElement)).getChannel(0).getName();
                        int vid = ((TMLWriteChannel) (currentElement)).getChannel(0).getID();
                        if (!g.containsVertex(getvertex(vName))) {
                            g.addVertex(vertex(vName, vid));
                        g.addEdge(getvertex(taskName), getvertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()));
                        HashSet<String> readForkVertex = new HashSet<String>();
                        readForkVertex.add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());
                        if (joinwriteEdges.containsKey(taskName)) {
                            if (!joinwriteEdges.get(taskName).contains(((TMLWriteChannel) (currentElement)).getChannel(0).getName())) {
                                joinwriteEdges.get(taskName).add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());

                            joinwriteEdges.put(taskName, readForkVertex);


                        opCount++;

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

                        continue;

                    }

                    updatemainBar(eventName);

                    if (currentElement.getNexts().size() > 1) {
                        for (TMLActivityElement ae : currentElement.getNexts()) {
                            multiNexts.add(ae);
                    eventName = getEventName(taskName, currentElement);
                    // 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) {
                        addStopVertex(taskName);
                    // start activity is added as a vertex
                    if (currentElement.getReferenceObject() instanceof TMLADStartState) {

                        addStartVertex(taskName);
                    }

                    // 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) {

                        addcurrentElementVertex(taskName, taskStartName);

                    }

                    // check if the next activity :add to an array:
                    // in case of for loop : the first element of inside/outside branches of loop
                    // in case of sequence: add first element of all branches

                    if (currentElement.getNexts().size() == 1) {

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

                    } else if (!multiNexts.isEmpty()) {
                        
                        trackMultiNexts(taskName,eventName);
                        currentElement = multiNexts.get(0);
                        multiNexts.remove(0);
                    allForLoopNextValues.putAll(forLoopNextValues);
            }

        }

        return cpuTaskMap;
    }

    private void trackMultiNexts(String taskName, String eventName) {
        // TODO Auto-generated method stub
        
        if (currentElement.getReferenceObject() instanceof TMLADForStaticLoop
                || currentElement.getReferenceObject() instanceof TMLADForLoop) {

            if (currentElement.getNexts().size() > 1) {

                List<TGConnectingPoint> points = new ArrayList<TGConnectingPoint>();
                List<TGConnector> getOutputConnectors = new ArrayList<TGConnector>();
                if (currentElement.getReferenceObject() instanceof TMLADForStaticLoop) {
                    points = Arrays.asList(((TMLADForStaticLoop) (currentElement.getReferenceObject())).getConnectingPoints());

                    getOutputConnectors = ((TMLADForStaticLoop) (currentElement.getReferenceObject())).getOutputConnectors();

                    String loopValue = ((TMLADForStaticLoop) (currentElement.getReferenceObject())).getValue();

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

                    if ((loopValue != null) && (loopValue.length() > 0)) {

                        if ((loopValue.matches("\\d*"))) {
                            getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                            for (TMLAttribute att : taskAc.getAttributes()) {
                                if (loopValue.contains(att.getName())) {
                                    loopValue = loopValue.replace(att.getName(), (att.getInitialValue()));
                                }

                            }
                            getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                } else if (currentElement.getReferenceObject() instanceof TMLADForLoop) {
                    points = Arrays.asList(((TMLADForLoop) (currentElement.getReferenceObject())).getConnectingPoints());
                    getOutputConnectors = ((TMLADForLoop) (currentElement.getReferenceObject())).getOutputConnectors();
                    // String loopValue = ((TMLADForLoop)
                    // (currentElement.getReferenceObject())).getValue();
                    getvertex(eventName).setType(vertex.TYPE_FOR_LOOP);
                    String cond = ((TMLADForLoop) (currentElement.getReferenceObject())).getCondition();
                    if (cond.contains("<=")) {
                        String[] val = cond.split("<=");
                        String loopValue = val[2].toString();
                        if ((loopValue != null) && (loopValue.length() > 0)) {
                            if ((loopValue.matches("\\d*"))) {
                                getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                            } else {
                                for (TMLAttribute att : taskAc.getAttributes()) {
                                    if (loopValue.contains(att.getName())) {
                                        loopValue = loopValue.replace(att.getName(), (att.getInitialValue()));
                                    }
                                }

                                getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                    } else if (cond.contains("<")) {

                        String[] val = cond.split("<");

                        String loopValue = val[1].toString();
                        if ((loopValue != null) && (loopValue.length() > 0)) {

                            if ((loopValue.matches("\\d*"))) {
                                getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                            } else {
                                for (TMLAttribute att : taskAc.getAttributes()) {

                                    if (loopValue.contains(att.getName())) {
                                        loopValue = loopValue.replace(att.getName(), (att.getInitialValue()));
                                    }

                                }
                                if ((loopValue.matches("\\d*"))) {
                                    getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                                }
                                {
                                    frameLatencyDetailedAnalysis
                                            .error(loopValue + " Expression in For Loop is not supported by Tainting");
                                }
                TGConnector inputConnector = null, outputConnector = null;
                for (TGConnector connector : getOutputConnectors) {
                    if (connector.getTGConnectingPointP1() == points.get(1)) {
                        inputConnector = connector;
                    } else if (connector.getTGConnectingPointP1() == points.get(2)) {
                        outputConnector = connector;
                    }
                List<String> afterloopActivity = new ArrayList<String>(2);

                String insideLoop = "", outsideLoop = "";

                for (TMLActivityElement ae : currentElement.getNexts()) {
                    List<TGConnector> cg = (((TGComponent) ae.getReferenceObject()).getInputConnectors());

                    for (TGConnector afterloopcg : cg) {

                        if (afterloopcg == inputConnector) {

                            if (ae.getReferenceObject() instanceof TMLADRandom) {

                                insideLoop = taskName + "__" + ae.getName() + "__" + ae.getID();

                            } else if (ae.getReferenceObject() instanceof TMLADUnorderedSequence) {

                                insideLoop = taskName + "__" + "unOrderedSequence" + "__" + ae.getID();

                            } else {

                                insideLoop = taskName + "__" + ae.getReferenceObject().toString() + "__" + ae.getID();
                        } else if (afterloopcg == outputConnector) {
                            if (ae.getReferenceObject() instanceof TMLADRandom) {

                                outsideLoop = taskName + "__" + ae.getName() + "__" + ae.getID();

                            } else if (ae.getReferenceObject() instanceof TMLADUnorderedSequence) {

                                outsideLoop = taskName + "__" + "unOrderedSequence" + "__" + ae.getID();

                            } else {

                                outsideLoop = taskName + "__" + ae.getReferenceObject().toString() + "__" + ae.getID();

                            }
                afterloopActivity.add(0, insideLoop);
                afterloopActivity.add(1, outsideLoop);
                forLoopNextValues.put(eventName, afterloopActivity);
        } else if (currentElement.getReferenceObject() instanceof TMLADSequence) {
            getvertex(eventName).setType(vertex.TYPE_SEQ);
            getvertex(eventName).setTaintFixedNumber(1);
            String nextEventName = "";
            for (TMLActivityElement seqListnextElement : currentElement.getNexts()) {
                if (seqListnextElement.getReferenceObject() instanceof TMLADRandom) {
                    nextEventName = taskName + "__" + seqListnextElement.getName() + "__" + seqListnextElement.getID();

                } else if (seqListnextElement.getReferenceObject() instanceof TMLADUnorderedSequence) {

                    nextEventName = taskName + "__" + "unOrderedSequence" + "__" + seqListnextElement.getID();

                } else {
                    nextEventName = taskName + "__" + seqListnextElement.getReferenceObject().toString() + "__"
                            + seqListnextElement.getID();

                }

                if (orderedSequenceList.containsKey(eventName)) {
                    if (!orderedSequenceList.get(eventName).contains(nextEventName)) {
                        orderedSequenceList.get(eventName).add(nextEventName);
                    }
                } else {
                    ArrayList<String> seqListNextValues = new ArrayList<String>();
                    seqListNextValues.add(nextEventName);
                    orderedSequenceList.put(eventName, seqListNextValues);
                }

            }

        } else if (currentElement.getReferenceObject() instanceof TMLADUnorderedSequence) {

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

            String nextEventName = "";

            for (TMLActivityElement seqListnextElement : currentElement.getNexts()) {
                if (seqListnextElement.getReferenceObject() instanceof TMLADRandom) {
                    nextEventName = taskName + "__" + seqListnextElement.getName() + "__" + seqListnextElement.getID();

                } else if (seqListnextElement.getReferenceObject() instanceof TMLADUnorderedSequence) {

                    nextEventName = taskName + "__" + "unOrderedSequence" + "__" + seqListnextElement.getID();

                } else {
                    nextEventName = taskName + "__" + seqListnextElement.getReferenceObject().toString() + "__"
                            + seqListnextElement.getID();

                }

                if (unOrderedSequenceList.containsKey(eventName)) {
                    if (!unOrderedSequenceList.get(eventName).contains(nextEventName)) {
                        unOrderedSequenceList.get(eventName).add(nextEventName);
                    }
                } else {
                    ArrayList<String> seqListNextValues = new ArrayList<String>();
                    seqListNextValues.add(nextEventName);
                    unOrderedSequenceList.put(eventName, seqListNextValues);
                }

            }

        }

        List<TGConnector> cg = (((TGComponent) currentElement.getReferenceObject()).getInputConnectors());

        
        
    }

    private void addStartVertex(String taskName) {
        // TODO Auto-generated method stub
        taskStartName = taskName + "__" + currentElement.getName() + "__" + currentElement.getID();
        vertex startv = vertex(taskStartName, currentElement.getID());

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

        opCount++;

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

        }
    }

    private void waitEventNames() {
        // TODO Auto-generated method stub
        for (TMLWaitEvent waitEvent : taskAc.getWaitEvents()) {
            // TMLCPrimitivePort portdetails = waitEvent.getEvent().port;
            TMLCPrimitivePort sendingPortdetails = waitEvent.getEvent().port;
            TMLCPrimitivePort receivePortdetails = waitEvent.getEvent().port2;

            if (!sendingPortdetails.isBlocking()) {
                warnings.add(
                        "send event port:" + sendingPortdetails.getPortName() + " is non-blocking. Use tainting for an accurate latency analysis");
            }
            if (sendingPortdetails.isFinite()) {
                warnings.add("send event port:" + sendingPortdetails.getPortName() + " is Finite. Event lost is not supported in latency analysis ");
            }
            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 + ")");

            }

        }

    }

    private void writeChannelNames() {
        // TODO Auto-generated method stub

        for (TMLWriteChannel writeChannel : taskAc.getWriteChannels()) {

            int i = writeChannel.getNbOfChannels();

            for (int j = 0; j < i; j++) {

                String sendingDataPortdetails = "";
                String receiveDataPortdetails = "";

                if ((writeChannel.getChannel(j)).originalDestinationTasks.size() > 0) {
                    String[] checkchannel;

                    if (writeChannel.getChannel(j).getOriginPort().getName().contains("FORKPORTORIGIN")) {

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

                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "FORKCHANNEL");
                            ;

                        } else if (checkchannel.length < 2) {

                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "");
                            ;

                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                            ;

                        }

                    } else if (writeChannel.getChannel(j).getOriginPort().getName().contains("JOINPORTORIGIN")) {

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

                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "JOINCHANNEL");
                        } else if (checkchannel.length <= 2) {
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "");
maysam zoor's avatar
maysam zoor committed

                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                            ;
                    } 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_", "");
maysam zoor's avatar
maysam zoor committed

                    } 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);
                }
    private void readChannelNames() {
        // TODO Auto-generated method stub
        for (TMLReadChannel readChannel : taskAc.getReadChannels()) {
            int i = readChannel.getNbOfChannels();
            // name = _ch.getOriginPorts().get(0).getName(); //return the name of the source
            // port of the channel
            for (int j = 0; j < i; j++) {
                String sendingDataPortdetails = "";
                String receiveDataPortdetails = "";
                if ((readChannel.getChannel(j)).originalDestinationTasks.size() > 0) {
                    String[] checkchannel;
                    if (readChannel.getChannel(j).getOriginPort().getName().contains("FORKPORTORIGIN")) {
                        checkchannel = readChannel.getChannel(j).getOriginPort().getName().split("_S_");
                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "FORKCHANNEL");
                        } else if (checkchannel.length <= 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "");
                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                            ;
                    } else if (readChannel.getChannel(j).getOriginPort().getName().contains("JOINPORTORIGIN")) {
                        checkchannel = readChannel.getChannel(j).getOriginPort().getName().split("_S_");
                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "JOINCHANNEL");
                        } else if ((checkchannel.length) <= 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "");
                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                        }
                    } else {
                        sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName();
                    }
                    if (readChannel.getChannel(j).getDestinationPort().getName().contains("FORKPORTDESTINATION")) {
                        checkchannel = readChannel.getChannel(j).getDestinationPort().getName().split("_S_");
                        if (checkchannel.length > 2) {
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION",
                                    "FORKCHANNEL");
                        } else if (checkchannel.length <= 2) {
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION", "");
                            receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                        }
                    } else if (readChannel.getChannel(j).getDestinationPort().getName().contains("JOINPORTDESTINATION")) {
                        checkchannel = readChannel.getChannel(j).getDestinationPort().getName().split("_S_");
                        if (checkchannel.length > 2) {
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("JOINPORTDESTINATION",
                                    "JOINCHANNEL");
                        } else if (checkchannel.length <= 2) {
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("JOINPORTDESTINATION", "");
                            receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                        }
                    } else {
                        receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName();
                    }
                } else {
                    sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName();
                    receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName();
                }
                if (!sendingDataPortdetails.equals(receiveDataPortdetails)) {
                    receiveData.put(receiveDataPortdetails, sendingDataPortdetails);
                TMLCPrimitivePort sp = null, rp = null;
                if (readChannel.getChannel(j).getOriginPort().getReferenceObject() instanceof TMLCPrimitivePort) {
                    rp = (TMLCPrimitivePort) readChannel.getChannel(j).getOriginPort().getReferenceObject();
                if (readChannel.getChannel(j).getOriginPort().getReferenceObject() instanceof TMLCPrimitivePort) {
                    sp = (TMLCPrimitivePort) readChannel.getChannel(j).getDestinationPort().getReferenceObject();
                if (sp != null && rp != null) {
                    if (!sp.isBlocking() && !rp.isBlocking()) {
                        warnings.add("send data port:" + sp.getPortName() + " and read data port:" + rp.getPortName()
                                + " are non-blocking. Use tainting for an accurate latency analysis.");
    private void sendEventsNames() {
        // TODO Auto-generated method stub
        for (TMLSendEvent sendEvent : taskAc.getSendEvents()) {
            TMLCPrimitivePort sendingPortdetails = sendEvent.getEvent().port;
            TMLCPrimitivePort receivePortdetails = sendEvent.getEvent().port2;
            String sendingPortparams = sendEvent.getAllParams();
            TMLTask destinationTasks = sendEvent.getEvent().getDestinationTask();
            sendEvt.put("sendevent:" + sendingPortdetails.getPortName() + "(" + sendingPortparams + ")", new ArrayList<String>());
            for (TMLWaitEvent wait_sendEvent : destinationTasks.getWaitEvents()) {
                String receivePortparams = wait_sendEvent.getAllParams();
                sendEvt.get("sendevent:" + sendingPortdetails.getPortName() + "(" + sendingPortparams + ")")
                        .add("waitevent:" + receivePortdetails.getPortName() + "(" + receivePortparams + ")");
    private void requestedTask(HashSet<TMLTask> value) {
        // TODO Auto-generated method stub
        for (TMLTask task : value) {
            if (task.isRequested()) {
                TMLRequest requestToTask = task.getRequest();
                requestToTask.getReferenceObject();
                requestToTask.getDestinationTask();
                requestToTask.getOriginTasks().get(0);
                requestToTask.ports.get(0).getName();
                requestToTask.getExtendedName();
                String destinationRequest = requestToTask.getDestinationTask().getName() + "__"
                        + requestToTask.getDestinationTask().getActivityDiagram().get(0).getName() + "__"
                        + requestToTask.getDestinationTask().getActivityDiagram().get(0).getID();
                String destinationRequestName = requestToTask.getDestinationTask().getName();
                for (TMLTask originTask : requestToTask.getOriginTasks()) {
                    String requestOriginTaskName = originTask.getName();
                    if (requestsOriginDestination.containsKey(requestOriginTaskName)) {
                        if (!requestsOriginDestination.get(requestOriginTaskName).contains(destinationRequestName)) {
                            requestsOriginDestination.get(requestOriginTaskName).add(destinationRequestName);
                        }
                    } else {
                        ArrayList<String> destinationRequestNames = new ArrayList<String>();
                        destinationRequestNames.add(destinationRequestName);
                        requestsOriginDestination.put(requestOriginTaskName, destinationRequestNames);
                    }
                for (TMLCPrimitivePort requestsPort : requestToTask.ports) {
                    String requestsPortName = requestsPort.getPortName();
                    if (requestsPorts.containsKey(task.getName())) {
                        if (!requestsPorts.get(task.getName()).contains(requestsPortName)) {
                            requestsPorts.get(task.getName()).add(requestsPortName);
                        }
                    } else {
                        ArrayList<String> requestsPortNames = new ArrayList<String>();
                        requestsPortNames.add(requestsPortName);
                        requestsPorts.put(task.getName(), requestsPortNames);
                    }
                if (requestsDestination.containsKey(destinationRequestName)) {
                    if (!requestsDestination.get(destinationRequestName).contains(destinationRequest)) {
                        requestsDestination.get(destinationRequestName).add(destinationRequest);
                    }
                } else {
                    ArrayList<String> destinationRequestNames = new ArrayList<String>();
                    destinationRequestNames.add(destinationRequest);
                    requestsDestination.put(destinationRequestName, destinationRequestNames);
                }
    private void addcurrentElementVertex(String taskName, String taskStartName) {
        // TODO Auto-generated method stub
        String preEventName;
        int preEventid;
        String eventName = getEventName(taskName, currentElement);
        int eventid = currentElement.getID();
        if (activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADRandom) {
            preEventName = taskName + "__" + activity.getPrevious(currentElement).getName() + "__" + activity.getPrevious(currentElement).getID();
            preEventid = activity.getPrevious(currentElement).getID();
        } else if (activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADUnorderedSequence) {
            preEventName = taskName + "__" + "unOrderedSequence" + "__" + activity.getPrevious(currentElement).getID();
            preEventid = activity.getPrevious(currentElement).getID();
        } else {
            preEventName = taskName + "__" + activity.getPrevious(currentElement).getReferenceObject().toString() + "__"
                    + activity.getPrevious(currentElement).getID();
            preEventid = 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 = taskName + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getName() + "__"
                        + activity.getPrevious(activity.getPrevious(currentElement)).getID();
                preEventid = activity.getPrevious(activity.getPrevious(currentElement)).getID();
            } else if (activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject() instanceof TMLADUnorderedSequence) {
                preEventName = taskName + "__" + "unOrderedSequence" + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getID();
                preEventid = activity.getPrevious(activity.getPrevious(currentElement)).getID();
            } else {
                preEventName = taskName + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject().toString() + "__"
                        + activity.getPrevious(activity.getPrevious(currentElement)).getID();
                preEventid = activity.getPrevious(activity.getPrevious(currentElement)).getID();
        if (!nameIDTaskList.containsKey(currentElement.getID())) {
            nameIDTaskList.put(String.valueOf(currentElement.getID()), eventName);
        }
        if (g.containsVertex(getvertex(preEventName))) {
            vertex v = vertex(eventName, eventid);
            vertex preV = vertex(preEventName, preEventid);
            g.addVertex(v);
            // gVertecies.add(vertex(eventName));
            g.addEdge(preV, v);
            opCount++;
        } else if ((activity.getPrevious(currentElement).getName().equals("start")) && g.containsVertex(getvertex(taskStartName))) {
            vertex v = vertex(eventName, eventid);
            g.addVertex(v);
            // gVertecies.add(vertex(eventName));
            g.addEdge(getvertex(taskStartName), getvertex(eventName));
            opCount++;
        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(taskName)) {
                for (String destinationTask : requestsOriginDestination.get(taskName)) {
                    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);

                                        requestEdges.put(eventName, destinationTaskoriginstart);
        if (currentElement.getReferenceObject() instanceof TMLADSendEvent) {
            if (sendEvt.containsKey(currentElement.getReferenceObject().toString().replaceAll(" ", ""))) {
                List<String> recieveEvt = sendEvt.get(currentElement.getReferenceObject().toString().replaceAll(" ", ""));
                for (vertex vertex : g.vertexSet()) {
                    String[] vertexName = vertex.toString().split("__");