diff --git a/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java b/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java index 35b770d..95a40b2 100644 --- a/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java +++ b/src/main/java/eu/dnetlib/validatorapi/controllers/ValidationController.java @@ -13,7 +13,6 @@ 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.ConsumerTemplate; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.logging.log4j.LogManager; @@ -217,11 +216,6 @@ public class ValidationController { validationIssueRepository, validationResultRepository); camelContext.addRoutes(oaiPmhRouteBuilder); - - /* RouteBuilder listSetsBuilder = new OaiSetListRoute("oaipmh://"+ baseURL + "?verb=ListSets"); - camelContext.addRoutes(listSetsBuilder); - validationJob.progress = "COMPLETED";*/ - } catch (Exception e) { log.error("Validation job stopped unexpectedly." + e.getMessage()); @@ -240,11 +234,12 @@ public class ValidationController { RouteBuilder listSetsBuilder = new OaiSetListRoute(); ProducerTemplate producerTemplate = camelContext.createProducerTemplate(); - producerTemplate.requestBodyAndHeader("direct:getResponse", null, "endpoint", "oaipmh://"+ baseURL + "?verb=ListSets", String.class); - + String response = producerTemplate.requestBodyAndHeader("direct:getResponse", null, "endpoint", "oaipmh://"+ baseURL + "?verb=ListSets", String.class); +/* ConsumerTemplate consumerTemplate = camelContext.createConsumerTemplate(); String result = consumerTemplate.receive("seda:result").getIn().getBody(String.class); - return result; + return result;*/ + return response; /* System.out.println(camelContext.getRoutes()); diff --git a/src/main/java/eu/dnetlib/validatorapi/repositories/ValidationResultRepository.java b/src/main/java/eu/dnetlib/validatorapi/repositories/ValidationResultRepository.java index 129cd6d..9bd1215 100644 --- a/src/main/java/eu/dnetlib/validatorapi/repositories/ValidationResultRepository.java +++ b/src/main/java/eu/dnetlib/validatorapi/repositories/ValidationResultRepository.java @@ -29,16 +29,16 @@ public interface ValidationResultRepository extends JpaRepository 0 THEN 'ERROR'" + - " WHEN COUNT(DISTINCT CASE WHEN vr.status = 'WARNING' THEN vr.ruleName END) > 0 THEN 'WARNING'" + + " WHEN COUNT(DISTINCT CASE WHEN vr.status = 'ERROR' THEN vr.ruleName END) = COUNT(DISTINCT vr.ruleName) THEN 'ERROR'" + + " WHEN COUNT(DISTINCT CASE WHEN vr.status = 'FAILURE' THEN vr.ruleName END) = COUNT(DISTINCT vr.ruleName) THEN 'FAILURE'" + " ELSE 'SUCCESS'" + " END " + - "FROM eu.dnetlib.validatorapi.entities.ValidationRuleResult vr WHERE vr.ruleName = sr.ruleName)," + + "FROM eu.dnetlib.validatorapi.entities.ValidationRuleResult vr WHERE vr.ruleName = sr.ruleName and sr.validationJobId=vr.validationJobId)," + "CASE WHEN COUNT(CASE WHEN has_errors IS TRUE THEN 1 END) > 0 THEN TRUE ELSE FALSE END AS hasErrors," + "CASE WHEN COUNT(CASE WHEN has_warnings IS TRUE THEN 1 END) > 0 THEN TRUE ELSE FALSE END AS hasWarnings)" + "FROM eu.dnetlib.validatorapi.entities.ValidationRuleResult sr " + "WHERE sr.validationJobId = :id " + - "GROUP BY sr.ruleName, sr.ruleWeight, sr.internalError") + "GROUP BY sr.ruleName, sr.ruleWeight, sr.internalError, sr.validationJobId") List getFullSummaryResult(@Param("id") int validationJobId); diff --git a/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java b/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java index 6095a55..a0a1ef8 100644 --- a/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java +++ b/src/main/java/eu/dnetlib/validatorapi/routes/OaiSetListRoute.java @@ -1,15 +1,26 @@ package eu.dnetlib.validatorapi.routes; -import eu.dnetlib.validatorapi.utils.ListSetAggregationStrategy; -import org.apache.camel.Exchange; 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 java.io.ByteArrayInputStream; -import java.io.InputStream; +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 { @@ -35,9 +46,24 @@ public class OaiSetListRoute extends RouteBuilder { exchange.getIn().setHeader("dynamicEndpoint", endpoint); }) .recipientList(header("dynamicEndpoint")) - .to("direct:processSets"); + .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; + } - from("direct:processSets") + 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); @@ -51,14 +77,45 @@ public class OaiSetListRoute extends RouteBuilder { .aggregate(constant(true), new ListSetAggregationStrategy()) .completionPredicate(exchangeProperty(Exchange.AGGREGATED_SIZE).isEqualTo(header("CamelSplitSize"))) .to("direct:processAggregatedSets") - .log("${body}"); - + .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"); + }).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(); } } diff --git a/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java b/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java index 01ab450..3c32dc5 100644 --- a/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java +++ b/src/main/java/eu/dnetlib/validatorapi/utils/ListSetAggregationStrategy.java @@ -5,6 +5,7 @@ import org.apache.camel.Exchange; public class ListSetAggregationStrategy implements AggregationStrategy { + public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { if (oldExchange == null) { return newExchange; @@ -17,5 +18,18 @@ public class ListSetAggregationStrategy implements AggregationStrategy { return oldExchange; } +/* public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { + if (oldExchange == null) { + newExchange.getIn().setBody("skata", String.class); + return newExchange; + } + + oldExchange.getIn().setBody("skatakia", String.class); + String oldBody = oldExchange.getIn().getBody(String.class); + String newBody = newExchange.getIn().getBody(String.class); + oldExchange.getIn().setBody(oldBody + newBody); + + return oldExchange; + }*/ } \ No newline at end of file