package org.scribble.model.global.actions;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.scribble.model.MAction;
import org.scribble.sesstype.Payload;
import org.scribble.sesstype.kind.Global;
import org.scribble.sesstype.name.MessageId;
import org.scribble.sesstype.name.Role;
public abstract class SAction extends MAction<Global>
{
public final Role subj;
public SAction(Role subj, Role obj, MessageId<?> mid, Payload payload)
{
super(obj, mid, payload);
this.subj = subj;
}
public boolean isConnect()
{
return false;
}
public boolean isDisconnect()
{
return false;
}
public boolean isAccept()
{
return false;
}
public boolean isSend()
{
return false;
}
public boolean isReceive()
{
return false;
}
public Set<Role> getRoles()
{
return new HashSet<>(Arrays.asList(this.subj, this.obj));
}
public boolean containsRole(Role role)
{
return this.subj.equals(role) || this.obj.equals(role);
}
/*public IOAction project(Role self)
{
if (this.subj.equals(self))
{
if (this.obj.equals(self))
{
throw new RuntimeException("TODO: " + this);
}
else
{
return new Send(this.obj, this.mid, this.payload);
}
}
else
{
if (this.obj.equals(self))
{
return new Receive(this.subj, this.mid, this.payload);
//return Receive.get(this.subj, this.mid, this.payload);
}
else
{
return null; // FIXME?
}
}
}*/
@Override
public String toString()
{
return this.subj + getCommSymbol() + this.obj + ":" + this.mid + this.payload;
}
@Override
public int hashCode()
{
int hash = 149;
hash = 31 * hash + super.hashCode();
hash = 31 * hash + this.subj.hashCode();
return hash;
}
@Override
public boolean equals(Object o) // FIXME: kind
{
if (this == o)
{
return true;
}
if (!(o instanceof SAction))
{
return false;
}
SAction a = (SAction) o;
return super.equals(o) && this.subj.equals(a.subj);
}
@Override
public boolean canEqual(Object o)
{
return o instanceof SAction;
}
}