diff --git a/pom.xml b/pom.xml
index 1411454..60106bb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,7 +89,55 @@
camel-spring-boot-starter
${apache.camel.version}
+
+ org.apache.camel.springboot
+ camel-jackson-starter
+ ${apache.camel.version}
+
+
+ org.apache.camel
+ camel-jackson
+ ${apache.camel.version}
+
+
+
+ org.apache.camel
+ camel-jacksonxml
+ ${apache.camel.version}
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.15.2
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.15.2
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+ 2.15.2
+
+
+
+ org.apache.camel.springboot
+ camel-servlet-starter
+ ${apache.camel.version}
+
+
+ org.apache.camel
+ camel-http
+ ${apache.camel.version}
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+ 2.15.2
+
diff --git a/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java b/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java
index 75b44df..ae5ab95 100644
--- a/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java
+++ b/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java
@@ -13,6 +13,7 @@ import eu.dnetlib.validatorapi.repositories.ValidationResultRepository;
import eu.dnetlib.validatorapi.routes.OaiPmhRoute;
import eu.dnetlib.validatorapi.routes.OaiSetListRoute;
import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -233,14 +234,29 @@ public class ValidationController {
}
}
- @RequestMapping(value = {"/getSets"}, method = RequestMethod.GET)
- public void getSets(@RequestParam(name = "baseUrl", defaultValue = "http://repositorium.sdum.uminho.pt/oai/request") String baseURL //not in use now
+ @RequestMapping(value = {"/getSets"}, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
+ public String getSets(@RequestParam(name = "baseUrl", defaultValue = "http://repositorium.sdum.uminho.pt/oai/request") String baseURL //not in use now
) throws Exception {
+
+ RouteBuilder listSetsBuilder = new OaiSetListRoute();
+ ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
+ String response = producerTemplate.requestBodyAndHeader("direct:getResponse", null, "endpoint", "oaipmh://"+ baseURL + "?verb=ListSets", String.class);
+ return response;
+
+/*
+ System.out.println(camelContext.getRoutes());
RouteBuilder listSetsBuilder = new OaiSetListRoute("oaipmh://"+ baseURL + "?verb=ListSets");
+
+ if(camelContext.getRoutes().size()<1)
camelContext.addRoutes(listSetsBuilder);
- camelContext.getRouteController().startRoute("oaiSetListRoute");
- camelContext.getRouteController().stopRoute("oaiSetListRoute");
- System.out.println(((OaiSetListRoute) listSetsBuilder).xml);
+ System.out.println(camelContext.getRoutes());
+ /*camelContext.getRouteController().startRoute("oaiSetListRoute");
+ camelContext.getRouteController().stopRoute("oaiSetListRoute");*/
+/* ProducerTemplate template = camelContext.createProducerTemplate();
+ String response = template.requestBody("direct:getResponse", null, String.class);
+ return response;
+*/
+ //System.out.println(((OaiSetListRoute) listSetsBuilder).xml);
}
@RequestMapping(value = {"/demo"}, produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
public String demo() {
diff --git a/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java b/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java
index ade1f18..74cdf86 100644
--- a/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java
+++ b/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java
@@ -1,24 +1,80 @@
package eu.dnetlib.validatorapi.routes;
+import eu.dnetlib.validatorapi.utils.ListSetAggregationStrategy;
+import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.dataformat.JacksonXMLDataFormat;
+import org.springframework.stereotype.Component;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+@Component
public class OaiSetListRoute extends RouteBuilder {
- private final String oaiEndpoint;
+ /*private final String oaiEndpoint;*/
public String xml = new String();
- public OaiSetListRoute(final String oaiEndpoint) {
+
+ /*public OaiSetListRoute(final String oaiEndpoint) {
this.oaiEndpoint = oaiEndpoint;
- }
+ }*/
+
@Override
public void configure() throws Exception {
- /* from(oaiEndpoint).process(exchange -> {
- // System.out.println(exchange.getIn().getBody(String.class));
- xml+=exchange.getIn().getBody(String.class)+"\n\n Katerina \n\n";
- });*/
+ JacksonXMLDataFormat xmlJsonFormat = new JacksonXMLDataFormat();
- from(oaiEndpoint)
+
+ from("direct:getResponse")
+ .process(exchange -> {
+ // Get the endpoint URL from the request parameter
+ String endpoint = exchange.getIn().getHeader("endpoint", String.class);
+
+ // Set the dynamic endpoint URL in the exchange header
+ exchange.getIn().setHeader("dynamicEndpoint", endpoint);
+ })
+ .recipientList(header("dynamicEndpoint"));
+ //.to("direct:processSets");
+
+ 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);
+ })
+ .split(xpath("//set")).log("${body}")
+ .aggregate(constant(true), new ListSetAggregationStrategy())
+ .completionPredicate(exchangeProperty(Exchange.AGGREGATED_SIZE).isEqualTo(header("CamelSplitSize")))
+ .to("direct:processAggregatedSets").log("Aggregated: ${body}");
+
+ /*
+ .aggregate(header("dynamicEndpoint"), new ListSetAggregationStrategy())
+ .completionPredicate(exchangeProperty(Exchange.AGGREGATED_SIZE).isEqualTo(header("CamelSplitSize")))
+ .marshal().json(JsonLibrary.Jackson)
+ .convertBodyTo(String.class)
+ .log("Aggregated Response: ${body}");*/
+ }
+
+ /*from("direct:getResponse")
+ .to("oaipmh:http://repositorium.sdum.uminho.pt/oai/request?verb=ListSets")
+ .process(exchange -> {
+ // Process the API response
+ String apiResponse = exchange.getIn().getBody(String.class);
+
+ // Create a new response
+ String newResponse = "New Response: I made it!";
+
+ // Set the new response in the exchange body
+ exchange.getIn().setBody(newResponse);
+ });*/
+
+
+/* from(oaiEndpoint)
.convertBodyTo(String.class) // Convert response to String
.marshal().json() // Convert String to JSON
.to("direct:serveResponse")
@@ -31,5 +87,5 @@ public class OaiSetListRoute extends RouteBuilder {
.setBody(simple("${body}")) // Set the response body
.log("${body}")
.to("mock:result"); // Replace 'mock:result' with the appropriate endpoint to serve the response
- }
+ }*/
}
diff --git a/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java b/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java
new file mode 100644
index 0000000..07613a3
--- /dev/null
+++ b/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java
@@ -0,0 +1,97 @@
+package eu.dnetlib.validatorapi.utils;
+
+import org.apache.camel.AggregationStrategy;
+import org.apache.camel.Exchange;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.xpath.*;
+import java.io.IOException;
+import java.io.StringReader;
+
+public class ListSetAggregationStrategy implements AggregationStrategy {
+
+ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+ if (oldExchange == null) {
+ return newExchange;
+ }
+
+ String oldBody = null;
+ try {
+ oldBody = exctractSets(oldExchange.getIn().getBody(String.class));
+ String newBody = exctractSets(newExchange.getIn().getBody(String.class));
+ oldExchange.getIn().setBody(oldBody + newBody);
+
+ } catch (ParserConfigurationException e) {
+ System.out.println(e);
+ e.printStackTrace();
+ } catch (IOException e) {
+ System.out.println(e);
+
+ e.printStackTrace();
+ } catch (SAXException e) {
+ System.out.println(e);
+
+ e.printStackTrace();
+ } catch (TransformerException e) {
+ System.out.println(e);
+
+ e.printStackTrace();
+ } catch (XPathExpressionException e) {
+ System.out.println(e);
+
+ e.printStackTrace();
+ }
+ return oldExchange;
+ }
+
+
+ private String exctractSets(String xml) throws ParserConfigurationException, IOException, SAXException, TransformerException, XPathExpressionException {
+ // Create an XPathFactory
+ XPathFactory xfactory = XPathFactory.newInstance();
+
+ // Create an XPath object
+ XPath xpath = xfactory.newXPath();
+
+ // Compile the XPath expression to select the set elements
+ XPathExpression expression = xpath.compile("//set");
+
+ // Create an InputSource from the XML string
+ InputSource inputSource = new InputSource(new StringReader(xml));
+
+ // Parse the inputSource and create a Document object
+ Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputSource);
+
+ // Evaluate the XPath expression on the document
+ NodeList setElements = (NodeList) expression.evaluate(document, XPathConstants.NODESET);
+
+ // Process the extracted set elements
+ StringBuilder extractedElements = new StringBuilder();
+ for (int i = 0; i < setElements.getLength(); i++) {
+ extractedElements.append(getElementAsString(setElements.item(i)));
+ }
+ // System.out.println(extractedElements.toString());
+ return extractedElements.toString();
+ }
+
+ // Helper method to convert a Node to String
+ private static String getElementAsString(Node node) {
+ try {
+ javax.xml.transform.TransformerFactory tf = javax.xml.transform.TransformerFactory.newInstance();
+ javax.xml.transform.Transformer transformer = tf.newTransformer();
+ transformer.setOutputProperty(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
+ java.io.StringWriter writer = new java.io.StringWriter();
+ transformer.transform(new javax.xml.transform.dom.DOMSource(node), new javax.xml.transform.stream.StreamResult(writer));
+ return writer.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+}
\ No newline at end of file