package org.scribble.ast.global;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.Constants;
import org.scribble.ast.MessageNode;
import org.scribble.ast.MessageTransfer;
import org.scribble.ast.local.LInteractionNode;
import org.scribble.ast.local.LNode;
import org.scribble.ast.local.LReceive;
import org.scribble.ast.name.simple.RoleNode;
import org.scribble.del.ScribDel;
import org.scribble.sesstype.kind.Global;
import org.scribble.sesstype.kind.RoleKind;
import org.scribble.sesstype.name.Role;
import org.scribble.util.ScribUtil;
public class GMessageTransfer extends MessageTransfer<Global> implements GSimpleInteractionNode
{
public GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List<RoleNode> dests)
{
super(source, src, msg, dests);
}
public LNode project(Role self)
{
Role srcrole = this.src.toName();
List<Role> destroles = this.getDestinationRoles();
LNode projection = null;
if (srcrole.equals(self) || destroles.contains(self))
{
RoleNode src = (RoleNode) AstFactoryImpl.FACTORY.SimpleNameNode(this.src.getSource(), RoleKind.KIND, this.src.toName().toString()); // clone?
MessageNode msg = (MessageNode) this.msg.project(); // FIXME: need namespace prefix update?
List<RoleNode> dests =
this.getDestinations().stream().map((rn) ->
(RoleNode) AstFactoryImpl.FACTORY.SimpleNameNode(rn.getSource(), RoleKind.KIND, rn.toName().toString())).collect(Collectors.toList());
if (srcrole.equals(self))
{
projection = AstFactoryImpl.FACTORY.LSend(this.source, src, msg, dests);
}
if (destroles.contains(self))
{
if (projection == null)
{
projection = AstFactoryImpl.FACTORY.LReceive(this.source, src, msg, dests);
}
else
{
LReceive lr = AstFactoryImpl.FACTORY.LReceive(this.source, src, msg, dests);
List<LInteractionNode> lis = Arrays.asList(new LInteractionNode[]{(LInteractionNode) projection, lr});
projection = AstFactoryImpl.FACTORY.LInteractionSeq(this.source, lis);
}
}
}
return projection;
}
@Override
protected GMessageTransfer copy()
{
return new GMessageTransfer(this.source, this.src, this.msg, getDestinations());
}
@Override
public GMessageTransfer clone()
{
RoleNode src = this.src.clone();
MessageNode msg = this.msg.clone();
List<RoleNode> dests = ScribUtil.cloneList(getDestinations());
return AstFactoryImpl.FACTORY.GMessageTransfer(this.source, src, msg, dests);
}
@Override
public GMessageTransfer reconstruct(RoleNode src, MessageNode msg, List<RoleNode> dests)
{
ScribDel del = del();
GMessageTransfer gmt = new GMessageTransfer(this.source, src, msg, dests);
gmt = (GMessageTransfer) gmt.del(del);
return gmt;
}
// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350
@Override
public Global getKind()
{
return GSimpleInteractionNode.super.getKind();
}
@Override
public String toString()
{
return this.msg + " " + Constants.FROM_KW + " " + this.src + " " + Constants.TO_KW + " "
+ getDestinations().stream().map((dest) -> dest.toString()).collect(Collectors.joining(", ")) + ";";
}
}