package com.packtpub.storm.operators;
import com.packtpub.storm.model.Board;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import storm.trident.operation.BaseFunction;
import storm.trident.operation.TridentCollector;
import storm.trident.tuple.TridentTuple;
import java.util.HashMap;
import java.util.Map;
public class ScoreUpdater extends BaseFunction {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(ScoreUpdater.class);
private static final Map<String, Integer> scores = new HashMap<String, Integer>();
private static final String MUTEX = "MUTEX";
@Override
public void execute(TridentTuple tuple, TridentCollector collector) {
Board board = (Board) tuple.get(0);
int score = tuple.getInteger(1);
String player = tuple.getString(2);
String key = board.toKey();
LOG.debug("Got (" + board.toKey() + ") => [" + score + "] for [" + player + "]");
// Always compute things from X's perspective
// We'll flip things when we interpret it if it is O's turn.
synchronized (MUTEX) {
Integer currentScore = scores.get(key);
if (currentScore == null || (player.equals("X") && score > currentScore)) {
updateScore(board, score);
} else if (player.equals("O") && score > currentScore) {
updateScore(board, score);
}
}
}
public void updateScore(Board board, Integer score) {
scores.put(board.toKey(), score);
LOG.debug("Updating [" + board.toString() + "]=>[" + score + "]");
}
}