package resa.evaluation.topology.fp; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseRichBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import org.apache.log4j.Logger; import org.joda.time.DateTime; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * Created by ding on 14-6-5. */ public class PatternReporter extends BaseRichBolt implements Constant { private static final Logger LOG = Logger.getLogger(PatternReporter.class); private OutputCollector collector; private Map<Integer, String> invdict; @Override public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { this.collector = collector; int id = 0; invdict = new HashMap<>(); try (BufferedReader reader = new BufferedReader( new InputStreamReader(this.getClass().getResourceAsStream((String) stormConf.get(DICT_FILE_PROP))))) { String line = null; while ((line = reader.readLine()) != null) { invdict.put(id++, line); } } catch (IOException e) { throw new RuntimeException(e); } } @Override public void execute(Tuple input) { WordList wordList = (WordList) input.getValueByField(PATTERN_FIELD); List<String> words = IntStream.of(wordList.getWords()).mapToObj(invdict::get).collect(Collectors.toList()); LOG.debug("In Reporter, " + DateTime.now() + ":" + words + "," + input.getBooleanByField(IS_ADD_MFP)); //TODO: use tuple tree to judge if the update belongs to the same tuple input events. collector.ack(input); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields(PATTERN_FIELD, IS_ADD_MFP)); } }