package storm.applications.bolt;
import backtype.storm.hooks.ITaskHook;
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.utils.Utils;
import java.util.HashMap;
import java.util.Map;
import storm.applications.constants.BaseConstants;
import storm.applications.constants.BaseConstants.BaseStream;
import storm.applications.hooks.BoltMeterHook;
import storm.applications.util.config.Configuration;
import static storm.applications.util.config.Configuration.METRICS_ENABLED;
/**
*
* @author Maycon Viana Bordin <mayconbordin@gmail.com>
*/
public abstract class AbstractBolt extends BaseRichBolt {
protected String configPrefix = BaseConstants.BASE_PREFIX;
protected OutputCollector collector;
protected Configuration config;
protected TopologyContext context;
protected Map<String, Fields> fields;
public AbstractBolt() {
fields = new HashMap<>();
}
public void setFields(Fields fields) {
this.fields.put(BaseStream.DEFAULT, fields);
}
public void setFields(String streamId, Fields fields) {
this.fields.put(streamId, fields);
}
@Override
public final void declareOutputFields(OutputFieldsDeclarer declarer) {
if (fields.isEmpty()) {
if (getDefaultFields() != null)
fields.put(BaseStream.DEFAULT, getDefaultFields());
if (getDefaultStreamFields() != null)
fields.putAll(getDefaultStreamFields());
}
for (Map.Entry<String, Fields> e : fields.entrySet()) {
declarer.declareStream(e.getKey(), e.getValue());
}
}
public Fields getDefaultFields() {
return null;
}
public Map<String, Fields> getDefaultStreamFields() {
return null;
}
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.config = Configuration.fromMap(stormConf);
this.context = context;
this.collector = collector;
if (config.getBoolean(METRICS_ENABLED, false)) {
context.addTaskHook(getMeterHook());
}
initialize();
}
public void initialize() {
}
public void setConfigPrefix(String configPrefix) {
this.configPrefix = configPrefix;
}
protected ITaskHook getMeterHook() {
return new BoltMeterHook();
}
}