package org.akka.essentials.wc.mapreduce.example.server;
import java.util.Iterator;
import java.util.List;
import java.util.NavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import akka.actor.ActorRef;
import akka.actor.UntypedActor;
public class ReduceActor extends UntypedActor {
private ActorRef actor = null;
public ReduceActor(ActorRef inAggregateActor) {
actor = inAggregateActor;
}
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof List) {
@SuppressWarnings("unchecked")
List<Result> work = (List<Result>) message;
// perform the work
NavigableMap<String, Integer> reducedList = reduce(work);
// reply with the result
actor.tell(reducedList);
} else
throw new IllegalArgumentException("Unknown message [" + message
+ "]");
}
private NavigableMap<String, Integer> reduce(List<Result> list) {
NavigableMap<String, Integer> reducedMap = new ConcurrentSkipListMap<String, Integer>();
Iterator<Result> iter = list.iterator();
while (iter.hasNext()) {
Result result = iter.next();
if (reducedMap.containsKey(result.getWord())) {
Integer value = (Integer) reducedMap.get(result.getWord());
value++;
reducedMap.put(result.getWord(), value);
} else {
reducedMap.put(result.getWord(), Integer.valueOf(1));
}
}
return reducedMap;
}
}