package com.lucidworks.storm.fusion;
import java.net.MalformedURLException;
import java.util.*;
import backtype.storm.task.OutputCollector;
import backtype.storm.tuple.Tuple;
import com.lucidworks.storm.spring.SpringBolt;
import com.lucidworks.storm.spring.StreamingDataAction;
import org.apache.log4j.Logger;
public class FusionBoltAction implements StreamingDataAction {
private static final Logger log = Logger.getLogger(FusionBoltAction.class);
protected FusionPipelineClient fusionPipelineClient;
protected String updatePath;
public FusionBoltAction(String endpoints, String fusionUser, String fusionPass, String fusionRealm, String updatePath) throws MalformedURLException {
this.updatePath = updatePath;
StringBuilder sb = new StringBuilder();
String[] ep = endpoints.split(",");
for (int e=0; e < ep.length; e++) {
if (e > 0) sb.append(",");
String base = ep[e].trim();
if (base.endsWith("/"))
base = base.substring(0,base.length()-1);
sb.append(base).append(updatePath);
}
String endpointsWithPath = sb.toString();
fusionPipelineClient = new FusionPipelineClient(endpointsWithPath, fusionUser, fusionPass, fusionRealm);
}
public SpringBolt.ExecuteResult execute(Tuple input, OutputCollector collector) {
String docId = input.getString(0);
Map<String,Object> values = (Map<String,Object>)input.getValue(1);
Map<String,Object> json = new HashMap<String,Object>(10);
json.put("id", docId);
List fieldList = new ArrayList();
for (String field : values.keySet())
fieldList.add(buildField(field, values.get(field)));
json.put("fields", fieldList);
try {
fusionPipelineClient.postBatchToPipeline(Collections.singletonList(json));
} catch (Exception e) {
log.error("Failed to send doc "+docId+" to Fusion due to: "+e);
throw new RuntimeException(e);
}
return SpringBolt.ExecuteResult.ACK;
}
protected Map<String,Object> buildField(String name, Object value) {
Map<String,Object> tsFld = new HashMap<String, Object>();
tsFld.put("name", name);
if (value != null) {
tsFld.put("value", value);
} else {
tsFld.put("value", "");
}
return tsFld;
}
}