package org.scribble.del.local; import java.util.List; import org.scribble.ast.MessageSigNode; import org.scribble.ast.ScribNode; import org.scribble.ast.local.LMessageTransfer; import org.scribble.ast.local.LSend; import org.scribble.ast.name.simple.RoleNode; import org.scribble.main.ScribbleException; import org.scribble.model.endpoint.actions.ESend; import org.scribble.sesstype.Payload; import org.scribble.sesstype.name.MessageId; import org.scribble.sesstype.name.Role; import org.scribble.visit.context.EGraphBuilder; import org.scribble.visit.context.ProjectedChoiceSubjectFixer; import org.scribble.visit.wf.ExplicitCorrelationChecker; public class LSendDel extends LMessageTransferDel { @Override public LSend leaveEGraphBuilding(ScribNode parent, ScribNode child, EGraphBuilder graph, ScribNode visited) throws ScribbleException { LSend ls = (LSend) visited; List<RoleNode> dests = ls.getDestinations(); if (dests.size() > 1) { throw new ScribbleException("[TODO] EFSM building for multicast not supported: " + ls); } Role peer = dests.get(0).toName(); MessageId<?> mid = ls.msg.toMessage().getId(); Payload payload = ls.msg.isMessageSigNode() // Hacky? ? ((MessageSigNode) ls.msg).payloads.toPayload() : Payload.EMPTY_PAYLOAD; graph.util.addEdge(graph.util.getEntry(), new ESend(peer, mid, payload), graph.util.getExit()); //builder.builder.addEdge(builder.builder.getEntry(), Send.get(peer, mid, payload), builder.builder.getExit()); return (LSend) super.leaveEGraphBuilding(parent, child, graph, ls); } // Could make a LMessageTransferDel to factor this out with LReceiveDel @Override public void enterProjectedChoiceSubjectFixing(ScribNode parent, ScribNode child, ProjectedChoiceSubjectFixer fixer) { fixer.setChoiceSubject(((LSend) child).src.toName()); } @Override public LMessageTransfer leaveExplicitCorrelationCheck(ScribNode parent, ScribNode child, ExplicitCorrelationChecker checker, ScribNode visited) throws ScribbleException { LMessageTransfer lmt = (LMessageTransfer) visited; checker.pushEnv(checker.popEnv().disableAccept()); return lmt; } }