package org.scribble.del.global;
import org.scribble.ast.ScribNode;
import org.scribble.ast.global.GDisconnect;
import org.scribble.ast.local.LNode;
import org.scribble.del.ConnectionActionDel;
import org.scribble.main.ScribbleException;
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;
// FIXME: make DisconnectDel (cf., G/LMessageTransferDel)
public class GDisconnectDel extends ConnectionActionDel implements GSimpleInteractionNodeDel
{
public GDisconnectDel()
{
}
@Override
public ScribNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException
{
GDisconnect gc = (GDisconnect) visited;
/*Role src = gc.src.toName();
Role dest = gc.dest.toName();*/
return gc;
}
@Override
public GDisconnect leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException
{
GDisconnect gd = (GDisconnect) visited;
Role src = gd.src.toName();
if (!checker.peekEnv().isEnabled(src))
{
throw new ScribbleException(gd.src.getSource(), "Role not enabled: " + src);
}
//Message msg = gd.msg.toMessage(); // Unit message
WFChoiceEnv env = checker.popEnv();
//for (Role dest : gc.getDestinationRoles())
Role dest = gd.dest.toName();
if (!env.isEnabled(dest))
{
throw new ScribbleException(gd.dest.getSource(), "Role not enabled: " + dest);
}
{
if (src.equals(dest))
{
throw new ScribbleException(gd.getSource(), "[TODO] Self connections not supported: " + gd); // Would currently be subsumed by the below
}
if (!env.isConnected(src, dest))
{
throw new ScribbleException(gd.getSource(), "Roles not (necessarily) connected: " + src + ", " + dest);
}
env = env.disconnect(src, dest);//.removeMessage(src, dest, ...); // Is remove really needed?
/*env = env
.disconnect(src, dest)
.removeMessage(src, dest, new MessageSig(Op.EMPTY_OPERATOR, Payload.EMPTY_PAYLOAD)); // FIXME: factor out dummy connection message with GConnect etc.*/
}
checker.pushEnv(env);
return gd;
}
@Override
public ScribNode leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException //throws ScribbleException
{
GDisconnect gd = (GDisconnect) visited;
Role self = proj.peekSelf();
LNode projection = gd.project(self);
proj.pushEnv(proj.popEnv().setProjection(projection));
return (GDisconnect) GSimpleInteractionNodeDel.super.leaveProjection(parent, child, proj, gd);
}
}