diff --git a/pom.xml b/pom.xml index cab462c..dd763ef 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.example + eu.dnetlib validator-api 1.0-SNAPSHOT uoa-validator-api diff --git a/src/main/java/eu/dnetlib/validatorapi/controllers/ValidatorController.java b/src/main/java/eu/dnetlib/validatorapi/controllers/ValidatorController.java index 31e5e63..0f9f5e3 100644 --- a/src/main/java/eu/dnetlib/validatorapi/controllers/ValidatorController.java +++ b/src/main/java/eu/dnetlib/validatorapi/controllers/ValidatorController.java @@ -2,19 +2,20 @@ package eu.dnetlib.validatorapi.controllers; import eu.dnetlib.validator2.validation.XMLApplicationProfile; import eu.dnetlib.validator2.validation.guideline.Guideline; -import eu.dnetlib.validator2.validation.guideline.openaire.AbstractOpenAireProfile; -import eu.dnetlib.validator2.validation.guideline.openaire.DataArchiveGuidelinesV2Profile; -import eu.dnetlib.validator2.validation.guideline.openaire.LiteratureGuidelinesV3Profile; -import eu.dnetlib.validator2.validation.guideline.openaire.LiteratureGuidelinesV4Profile; +import eu.dnetlib.validator2.validation.guideline.StandardResult; +import eu.dnetlib.validator2.validation.guideline.openaire.*; +import eu.dnetlib.validatorapi.entities.RuleInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import java.io.StringReader; +import java.io.*; +import java.nio.file.Files; import java.util.*; import java.util.stream.Collectors; @@ -24,8 +25,117 @@ public class ValidatorController { private final Logger log = LogManager.getLogger(this.getClass()); @RequestMapping(value = {"/validate"}, method = RequestMethod.POST) - public List validate(@RequestParam(name = "guidelines") String guidelinesProfileName, @RequestBody String xml) { +// public List validate(@RequestParam(name = "guidelines") String guidelinesProfileName, @RequestBody String xml) { + public List validate(@RequestParam(name = "guidelines") String guidelinesProfileName, @RequestBody String xml) { log.debug(xml); + List resultMessages = new ArrayList<>(); + List resultRules = new ArrayList<>(); + + AbstractOpenAireProfile profile = null; + AbstractOpenAireProfile fairProfile = null; + if(guidelinesProfileName.equals("dataArchiveGuidelinesV2Profile")) { + profile = new DataArchiveGuidelinesV2Profile(); + fairProfile = new FAIR_Data_GuidelinesProfile(); + } else if(guidelinesProfileName.equals("literatureGuidelinesV3Profile")) { + profile = new LiteratureGuidelinesV3Profile(); + fairProfile = new FAIR_Data_GuidelinesProfile(); + } else if(guidelinesProfileName.equals("literatureGuidelinesV4Profile")) { + profile = new LiteratureGuidelinesV4Profile(); + fairProfile = new FAIR_Data_GuidelinesProfile(); + } else if(guidelinesProfileName.equals("fairDataGuidelinesProfile")) { + fairProfile = new FAIR_Data_GuidelinesProfile(); + } + + if(profile == null && fairProfile == null) { + log.error("Exception: No valid guidelines"); + new Exception("No valid guidelines"); + } + Map scorePerDoc = new LinkedHashMap<>(); +// String file = "/home/konstantina/projects/validator-api/src/main/resources/Record_21811.xml"; + XMLApplicationProfile.ValidationResult result = null; + try { +// log.debug("Processing " + file); +// Document doc = DOMBuilder.parse(new FileReader(file), false, true, true); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new InputSource(new StringReader(xml))); + + if(profile != null) { + log.debug("Max score: " + profile.maxScore()); + + result = profile.validate("id", doc); + Date date = new Date(); + scorePerDoc.put("input-" + date.toString(), result.score()); + Map results = result.results(); + log.debug("\n\nPrinting results..."); + for (Map.Entry entry : results.entrySet()) { + log.debug(entry.getKey() + " = " + entry.getValue()); + resultMessages.add(entry.getKey() + " = " + entry.getValue()); + RuleInfo ruleInfo = new RuleInfo(); + ruleInfo.setName(entry.getKey().toString()); + + Guideline.Result res = (Guideline.Result) entry.getValue(); + ruleInfo.setErrors((List) res.errors()); + ruleInfo.setWarnings((List) res.warnings()); + ruleInfo.setInternalError(res.internalError()); + ruleInfo.setScore(res.score()); + ruleInfo.setStatus(res.status()); + + resultRules.add(ruleInfo); + } + } + + if(fairProfile != null) { + log.debug("Max score: " + fairProfile.maxScore()); + + result = fairProfile.validate("id", doc); + Date date = new Date(); + scorePerDoc.put("input-"+date.toString(), result.score()); + Map results = result.results(); + log.debug("\n\nPrinting FAIR results..."); + for (Map.Entry entry : results.entrySet()) { + if (!entry.getValue().toString().contains("eu.dnetlib.validator2")) { + log.debug(entry.getKey() + " = " + entry.getValue()); + resultMessages.add(entry.getKey() + " = " + entry.getValue()); + RuleInfo ruleInfo = new RuleInfo(); + ruleInfo.setName(entry.getKey().toString()); + + Guideline.Result res = (Guideline.Result) entry.getValue(); + ruleInfo.setErrors((List) res.errors()); + ruleInfo.setWarnings((List) res.warnings()); + ruleInfo.setInternalError(res.internalError()); + ruleInfo.setScore(res.score()); + ruleInfo.setStatus(res.status()); + + resultRules.add(ruleInfo); + } + } + } + } + catch(Exception e) { + log.debug(e.getMessage()); + log.debug(e); + e.printStackTrace(); + resultMessages.add("Error processing input"); + } + String printout = scorePerDoc.entrySet().stream(). + map(entry -> { + resultMessages.add("score: " + entry.getValue()); + return entry.getValue() + ": " + entry.getKey(); + }).collect(Collectors.joining("\n")); + log.debug("\n\nPrinting scorePerDoc..."); + log.debug(printout); + +// return resultMessages; + return resultRules; + } + + @RequestMapping(method = RequestMethod.POST, value = {"/validate-file"}) + public List validateXmlImport(@RequestParam("guidelines") String guidelinesProfileName, @RequestParam("file") MultipartFile multipartFile) throws IOException { + String filePath = "src/main/resources/xmlFile.tmp"; + File file = new File(filePath); + multipartFile.transferTo(file); + List resultMessages = new ArrayList<>(); AbstractOpenAireProfile profile = null; @@ -45,10 +155,10 @@ public class ValidatorController { XMLApplicationProfile.ValidationResult result = null; try { // log.debug("Processing " + file); -// Document doc = DOMBuilder.parse(new FileReader(file), false, true, true); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); - Document doc = db.parse(new InputSource(new StringReader(xml))); +// Document doc = db.parse(new InputSource(new StringReader(xml))); + Document doc = db.parse(filePath); result = profile.validate("id", doc); Date date = new Date(); scorePerDoc.put("input-"+date.toString(), result.score()); @@ -73,7 +183,9 @@ public class ValidatorController { log.debug("\n\nPrinting scorePerDoc..."); log.debug(printout); + Files.deleteIfExists(file.toPath()); + return resultMessages; - } } +} diff --git a/src/main/java/eu/dnetlib/validatorapi/entities/RuleInfo.java b/src/main/java/eu/dnetlib/validatorapi/entities/RuleInfo.java new file mode 100644 index 0000000..4e775d9 --- /dev/null +++ b/src/main/java/eu/dnetlib/validatorapi/entities/RuleInfo.java @@ -0,0 +1,82 @@ +package eu.dnetlib.validatorapi.entities; + +import eu.dnetlib.validator2.engine.Status; +import eu.dnetlib.validator2.validation.guideline.Guideline; +import eu.dnetlib.validator2.validation.guideline.StandardResult; + +import java.util.List; + +public class RuleInfo { + String name; + String description; +// Guideline.Result result; + List warnings; + List errors; + String internalError; + Status status; + int score; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getWarnings() { + return warnings; + } + + public void setWarnings(List warnings) { + this.warnings = warnings; + } + + public List getErrors() { + return errors; + } + + public void setErrors(List errors) { + this.errors = errors; + } + + public String getInternalError() { + return internalError; + } + + public void setInternalError(String internalError) { + this.internalError = internalError; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + // public StandardResult getResult() { +// return result; +// } +// +// public void setResult(StandardResult result) { +// this.result = result; +// } +}