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.*; import eu.dnetlib.validatorapi.entities.RuleInfo; import eu.dnetlib.validatorapi.entities.XmlValidationResponse; 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.File; import java.io.IOException; import java.io.StringReader; import java.nio.file.Files; import java.util.*; import java.util.stream.Collectors; @RestController @CrossOrigin(origins = "*") 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 XmlValidationResponse validate(@RequestParam(name = "guidelines") String guidelinesProfileName, @RequestBody String xml) { log.debug(xml); // List resultMessages = new ArrayList<>(); List resultRules = null; List fairRules = null; XmlValidationResponse xmlValidationResponse = new XmlValidationResponse(); 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) { resultRules = new ArrayList<>(); log.debug("Max score: " + profile.maxScore()); result = profile.validate("id", doc); Date date = new Date(); scorePerDoc.put("input-" + date.toString(), result.getScore()); Map results = result.getResults(); 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.getErrors()); ruleInfo.setWarnings((List) res.getWarnings()); ruleInfo.setInternalError(res.getInternalError()); ruleInfo.setScore(res.getScore()); ruleInfo.setStatus(res.getStatus()); resultRules.add(ruleInfo); } String printout = scorePerDoc.entrySet().stream(). map(entry -> { xmlValidationResponse.setValidationScore(entry.getValue().toString()); // resultMessages.add("score: " + entry.getValue()); return entry.getValue() + ": " + entry.getKey(); }).collect(Collectors.joining("\n")); log.debug("\n\nPrinting scorePerDoc..."); log.debug(printout); } if(fairProfile != null) { fairRules = new ArrayList<>(); log.debug("Max score: " + fairProfile.maxScore()); result = fairProfile.validate("id", doc); Date date = new Date(); scorePerDoc.put("input-"+date.toString(), result.getScore()); Map results = result.getResults(); 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.getErrors()); ruleInfo.setWarnings((List) res.getWarnings()); ruleInfo.setInternalError(res.getInternalError()); ruleInfo.setScore(res.getScore()); ruleInfo.setStatus(res.getStatus()); fairRules.add(ruleInfo); // } } String printout = scorePerDoc.entrySet().stream(). map(entry -> { xmlValidationResponse.setFairScore(entry.getValue().toString()); // resultMessages.add("fair score: " + entry.getValue()); return entry.getValue() + ": " + entry.getKey(); }).collect(Collectors.joining("\n")); log.debug("\n\nPrinting fair scorePerDoc..."); log.debug(printout); } } catch(Exception e) { log.debug(e.getMessage()); log.debug(e); e.printStackTrace(); // resultMessages.add("Error processing input"); } // return resultMessages; xmlValidationResponse.setRules(resultRules); xmlValidationResponse.setFairRules(fairRules); return xmlValidationResponse; } @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; if(guidelinesProfileName.equals("dataArchiveGuidelinesV2Profile")) { profile = new DataArchiveGuidelinesV2Profile(); } else if(guidelinesProfileName.equals("literatureGuidelinesV3Profile")) { profile = new LiteratureGuidelinesV3Profile(); } else if(guidelinesProfileName.equals("literatureGuidelinesV4Profile")) { profile = new LiteratureGuidelinesV4Profile(); } if(profile == null) { new Exception("No valid guidelines"); } log.debug("Max score: " + profile.maxScore()); 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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); // 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.getScore()); Map results = result.getResults(); log.debug("\n\nPrinting results..."); for (Map.Entry entry : results.entrySet()) { log.debug(entry.getKey() + " = " + entry.getValue()); resultMessages.add(entry.getKey() + " = " + entry.getValue()); } } 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); Files.deleteIfExists(file.toPath()); return resultMessages; } }