package akka.first.app.java.actors;
import java.util.HashMap;
import java.util.List;
import akka.actor.ActorRef;
import akka.actor.UntypedActor;
import akka.first.app.java.messages.MapData;
import akka.first.app.java.messages.ReduceData;
import akka.first.app.java.messages.WordCount;
public class ReduceActor extends UntypedActor {
private ActorRef aggregateActor = null;
public ReduceActor(ActorRef inAggregateActor) {
aggregateActor = inAggregateActor;
}
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof MapData) {
MapData mapData = (MapData) message;
// reduce the incoming data
ReduceData reduceData = reduce(mapData.getDataList());
// forward the result to aggregate actor
aggregateActor.tell(reduceData);
} else
unhandled(message);
}
private ReduceData reduce(List<WordCount> dataList) {
HashMap<String, Integer> reducedMap = new HashMap<String, Integer>();
for (WordCount wordCount : dataList) {
if (reducedMap.containsKey(wordCount.getWord())) {
Integer value = (Integer) reducedMap.get(wordCount.getWord());
value++;
reducedMap.put(wordCount.getWord(), value);
} else {
reducedMap.put(wordCount.getWord(), Integer.valueOf(1));
}
}
return new ReduceData(reducedMap);
}
}