package jcircus.newutil;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.czt.circus.ast.ActionPara;
import net.sourceforge.czt.circus.ast.BasicProcess;
import net.sourceforge.czt.circus.ast.CallProcess;
import net.sourceforge.czt.circus.ast.CircusAction;
import net.sourceforge.czt.circus.ast.CircusProcess;
import net.sourceforge.czt.circus.ast.CircusStateAnn;
import net.sourceforge.czt.circus.ast.ExtChoiceAction;
import net.sourceforge.czt.circus.ast.ExtChoiceProcess;
import net.sourceforge.czt.circus.ast.IntChoiceAction;
import net.sourceforge.czt.circus.ast.IntChoiceProcess;
import net.sourceforge.czt.circus.ast.InterleaveAction;
import net.sourceforge.czt.circus.ast.InterleaveProcess;
import net.sourceforge.czt.circus.ast.OnTheFlyDefAnn;
import net.sourceforge.czt.circus.ast.ParallelAction;
import net.sourceforge.czt.circus.ast.ParallelProcess;
import net.sourceforge.czt.circus.ast.ParamProcess;
import net.sourceforge.czt.circus.ast.Process1;
import net.sourceforge.czt.circus.ast.Process2;
import net.sourceforge.czt.circus.ast.SeqAction;
import net.sourceforge.czt.circus.ast.SeqProcess;
import net.sourceforge.czt.circus.util.Factory;
import net.sourceforge.czt.z.ast.Decl;
import net.sourceforge.czt.z.ast.Para;
import net.sourceforge.czt.z.ast.Spec;
import net.sourceforge.czt.z.ast.VarDecl;
import net.sourceforge.czt.z.ast.ZDeclList;
import net.sourceforge.czt.z.ast.ZExprList;
import net.sourceforge.czt.z.ast.ZNameList;
import net.sourceforge.czt.z.ast.ZParaList;
public class ActionUtil {
static FactoryUtil pf = new FactoryUtil ();
public static boolean isMainActionPara (ActionPara para) {
return para.getZName().toString().contains("$$mainAction");
}
public static void setOrAddValidMainActionPara (CircusAction action, BasicProcess process) {
ZParaList paras = process.getZParaList();
ActionPara actionPara = ProcessUtil.f.createActionPara();
actionPara.setName(ProcessUtil.f.createZName("Not initialized"));
boolean changed = false;
for (int i = 0; i < paras.size(); i++) {
Para para = paras.get(i);
if (para instanceof ActionPara) {
ActionPara actionPara2 = (ActionPara)para;
if (actionPara2.getName().toString().contains("$$mainAction") && !actionPara2.getName().toString().contains("Previous")) {
ActionPara actPara = (ActionPara)paras.get(i);
actPara.setCircusAction(action);
OnTheFlyDefAnn otfda = ProcessUtil.f.createOnTheFlyDefAnn();
actPara.getAnns().add (otfda);
paras.set(i, actPara);
changed = true;
}
}
}
if (!changed) {
ActionPara mainPara = ProcessUtil.f.createActionPara();
mainPara.setName(ProcessUtil.f.createZName("$$mainAction"));
mainPara.setCircusAction(action);
OnTheFlyDefAnn otfda = ProcessUtil.f.createOnTheFlyDefAnn();
mainPara.getAnns().add(otfda);
process.getZParaList().add(mainPara);
System.out.print("");
}
}
public static CircusAction resultingMainAction2 (CircusProcess process, Spec spec) {
Factory f = new Factory ();
if (process instanceof BasicProcess) {
CircusAction action = ((BasicProcess)process).getMainAction();
return action;
}
else if (process instanceof ParamProcess) {
CircusAction action = ((ParamProcess)process).getCircusBasicProcess().getMainAction();
return action;
}
else if (process instanceof ExtChoiceProcess) {
ExtChoiceProcess ecp = (ExtChoiceProcess)process;
ExtChoiceAction eca = f.createExtChoiceAction();
eca.setLeftAction (resultingMainAction2 (ecp.getLeftProcess(), spec));
eca.setRightAction (resultingMainAction2 (ecp.getRightProcess(), spec));
return eca;
}
else if (process instanceof IntChoiceProcess) {
IntChoiceProcess ecp = (IntChoiceProcess)process;
IntChoiceAction eca = f.createIntChoiceAction();
eca.setLeftAction (resultingMainAction2 (ecp.getLeftProcess(), spec));
eca.setRightAction (resultingMainAction2 (ecp.getRightProcess(), spec));
return eca;
}
else if (process instanceof ParallelProcess) {
ParallelProcess pp = (ParallelProcess)process;
ParallelAction pa = f.createParallelAction();
pa.setLeftAction (resultingMainAction2 (pp.getLeftProcess(), spec));
pa.setRightAction (resultingMainAction2 (pp.getRightProcess(), spec));
pa.setChannelSet(pp.getChannelSet());
pa.setLeftNameSet(f.createCircusNameSet());
pa.setRightNameSet(f.createCircusNameSet());
return pa;
}
else if (process instanceof InterleaveProcess) {
InterleaveProcess pp = (InterleaveProcess)process;
InterleaveAction pa = f.createInterleaveAction();
pa.setLeftAction (resultingMainAction2 (pp.getLeftProcess(), spec));
pa.setRightAction (resultingMainAction2 (pp.getRightProcess(), spec));
pa.setLeftNameSet(f.createCircusNameSet());
pa.setRightNameSet(f.createCircusNameSet());
return pa;
}
else if (process instanceof CallProcess) {
ZExprList paramExprs = (ZExprList) ((CallProcess)process).getActuals();
CircusProcess content = ProcessUtil.getContentOfCallProcess ((CallProcess)process, spec);
CircusAction resultingMainAction = pf.createCircusAction(resultingMainAction2 (content, spec));
CircusAction resultingMainActionAux = pf.createExpandedCircusAction (resultingMainAction, process, spec);
List <VarDecl> vardecls = new ArrayList <VarDecl> ();
if (content instanceof ParamProcess) {
ZDeclList decls = f.createZDeclList (((ParamProcess)content).getZDeclList());
for (int i = 0; i < decls.size(); i++) {
Decl decl = decls.get(i);
if (decl instanceof VarDecl) {
vardecls.add((VarDecl)decl);
}
}
System.out.println(PrinterUtil.printAction (resultingMainAction, spec));
resultingMainActionAux = pf.createCircusAction (
ExprUtil.updateExpression (vardecls, paramExprs, resultingMainAction, process, spec)
)
;
System.out.println(PrinterUtil.printAction (resultingMainActionAux, spec));
System.out.print ("");
}
return resultingMainActionAux;
}
else {
return f.createSkipAction();
}
}
public static CircusAction resultingMainAction (CircusProcess process, Spec spec, String paraName) {
Factory f = new Factory ();
if (process instanceof BasicProcess) {
CircusAction action = ((BasicProcess)process).getMainAction();
return action;
}
else if (process instanceof ParamProcess) {
BasicProcess proc2 = ((ParamProcess)process).getCircusBasicProcess();
ZDeclList paramDecls = ((ParamProcess)process).getZDeclList();
CircusAction action = proc2.getMainAction();
return action;
}
else if (process instanceof ExtChoiceProcess) {
ExtChoiceProcess ecp = (ExtChoiceProcess)process;
ExtChoiceAction eca = f.createExtChoiceAction();
eca.setLeftAction (resultingMainAction (ecp.getLeftProcess(), spec, paraName));
eca.setRightAction (resultingMainAction (ecp.getRightProcess(), spec, paraName));
return eca;
}
else if (process instanceof IntChoiceProcess) {
IntChoiceProcess ecp = (IntChoiceProcess)process;
IntChoiceAction eca = f.createIntChoiceAction();
eca.setLeftAction (resultingMainAction (ecp.getLeftProcess(), spec, paraName));
eca.setRightAction (resultingMainAction (ecp.getRightProcess(), spec, paraName));
return eca;
}
else if (process instanceof SeqProcess) {
SeqProcess ecp = (SeqProcess)process;
SeqAction eca = f.createSeqAction();
eca.setLeftAction (resultingMainAction (ecp.getLeftProcess(), spec, paraName));
eca.setRightAction (resultingMainAction (ecp.getRightProcess(), spec, paraName));
return eca;
}
else if (process instanceof ParallelProcess) {
ParallelProcess pp = (ParallelProcess)process;
ParallelAction pa = f.createParallelAction();
pa.setLeftAction (resultingMainAction (pp.getLeftProcess(), spec, paraName));
pa.setRightAction (resultingMainAction (pp.getRightProcess(), spec, paraName));
pa.setChannelSet(pp.getChannelSet());
pa.setLeftNameSet(f.createCircusNameSet());
pa.setRightNameSet(f.createCircusNameSet());
return pa;
}
else if (process instanceof InterleaveProcess) {
InterleaveProcess pp = (InterleaveProcess)process;
InterleaveAction pa = f.createInterleaveAction();
pa.setLeftAction (resultingMainAction (pp.getLeftProcess(), spec, paraName));
pa.setRightAction (resultingMainAction (pp.getRightProcess(), spec, paraName));
pa.setLeftNameSet(f.createCircusNameSet());
pa.setRightNameSet(f.createCircusNameSet());
return pa;
}
else if (process instanceof CallProcess) {
ZExprList paramExprs = (ZExprList) ((CallProcess)process).getActuals();
CircusProcess content = ProcessUtil.getContentOfCallProcess ((CallProcess)process, spec);
CircusAction resultingMainAction =
ActionUtil.pf.createCircusAction(resultingMainAction (content, spec, paraName));
CircusAction resultingMainActionAux =
ActionUtil.pf.createCircusAction (resultingMainAction);
List <VarDecl> vardecls = new ArrayList <VarDecl> ();
if (paramExprs.size() > 0/*content instanceof ParamProcess*/) {
ZDeclList decls;
if (content instanceof ParamProcess)
decls = f.createZDeclList (((ParamProcess)content).getZDeclList());
else {
decls = f.createZDeclList ();
}
for (int i = 0; i < decls.size(); i++) {
Decl decl = decls.get(i);
if (decl instanceof VarDecl) {
vardecls.add((VarDecl)decl);
}
}
System.out.println (PrinterUtil.printAction(resultingMainAction, spec));
resultingMainActionAux =
ActionUtil.pf.createCircusAction
(ExprUtil.actionWithUpdatedExpression (vardecls, paramExprs, resultingMainAction, process, spec));
System.out.println (PrinterUtil.printAction(resultingMainActionAux, spec));
System.out.print ("");
}
return resultingMainActionAux;
}
else {
return f.createSkipAction();
}
}
public static ZParaList actionParagraphs (CircusProcess process, Spec spec) { //TODO NÃO TESTADO!!!!! //Retorna os parágrafos do processo, exceto o do estado
Factory f = new Factory ();
if (process instanceof BasicProcess) {
ZParaList finallist = f.createZParaList();
ZParaList paras = ((BasicProcess)process).getZParaList();
int size = paras.size();
for (int i = 0; i < size; i++) {
Para para = paras.get(i);
if (para.getAnn(CircusStateAnn.class) == null && para instanceof ActionPara) {
if (((ActionPara)para).getName().toString().contains("Previous"))
finallist.add(para);
}
}
return finallist;
}
else if (process instanceof ParamProcess) {
return actionParagraphs (((ParamProcess)process).getCircusBasicProcess(), spec);
}
else if (process instanceof CallProcess) {
CallProcess call = (CallProcess)process;
CircusProcess cp = ProcessUtil.getContentOfCallProcess (call, spec);
return actionParagraphs (ProcessUtil.getContentOfCallProcess (call, spec), spec);
}
else if (process instanceof Process1) {
//else {
return actionParagraphs (((Process1)process).getCircusProcess(), spec);
//}
}
else if (process instanceof Process2) {
Process2 process2 = (Process2) process;
ZParaList finallist = actionParagraphs (process2.getLeftProcess(), spec);
finallist.addAll(actionParagraphs (process2.getRightProcess(), spec));
return finallist;
}
else {
return f.createZParaList();
}
}
}