package org.scribble.codegen.java.endpointapi.ioifaces;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
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.EnumBuilder;
import org.scribble.codegen.java.util.InterfaceBuilder;
import org.scribble.codegen.java.util.JavaBuilder;
import org.scribble.main.ScribbleException;
import org.scribble.model.endpoint.EState;
import org.scribble.model.endpoint.actions.EAction;
import org.scribble.sesstype.name.Role;
public class BranchInterfaceGenerator extends IOStateInterfaceGenerator
{
public BranchInterfaceGenerator(StateChannelApiGenerator apigen, Map<EAction, InterfaceBuilder> actions, EState curr)
{
super(apigen, actions, curr);
}
@Override
protected void constructInterface() throws ScribbleException
{
super.constructInterface();
addBranchEnum();
addBranchMethods();
}
protected void addBranchMethods()
{
Role self = this.apigen.getSelf();
//Set<EAction> as = this.curr.getActions();
List<EAction> as = this.curr.getActions();
// FIXME: factor out with BranchSocketGenerator
AbstractMethodBuilder bra = this.ib.newAbstractMethod("branch");
String ret = CaseInterfaceGenerator.getCasesInterfaceName(self, this.curr)
+ "<" + IntStream.range(1, as.size()+1).mapToObj((i) -> "__Succ" + i).collect(Collectors.joining(", ")) + ">"; // FIXME: factor out
bra.setReturn(ret);
bra.addParameters(SessionApiGenerator.getRoleClassName(as.iterator().next().obj) + " role");
bra.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "java.io.IOException", "ClassNotFoundException");
AbstractMethodBuilder bra2 = this.ib.newAbstractMethod("branch");
bra2.setReturn(JavaBuilder.VOID);
bra2.addParameters(SessionApiGenerator.getRoleClassName(as.iterator().next().obj) + " role");
String next = HandleInterfaceGenerator.getHandleInterfaceName(self, this.curr) + "<" + IntStream.range(1, as.size() + 1).mapToObj((i) -> "__Succ" + i).collect(Collectors.joining(", ")) + ">";
bra2.addParameters(next + " handler");
bra2.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "java.io.IOException", "ClassNotFoundException");
AbstractMethodBuilder bra3 = this.ib.newAbstractMethod("handle");
bra3.setReturn(JavaBuilder.VOID);
bra3.addParameters(SessionApiGenerator.getRoleClassName(as.iterator().next().obj) + " role");
String handle = HandleInterfaceGenerator.getHandleInterfaceName(self, this.curr) + "<" +
as.stream().sorted(IOStateInterfaceGenerator.IOACTION_COMPARATOR)
.map((a) -> SuccessorInterfaceGenerator.getSuccessorInterfaceName(a)).collect(Collectors.joining(", ")) + ">";
bra3.addParameters(handle + " handler");
bra3.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "java.io.IOException", "ClassNotFoundException");
}
protected void addBranchEnum()
{
Role self = this.apigen.getSelf();
// Duplicated from BranchSocketGenerator
EnumBuilder eb = this.ib.newMemberEnum(getBranchInterfaceEnumName(self, this.curr));
eb.addModifiers(JavaBuilder.PUBLIC);
eb.addInterfaces(ScribSocketGenerator.OPENUM_INTERFACE);
this.curr.getActions().stream().forEach((a) -> eb.addValues(SessionApiGenerator.getOpClassName(a.mid)));
}
// Don't add Action Interfaces (added to CaseInterface)
@Override
protected void addSuccessorParamsAndActionInterfaces()
{
int i = 1;
for (EAction a : this.curr.getActions().stream().sorted(IOACTION_COMPARATOR).collect(Collectors.toList()))
{
this.ib.addParameters("__Succ" + i + " extends " + SuccessorInterfaceGenerator.getSuccessorInterfaceName(a));
i++;
}
}
public static String getBranchInterfaceEnumName(Role self, EState curr)
{
return getIOStateInterfaceName(self, curr) + "_Enum";
}
}