package com.neverwinterdp.command.server;
import java.util.Map;
import com.neverwinterdp.scribengin.dataflow.DataflowDescriptor;
import com.neverwinterdp.scribengin.storage.StorageDescriptor;
public class DescriptorBuilder {
protected static DataflowDescriptor parseDataflowInput(Map<String,String> request){
DataflowDescriptor dflDescriptor = parseDataFlowDescriptor(request);
String sourceType = request.get("source-Type");
String sinkType = request.get("sink-Type");
String invalidSinkType = request.get("invalidsink-Type");
if(sourceType == null){
sourceType = "KAFKA";
}
if(sinkType == null){
sinkType = "KAFKA";
}
if(invalidSinkType == null){
invalidSinkType = "KAFKA";
}
switch(sourceType.toUpperCase()){
case "KAFKA":
dflDescriptor.setSourceDescriptor(createKafkaSourceDescriptor(request));
break;
default:
break;
}
switch(sinkType.toUpperCase()){
case "KAFKA":
dflDescriptor.addSinkDescriptor("default", createKafkaSinkDescriptor(request, "sink"));
break;
default:
break;
}
switch(invalidSinkType.toUpperCase()){
case "KAFKA":
dflDescriptor.addSinkDescriptor("invalid", createKafkaSinkDescriptor(request, "invalidsink"));
break;
default:
break;
}
return dflDescriptor;
}
/**
* Parse out parameters from httpRequest for dataflowDescriptor
* If no value is set, pull in defaults
* @param request
* @return
*/
public static DataflowDescriptor parseDataFlowDescriptor(Map<String,String> request){
String dataflowName = request.get("dataflow-Name");
if(dataflowName == null){
dataflowName = DescriptorBuilderDefaults._dataflowName;
}
String dataProcessorClass = request.get("dataflow-Dataprocessor");
if(dataProcessorClass == null){
dataProcessorClass = DescriptorBuilderDefaults._dataProcessorClass;
}
int numWorkers;
try{
numWorkers = Integer.parseInt(request.get("dataflow-NumWorkers"));
}
catch(Exception e){
numWorkers = DescriptorBuilderDefaults._numWorkers;
}
int numExecutorsPerWorker;
try{
numExecutorsPerWorker = Integer.parseInt(request.get("dataflow-NumExecutorsPerWorkers"));
}
catch(Exception e){
numExecutorsPerWorker = DescriptorBuilderDefaults._numExecutorsPerWorker;
}
DataflowDescriptor dflDescriptor = new DataflowDescriptor();
dflDescriptor.setName(dataflowName);
dflDescriptor.setNumberOfWorkers(numWorkers);
dflDescriptor.setNumberOfExecutorsPerWorker(numExecutorsPerWorker);
dflDescriptor.setScribe(dataProcessorClass);
return dflDescriptor;
}
/**
* Parse out details from post request containing source-*
* and return a Kafka Source Descriptor
* @param request
* @return
*/
public static StorageDescriptor createKafkaSourceDescriptor(Map<String,String> request){
String type = request.get("source-Type");
String name = request.get("source-Name");
String topic = request.get("source-Topic");
String zkConnect = request.get("source-ZkConnect");
String brokerList = request.get("source-BrokerList");
if(type == null){
type = "KAFKA";
}
if(name == null){
name = DescriptorBuilderDefaults._kafkaName;
}
if(topic == null){
topic = DescriptorBuilderDefaults._kafkaTopic;
}
if(zkConnect == null){
zkConnect = DescriptorBuilderDefaults._kafkaZkConnect;
}
if(brokerList == null){
brokerList = DescriptorBuilderDefaults._kafkaBrokerList;
}
StorageDescriptor sourceDescriptor = new StorageDescriptor(type) ;
sourceDescriptor.attribute("name", name);
sourceDescriptor.attribute("topic", topic);
sourceDescriptor.attribute("zk.connect", zkConnect);
sourceDescriptor.attribute("broker.list", brokerList);
return sourceDescriptor;
}
/**
* Parse out all the details from the post request matching prefix-*
* and create a kafka SinkDescriptor
* @param request
* @param prefix
* @return
*/
public static StorageDescriptor createKafkaSinkDescriptor(Map<String,String> request, String prefix){
String type = request.get(prefix+"-Type");
String name = request.get(prefix+"-Name");
String topic = request.get(prefix+"-Topic");
String zkConnect = request.get(prefix+"-ZkConnect");
String brokerList = request.get(prefix+"-BrokerList");
if(type == null){
type = "KAFKA";
}
if(name == null){
name = DescriptorBuilderDefaults._kafkaName;
}
if(topic == null){
topic = DescriptorBuilderDefaults._kafkaTopic;
}
if(zkConnect == null){
zkConnect = DescriptorBuilderDefaults._kafkaZkConnect;
}
if(brokerList == null){
brokerList = DescriptorBuilderDefaults._kafkaBrokerList;
}
StorageDescriptor sink = new StorageDescriptor(type) ;
sink.attribute("name", name);
sink.attribute("topic", topic);
sink.attribute("zk.connect", zkConnect);
sink.attribute("broker.list", brokerList);
return sink;
}
}