package org.hackreduce.storm.vmc.bolts; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; import org.hackreduce.storm.vmc.common.BaseComponent; import org.hackreduce.storm.vmc.common.Utils; import org.hackreduce.storm.vmc.common.Whatever; public class HelloCountBolt extends BaseComponent implements IRichBolt { private Map<String, Integer> counts; private Map<String, String> lookup; private OutputCollector collector; public HelloCountBolt(Map<String, String> lookup) {this.lookup = lookup;} @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { this.collector = collector; this.conf = conf; counts = new ConcurrentHashMap<String, Integer>(); Set<String> keys = lookup.keySet(); for (String key: keys) this.counts.put(key, 0); } @Override public void execute(Tuple input) { String lang = input.getValueByField(Whatever.LANGUAGEFIELD).toString(); String hello = input.getValueByField(Whatever.HELLOFIELD).toString(); this.counts.put(lang, counts.get(lang) + 1); this.collector.emit(new Values(lang, hello, this.counts.get(lang))); } @Override public void cleanup() {System.out.println(Utils.displayHelloCounts(this.lookup, this.counts));} @Override public void declareOutputFields(OutputFieldsDeclarer declarer) {declarer.declare(new Fields(Whatever.LANGUAGEFIELD, Whatever.HELLOFIELD, "count"));} }