package org.scribble.codegen.java.endpointapi.ioifaces;
import org.scribble.codegen.java.endpointapi.ReceiveSocketGenerator;
import org.scribble.codegen.java.endpointapi.OutputSocketGenerator;
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.main.ScribbleException;
import org.scribble.model.endpoint.EState;
import org.scribble.model.endpoint.actions.EAction;
import org.scribble.model.endpoint.actions.EReceive;
import org.scribble.sesstype.name.GProtocolName;
import org.scribble.sesstype.name.PayloadType;
public class ActionInterfaceGenerator extends IOInterfaceGenerator
{
private final EAction a;
private final InterfaceBuilder ib = new InterfaceBuilder();
public ActionInterfaceGenerator(StateChannelApiGenerator apigen, EState curr, EAction a)
{
super(apigen, curr);
this.a = a;
}
@Override
public InterfaceBuilder generateType() throws ScribbleException
{
GProtocolName gpn = this.apigen.getGProtocolName();
this.ib.setName(getActionInterfaceName(this.a));
this.ib.setPackage(IOInterfacesGenerator.getIOInterfacePackageName(this.apigen.getGProtocolName(), this.apigen.getSelf()));
this.ib.addImports("java.io.IOException");
this.ib.addImports(SessionApiGenerator.getEndpointApiRootPackageName(gpn) + ".*"); // FIXME: factor out with ScribSocketGenerator
this.ib.addImports(SessionApiGenerator.getRolesPackageName(gpn) + ".*");
this.ib.addImports(SessionApiGenerator.getOpsPackageName(gpn) + ".*");
this.ib.addModifiers(JavaBuilder.PUBLIC);
this.ib.addParameters("__Succ extends " + SuccessorInterfaceGenerator.getSuccessorInterfaceName(this.a));
AbstractMethodBuilder mb = this.ib.newAbstractMethod(); // FIXME: factor out with ReceiveSocketBuilder
//AbstractMethodBuilder mb2 = null;
if (this.a instanceof EReceive)
{
/*if (this.curr.getAcceptable().size() > 1)
{
//CaseSocketGenerator.setCaseReceiveHeaderWithoutReturnType(this.apigen, this.a, mb);
}
//else*/
{
ReceiveSocketGenerator.setReceiveHeaderWithoutReturnType(this.apigen, this.a, mb);
/*if (this.curr.getAcceptable().size() == 1) // FIXME: action interface should not depend on curr state -- should generate this method in the IO State I/f, not here
{
mb2 = this.ib.newAbstractMethod();
ReceiveSocketGenerator.setAsyncDiscardHeaderWithoutReturnType(this.apigen, this.a, mb2,
InputFutureGenerator.getInputFutureName(this.apigen.getSocketClassName(this.curr)));
}
/*else
{
CaseSocketGenerator.setCaseReceiveDiscardHeaderWithoutReturnType(this.apigen, this.a, mb2);
}*/
}
}
else //if (this.a instanceof Send)
{
OutputSocketGenerator.setSendHeaderWithoutReturnType(this.apigen, this.a, mb);
}
/*EndpointState succ = this.curr.accept(this.a);
if (succ.isTerminal())
{
ScribSocketGenerator.setNextSocketReturnType(this.apigen, mb, succ);
/*if (this.a instanceof Receive)
{
ScribSocketGenerator.setNextSocketReturnType(this.apigen, mb2, succ);
}* /
}
else*/
{
mb.setReturn("__Succ");
//if (this.a instanceof Receive)
/*if (this.a instanceof Receive && this.curr.getAcceptable().size() == 1)
{
mb2.setReturn("__Succ");
}*/
}
return ib;
}
// FIXME: curr unnecessary
public static String getActionInterfaceName(EAction a)
{
/*String name = (a instanceof Receive)
? "In"
: "Out";*/
String name;
//if (curr.getAcceptable().iterator().next() instanceof Receive)
if (a instanceof EReceive)
{
/*if (curr.getAcceptable().size() > 1)
{
name = "Case"; // FIXME: make subtype of In?
}
//else*/
{
name = "In";
}
}
else
{
name = "Out";
}
name += "_" + getActionString(a);
return name;
}
public static String getActionString(EAction a) // FIXME: peer not needed for inputs
{
//String name = a.peer + "$" + a.mid;
String name = a.obj + "_" + a.mid;
for (PayloadType<?> pay : a.payload.elems)
{
//name += "$" + pay;
name += "_" + pay;
}
return name;
}
}