package stormapplied.githubcommits.topology;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
import java.util.HashMap;
import java.util.Map;
public class EmailCounter extends BaseBasicBolt {
private Map<String, Integer> counts;
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// This bolt does not emit any values and therefore does not define any output fields.
}
@Override
public void prepare(Map stormConf,
TopologyContext context) {
counts = new HashMap<String, Integer>();
}
@Override
public void execute(Tuple tuple,
BasicOutputCollector outputCollector) {
String email = tuple.getStringByField("email");
counts.put(email, countFor(email) + 1);
printCounts();
}
private Integer countFor(String email) {
Integer count = counts.get(email);
return count == null ? 0 : count;
}
/**
* Print the counts to System.out so you can easily see what's happening.
*/
private void printCounts() {
for (String email : counts.keySet()) {
System.out.println(String.format("%s has count of %s", email, counts.get(email)));
}
}
}