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 vardecls = new ArrayList (); 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 vardecls = new ArrayList (); 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(); } } }