package main.java.bolts;
import static main.java.utils.constants.WorkberchConstants.INDEX_FIELD;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import main.java.utils.WorkberchTuple;
import main.java.utils.constants.WorkberchConstants;
import backtype.storm.topology.BasicOutputCollector;
import com.fasterxml.jackson.databind.JsonNode;
public class RestBolt extends WorkberchTavernaProcessorBolt {
private static final long serialVersionUID = 1L;
String address;
String requestMethod;
String accetpHeader;
final String ACCEPT_PROP = "Accept";
public RestBolt(final String guid, final List<String> outputFields, final String address, final String requestMethod, final String accetpHeader) {
super(guid, outputFields);
this.address = address;
this.requestMethod = requestMethod;
this.accetpHeader = accetpHeader;
}
public RestBolt(final String guid, final List<String> inputFields, final List<String> outputFields, final JsonNode node) {
super(guid, inputFields, outputFields, node);
}
@Override
public void executeLogic(final WorkberchTuple tuple, final BasicOutputCollector collector, final boolean lastValue, final String uuid) {
String localAddress = address;
for (final String param : tuple.getValues().keySet()) {
if (!param.equals(WorkberchConstants.INDEX_FIELD)) {
final String localParam = param.split("\\" + WorkberchConstants.NAME_DELIMITER)[1];
localAddress = localAddress.replace("{" + localParam + "}", tuple.getValues().get(param).toString());
}
}
try {
final URL url = new URL(localAddress);
final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(requestMethod);
conn.setRequestProperty(ACCEPT_PROP, accetpHeader);
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Falló el la conexion en REST Bolt : HTTP error code : " + conn.getResponseCode());
}
final BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String output;
final StringBuilder sb = new StringBuilder();
while ((output = br.readLine()) != null) {
sb.append(output);
}
conn.disconnect();
final String outputValue = sb.toString();
final ArrayList<Object> values = new ArrayList<Object>();
values.add(outputValue);
values.add(tuple.getValues().get(INDEX_FIELD));
emitTuple(values, collector, lastValue, uuid);
} catch (final MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (final ProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (final IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void initFromJsonNode(final JsonNode jsonNode) {
final JsonNode requestNode = jsonNode.get("request");
requestMethod = requestNode.get("httpMethod").asText();
address = requestNode.get("absoluteURITemplate").asText();
// TODO Hay que ver que se con los demas headers
final JsonNode header = requestNode.get("headers").get(0);
accetpHeader = header.get("value").asText();
}
}