package storm.applications.topology; import backtype.storm.Config; import backtype.storm.generated.StormTopology; import backtype.storm.topology.TopologyBuilder; import org.slf4j.Logger; import storm.applications.constants.BaseConstants.BaseConf; import storm.applications.sink.BaseSink; import storm.applications.spout.AbstractSpout; import storm.applications.util.config.ClassLoaderUtils; import storm.applications.util.config.Configuration; public abstract class AbstractTopology { protected TopologyBuilder builder; protected String topologyName; protected Configuration config; public AbstractTopology(String topologyName, Config config) { this.topologyName = topologyName; this.config = Configuration.fromMap(config); this.builder = new TopologyBuilder(); } public String getTopologyName() { return topologyName; } protected AbstractSpout loadSpout() { return loadSpout(BaseConf.SPOUT_CLASS, getConfigPrefix()); } protected AbstractSpout loadSpout(String name) { return loadSpout(BaseConf.SPOUT_CLASS, String.format("%s.%s", getConfigPrefix(), name)); } protected AbstractSpout loadSpout(String configKey, String configPrefix) { String spoutClass = config.getString(String.format(configKey, configPrefix)); AbstractSpout spout = (AbstractSpout) ClassLoaderUtils.newInstance(spoutClass, "spout", getLogger()); spout.setConfigPrefix(configPrefix); return spout; } protected BaseSink loadSink() { return loadSink(BaseConf.SINK_CLASS, getConfigPrefix()); } protected BaseSink loadSink(String name) { return loadSink(BaseConf.SINK_CLASS, String.format("%s.%s", getConfigPrefix(), name)); } protected BaseSink loadSink(String configKey, String configPrefix) { String sinkClass = config.getString(String.format(configKey, configPrefix)); BaseSink sink = (BaseSink) ClassLoaderUtils.newInstance(sinkClass, "sink", getLogger()); sink.setConfigPrefix(configPrefix); return sink; } /** * Utility method to parse a configuration key with the application prefix and * component prefix. * @param key The configuration key to be parsed * @param name The name of the component * @return The formatted configuration key */ protected String getConfigKey(String key, String name) { return String.format(key, String.format("%s.%s", getConfigPrefix(), name)); } /** * Utility method to parse a configuration key with the application prefix.. * @param key The configuration key to be parsed * @return */ protected String getConfigKey(String key) { return String.format(key, getConfigPrefix()); } public abstract void initialize(); public abstract StormTopology buildTopology(); public abstract Logger getLogger(); public abstract String getConfigPrefix(); }