package org.scribble.codegen.java.endpointapi;
import java.util.List;
import org.scribble.codegen.java.util.JavaBuilder;
import org.scribble.codegen.java.util.MethodBuilder;
import org.scribble.model.endpoint.EState;
import org.scribble.model.endpoint.actions.EAction;
public class AcceptSocketGenerator extends ScribSocketGenerator
{
public AcceptSocketGenerator(StateChannelApiGenerator apigen, EState curr)
{
super(apigen, curr);
}
@Override
protected String getSuperClassType()
{
return ACCEPTSOCKET_CLASS + "<" + getSessionClassName() + ", " + getSelfClassName() + ">";
}
@Override
protected void addImports()
{
super.addImports();
//this.cb.addImports(getOpsPackageName() + ".*");
}
@Override
protected void addMethods()
{
//Set<EAction> as = curr.getActions();
List<EAction> as = curr.getActions();
if (as.size() > 1)
{
throw new RuntimeException("AcceptSocket generation not yet supported for accept-branches: " + as);
}
EAction a = as.iterator().next();
EState succ = curr.getSuccessor(a);
makeAcceptMethod(a, succ);
}
private void makeAcceptMethod(EAction a, EState succ)
{
MethodBuilder mb = makeAcceptHeader(a, succ);
mb.addBodyLine(JavaBuilder.SUPER + ".accept(ss, " + getSessionApiRoleConstant(a.obj) + ");");
addReturnNextSocket(mb, succ);
}
private MethodBuilder makeAcceptHeader(EAction a, EState succ)
{
MethodBuilder mb = this.cb.newMethod();
setAcceptHeaderWithoutReturnType(this.apigen, a, mb);
setNextSocketReturnType(this.apigen, mb, succ);
return mb;
}
// Doesn't include return type
//public static void makeReceiveHeader(StateChannelApiGenerator apigen, IOAction a, EndpointState succ, MethodBuilder mb)
public static void setAcceptHeaderWithoutReturnType(StateChannelApiGenerator apigen, EAction a, MethodBuilder mb)
{
final String ROLE_PARAM = "role";
mb.setName("accept");
mb.addModifiers(JavaBuilder.PUBLIC);
mb.addExceptions(StateChannelApiGenerator.SCRIBBLERUNTIMEEXCEPTION_CLASS, "java.io.IOException");
mb.addParameters(SessionApiGenerator.getRoleClassName(a.obj) + " " + ROLE_PARAM, SCRIBSERVERSOCKET_CLASS + " ss");
}
}