package storm.applications;
import backtype.storm.Config;
import backtype.storm.generated.StormTopology;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import storm.applications.topology.AbstractTopology;
/**
*
* @author mayconbordin
*/
public class AppDriver {
private static final Logger LOG = LoggerFactory.getLogger(AppDriver.class);
private final Map<String, AppDescriptor> applications;
public AppDriver() {
applications = new HashMap<>();
}
public void addApp(String name, Class<? extends AbstractTopology> cls) {
applications.put(name, new AppDescriptor(cls));
}
public AppDescriptor getApp(String name) {
return applications.get(name);
}
public static class AppDescriptor {
private final Class<? extends AbstractTopology> cls;
public AppDescriptor(Class<? extends AbstractTopology> cls) {
this.cls = cls;
}
public StormTopology getTopology(String topologyName, Config config) {
try {
Constructor c = cls.getConstructor(String.class, Config.class);
LOG.info("Loaded topology {}", cls.getCanonicalName());
AbstractTopology topology = (AbstractTopology) c.newInstance(topologyName, config);
topology.initialize();
return topology.buildTopology();
} catch (ReflectiveOperationException ex) {
LOG.error("Unable to load topology class", ex);
return null;
}
}
}
}