public ActionResult Submit(string json)
        {
            StringBuilder spec = new StringBuilder();

            //String json = new StreamReader(this.Request.InputStream).ReadToEnd();

            if (json.Contains("ClientServer"))
            {
                ClientServerJSONTranslator CnsJSONTranslator = new ClientServerJSONTranslator();
                ClientServerSpecCreator    CnsSpecCreator    = new ClientServerSpecCreator();

                ClientServerSystemModel system = CnsJSONTranslator.CreateModel(json);
                spec = CnsSpecCreator.CreateSpec(system);
            }
            else if (json.Contains("PipeAndFilter"))
            {
                PipeFilterJSONTranslator PnfJSONTranslator = new PipeFilterJSONTranslator();
                PipeFilterSpecCreator    PnfSpecCreator    = new PipeFilterSpecCreator();

                PipeFilterSystemModel system = PnfJSONTranslator.CreateModel(json);
                spec = PnfSpecCreator.CreateSpec(system);
            }

            saveFileClientSide(spec);

            return(new EmptyResult());
        }
        public StringBuilder CreateSpec(ClientServerSystemModel system)
        {
            StringBuilder cs_spec = new StringBuilder();

            // Header: User can rename it later.
            cs_spec.Append("module CnsExample\n\n");

            // Includes: User must have the Cns_simplified spec in a library folder where this spec is saved.
            cs_spec.Append("open library/Cns_simplified as Cns\n\n");

            // System Name:
            cs_spec.Append("one sig ");
            cs_spec.Append(system.Name);
            cs_spec.Append(" extends System{}\n\n");

            // For each Server:
            foreach (CnsServer s in system.Servers)
            {
                cs_spec.Append("one sig ");
                cs_spec.Append(s.Name);
                cs_spec.Append(" extends Server{}{\n");

                int count_ports = 0;
                foreach (CnsClientAccess ca in s.ClientAccesses)
                {
                    if (count_ports == 0)
                    {
                        cs_spec.Append("\tports = ");
                        cs_spec.Append(ca.Name);
                        count_ports = 1;
                    }
                    else
                    {
                        cs_spec.Append(" + ");
                        cs_spec.Append(ca.Name);
                    }
                }
                cs_spec.Append("\n}\n\n");
            }

            // For each CnsConnector:
            foreach (CnsConnector c in system.Connectors)
            {
                cs_spec.Append("one sig ");
                cs_spec.Append(c.Name);
                cs_spec.Append(" extends CnsConnector{}{\n");

                int count_roles = 0;
                foreach (CnsRequester r in c.Requesters)
                {
                    if (count_roles == 0)
                    {
                        cs_spec.Append("\troles = ");
                        cs_spec.Append(r.Name);
                        count_roles = 1;
                    }
                    else
                    {
                        cs_spec.Append(" + ");
                        cs_spec.Append(r.Name);
                    }
                }
                foreach (CnsProvider p in c.Providers)
                {
                    if (count_roles == 0)
                    {
                        cs_spec.Append("\troles = ");
                        cs_spec.Append(p.Name);
                        count_roles = 1;
                    }
                    else
                    {
                        cs_spec.Append(" + ");
                        cs_spec.Append(p.Name);
                    }
                }
                cs_spec.Append("\n}\n\n");
            }

            // For each Client:
            foreach (CnsClient c in system.Clients)
            {
                cs_spec.Append("one sig ");
                cs_spec.Append(c.Name);
                cs_spec.Append(" extends Client{}{\n");

                int count_ports = 0;
                foreach (CnsServerRequest sr in c.ServerRequests)
                {
                    if (count_ports == 0)
                    {
                        cs_spec.Append("\tports = ");
                        cs_spec.Append(sr.Name);
                        count_ports = 1;
                    }
                    else
                    {
                        cs_spec.Append(" + ");
                        cs_spec.Append(sr.Name);
                    }
                }
                cs_spec.Append("\n}\n\n");
            }

            // For each ClientAccess:
            foreach (CnsServer s in system.Servers)
            {
                foreach (CnsClientAccess ca in s.ClientAccesses)
                {
                    cs_spec.Append("one sig ");
                    cs_spec.Append(ca.Name);
                    cs_spec.Append(" extends ClientAccess{}\n\n");
                }
            }

            // For each Provider + Requester:
            foreach (CnsConnector c in system.Connectors)
            {
                // Providers:
                foreach (CnsProvider p in c.Providers)
                {
                    cs_spec.Append("one sig ");
                    cs_spec.Append(p.Name);
                    cs_spec.Append(" extends Provider{}\n\n");
                }

                // Requesters:
                foreach (CnsRequester r in c.Requesters)
                {
                    cs_spec.Append("one sig ");
                    cs_spec.Append(r.Name);
                    cs_spec.Append(" extends Requester{}\n\n");
                }
            }

            // For each ServerRequest:
            foreach (CnsClient c in system.Clients)
            {
                foreach (CnsServerRequest sr in c.ServerRequests)
                {
                    cs_spec.Append("one sig ");
                    cs_spec.Append(sr.Name);
                    cs_spec.Append(" extends ServerRequest{}\n\n");
                }
            }


            // Fact for attachments:
            if (system.Attachments.Count > 1)
            {
                cs_spec.Append("fact Correct_Attachments {\n");
                cs_spec.Append(system.Name);
                cs_spec.Append(".attachments =\n");

                int attachment_count = 0;
                foreach (KeyValuePair <CnsRole, CnsPort> a in system.Attachments)
                {
                    if (attachment_count == 0)
                    {
                        cs_spec.Append(a.Key.Name);
                        cs_spec.Append("->");
                        cs_spec.Append(a.Value.Name);
                        cs_spec.Append("\n");
                        attachment_count = 1;
                    }
                    else
                    {
                        cs_spec.Append("+ ");
                        cs_spec.Append(a.Key.Name);
                        cs_spec.Append("->");
                        cs_spec.Append(a.Value.Name);
                        cs_spec.Append("\n");
                    }
                }
                cs_spec.Append("}\n\n");
            }

            // Footer: pred show and run show
            cs_spec.Append("pred show {\n");
            cs_spec.Append("\tone System\n");
            cs_spec.Append("}\n\n");
            cs_spec.Append("run show\n\n");

            return(cs_spec);
        }
        public ClientServerSystemModel CreateModel(string json)
        {
            var details = JsonConvert.DeserializeObject <JsonDetails>(json);

            ClientServerSystemModel system = new ClientServerSystemModel();

            system.Name = "ClientServerSystemExample";

            // For each Connector
            foreach (Connector c in details.connectors)
            {
                CnsConnector newConnector = new CnsConnector();
                newConnector.Name = c.name;

                //Find Requesters and Providers
                foreach (Role r in details.roles)
                {
                    if (r.connector == c.id)
                    {
                        if (r.name.Contains("Requester"))
                        {
                            CnsRequester tempRequester = new CnsRequester();
                            tempRequester.Name = r.name;
                            newConnector.Requesters.Add(tempRequester);
                        }
                        else if (r.name.Contains("Provider"))
                        {
                            CnsProvider tempProvider = new CnsProvider();
                            tempProvider.Name = r.name;
                            newConnector.Providers.Add(tempProvider);
                        }
                        else
                        {
                            //THROW ERROR: role is not named correctly, big sad
                        }
                    }
                }
                if ((newConnector.Providers == null || newConnector.Providers.Count < 1) ||
                    (newConnector.Requesters == null || newConnector.Requesters.Count < 1))
                {
                    //THROW ERROR: no roles found for connector
                }
                else
                {
                    system.Connectors.Add(newConnector);
                }
            }

            // For each Component
            foreach (Component c in details.components)
            {
                if (c.name.Contains("Server"))
                {
                    CnsServer newServer = new CnsServer();
                    newServer.Name = c.name;

                    // Find ClientAccesses
                    foreach (Port p in details.ports)
                    {
                        if (p.component == c.id)
                        {
                            if (p.name.Contains("ClientAccess"))
                            {
                                CnsClientAccess tempClientAccess = new CnsClientAccess();
                                tempClientAccess.Name = p.name;
                                newServer.ClientAccesses.Add(tempClientAccess);
                            }
                            else
                            {
                                //THROW ERROR: port should contain "ClientAccess" for Servers.
                            }
                        }
                    }
                    if (newServer.ClientAccesses == null || newServer.ClientAccesses.Count < 1)
                    {
                        //THROW ERROR: no ClientAccess found for Server.
                    }
                    else
                    {
                        system.Servers.Add(newServer);
                    }
                }
                else if (c.name.Contains("Client"))
                {
                    CnsClient newClient = new CnsClient();
                    newClient.Name = c.name;

                    // Find ServerRequests
                    foreach (Port p in details.ports)
                    {
                        if (p.component == c.id)
                        {
                            if (p.name.Contains("ServerRequest"))
                            {
                                CnsServerRequest tempServerRequest = new CnsServerRequest();
                                tempServerRequest.Name = p.name;
                                newClient.ServerRequests.Add(tempServerRequest);
                            }
                            else
                            {
                                //THROW ERROR: port should contain "ServerRequest" for Clients
                            }
                        }
                    }
                    if (newClient.ServerRequests == null || newClient.ServerRequests.Count < 1)
                    {
                        //THROW ERROR: no ServerRequests found for Client.
                    }
                    else
                    {
                        system.Clients.Add(newClient);
                    }
                }
                else
                {
                    //THROW ERROR: components named incorrectly, should contain either "Client" or "Server".
                }
            }

            // For each attachment
            foreach (Interaction i in details.interactions)
            {
                CnsRole tempRole = new CnsRole();
                CnsPort tempPort = new CnsPort();

                // Find name of each role
                foreach (Role r in details.roles)
                {
                    if (i.role == r.id)
                    {
                        tempRole.Name = r.name;
                    }
                }
                // Find name of each port
                foreach (Port p in details.ports)
                {
                    if (i.port == p.id)
                    {
                        tempPort.Name = p.name;
                    }
                }

                // if both are not null add to attachments
                if (string.IsNullOrEmpty(tempPort.Name) || string.IsNullOrEmpty(tempRole.Name))
                {
                    //THROW ERROR: Broken, ids are wrong for interactions
                }
                else
                {
                    system.Attachments.Add(tempRole, tempPort);
                }
            }
            return(system);
        }