package org.scribble.del.global;
import java.util.List;
import org.scribble.ast.ScribNode;
import org.scribble.ast.global.GMessageTransfer;
import org.scribble.ast.local.LNode;
import org.scribble.del.MessageTransferDel;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.Message;
import org.scribble.sesstype.name.Role;
import org.scribble.visit.context.Projector;
import org.scribble.visit.wf.NameDisambiguator;
import org.scribble.visit.wf.WFChoiceChecker;
import org.scribble.visit.wf.env.WFChoiceEnv;
public class GMessageTransferDel extends MessageTransferDel implements GSimpleInteractionNodeDel
{
public GMessageTransferDel()
{
}
@Override
public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException
{
GMessageTransfer gmt = (GMessageTransfer) visited;
Role src = gmt.src.toName();
List<Role> dests = gmt.getDestinationRoles();
if (dests.contains(src))
{
throw new ScribbleException(gmt.getSource(), "[TODO] Self connections not supported: " + gmt); // Would currently be subsumed by unconnected check
}
return gmt;
}
@Override
public GMessageTransfer leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException
{
GMessageTransfer gmt = (GMessageTransfer) visited;
Role src = gmt.src.toName();
if (!checker.peekEnv().isEnabled(src))
{
throw new ScribbleException(gmt.src.getSource(), "Role not enabled: " + src);
}
Message msg = gmt.msg.toMessage();
WFChoiceEnv env = checker.popEnv();
for (Role dest : gmt.getDestinationRoles())
{
// FIXME: better to check as global model error (role stuck on uncomnected send)
if (!env.isConnected(src, dest))
{
throw new ScribbleException(gmt.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest);
}
env = env.addMessage(src, dest, msg);
//System.out.println("a: " + src + ", " + dest + ", " + msg);
}
checker.pushEnv(env);
return gmt;
}
@Override
//public GMessageTransfer leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException
public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException
{
GMessageTransfer gmt = (GMessageTransfer) visited;
Role self = proj.peekSelf();
LNode projection = gmt.project(self);
proj.pushEnv(proj.popEnv().setProjection(projection));
return (GMessageTransfer) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gmt);
}
/*@Override
public ScribNode leaveF17Parsing(ScribNode parent, ScribNode child, F17Parser parser, ScribNode visited) throws ScribbleException
{
F17ParserEnv env = parser.peekEnv();
if (env.isUnguarded())
{
parser.popEnv();
parser.pushEnv(new F17ParserEnv()); // Maybe make "setGuarded" method
}
return super.leaveF17Parsing(parent, child, parser, visited);
}*/
}