package org.scribble.ast.global;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.ConnectionAction;
import org.scribble.ast.Constants;
import org.scribble.ast.MessageNode;
import org.scribble.ast.local.LNode;
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;
public class GConnect extends ConnectionAction<Global> implements GSimpleInteractionNode
{
public GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest)
//public GConnect(RoleNode src, RoleNode dest)
{
super(source, src, msg, dest);
//super(src, dest);
}
public LNode project(Role self)
{
Role srcrole = this.src.toName();
Role destrole = this.dest.toName();
LNode projection = null;
if (srcrole.equals(self) || destrole.equals(self))
{
RoleNode src = (RoleNode) AstFactoryImpl.FACTORY.SimpleNameNode(this.src.getSource(), RoleKind.KIND, this.src.toName().toString()); // clone?
MessageNode msg = (MessageNode) this.msg; // FIXME: need namespace prefix update?
RoleNode dest = (RoleNode) AstFactoryImpl.FACTORY.SimpleNameNode(this.dest.getSource(), RoleKind.KIND, this.dest.toName().toString());
if (srcrole.equals(self))
{
projection = AstFactoryImpl.FACTORY.LConnect(this.source, src, msg, dest);
//projection = AstFactoryImpl.FACTORY.LConnect(src, dest); // src and dest (not self and peer)
}
if (destrole.equals(self))
{
projection = AstFactoryImpl.FACTORY.LAccept(this.source, src, msg, dest);
//projection = AstFactoryImpl.FACTORY.LAccept(src, dest);
}
}
return projection;
}
@Override
protected GConnect copy()
{
return new GConnect(this.source, this.src, this.msg, this.dest);
//return new GConnect(this.src, this.dest);
}
@Override
public GConnect clone()
{
RoleNode src = this.src.clone();
MessageNode msg = this.msg.clone();
RoleNode dest = this.dest.clone();
return AstFactoryImpl.FACTORY.GConnect(this.source, src, msg, dest);
//return AstFactoryImpl.FACTORY.GConnect(src, dest);
}
@Override
public GConnect reconstruct(RoleNode src, MessageNode msg, RoleNode dest)
//public GConnect reconstruct(RoleNode src, RoleNode dest)
{
ScribDel del = del();
GConnect gc = new GConnect(this.source, src, msg, dest);
//GConnect gc = new GConnect(src, dest);
gc = (GConnect) gc.del(del);
return gc;
}
// 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 (isUnitMessage() ? "" : this.msg + " ") + Constants.CONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";";
//return Constants.CONNECT_KW + " " + this.src + " " + Constants.TO_KW + " " + this.dest + ";";
}
}