package eu.dnetlib.validatorapi.routes; import org.apache.camel.builder.RouteBuilder; import org.json.JSONObject; import org.json.XML; import org.springframework.stereotype.Component; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; @Component public class OaiSetListRoute extends RouteBuilder { @Override public void configure() throws Exception { from("direct:getResponse") .process(exchange -> { String endpoint = exchange.getIn().getHeader("endpoint", String.class); exchange.getIn().setHeader("dynamicEndpoint", endpoint); }) .recipientList(header("dynamicEndpoint")) .process(exchange -> { List ListSetsXml = exchange.getIn().getBody(ArrayList.class); List desiredJsonParts = new ArrayList<>(); String xmlSets = ""; // Extract the desired elements from each XML string for (String xml : ListSetsXml) { List extractedSets = extractSets(xml); for (String setXml : extractedSets) xmlSets += setXml; } JSONObject jsonObject = XML.toJSONObject(xmlSets); String jsonString = jsonObject.toString(); exchange.getIn().setBody(jsonString); }); } /*from("direct:processSets") .process(exchange -> { // Access the individual response from the ArrayList ArrayList responseList = exchange.getIn().getBody(ArrayList.class); InputStream responseStream = new ByteArrayInputStream(responseList.get(0).toString().getBytes()); // Set the converted InputStream as the new body exchange.getIn().setBody(responseStream); }).log("${body}") .split(xpath("//*[local-name()='set']")).log("${body}") // .log("${body}") .aggregate(constant(true), new ListSetAggregationStrategy()) .completionPredicate(exchangeProperty(Exchange.AGGREGATED_SIZE).isEqualTo(header("CamelSplitSize"))) .to("direct:processAggregatedSets") .log("${body}");*/ /* from("direct:processAggregatedSets") .process(exchange -> { String aggregatedXml = exchange.getIn().getBody(ArrayList.class) + ""; JSONObject jsonObject = XML.toJSONObject(aggregatedXml); String jsonString = jsonObject.toString(); exchange.getIn().setBody(jsonString); }).to("seda:result");*/ //} private List extractSets(String xml) { List setXmls = new ArrayList<>(); try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource inputSource = new InputSource(new StringReader(xml)); Document document = builder.parse(inputSource); NodeList setElements = document.getElementsByTagName("set"); for (int i = 0; i < setElements.getLength(); i++) { Node setElement = setElements.item(i); String setXml = nodeToString(setElement); setXmls.add(setXml); } } catch (Exception e) { // Handle any exceptions that occur during XML parsing or processing log.error(e.getMessage()); } return setXmls; } private String nodeToString(Node node) throws TransformerException { StringWriter sw = new StringWriter(); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.transform(new DOMSource(node), new StreamResult(sw)); return sw.toString(); } }