118 lines
4.9 KiB
Java
118 lines
4.9 KiB
Java
package eu.dnetlib.validatorapi.routes;
|
|
|
|
import org.apache.camel.builder.RouteBuilder;
|
|
import org.apache.camel.impl.engine.DefaultShutdownStrategy;
|
|
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 {
|
|
|
|
// Access the DefaultShutdownStrategy
|
|
DefaultShutdownStrategy shutdownStrategy = (DefaultShutdownStrategy) getContext().getShutdownStrategy();
|
|
|
|
// Set the shutdown timeout in milliseconds (e.g., 10 seconds)
|
|
shutdownStrategy.setTimeout(1);
|
|
|
|
from("direct:getResponse")
|
|
.process(exchange -> {
|
|
String endpoint = exchange.getIn().getHeader("endpoint", String.class);
|
|
exchange.getIn().setHeader("dynamicEndpoint", endpoint);
|
|
})
|
|
.recipientList(header("dynamicEndpoint"))
|
|
.process(exchange -> {
|
|
List<String> ListSetsXml = exchange.getIn().getBody(ArrayList.class);
|
|
List<String> desiredJsonParts = new ArrayList<>();
|
|
String xmlSets = "";
|
|
|
|
// Extract the desired <set> elements from each XML string
|
|
for (String xml : ListSetsXml) {
|
|
List<String> 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<String> extractSets(String xml) {
|
|
List<String> 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();
|
|
}
|
|
}
|