package org.scribble.codegen.java.endpointapi.ioifaces;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.scribble.codegen.java.endpointapi.CaseSocketGenerator;
import org.scribble.codegen.java.endpointapi.ScribSocketGenerator;
import org.scribble.codegen.java.endpointapi.SessionApiGenerator;
import org.scribble.codegen.java.endpointapi.StateChannelApiGenerator;
import org.scribble.codegen.java.util.AbstractMethodBuilder;
import org.scribble.codegen.java.util.InterfaceBuilder;
import org.scribble.codegen.java.util.JavaBuilder;
import org.scribble.codegen.java.util.MethodBuilder;
import org.scribble.main.ScribbleException;
import org.scribble.model.endpoint.EState;
import org.scribble.model.endpoint.actions.EAction;
import org.scribble.sesstype.name.GProtocolName;
import org.scribble.sesstype.name.Role;
public class CaseInterfaceGenerator extends IOStateInterfaceGenerator
{
public CaseInterfaceGenerator(StateChannelApiGenerator apigen, Map<EAction, InterfaceBuilder> actions, EState curr)
{
super(apigen, actions, curr);
}
@Override
protected void constructInterface() throws ScribbleException
{
super.constructInterface();
addBranchEnumField();
addCaseReceiveDiscardMethods();
}
@Override
protected void addHeader()
{
GProtocolName gpn = this.apigen.getGProtocolName();
Role self = this.apigen.getSelf();
String packname = IOInterfacesGenerator.getIOInterfacePackageName(gpn, self);
String ifname = getCasesInterfaceName(self, this.curr);
this.ib.setName(ifname);
this.ib.setPackage(packname);
this.ib.addModifiers(JavaBuilder.PUBLIC);
}
/*@Override
protected void addSuccessorInterfaces()
{
}*/
protected void addBranchEnumField()
{
Role self = this.apigen.getSelf();
String name = super.getIOStateInterfaceName(self, this.curr);
AbstractMethodBuilder op = this.ib.newAbstractMethod("getOp");
op.setReturn(name + "." + BranchInterfaceGenerator.getBranchInterfaceEnumName(self, this.curr));
}
protected void addCaseReceiveDiscardMethods()
{
GProtocolName gpn = this.apigen.getGProtocolName();
//Set<EAction> as = this.curr.getActions();
List<EAction> as = this.curr.getActions();
int i = 1;
this.ib.addImports(SessionApiGenerator.getOpsPackageName(gpn) + ".*");
for (EAction a : as.stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList()))
{
MethodBuilder mb = this.ib.newAbstractMethod();
CaseSocketGenerator.setCaseReceiveDiscardHeaderWithoutReturnType(this.apigen, a, mb);
EState succ = this.curr.getSuccessor(a);
if (succ.isTerminal())
{
ScribSocketGenerator.setNextSocketReturnType(this.apigen, mb, succ);
}
else
{
mb.setReturn("__Succ" + i); // Hacky? // FIXME: factor out Succ
}
i++;
}
}
//protected static String getCasesInterfaceName(String braif)
// Pre: s is a branch state
// Cf. IOStateInterfaceGenerator.getIOStateInterfaceName
protected static String getCasesInterfaceName(Role self, EState s)
{
//return "Case_" + braif.substring("Branch_".length(), braif.length());
return "Case_" + self + "_" + s.getActions().stream().sorted(IOACTION_COMPARATOR)
.map((a) -> ActionInterfaceGenerator.getActionString(a)).collect(Collectors.joining("__"));
}
}