package main.java.bolts; import static main.java.utils.constants.WorkberchConstants.INDEX_FIELD; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import main.java.utils.WorkberchTuple; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import backtype.storm.topology.BasicOutputCollector; import com.fasterxml.jackson.databind.JsonNode; public class XPathBolt extends WorkberchTavernaProcessorBolt { private static final long serialVersionUID = 1L; String xPathExpression; public XPathBolt(final String guid, final List<String> outputFields, final String xPathExpression) { super(guid, outputFields); this.xPathExpression = xPathExpression; } public XPathBolt(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) { try { final XPathFactory xPathfactory = XPathFactory.newInstance(); final XPath xpath = xPathfactory.newXPath(); final XPathExpression expr = xpath.compile(xPathExpression); final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; final Object value = tuple.getValues().values().toArray()[1]; final String xmlString = value.toString(); builder = factory.newDocumentBuilder(); final Document document = builder.parse(new InputSource(new StringReader(xmlString))); final NodeList nl = (NodeList) expr.evaluate(document, XPathConstants.NODESET); final List<Object> emitTuple = new ArrayList<Object>(); for (int i = 0; i < nl.getLength(); i++) { final String nodeContent = nl.item(i).getTextContent(); emitTuple.add(nodeContent); } final List<Object> salida = new ArrayList<Object>(); salida.add(emitTuple); salida.add(tuple.getValues().get(INDEX_FIELD)); emitTuple(salida, collector, lastValue, uuid); } catch (final XPathExpressionException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (final ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (final SAXException 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) { xPathExpression = jsonNode.get("xpathExpression").asText(); } }