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); }