/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package CSP_CREATOR;
import LOGIC.Channel;
import LOGIC.Contract;
import LOGIC.Instance;
import LOGIC.ObjectList;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author sarah
*/
public class CreatorInstance {
private Instance instance;
private Contract contract;
private String IOprocessInstantiation = "";
private String include = "";
private String behavior = "";
private String declarate = "";
private ObjectList obl;
private CreatorTypesAndChannels typechannel;
private CreatorIOProcess iop;
public CreatorInstance(Instance i, ObjectList ob) {
instance = i;
contract = instance.getContrato();
obl = ob;
typechannel = new CreatorTypesAndChannels(ob);
typechannel.creatorTypesChannels();
iop = new CreatorIOProcess(i);
iop.creatorIOProcess();
}
public void CSPCreatorInstance() {
declarate = declarate + typechannel.getTypeChannel();
for (int i = 0; i < obl.getContractList().size(); i++) {
behavior = behavior + "\n" + obl.getContractList().get(i).getBehavior();
}
for (int i = 0; i < instance.getChannel().size(); i++) {
//chama o método que cria o csp dos canais que estão associados ao contrato recebido
channelInstanciation(instance.getChannel().get(i));
}
functionrename();
functionGetChannelI();
functioninputI();
functionoutputI();
IOprocessInstantiation = IOprocessInstantiation + iop.getIoprocess();
include = "include \"sequence_aux.csp\" \ninclude \"function_aux.csp\" \n"
+ "include \"auxiliar.csp\" \ninclude \"rules.csp\"";
FileWriter ioprocess = null;
try {
ioprocess = new FileWriter(new File("cspFiles/"+instance.getName()+".csp"));
PrintWriter p = new PrintWriter(ioprocess);
p.flush();
p.write(include + "\n\n" + declarate + "\n\n" + behavior + "\n\n" + IOprocessInstantiation);
ioprocess.close();
p.close();
} catch (IOException ex) {
Logger.getLogger(instance.getName()).log(Level.SEVERE, null, ex);
}
}
public void functionrename() {
//rename
IOprocessInstantiation = IOprocessInstantiation + "\n\nRenameContract(i) = " + contract.getName() + " [[";
for (int i = 0; i < contract.getChannel().size(); i++) {
if (i == contract.getChannel().size() - 1) {
IOprocessInstantiation = IOprocessInstantiation + contract.getChannel().get(i).getName() + " <- " + instance.getChannel().get(i).getName();
} else {
IOprocessInstantiation = IOprocessInstantiation + contract.getChannel().get(i).getName() + " <- " + instance.getChannel().get(i).getName() + ",";
}
}
IOprocessInstantiation = IOprocessInstantiation + "]] \n";
IOprocessInstantiation = IOprocessInstantiation + "Inst_" + instance.getName() + " = <";
for (int i = 0; i < contract.getChannel().size(); i++) {
if (i == contract.getChannel().size() - 1) {
IOprocessInstantiation = IOprocessInstantiation + "(" + contract.getChannel().get(i).getName() + "," + instance.getChannel().get(i).getName() + ")";
} else {
IOprocessInstantiation = IOprocessInstantiation + "(" + contract.getChannel().get(i).getName() + "," + instance.getChannel().get(i).getName() + "),";
}
}
IOprocessInstantiation = IOprocessInstantiation + "> \n";
IOprocessInstantiation = IOprocessInstantiation + instance.getName() + " = rename(" + contract.getName() + ", Inst_" + instance.getName() + ") \n\n";
}
public void functionGetChannelI() {
//channels
IOprocessInstantiation = IOprocessInstantiation + "\nGET_CHANNELS(P) =";
IOprocessInstantiation = IOprocessInstantiation + "\n \t let f =";
IOprocessInstantiation = IOprocessInstantiation + "\n \t < \n \t (" + instance.getName() + ", { ";
IOprocessInstantiation = IOprocessInstantiation + "\n";
for (int i = 0; i < instance.getChannel().size(); i++) {
if (i == instance.getChannel().size() - 1) {
IOprocessInstantiation = IOprocessInstantiation + instance.getChannel().get(i).getName();
} else {
IOprocessInstantiation = IOprocessInstantiation + instance.getChannel().get(i).getName() + ",";
}
}
IOprocessInstantiation = IOprocessInstantiation + " }) \n \t > \n";
IOprocessInstantiation = IOprocessInstantiation + "\n \t within apply(f,P )";
}
public void functioninputI() {
//função inputs
IOprocessInstantiation = IOprocessInstantiation + "\n";
// verificação para o contrato
IOprocessInstantiation = IOprocessInstantiation + "\ninputs(P) = ";
IOprocessInstantiation = IOprocessInstantiation + "\n \t let f = \n";
IOprocessInstantiation = IOprocessInstantiation + "\n \t < \n ( " + instance.getName() + ", {| ";
// coloca todos os canais de in associado com seus tipos. ex: {|c.1, c.2|}
for (int i = 0; i < instance.getIn().size(); i++) {
if (i == instance.getIn().size() - 1) {
IOprocessInstantiation = IOprocessInstantiation + instance.getIn().get(i).getEvento();
} else {
IOprocessInstantiation = IOprocessInstantiation + instance.getIn().get(i).getEvento() + ", ";
}
}
IOprocessInstantiation = IOprocessInstantiation + " |}) \n \t > \n";
IOprocessInstantiation = IOprocessInstantiation + "\n \t within apply(f, P )";
IOprocessInstantiation = IOprocessInstantiation + "\n";
}
public void functionoutputI() {
//função outputs
IOprocessInstantiation = IOprocessInstantiation + "\noutputs(P) = ";
IOprocessInstantiation = IOprocessInstantiation + "\n \t let f =";
IOprocessInstantiation = IOprocessInstantiation + "\n \t < \n ( " + instance.getName() + ", {| ";
// coloca todos os canais de out associado com seus tipos. ex: {|c.1, c.2|}
for (int i = 0; i < instance.getOut().size(); i++) {
if (i == instance.getOut().size() - 1) {
IOprocessInstantiation = IOprocessInstantiation + instance.getOut().get(i).getEvento();
} else {
IOprocessInstantiation = IOprocessInstantiation + instance.getOut().get(i).getEvento() + ", ";
}
}
IOprocessInstantiation = IOprocessInstantiation + " |}) \n \t >";
IOprocessInstantiation = IOprocessInstantiation + "\n \t within apply(f,P)\n";
}
public void channelInstanciation(Channel Canal) {
declarate = declarate + "\nchannel " + Canal.getName() + " : ";
for (int i = 0; i < Canal.getType().size(); i++) {
if (i == Canal.getType().size() - 1) {
declarate = declarate + Canal.getType().get(i).getNome();
} else {
declarate = declarate + Canal.getType().get(i).getNome() + ".";
}
}
}
}