package main.java.parser;
import java.util.HashMap;
import java.util.Map;
import main.java.bolts.WorkberchGenericBolt;
import main.java.parser.model.WorkberchIterStgy;
import main.java.parser.model.WorkberchIterStgyNode;
import main.java.parser.model.WorkberchLink;
import main.java.parser.model.WorkberchNode;
import main.java.parser.model.WorkberchOutputNode;
import main.java.parser.model.WorkberchProcessorNode;
import main.java.spouts.WorkberchGenericSpout;
import org.apache.commons.lang.StringUtils;
import backtype.storm.generated.StormTopology;
import backtype.storm.topology.TopologyBuilder;
public class WorkberchTopologyBuilder {
private final TopologyBuilder tBuilder = new TopologyBuilder();
private final Map<String, WorkberchNode> nodes = new HashMap<String, WorkberchNode>();
private String outputPath;
private String inputPath;
private int parallelism;
private String guid;
public String getOutputPath() {
return outputPath;
}
public void setOutputPath(final String outputPath) {
this.outputPath = outputPath;
}
public String getInputPath() {
return inputPath;
}
public void setInputPath(final String inputPath) {
this.inputPath = inputPath;
}
public void addInputNode(final WorkberchNode inputNode) {
final WorkberchGenericSpout spout = inputNode.buildSpout();
tBuilder.setSpout(inputNode.getName(), spout, 1);
nodes.put(inputNode.getName(), inputNode);
}
public void setGuid(final String guid) {
this.guid = guid;
}
public void setParallelism(final int parallelism) {
this.parallelism = parallelism;
}
public void addNode(final WorkberchProcessorNode node, final WorkberchIterStgy strategy) {
strategy.addStrategy2Topology(guid, tBuilder, parallelism);
final WorkberchGenericBolt bolt = node.buildBolt(guid);
if (StringUtils.startsWith(strategy.getBoltName(), "CROSS_") && strategy instanceof WorkberchIterStgyNode && !((WorkberchIterStgyNode)strategy).isOptimized()) {
tBuilder.setBolt(node.getName(), bolt, parallelism).shuffleGrouping(strategy.getBoltName().replace("CROSS_", "ORDER_"));
}
else {
tBuilder.setBolt(node.getName(), bolt, parallelism).shuffleGrouping(strategy.getBoltName());
}
nodes.put(node.getName(), node);
}
public void addOutput(final WorkberchOutputNode node, final WorkberchLink incomingLink) {
final WorkberchGenericBolt bolt = node.buildBolt(guid);
tBuilder.setBolt(node.getName(), bolt, 1).shuffleGrouping(incomingLink.getSourceNode());
}
public StormTopology buildTopology() {
return tBuilder.createTopology();
}
}