workcraft/workcraft

View on GitHub
workcraft/XmasPlugin/src/org/workcraft/plugins/xmas/commands/PNetGenerationCommand.java

Summary

Maintainability
F
1 wk
Test Coverage
package org.workcraft.plugins.xmas.commands;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.MappingJsonFactory;
import org.workcraft.commands.Command;
import org.workcraft.plugins.xmas.Xmas;
import org.workcraft.plugins.xmas.XmasSettings;
import org.workcraft.plugins.xmas.components.FunctionComponent;
import org.workcraft.plugins.xmas.components.SinkComponent;
import org.workcraft.plugins.xmas.components.SourceComponent;
import org.workcraft.plugins.xmas.components.SwitchComponent;
import org.workcraft.utils.LogUtils;
import org.workcraft.utils.WorkspaceUtils;
import org.workcraft.workspace.WorkspaceEntry;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Scanner;

public class PNetGenerationCommand implements Command {

    private static final int dl = 1;
    private static final boolean printoutput = true;

    private static class Ids {
        public final String a;
        public final String b;

        Ids(String s1, String s2) {
            a = s1;
            b = s2;
        }
    }

    private static class Info {
        public final String a;
        public final String b;
        public final String c;
        public final String d;

        Info(String s1, String s2, String s3, String s4) {
            a = s1;
            b = s2;
            c = s3;
            d = s4;
        }
    }

    private static final List<Info> lst = new ArrayList<>();
    private static final List<Ids> lst2 = new ArrayList<>();
    private static final List<Info> slsti = new ArrayList<>();
    private static final List<Info> slsto = new ArrayList<>();
    private static final List<Info> slsto2 = new ArrayList<>();

    public void initlist() {
        lst.clear();
        lst2.clear();
        slsti.clear();
        slsto.clear();
        slsto2.clear();
    }

    private static void processFile(String file) {
        Scanner sc = null;
        try {
            sc = new Scanner(new File(file));
        } catch (FileNotFoundException e) {
            LogUtils.logError(e.getMessage());
        }
        String qs = "";
        String cn = "";
        String dn = "";
        int tst = 0;
        while (sc.hasNextLine() && tst == 0) {
            Scanner line = new Scanner(sc.nextLine());
            Scanner nxt = new Scanner(line.next());
            String check = nxt.next();
            if (check.startsWith("empty")) {
                tst = 1;
            } else if (check.startsWith("//gensync")) {
                nxt = new Scanner(line.next());
                String str = nxt.next();
                qs = str.replace("Qs", "Sync");
            } else {
                nxt = new Scanner(line.next());
                nxt.next();
                nxt = new Scanner(line.next());
                cn = nxt.next();
                nxt = new Scanner(line.next());
                dn = nxt.next();
                String d = "0";
                if ("b".equals(dn)) {
                    d = "1";  //Mrg conn
                }
                lst.add(new Info(cn, qs, "", d));
            }
        }
    }

    @Override
    public String getDisplayName() {
        return "Generate Circuit Petri Net";
    }

    @Override
    public String getSection() {
        return "GenCPNet";
    }

    @Override
    public boolean isApplicableTo(WorkspaceEntry we) {
        return WorkspaceUtils.isApplicable(we, Xmas.class);
    }

    private static String searchList(String id) {
        String str = "";

        for (Info info : lst) {
            if (info.a.equals(id)) {
                str = info.b;
            }
        }
        return str;
    }

    private static String searchList2(String id) {
        String str = "";

        for (Info info : lst) {
            if (info.a.equals(id)) {
                str = info.c;
            }
        }
        return str;
    }

    private static String searchList3(String id) {
        String str = "";

        for (Ids ids : lst2) {
            if (ids.a.equals(id)) {
                str = ids.b;
            }
        }
        return str;
    }

    private static String searchListFirst(String id) {
        int tst = 0;
        String str = "";

        int i = 0;
        while (i < lst.size() && tst == 0) {
            if (lst.get(i).a.equals(id)) {
                if ("0".equals(lst.get(i).d)) {
                    str = lst.get(i).b;
                    tst = 1;
                }
            }
            i++;
        }
        return str;
    }

    private static String searchListSecond(String id) {
        int tst = 0;
        String str = "";

        int i = 0;
        while (i < lst.size() && tst == 0) {
            if (lst.get(i).a.equals(id)) {
                if ("1".equals(lst.get(i).d)) {
                    str = lst.get(i).b;
                    tst = 1;
                }
            }
            i++;
        }
        return str;
    }

    private static String searchListFirst2(String id) {
        int tst = 0;
        String str = "";

        int i = 0;
        while (i < lst.size() && tst == 0) {
            if (lst.get(i).a.equals(id)) {
                if ("0".equals(lst.get(i).d)) {
                    str = lst.get(i).c;
                    tst = 1;
                }
            }
            i++;
        }
        return str;
    }

    private static String searchListSecond2(String id) {
        int tst = 0;
        String str = "";

        int i = 0;
        while (i < lst.size() && tst == 0) {
            if (lst.get(i).a.equals(id)) {
                if ("1".equals(lst.get(i).d)) {
                    str = lst.get(i).c;
                    tst = 1;
                }
            }
            i++;
        }
        return str;
    }

    private static void writeblock(String id, String label, PrintWriter writer) {
        if (printoutput) {
            System.out.println("p_" + id + label + "0  t_" + id + label + "plus ");
            System.out.println("t_" + id + label + "plus  p_" + id + label + "1");
            System.out.println("p_" + id + label + "1  t_" + id + label + "minus ");
            System.out.println("t_" + id + label + "minus  p_" + id + label + "0");
        }
        writer.println("p_" + id + label + "0  t_" + id + label + "plus ");
        writer.println("t_" + id + label + "plus  p_" + id + label + "1");
        writer.println("p_" + id + label + "1  t_" + id + label + "minus ");
        writer.println("t_" + id + label + "minus  p_" + id + label + "0");
    }

    private static void writebidir(String id, String label1, String label2, PrintWriter writer) {
        if (printoutput) {
            System.out.println("p_" + id + label1 + "  t_" + id + label2);
            System.out.println("t_" + id + label2 + "  p_" + id + label1);
        }
        writer.println("p_" + id + label1 + "  t_" + id + label2);
        writer.println("t_" + id + label2 + "  p_" + id + label1);
    }

    private static void writelink(String id, String id1, String label1, String label2, PrintWriter writer) {
        if (id1.contains("Sync")) {
            String s = id1.replace("Sync", "");
            id1 = "Qs" + s;
        }
        if (printoutput) {
            System.out.println("p_" + id1 + label1 + "  t_" + id + label2);
            System.out.println("t_" + id + label2 + "  p_" + id1 + label1);
        }
        writer.println("p_" + id1 + label1 + "  t_" + id + label2);
        writer.println("t_" + id + label2 + "  p_" + id1 + label1);
    }

    private static void writelinkp(String id, String id1, String label1, String label2, String idp, PrintWriter writer) {
        if (id1.contains("Sync")) {
            String s = id1.replace("Sync", "");
            id1 = "Qs" + s;
        }
        if ("0".equals(idp)) {
            writelink(id, id1, "a" + label1, label2, writer);
        } else if ("1".equals(idp)) {
            writelink(id, id1, "b" + label1, label2, writer);
        } else {
            writelink(id, id1, "i" + label1, label2, writer);
        }
    }

    private static void writelinki(String id, String id1, String label1, String label2, String idi, PrintWriter writer) {
        if (id1.contains("Sync")) {
            String s = id1.replace("Sync", "");
            id1 = "Qs" + s;
        }
        if ("a".equals(idi)) {
            writelink(id, id1, "a" + label1, label2, writer);
        } else if ("b".equals(idi)) {
            writelink(id, id1, "b" + label1, label2, writer);
        } else {
            writelink(id, id1, "o" + label1, label2, writer);
        }
    }

    private static void writeMarking(String id, String label, PrintWriter writer) {
        if (printoutput) {
            System.out.println("marking p_" + id + label + "0 1");
            System.out.println("marking p_" + id + label + "1 0");
        }
        writer.println("marking p_" + id + label + "0 1");
        writer.println("marking p_" + id + label + "1 0");
    }

    private static void writeMarking2(String id, String label, PrintWriter writer) {
        if (printoutput) {
            System.out.println("marking p_" + id + label + "0 0");
            System.out.println("marking p_" + id + label + "1 1");
        }
        writer.println("marking p_" + id + label + "0 0");
        writer.println("marking p_" + id + label + "1 1");
    }

    private static void genSource(String id, String id1, String idp, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//gensource " + id);
        }
        writer.println("//gensource " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "_oracle", writer);
        writeblock(id, "_oracle", writer);
        writeMarking(id, "o_irdy", writer);
        writeblock(id, "o_irdy", writer);
        writebidir(id, "_oracle0", "o_irdyminus", writer);
        writebidir(id, "_oracle1", "o_irdyplus", writer);
        writelinkp(id, id1, "_trdy1", "o_irdyminus", idp, writer);
    }

    private static void genSink(String id, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//gensink " + id);
        }
        writer.println("//gensink " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "_oracle", writer);
        writeblock(id, "_oracle", writer);
        writeMarking(id, "i_trdy", writer);
        writeblock(id, "i_trdy", writer);
        writebidir(id, "_oracle0", "i_trdyminus", writer);
        writebidir(id, "_oracle1", "i_trdyplus", writer);
        String id2 = searchList(id);
        String id3 = searchList2(id);
        if ("a".equals(id3)) {
            writelink(id, id2, "a_irdy1", "i_trdyminus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2, "b_irdy1", "i_trdyminus", writer);
        } else {
            writelink(id, id2, "o_irdy1", "i_trdyminus", writer);
        }
    }

    private static void genFunction(String id, String id1, String idp, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//genfunction " + id);
        }
        writer.println("//genfunction " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "o_irdy", writer);
        writeblock(id, "o_irdy", writer);
        writeMarking(id, "i_trdy", writer);
        writeblock(id, "i_trdy", writer);
        String id2 = searchList(id);
        String id3 = searchList2(id);
        if ("a".equals(id3)) {
            writelink(id, id2, "a_irdy0", "o_irdyminus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2, "b_irdy0", "o_irdyminus", writer);
        } else {
            writelink(id, id2, "o_irdy0", "o_irdyminus", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2, "a_irdy1", "o_irdyplus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2, "b_irdy1", "o_irdyplus", writer);
        } else {
            writelink(id, id2, "o_irdy1", "o_irdyplus", writer);
        }
        //writer.println("Function checking id = " + ' ' + id + "id2 = " + ' ' + id2);
        writelinkp(id, id1, "_trdy0", "i_trdyminus", idp, writer);
        writelinkp(id, id1, "_trdy1", "i_trdyplus", idp, writer);

    }

    private static void genFork(String id, String id1, String id2, String idp1, String idp2, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//genfork " + id);
        }
        writer.println("//genfork " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "a_irdy", writer);
        writeblock(id, "a_irdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "a_irdy1  t_" + id + "a_irdyminus1");
            System.out.println("t_" + id + "a_irdyminus1  p_" + id + "a_irdy0");
        }
        writer.println("p_" + id + "a_irdy1  t_" + id + "a_irdyminus1");
        writer.println("t_" + id + "a_irdyminus1  p_" + id + "a_irdy0");
        writeMarking(id, "b_irdy", writer);
        writeblock(id, "b_irdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "b_irdy1  t_" + id + "b_irdyminus1");
            System.out.println("t_" + id + "b_irdyminus1  p_" + id + "b_irdy0");
        }
        writer.println("p_" + id + "b_irdy1  t_" + id + "b_irdyminus1");
        writer.println("t_" + id + "b_irdyminus1  p_" + id + "b_irdy0");
        writeMarking(id, "i_trdy", writer);
        writeblock(id, "i_trdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus1");
            System.out.println("t_" + id + "i_trdyminus1  p_" + id + "i_trdy0");
        }
        writer.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus1");
        writer.println("t_" + id + "i_trdyminus1  p_" + id + "i_trdy0");
        String id2b = searchList(id);
        String id3 = searchList2(id);
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy0", "a_irdyminus1", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy0", "a_irdyminus1", writer);
        } else {
            writelink(id, id2b, "o_irdy0", "a_irdyminus1", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy1", "a_irdyplus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy1", "a_irdyplus", writer);
        } else {
            writelink(id, id2b, "o_irdy1", "a_irdyplus", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy0", "b_irdyminus1", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy0", "b_irdyminus1", writer);
        } else {
            writelink(id, id2b, "o_irdy0", "b_irdyminus1", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy1", "b_irdyplus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy1", "b_irdyplus", writer);
        } else {
            writelink(id, id2b, "o_irdy1", "b_irdyplus", writer);
        }
        writelinkp(id, id1, "_trdy0", "a_irdyminus", idp1, writer);
        writelinkp(id, id1, "_trdy1", "a_irdyplus", idp1, writer);
        writelinkp(id, id2, "_trdy0", "b_irdyminus", idp2, writer);
        writelinkp(id, id2, "_trdy1", "b_irdyplus", idp2, writer);
        writelinkp(id, id1, "_trdy1", "i_trdyplus", idp1, writer);
        writelinkp(id, id2, "_trdy1", "i_trdyplus", idp2, writer);
        writelinkp(id, id1, "_trdy0", "i_trdyminus", idp1, writer);
        writelinkp(id, id2, "_trdy0", "i_trdyminus1", idp2, writer);

    }

    private static void genJoin(String id, String id1, String idp, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//genjoin " + id);
        }
        writer.println("//genjoin " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "a_trdy", writer);
        writeblock(id, "a_trdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "a_trdy1  t_" + id + "a_trdyminus1");
            System.out.println("t_" + id + "a_trdyminus1  p_" + id + "a_trdy0");
        }
        writer.println("p_" + id + "a_trdy1  t_" + id + "a_trdyminus1");
        writer.println("t_" + id + "a_trdyminus1  p_" + id + "a_trdy0");
        writeMarking(id, "b_trdy", writer);
        writeblock(id, "b_trdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "b_trdy1  t_" + id + "b_trdyminus1");
            System.out.println("t_" + id + "b_trdyminus1  p_" + id + "b_trdy0");
        }
        writer.println("p_" + id + "b_trdy1  t_" + id + "b_trdyminus1");
        writer.println("t_" + id + "b_trdyminus1  p_" + id + "b_trdy0");
        writeMarking(id, "o_irdy", writer);
        writeblock(id, "o_irdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "o_irdy1  t_" + id + "o_irdyminus1");
            System.out.println("t_" + id + "o_irdyminus1  p_" + id + "o_irdy0");
        }
        writer.println("p_" + id + "o_irdy1  t_" + id + "o_irdyminus1");
        writer.println("t_" + id + "o_irdyminus1  p_" + id + "o_irdy0");
        String id3 = searchListFirst(id);
        String id4 = searchListSecond(id);
        String id5 = searchListFirst2(id);
        String id6 = searchListSecond2(id);
        writelinki(id, id3, "_irdy0", "a_trdyminus1", id5, writer);
        writelinki(id, id3, "_irdy1", "a_trdyplus", id5, writer);
        writelinki(id, id4, "_irdy0", "b_trdyminus1", id6, writer);
        writelinki(id, id4, "_irdy1", "b_trdyplus", id6, writer);
        writelinki(id, id3, "_irdy1", "o_irdyplus", id5, writer);
        writelinki(id, id4, "_irdy1", "o_irdyplus", id6, writer);
        writelinki(id, id3, "_irdy0", "o_irdyminus", id5, writer);
        writelinki(id, id4, "_irdy0", "o_irdyminus1", id6, writer);
        writelinkp(id, id1, "_trdy0", "a_trdyminus", idp, writer);
        writelinkp(id, id1, "_trdy1", "a_trdyplus", idp, writer);
        writelinkp(id, id1, "_trdy0", "b_trdyminus", idp, writer);
        writelinkp(id, id1, "_trdy1", "b_trdyplus", idp, writer);

    }

    private static void genSwitch(String id, String id1, String id2, String idp1, String idp2, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//genswitch " + id);
        }
        writer.println("//genswitch " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "_sw", writer);
        writeblock(id, "_sw", writer);
        writeMarking(id, "a_irdy", writer);
        writeblock(id, "a_irdy", writer);
        writer.println("p_" + id + "a_irdy1  t_" + id + "a_irdyminus1");
        writer.println("t_" + id + "a_irdyminus1  p_" + id + "a_irdy0");
        writeMarking(id, "b_irdy", writer);
        writeblock(id, "b_irdy", writer);
        writer.println("p_" + id + "b_irdy1  t_" + id + "b_irdyminus1");
        writer.println("t_" + id + "b_irdyminus1  p_" + id + "b_irdy0");
        writeMarking(id, "i_trdy", writer);
        writeblock(id, "i_trdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "i_trdy0  t_" + id + "i_trdyplus1");
            System.out.println("t_" + id + "i_trdyplus1  p_" + id + "i_trdy1");
        }
        writer.println("p_" + id + "i_trdy0  t_" + id + "i_trdyplus1");
        writer.println("t_" + id + "i_trdyplus1  p_" + id + "i_trdy1");
        if (printoutput) {
            System.out.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus1");
            System.out.println("t_" + id + "i_trdyminus1  p_" + id + "i_trdy0");
        }
        writer.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus1");
        writer.println("t_" + id + "i_trdyminus1  p_" + id + "i_trdy0");
        if (printoutput) {
            System.out.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus2");
            System.out.println("t_" + id + "i_trdyminus2  p_" + id + "i_trdy0");
        }
        writer.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus2");
        writer.println("t_" + id + "i_trdyminus2  p_" + id + "i_trdy0");
        if (printoutput) {
            System.out.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus3");
            System.out.println("t_" + id + "i_trdyminus3  p_" + id + "i_trdy0");
        }
        writer.println("p_" + id + "i_trdy1  t_" + id + "i_trdyminus3");
        writer.println("t_" + id + "i_trdyminus3  p_" + id + "i_trdy0");
        writebidir(id, "_sw0", "b_irdyplus", writer);
        writebidir(id, "_sw1", "b_irdyminus1", writer);
        writebidir(id, "_sw1", "a_irdyplus", writer);
        writebidir(id, "_sw0", "a_irdyminus1", writer);
        writebidir(id, "a_irdy1", "i_trdyplus", writer);
        writebidir(id, "b_irdy1", "i_trdyplus1", writer);
        writebidir(id, "a_irdy0", "i_trdyminus3", writer);
        writebidir(id, "a_irdy0", "i_trdyminus2", writer);
        writebidir(id, "b_irdy0", "i_trdyminus3", writer);
        writebidir(id, "b_irdy0", "i_trdyminus1", writer);
        String id2b = searchList(id);
        String id3 = searchList2(id);
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy0", "a_irdyminus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy0", "a_irdyminus", writer);
        } else {
            writelink(id, id2b, "o_irdy0", "a_irdyminus", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy1", "a_irdyplus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy1", "a_irdyplus", writer);
        } else {
            writelink(id, id2b, "o_irdy1", "a_irdyplus", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy0", "b_irdyminus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy0", "b_irdyminus", writer);
        } else {
            writelink(id, id2b, "o_irdy0", "b_irdyminus", writer);
        }
        if ("a".equals(id3)) {
            writelink(id, id2b, "a_irdy1", "b_irdyplus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2b, "b_irdy1", "b_irdyplus", writer);
        } else {
            writelink(id, id2b, "o_irdy1", "b_irdyplus", writer);
        }
        writelinkp(id, id1, "_trdy1", "i_trdyplus", idp1, writer);
        writelinkp(id, id2, "_trdy1", "i_trdyplus1", idp2, writer);
        writelinkp(id, id1, "_trdy0", "i_trdyminus", idp1, writer);
        writelinkp(id, id1, "_trdy0", "i_trdyminus1", idp1, writer);
        writelinkp(id, id2, "_trdy0", "i_trdyminus", idp2, writer);
        writelinkp(id, id2, "_trdy0", "i_trdyminus2", idp2, writer);

    }

    private static void genMerge(String id, String id1, String idp, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//genmerge " + id);
        }
        writer.println("//genmerge " + id);
        if (fieldgr > 0) {
            System.out.println("//gr " + fieldgr);
            writer.println("//gr " + fieldgr);
        }
        writeMarking(id, "_u", writer);
        writeblock(id, "_u", writer);
        writeMarking(id, "a_trdy", writer);
        writeblock(id, "a_trdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "a_trdy1  t_" + id + "a_trdyminus1");
            System.out.println("t_" + id + "a_trdyminus1  p_" + id + "a_trdy0");
        }
        writer.println("p_" + id + "a_trdy1  t_" + id + "a_trdyminus1");
        writer.println("t_" + id + "a_trdyminus1  p_" + id + "a_trdy0");
        if (printoutput) {
            System.out.println("p_" + id + "a_trdy1  t_" + id + "a_trdyminus2");
            System.out.println("t_" + id + "a_trdyminus2  p_" + id + "a_trdy0");
        }
        writer.println("p_" + id + "a_trdy1  t_" + id + "a_trdyminus2");
        writer.println("t_" + id + "a_trdyminus2  p_" + id + "a_trdy0");
        writeMarking(id, "b_trdy", writer);
        writeblock(id, "b_trdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "b_trdy1  t_" + id + "b_trdyminus1");
            System.out.println("t_" + id + "b_trdyminus1  p_" + id + "b_trdy0");
        }
        writer.println("p_" + id + "b_trdy1  t_" + id + "b_trdyminus1");
        writer.println("t_" + id + "b_trdyminus1  p_" + id + "b_trdy0");
        if (printoutput) {
            System.out.println("p_" + id + "b_trdy1  t_" + id + "b_trdyminus2");
            System.out.println("t_" + id + "b_trdyminus2  p_" + id + "b_trdy0");
        }
        writer.println("p_" + id + "b_trdy1  t_" + id + "b_trdyminus2");
        writer.println("t_" + id + "b_trdyminus2  p_" + id + "b_trdy0");
        writeMarking(id, "o_irdy", writer);
        writeblock(id, "o_irdy", writer);
        if (printoutput) {
            System.out.println("p_" + id + "o_irdy0  t_" + id + "o_irdyplus1");
            System.out.println("t_" + id + "o_irdyplus1  p_" + id + "o_irdy1");
        }
        writer.println("p_" + id + "o_irdy0  t_" + id + "o_irdyplus1");
        writer.println("t_" + id + "o_irdyplus1  p_" + id + "o_irdy1");
        writebidir(id, "_u0", "a_trdyminus", writer);
        writebidir(id, "_u1", "a_trdyplus", writer);
        writebidir(id, "_u0", "b_trdyplus", writer);
        writebidir(id, "_u1", "b_trdyminus", writer);
        String id3 = searchListFirst(id);
        String id4 = searchListSecond(id);
        String id5 = searchListFirst2(id);
        String id6 = searchListSecond2(id);
        writelinki(id, id3, "_irdy0", "_uminus", id5, writer);
        writelinki(id, id3, "_irdy1", "_uplus", id5, writer);
        writelinki(id, id4, "_irdy0", "_uplus", id6, writer);
        writelinki(id, id4, "_irdy1", "_uminus", id6, writer);
        writelinki(id, id3, "_irdy0", "a_trdyminus2", id5, writer);
        writelinki(id, id3, "_irdy1", "a_trdyplus", id5, writer);
        writelinki(id, id4, "_irdy0", "b_trdyminus2", id6, writer);
        writelinki(id, id4, "_irdy1", "b_trdyplus", id6, writer);
        writelinki(id, id3, "_irdy0", "o_irdyminus", id5, writer);
        writelinki(id, id3, "_irdy1", "o_irdyplus", id5, writer);
        writelinki(id, id4, "_irdy0", "o_irdyminus", id6, writer);
        writelinki(id, id4, "_irdy1", "o_irdyplus1", id6, writer);
        writelinkp(id, id1, "_trdy1", "a_trdyplus", idp, writer);
        writelinkp(id, id1, "_trdy1", "b_trdyplus", idp, writer);
        writelinkp(id, id1, "_trdy0", "a_trdyminus1", idp, writer);
        writelinkp(id, id1, "_trdy0", "b_trdyminus1", idp, writer);

    }

    private static void genQueue(String id, String id1, String idp, int init, String gpf, int fieldgr, PrintWriter writer) {
        if (printoutput) {
            System.out.println("//genqueue " + id + " " + gpf);
        }
        writer.println("//genqueue " + id + " " + gpf);
        if (fieldgr > 0) {
            System.out.println("//g " + fieldgr);
            writer.println("//g " + fieldgr);
        }
        if (init == 0) writeMarking(id, "o_irdy", writer);
        else writeMarking2(id, "o_irdy", writer);
        writeblock(id, "o_irdy", writer);
        if (init == 0) writeMarking2(id, "i_trdy", writer);
        else writeMarking(id, "i_trdy", writer);
        writeblock(id, "i_trdy", writer);
        if (init == 0) writeMarking(id, "_q", writer);
        else writeMarking2(id, "_q", writer);
        writeblock(id, "_q", writer);
        writebidir(id, "_q0", "o_irdyminus", writer);
        writebidir(id, "_q0", "i_trdyplus", writer);
        writebidir(id, "_q1", "o_irdyplus", writer);
        writebidir(id, "_q1", "i_trdyminus", writer);
        writebidir(id, "o_irdy1", "_qminus", writer);
        writebidir(id, "i_trdy1", "_qplus", writer);
        String id2 = searchList(id);
        String id3 = searchList2(id);
        if ("a".equals(id3)) {
            writelink(id, id2, "a_irdy1", "_qplus", writer);
        } else if ("b".equals(id3)) {
            writelink(id, id2, "b_irdy1", "_qplus", writer);
        } else {
            writelink(id, id2, "o_irdy1", "_qplus", writer);
        }
        writelinkp(id, id1, "_trdy1", "_qminus", idp, writer);
        if (dl == 1) {
            if (!id2.contains("Src") && !id2.contains("Qu") && !id2.contains("Sync")) writelink(id, id2, "_dl1", "_qplus", writer);
        }
    }

    private static void genQueue2p(int size, String id, String id1, String idp, int init, String gpf, int fieldgr, PrintWriter writer) {
        int inc = 0;
        if (printoutput) {
            if (size == 2) System.out.println("//genqueue2p " + id + " " + gpf);
            if (size == 3) System.out.println("//genqueue3p " + id + " " + gpf);
            if (size == 4) System.out.println("//genqueue4p " + id + " " + gpf);
            if (size == 5) System.out.println("//genqueue5p " + id + " " + gpf);
        }
        if (size == 2) writer.println("//genqueue2p " + id + " " + gpf);
        if (size == 3) writer.println("//genqueue3p " + id + " " + gpf);
        if (size == 4) writer.println("//genqueue4p " + id + " " + gpf);
        if (size == 5) writer.println("//genqueue5p " + id + " " + gpf);
        if (fieldgr > 0) {
            System.out.println("//g " + fieldgr);
            writer.println("//g " + fieldgr);
        }
        if (init > 0) writeMarking2(id, "o_irdy", writer);
        else writeMarking(id, "o_irdy", writer);
        writeblock(id, "o_irdy", writer);
        for (int i = 1; i < size; i++) {
            if (printoutput) {
                System.out.println("p_" + id + "o_irdy0  t_" + id + "o_irdyplus" + i);
                System.out.println("t_" + id + "o_irdyplus" + i + " p_" + id + "o_irdy1");
            }
            writer.println("p_" + id + "o_irdy0  t_" + id + "o_irdyplus" + i);
            writer.println("t_" + id + "o_irdyplus" + i + " p_" + id + "o_irdy1");
        }
        if (init >= size) writeMarking(id, "i_trdy", writer);
        else writeMarking2(id, "i_trdy", writer);
        writeblock(id, "i_trdy", writer);
        for (int i = 1; i < size; i++) {
            if (printoutput) {
                System.out.println("p_" + id + "i_trdy0  t_" + id + "i_trdyplus" + i);
                System.out.println("t_" + id + "i_trdyplus" + i + " p_" + id + "i_trdy1");
            }
            writer.println("p_" + id + "i_trdy0  t_" + id + "i_trdyplus" + i);
            writer.println("t_" + id + "i_trdyplus" + i + " p_" + id + "i_trdy1");
        }
        for (int i = 1; i <= size; i++) {
            if (init >= i) writeMarking2(id, "_q" + i, writer);
            else writeMarking(id, "_q" + i, writer);
            writeblock(id, "_q" + i, writer);
        }
        for (int i = 1; i <= size; i++) {
            if (i == init + 1) writeMarking2(id, "_hd" + i, writer);
            else writeMarking(id, "_hd" + i, writer);
            writeblock(id, "_hd" + i, writer);
        }
        for (int i = 1; i <= size; i++) {
            if (i == 1) {
                if (init <= 0) writeMarking(id, "_tl" + i, writer);
                else writeMarking2(id, "_tl" + i, writer);
            } else writeMarking(id, "_tl" + i, writer);
            writeblock(id, "_tl" + i, writer);
        }
        for (int i = 1; i <= size; i++) {
            writebidir(id, "i_trdy1", "_q" + i + "plus", writer);
            writebidir(id, "o_irdy1", "_q" + i + "minus", writer);
        }
        for (int i = 1; i <= size; i++) {
            writebidir(id, "_q" + i + "0", "o_irdyminus", writer);
            writebidir(id, "_q" + i + "1", "i_trdyminus", writer);
        }
        writebidir(id, "_q1" + "0", "i_trdyplus", writer);
        for (int i = 2; i <= size; i++) {
            writebidir(id, "_q" + i + "0", "i_trdyplus" + (i - 1), writer);
        }
        writebidir(id, "_q1" + "1", "o_irdyplus", writer);
        for (int i = 2; i <= size; i++) {
            writebidir(id, "_q" + i + "1", "o_irdyplus" + (i - 1), writer);
        }
        for (int i = 1; i <= size; i++) {
            writebidir(id, "_q" + i + "0", "_hd" + i + "plus", writer);
            writebidir(id, "_q" + i + "1", "_hd" + i + "minus", writer);
            if (i == size) inc = 1;
            else inc = i + 1;
            writebidir(id, "_q" + i + "1", "_hd" + inc + "plus", writer);
        }
        for (int i = 1; i <= size; i++) {
            writebidir(id, "_q" + i + "0", "_tl" + i + "minus", writer);
            writebidir(id, "_q" + i + "1", "_tl" + i + "plus", writer);
            if (i == size) inc = 1;
            else inc = i + 1;
            writebidir(id, "_q" + i + "0", "_tl" + inc + "plus", writer);
        }
        for (int i = 1; i <= size; i++) {
            writebidir(id, "_hd" + i + "1", "_q" + i + "plus", writer);
        }
        for (int i = 1; i <= size; i++) {
            writebidir(id, "_tl" + i + "1", "_q" + i + "minus", writer);
        }
        String id2 = searchList(id);
        String id3 = searchList2(id);
        for (int i = 1; i <= size; i++) {
            if ("a".equals(id3)) {
                writelink(id, id2, "a_irdy1", "_q" + i + "plus", writer);
            } else if ("b".equals(id3)) {
                writelink(id, id2, "b_irdy1", "_q" + i + "plus", writer);
            } else {
                writelink(id, id2, "o_irdy1", "_q" + i + "plus", writer);
            }
        }
        for (int i = 1; i <= size; i++) {
            writelinkp(id, id1, "_trdy1", "_q" + i + "minus", idp, writer);
        }
        if (dl == 1) {
            for (int i = 1; i <= size; i++) {
                if (!id2.contains("Src") && !id2.contains("Qu") && !id2.contains("Sync")) writelink(id, id2, "_dl1", "_q" + i + "plus", writer);
            }
        }
    }

    public static void initParse(String args) throws IOException {
        JsonFactory f = new MappingJsonFactory();
        JsonParser jp = f.createJsonParser(new File(args));

        JsonToken current;

        current = jp.nextToken();
        if (current != JsonToken.START_OBJECT) {
            LogUtils.logError("Root should be object: quiting.");
            return;
        }

        while (jp.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = jp.getCurrentName();
            // move from field name to field value
            current = jp.nextToken();

            if ("NETWORK".equals(fieldName)) {
                if (current == JsonToken.START_ARRAY) {
                    // For each of the records in the array
                    System.out.println("Generate CPNs");
                    while (jp.nextToken() != JsonToken.END_ARRAY) {
                        JsonNode node = jp.readValueAsTree();
                        String idName = node.get("id").toString();
                        String idName1 = "";
                        String idName2 = "";
                        String idNamep = "";
                        String idNamep1 = "";
                        String idNamep2 = "";
                        String typeName = node.get("type").toString();
                        //System.out.println("id: " + idName + "type: " + typeName);
                        lst2.add(new Ids(idName, typeName));
                        JsonNode y = node.get("outs");
                        if (y != null) {
                            for (int i = 0; y.has(i); i++) {
                                if (y.get(i).has("id")) {
                                    if (i == 0) {
                                        idName1 = y.get(i).get("id").toString();
                                        idNamep1 = y.get(i).get("in_port").toString();
                                        if ("xfork".equals(typeName)) {
                                            lst.add(new Info(idName1, idName, "b", idNamep1));
                                        } else if ("xswitch".equals(typeName)) {
                                            lst.add(new Info(idName1, idName, "a", idNamep1));
                                        } else {
                                            lst.add(new Info(idName1, idName, "", idNamep1));
                                        }
                                        if (idName1.contains("Sync")) {
                                            //System.out.println("id: " + idName + "sync: " + idName1);
                                            slsti.add(new Info(idName, idName1, "", idNamep1));   //swapped order slsti slsto
                                        }
                                        //add o based on order of i or reverse?
                                        if (idName.contains("Sync")) {
                                            slsto2.add(new Info(idName1, idName, "", idNamep1));
                                        }
                                    } else if (i == 1) {
                                        idName2 = y.get(i).get("id").toString();
                                        idNamep2 = y.get(i).get("in_port").toString();
                                        if ("xfork".equals(typeName)) {
                                            lst.add(new Info(idName2, idName, "a", idNamep2));
                                        } else if ("xswitch".equals(typeName)) {
                                            lst.add(new Info(idName2, idName, "b", idNamep2));
                                        } else {
                                            lst.add(new Info(idName2, idName, "", idNamep2));
                                        }
                                        if (idName2.contains("Sync")) slsti.add(new Info(idName, idName2, "", idNamep2));
                                        if (idName.contains("Sync")) {
                                            slsto2.add(new Info(idName2, idName, "", idNamep2));
                                        }
                                    } else {
                                        idName1 = y.get(i).get("id").toString();
                                        idNamep = y.get(i).get("in_port").toString();
                                        if (idName.contains("Sync")) {
                                            slsto2.add(new Info(idName, idName1, "", idNamep));
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else {
                    LogUtils.logError("Records should be an array: skipping.");
                    jp.skipChildren();
                }
            } else {
                //System.out.println("Unprocessed property: " + fieldName);
                jp.skipChildren();
            }
        }
    }

    //public Collection<VisualSourceComponent> srcNodes;
    public Collection<SourceComponent> srcNodes;
    public Collection<FunctionComponent> funNodes;
    public Collection<SwitchComponent> swNodes;
    public Collection<SinkComponent> snkNodes;

    @SuppressWarnings("PMD.EmptyControlStatement")
    @Override
    public void run(WorkspaceEntry we) {
        System.out.println();
        final Xmas cnet = WorkspaceUtils.getAs(we, Xmas.class);
        srcNodes = cnet.getSourceComponents();
        //funNodes = Hierarchy.getDescendantsOfType(vnet.getRoot(), VisualFunctionComponent.class);
        funNodes = cnet.getFunctionComponents();
        swNodes = cnet.getSwitchComponents();
        snkNodes = cnet.getSinkComponents();

        JsonFactory f = new MappingJsonFactory();
        File cpnFile = XmasSettings.getTempVxmCpnFile();
        PrintWriter writer = null;
        try {

            initlist();
            File syncFile = XmasSettings.getTempVxmSyncFile();
            processFile(syncFile.getAbsolutePath());

            File jsonFile = XmasSettings.getTempVxmJsonFile();
            initParse(jsonFile.getAbsolutePath());
            //createSlsto();

            writer = new PrintWriter(cpnFile);
            JsonParser jp = f.createJsonParser(jsonFile);
            JsonToken current;

            current = jp.nextToken();
            if (current != JsonToken.START_OBJECT) {
                LogUtils.logError("Root should be object: quiting.");
                return;
            }

            while (jp.nextToken() != JsonToken.END_OBJECT) {
                String fieldName = jp.getCurrentName();
                // move from field name to field value
                current = jp.nextToken();
                if ("VARS".equals(fieldName)) {
                    if (current == JsonToken.START_ARRAY) {
                        while (jp.nextToken() != JsonToken.END_ARRAY) {
                        }
                    }
                } else if ("PACKET_TYPE".equals(fieldName)) {
                    if (current == JsonToken.START_OBJECT) {
                        while (jp.nextToken() != JsonToken.END_OBJECT) {
                        }
                    }
                } else if ("COMPOSITE_OBJECTS".equals(fieldName)) {
                    if (current == JsonToken.START_ARRAY) {
                        while (jp.nextToken() != JsonToken.END_ARRAY) {
                        }
                    }
                } else if ("NETWORK".equals(fieldName)) {
                    if (current == JsonToken.START_ARRAY) {
                        // For each of the records in the array
                        while (jp.nextToken() != JsonToken.END_ARRAY) {
                            // read the record into a tree model,
                            JsonNode node = jp.readValueAsTree();
                            String idName = node.get("id").toString();
                            String idName1 = "";
                            String idName2 = "";
                            String idNamep1 = "";
                            String idNamep2 = "";
                            String fieldsize = "";
                            String fieldgpf = "";
                            int fieldinit = 0;
                            int fieldgr = 0;
                            String typeName = node.get("type").toString();

                            JsonNode y = node.get("outs");
                            if (y != null) {
                                for (int i = 0; y.has(i); i++) {
                                    if (y.get(i).has("id")) {
                                        if (i == 0) {
                                            idName1 = y.get(i).get("id").toString();
                                            /*if ("xfork".equals(typeName)) lst.add(new Info(idName1, idName, "b"));
                                              else if ("xswitch".equals(typeName)) lst.add(new Info(idName1, idName, "a"));
                                              else lst.add(new Info(idName1, idName, "")); */
                                        } else if (i == 1) {
                                            idName2 = y.get(i).get("id").toString();
                                            /*if ("xfork".equals(typeName)) lst.add(new Info(idName2, idName, "a"));
                                              else if ("xswitch".equals(typeName)) lst.add(new Info(idName2, idName, "b"));
                                              else lst.add(new Info(idName2, idName, "")); */
                                        }
                                    }
                                    if (y.get(i).has("in_port")) {
                                        if (i == 0) {
                                            String searchtyp = "";
                                            searchtyp = searchList3(idName1);
                                            if ("join".equals(searchtyp)) {
                                                //idNamep1 = y.get(i).get("in_port").toString();
                                                if ("0".equals(y.get(i).get("in_port").toString())) idNamep1 = "1";
                                                else idNamep1 = "0";
                                            } else if ("merge".equals(searchtyp)) {
                                                idNamep1 = y.get(i).get("in_port").toString();
                                            }
                                        } else if (i == 1) {
                                            String searchtyp1 = "";
                                            searchtyp1 = searchList3(idName2);
                                            if ("join".equals(searchtyp1)) {
                                                //idNamep2 = y.get(i).get("in_port").toString();
                                                if ("0".equals(y.get(i).get("in_port").toString())) idNamep2 = "1";
                                                else idNamep2 = "0";
                                            } else if ("merge".equals(searchtyp1)) {
                                                idNamep2 = y.get(i).get("in_port").toString();
                                            }
                                        }
                                    }
                                }
                            }
                            JsonNode y2 = node.get("fields");
                            if (y2 != null) {
                                for (int i = 0; y2.has(i); i++) {
                                    if (y2.get(i).has("size")) {
                                        fieldsize = y2.get(i).get("size").toString();
                                    }
                                    if (y2.get(i).has("init")) {
                                        fieldinit = y2.get(i).get("init").asInt();
                                    }
                                    if (y2.get(i).has("gr")) {
                                        fieldgr = y2.get(i).get("gr").asInt();
                                    }
                                    if (y2.get(i).has("gpf")) {
                                        fieldgpf = y2.get(i).get("gpf").toString();
                                    }
                                    if (y2.get(i).has("gpf1")) {
                                        fieldgpf = y2.get(i).get("gpf1").toString();
                                    }
                                }
                            }

                            if ("source".equals(typeName)) genSource(idName, idName1, idNamep1, fieldgr, writer);
                            if ("function".equals(typeName)) genFunction(idName, idName1, idNamep1, fieldgr, writer);
                            if ("xfork".equals(typeName)) genFork(idName, idName1, idName2, idNamep1, idNamep2, fieldgr, writer);
                            if ("join".equals(typeName)) genJoin(idName, idName1, idNamep1, fieldgr, writer);
                            if ("xswitch".equals(typeName)) genSwitch(idName, idName1, idName2, idNamep1, idNamep2, fieldgr, writer);
                            if ("merge".equals(typeName)) genMerge(idName, idName1, idNamep1, fieldgr, writer);
                            if ("queue".equals(typeName)) {
                                int size = Integer.parseInt(fieldsize);
                                //if ("1".equals(fieldsize)) genqueue(idName, idName1, idNamep1, fieldinit, writer);
                                //else genqueue2p(2, idName, idName1, idNamep1, writer);
                                if (size <= 1) {
                                    genQueue(idName, idName1, idNamep1, fieldinit, fieldgpf, fieldgr, writer);
                                } else {
                                    genQueue2p(size, idName, idName1, idNamep1, fieldinit, fieldgpf, fieldgr, writer);
                                }
                            }
                            if ("sink".equals(typeName)) genSink(idName, fieldgr, writer);
                        }
                    } else {
                        LogUtils.logError("Records should be an array: skipping.");
                        jp.skipChildren();
                    }
                } else {
                    LogUtils.logWarning("Unprocessed property: " + fieldName);
                    jp.skipChildren();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                writer.close();
                System.out.println("Control CPNs created");
                new PNetExt(srcNodes, funNodes, swNodes);
            }
        }
        System.out.println();
    }

}