package org.akka.essentials.stm.pingpong.example3;
import akka.agent.Agent;
import akka.util.Timeout;
import static java.util.concurrent.TimeUnit.SECONDS;
public class PingPong {
Agent<String> whoseTurn;
public PingPong(Agent<String> player) {
whoseTurn = player;
}
public boolean hit(final String opponent) {
final String x = Thread.currentThread().getName();
//wait till all the messages are processed to make
//you get the correct value, as updated to Agents are
//async
String result = whoseTurn.await(new Timeout(5, SECONDS));
if (result == "") {
whoseTurn.send(x);
return true;
}
if (x.compareTo(result) == 0) {
System.out.println("PING! (" + x + ")");
whoseTurn.send(opponent);
} else {
try {
long t1 = System.currentTimeMillis();
wait(2500);
if ((System.currentTimeMillis() - t1) > 2500) {
System.out.println("****** TIMEOUT! " + x
+ " is waiting for " + whoseTurn + " to play.");
}
} catch (Exception e) {
}
}
if (result.compareTo("DONE") == 0)
return false;
if (opponent.compareTo("DONE") == 0) {
whoseTurn.send(opponent);
return false;
}
return true; // keep playing.
}
}