package org.scribble.visit.wf; import org.scribble.ast.ProtocolDecl; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.local.LInteractionSeqDel; import org.scribble.main.Job; import org.scribble.main.ScribbleException; import org.scribble.visit.UnfoldingVisitor; import org.scribble.visit.wf.env.ReachabilityEnv; public class ReachabilityChecker extends UnfoldingVisitor<ReachabilityEnv> { public ReachabilityChecker(Job job) { super(job); } @Override protected ReachabilityEnv makeRootProtocolDeclEnv(ProtocolDecl<?> pd) { ReachabilityEnv env = new ReachabilityEnv(); return env; } // Following Projector visit pattern -- for overriding base enter/visit/leave pattern @Override protected ScribNode visitForUnfolding(ScribNode parent, ScribNode child) throws ScribbleException { if (child instanceof LInteractionSeq) { return visitOverrideForLInteractionSequence((LProtocolBlock) parent, (LInteractionSeq) child); } else { return super.visitForUnfolding(parent, child); } } protected LInteractionSeq visitOverrideForLInteractionSequence(LProtocolBlock parent, LInteractionSeq child) throws ScribbleException { return ((LInteractionSeqDel) child.del()).visitForReachabilityChecking(this, (LInteractionSeq) child); } @Override protected void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException { super.unfoldingEnter(parent, child); child.del().enterReachabilityCheck(parent, child, this); } @Override protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException { visited = visited.del().leaveReachabilityCheck(parent, child, this, visited); return super.unfoldingLeave(parent, child, visited); } }