package fib; import java.io.IOException; import java.util.concurrent.ExecutionException; import org.scribble.main.ScribbleRuntimeException; import org.scribble.net.Buf; import org.scribble.net.ObjectStreamFormatter; import org.scribble.net.scribsock.ScribServerSocket; import org.scribble.net.scribsock.SocketChannelServer; import org.scribble.net.session.MPSTEndpoint; import fib.Fib.Adder.Adder; import fib.Fib.Adder.channels.S.Adder_S_1; import fib.Fib.Adder.channels.S.Adder_S_1_Cases; import fib.Fib.Adder.channels.S.Adder_S_3; import fib.Fib.Adder.roles.S; public class AdderServer { public static void main(String[] args) throws IOException, ScribbleRuntimeException, ExecutionException, InterruptedException { try (ScribServerSocket ss = new SocketChannelServer(8888)) { Buf<Integer> i1 = new Buf<>(); Buf<Integer> i2 = new Buf<>(); while (true) { Adder foo = new Adder(); try (MPSTEndpoint<Adder, S> se = new MPSTEndpoint<>(foo, Adder.S, new ObjectStreamFormatter())) { se.accept(ss, Adder.C); X(new Adder_S_1(se), i1, i2).send(Adder.C, Adder.BYE); } catch (ScribbleRuntimeException | IOException | ClassNotFoundException e) { e.printStackTrace(); } } } } private static Adder_S_3 X(Adder_S_1 s1, Buf<Integer> i1, Buf<Integer> i2) throws ClassNotFoundException, ScribbleRuntimeException, IOException, ExecutionException, InterruptedException { Adder_S_1_Cases cases = s1.branch(Adder.C); switch (cases.op) { case BYE: { return cases.receive(Adder.BYE); } case ADD: { return X(cases.receive(Adder.ADD, i1, i2).send(Adder.C, Adder.RES, i1.val + i2.val), i1, i2); } default: { throw new RuntimeException("Won't get here: "); } } } }