progress with error and warning reports. not yet final. need to clean code and finalize the needed methods

This commit is contained in:
Katerina 2023-05-03 15:00:57 +03:00
parent 4d7836b4d7
commit a15670b741
8 changed files with 387 additions and 152 deletions

View File

@ -3,12 +3,10 @@ package eu.dnetlib.validatorapi.controllers;
import eu.dnetlib.validator2.validation.XMLApplicationProfile; import eu.dnetlib.validator2.validation.XMLApplicationProfile;
import eu.dnetlib.validator2.validation.guideline.Guideline; import eu.dnetlib.validator2.validation.guideline.Guideline;
import eu.dnetlib.validator2.validation.guideline.openaire.*; import eu.dnetlib.validator2.validation.guideline.openaire.*;
import eu.dnetlib.validatorapi.entities.RuleInfo; import eu.dnetlib.validatorapi.entities.*;
import eu.dnetlib.validatorapi.entities.SummaryResult; import eu.dnetlib.validatorapi.repositories.ValidationIssueRepository;
import eu.dnetlib.validatorapi.entities.ValidationJob; import eu.dnetlib.validatorapi.repositories.ValidationJobRepository;
import eu.dnetlib.validatorapi.entities.ValidationJobResult; import eu.dnetlib.validatorapi.repositories.ValidationResultRepository;
import eu.dnetlib.validatorapi.repository.ValidationJobRepository;
import eu.dnetlib.validatorapi.repository.ValidationResultRepository;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -45,30 +43,33 @@ public class ValidationController {
private final Logger log = LogManager.getLogger(this.getClass()); private final Logger log = LogManager.getLogger(this.getClass());
private final ValidationJobRepository validationJobRepository; private final ValidationJobRepository validationJobRepository;
private final ValidationResultRepository validationResultRepository; private final ValidationResultRepository validationResultRepository;
private final ValidationIssueRepository validationIssueRepository;
@Autowired @Autowired
public ValidationController(ValidationJobRepository validationJobRepository, ValidationResultRepository validationResultRepository) { public ValidationController(ValidationJobRepository validationJobRepository, ValidationResultRepository validationResultRepository, ValidationIssueRepository validationIssueRepository) {
this.validationJobRepository = validationJobRepository; this.validationJobRepository = validationJobRepository;
this.validationResultRepository = validationResultRepository; this.validationResultRepository = validationResultRepository;
this.validationIssueRepository = validationIssueRepository;
} }
@RequestMapping(value = {"/realValidator"}, method = RequestMethod.POST) @RequestMapping(value = {"/realValidator"}, method = RequestMethod.POST)
public void validateRealOAIPMH(@RequestParam(name = "guidelines") String guidelinesProfileName, public void validateRealOAIPMH(@RequestParam(name = "guidelines") String guidelinesProfileName,
@RequestParam(name = "baseUrl", defaultValue = "localhost") String baseUrl, //not in use now @RequestParam(name = "baseUrl", defaultValue = "http://repositorium.sdum.uminho.pt/oai/request") String baseURL, //not in use now
@RequestParam(name="numberOfRecords", defaultValue = "10") int numberOfRecords //not in use now @RequestParam(name="numberOfRecords", defaultValue = "10") int numberOfRecords, //not in use now
) { @RequestParam(name="set", required = false) String set, @RequestParam(name="metadataPrefix", defaultValue = "oai_dc") String metadataPrefix,
@RequestParam(name="batchsize", defaultValue = "50") int batchSize) {
ValidationJob validationJob = new ValidationJob(baseUrl, numberOfRecords); AbstractOpenAireProfile profile = initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = initializeFairProfile(guidelinesProfileName);
if (profile == null && fairProfile == null) {
log.error("Exception: No valid guidelines");
new Exception("Validation Job stopped unexpectedly. No valid guidelines were provided.");
}
AbstractOpenAireProfile profile = null; ValidationJob validationJob = new ValidationJob(baseURL, numberOfRecords);
AbstractOpenAireProfile fairProfile = null;
profile = initializeProfile(guidelinesProfileName, profile, fairProfile);
validationJob.guidelines = profile.name(); validationJob.guidelines = profile.name();
System.out.println("Initial validation job "+ validationJob + " | " + validationJob.hashCode() + "\n"); validationJobRepository.save(validationJob);
//TODO uncomment
// validationJobRepository.save(validationJob);
int record = 0; int record = 0;
double resultSum = 0; double resultSum = 0;
@ -77,21 +78,17 @@ public class ValidationController {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); DocumentBuilder db = dbf.newDocumentBuilder();
String baseURL = "http://repositorium.sdum.uminho.pt/oai/request"; // replace with your repository's base URL
String metadataPrefix = "oai_dc"; // replace with your desired metadata prefix
String set = null; // replace with your desired set, or null for all records
int batchSize = 50; // replace with your desired batch size
// Step 1: Make initial request
String url = baseURL + "?verb=ListRecords&metadataPrefix=" + metadataPrefix; String url = baseURL + "?verb=ListRecords&metadataPrefix=" + metadataPrefix;
if (set != null) { if (set != null) {
url += "&set=" + set; url += "&set=" + set;
} }
// url += "&pageSize=" + batchSize;
System.out.println("URL " + url.toString()); System.out.println("URL " + url.toString());
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
Document oaipmhResponse = parseResponse(conn.getInputStream()); Document oaipmhResponse = parseResponse(conn.getInputStream());
List<String> records = new ArrayList<String>();
//TODO: follow other approach if records are more than 100!!!
int recordsRetrieved = 0; int recordsRetrieved = 0;
// Step 2: Retrieve additional records using resumptionToken // Step 2: Retrieve additional records using resumptionToken
while (recordsRetrieved < batchSize) { while (recordsRetrieved < batchSize) {
@ -105,61 +102,49 @@ public class ValidationController {
conn = (HttpURLConnection) new URL(url).openConnection(); conn = (HttpURLConnection) new URL(url).openConnection();
oaipmhResponse = parseResponse(conn.getInputStream()); oaipmhResponse = parseResponse(conn.getInputStream());
// TODO: process the records returned in this response
XPathFactory xfactory = XPathFactory.newInstance(); XPathFactory xfactory = XPathFactory.newInstance();
XPath xpath = xfactory.newXPath(); XPath xpath = xfactory.newXPath();
XPathExpression recordsExpression = xpath.compile("//record"); XPathExpression recordsExpression = xpath.compile("//record");
NodeList recordNodes = (NodeList) recordsExpression.evaluate(oaipmhResponse, XPathConstants.NODESET); NodeList recordNodes = (NodeList) recordsExpression.evaluate(oaipmhResponse, XPathConstants.NODESET);
List<String> records = new ArrayList<String>();
for (int i = 0; i < recordNodes.getLength(); ++i) { for (int i = 0; i < recordNodes.getLength(); ++i) {
Node element = recordNodes.item(i); Node element = recordNodes.item(i);
StringWriter stringWriter = new StringWriter(); StringWriter stringWriter = new StringWriter();
Transformer xform = TransformerFactory.newInstance().newTransformer(); Transformer xform = TransformerFactory.newInstance().newTransformer();
xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); // optional
xform.setOutputProperty(OutputKeys.INDENT, "yes"); // optional
xform.transform(new DOMSource(element), new StreamResult(stringWriter)); xform.transform(new DOMSource(element), new StreamResult(stringWriter));
records.add(stringWriter.toString()); records.add(stringWriter.toString());
} }
System.out.println("size " + records.size());
recordsRetrieved += records.size(); recordsRetrieved += records.size();
}
for (String recordXml : records) { for (String recordXml : records) {
Document doc = db.parse(new InputSource(new StringReader(recordXml))); System.out.println("\n\n\n\n\n\n\n\n HELLLOOOOOOOOOO \n\n\n\n\n");
if (profile != null) { Document doc = db.parse(new InputSource(new StringReader(recordXml)));
System.out.println("\n\n\n\n RECORD : " + recordXml + "\n\n\n\n\n");
//what id is that? if (profile != null) {
XMLApplicationProfile.ValidationResult validationResult = profile.validate("id", doc); XMLApplicationProfile.ValidationResult validationResult = profile.validate("id", doc); //what id is that?
Map<String, Guideline.Result> results = validationResult.results(); Map<String, Guideline.Result> results = validationResult.results();
/* for (Map.Entry entry : results.entrySet()) { for (Map.Entry entry : results.entrySet()) {
ValidationJobResult validationJobResult = new ValidationJobResult();
validationJobResult.validationJobId = validationJob.id;
validationJobResult.ruleName = entry.getKey().toString();
validationJobResult.recordUrl = "localhost://records/record["+record+"]"; // silly id
Guideline.Result engineResult = (Guideline.Result) entry.getValue(); Guideline.Result engineResult = (Guideline.Result) entry.getValue();
validationJobResult.score = engineResult.score(); String recordUrl = extractRecordUrl(doc, "identifier");
validationJobResult.status = engineResult.status().toString(); System.out.println("DC IDENTIFIER: " + recordUrl);
validationJobResult.internalError = engineResult.internalError(); String ruleName = entry.getKey().toString();
ValidationRuleResult validationRuleResult = constructValidationRuleResult(validationJob.id, recordUrl,
ruleName, profile, engineResult);
System.out.println(validationRuleResult + " | " + validationRuleResult.hashCode() + "\n");
resultSum += engineResult.score(); resultSum += engineResult.score();
validationJobResult.warnings = ((List<String>) engineResult.warnings()).toArray(new String[0]); validationResultRepository.save(validationRuleResult);
validationJobResult.errors = ((List<String>) engineResult.errors()).toArray(new String[0]); saveValidationIssues(validationJob.id, recordUrl, ruleName, engineResult);
System.out.println(validationJobResult + " | " + validationJobResult.hashCode() + "\n");
validationResultRepository.save(validationJobResult);
validationJobResults.add(validationJobResult);
}*/
} }
record++; record++;
System.out.println(record);
} }
} }
validationJob.status = "COMPLETED"; validationJob.status = "COMPLETED";
@ -183,26 +168,115 @@ public class ValidationController {
//xmlValidationResponse.setFairRules(fairRules); //xmlValidationResponse.setFairRules(fairRules);
} }
private AbstractOpenAireProfile initializeProfile(@RequestParam(name = "guidelines") String guidelinesProfileName, AbstractOpenAireProfile profile, AbstractOpenAireProfile fairProfile) {
private void constructValidationJobResult(ValidationJob validationJob, ValidationRuleResult validationRuleResult,
Map.Entry entry, AbstractOpenAireProfile profile, Document document) {
validationRuleResult.validationJobId = validationJob.id;
validationRuleResult.ruleName = entry.getKey().toString();
validationRuleResult.ruleWeight = profile.guideline(validationRuleResult.ruleName).getWeight();
validationRuleResult.recordUrl = extractRecordUrl(document, "dc:identifier");
Guideline.Result engineResult = (Guideline.Result) entry.getValue();
validationRuleResult.score = engineResult.score();
validationRuleResult.status = engineResult.status().toString();
validationRuleResult.internalError = engineResult.internalError();
}
private ValidationRuleResult constructValidationJobResult(ValidationJob validationJob,
Map.Entry entry, AbstractOpenAireProfile profile, Document document) {
ValidationRuleResult validationRuleResult = new ValidationRuleResult();
validationRuleResult.validationJobId = validationJob.id;
validationRuleResult.ruleName = entry.getKey().toString();
validationRuleResult.ruleWeight = profile.guideline(validationRuleResult.ruleName).getWeight();
validationRuleResult.recordUrl = extractRecordUrl(document, "dc:identifier");
Guideline.Result engineResult = (Guideline.Result) entry.getValue();
validationRuleResult.score = engineResult.score();
validationRuleResult.status = engineResult.status().toString();
validationRuleResult.internalError = engineResult.internalError();
return validationRuleResult;
}
private void saveValidationIssues(int validationJobId, String recordUrl, String ruleName, Guideline.Result engineResult) {
System.out.println("-------");
for (String error:engineResult.errors()) {
System.out.println("11111");
ValidationIssue validationIssue = new ValidationIssue();
validationIssue.validationJobId = validationJobId;
validationIssue.ruleName = ruleName;
validationIssue.recordUrl = recordUrl;
validationIssue.issueType = "ERROR";
validationIssue.issueText = error;
validationIssueRepository.save(validationIssue);
System.out.println(validationIssue);
}
for (String warning: engineResult.warnings()){
System.out.println("22222");
ValidationIssue validationIssue = new ValidationIssue();
validationIssue.validationJobId = validationJobId;
validationIssue.ruleName = ruleName;
validationIssue.recordUrl = recordUrl;
validationIssue.issueType = "WARNING";
validationIssue.issueText = warning;
validationIssueRepository.save(validationIssue);
System.out.println(validationIssue);
}
}
private ValidationRuleResult constructValidationRuleResult(int validationJobId, String recordUrl, String ruleName,
AbstractOpenAireProfile profile, Guideline.Result engineResult) {
ValidationRuleResult validationRuleResult = new ValidationRuleResult();
validationRuleResult.validationJobId = validationJobId;
validationRuleResult.ruleName = ruleName;
validationRuleResult.ruleWeight = profile.guideline(ruleName).getWeight();
validationRuleResult.recordUrl = recordUrl;
validationRuleResult.score = engineResult.score();
validationRuleResult.status = engineResult.status().toString();
validationRuleResult.internalError = engineResult.internalError();
return validationRuleResult;
}
//TODO consider throwing exception
private String extractRecordUrl(Document doc, String xmlField) {
NodeList identifierNodes = doc.getElementsByTagName(xmlField);
if (identifierNodes.getLength() > 0) {
Element identifierElement = (Element) identifierNodes.item(0);
return identifierElement.getTextContent();
}
return "-";
}
private AbstractOpenAireProfile initializeOpenAireProfile(String guidelinesProfileName) {
if (guidelinesProfileName.equals("dataArchiveGuidelinesV2Profile")) { if (guidelinesProfileName.equals("dataArchiveGuidelinesV2Profile")) {
profile = new DataArchiveGuidelinesV2Profile(); return new DataArchiveGuidelinesV2Profile();
fairProfile = new FAIR_Data_GuidelinesProfile();
} else if (guidelinesProfileName.equals("literatureGuidelinesV3Profile")) { } else if (guidelinesProfileName.equals("literatureGuidelinesV3Profile")) {
profile = new LiteratureGuidelinesV3Profile(); return new LiteratureGuidelinesV3Profile();
} else if (guidelinesProfileName.equals("literatureGuidelinesV4Profile")) { } else if (guidelinesProfileName.equals("literatureGuidelinesV4Profile")) {
profile = new LiteratureGuidelinesV4Profile(); return new LiteratureGuidelinesV4Profile();
}
return null;
}
private AbstractOpenAireProfile initializeFairProfile(String guidelinesProfileName) {
if (guidelinesProfileName.equals("dataArchiveGuidelinesV2Profile")) {
return new FAIR_Data_GuidelinesProfile();
} else if (guidelinesProfileName.equals("fairDataGuidelinesProfile")) { } else if (guidelinesProfileName.equals("fairDataGuidelinesProfile")) {
fairProfile = new FAIR_Data_GuidelinesProfile(); return new FAIR_Data_GuidelinesProfile();
} }
if (profile == null && fairProfile == null) { return null;
log.error("Exception: No valid guidelines");
new Exception("Validation Job stopped unexpectedly. No valid guidelines were provided.");
}
return profile;
} }
@ -236,10 +310,8 @@ public class ValidationController {
List<RuleInfo> resultRules = null; List<RuleInfo> resultRules = null;
List<RuleInfo> fairRules = null; List<RuleInfo> fairRules = null;
AbstractOpenAireProfile profile = null; AbstractOpenAireProfile profile = initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = null; AbstractOpenAireProfile fairProfile = initializeFairProfile(guidelinesProfileName);
profile = initializeProfile(guidelinesProfileName, profile, fairProfile);
validationJob.guidelines = profile.name(); validationJob.guidelines = profile.name();
System.out.println("Initial validation job "+ validationJob + " | " + validationJob.hashCode() + "\n"); System.out.println("Initial validation job "+ validationJob + " | " + validationJob.hashCode() + "\n");
@ -249,7 +321,7 @@ public class ValidationController {
try { try {
List<String> recordXmls = extractRecordXmls(OAIPMHResponse); List<String> recordXmls = extractRecordXmls(OAIPMHResponse);
List<ValidationJobResult> validationJobResults = new ArrayList<>(); List<ValidationRuleResult> validationRuleResults = new ArrayList<>();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); DocumentBuilder db = dbf.newDocumentBuilder();
@ -264,21 +336,19 @@ public class ValidationController {
Map<String, Guideline.Result> results = validationResult.results(); Map<String, Guideline.Result> results = validationResult.results();
for (Map.Entry entry : results.entrySet()) { for (Map.Entry entry : results.entrySet()) {
ValidationJobResult validationJobResult = new ValidationJobResult(); ValidationRuleResult validationRuleResult = new ValidationRuleResult();
validationJobResult.validationJobId = validationJob.id; validationRuleResult.validationJobId = validationJob.id;
validationJobResult.ruleName = entry.getKey().toString(); validationRuleResult.ruleName = entry.getKey().toString();
validationJobResult.recordUrl = "localhost://records/record["+record+"]"; // silly id validationRuleResult.recordUrl = "localhost://records/record["+record+"]"; // silly id
Guideline.Result engineResult = (Guideline.Result) entry.getValue(); Guideline.Result engineResult = (Guideline.Result) entry.getValue();
validationJobResult.score = engineResult.score(); validationRuleResult.score = engineResult.score();
validationJobResult.status = engineResult.status().toString(); validationRuleResult.status = engineResult.status().toString();
validationJobResult.internalError = engineResult.internalError(); validationRuleResult.internalError = engineResult.internalError();
resultSum += engineResult.score(); System.out.println(validationRuleResult + " | " + validationRuleResult.hashCode() + "\n");
validationResultRepository.save(validationRuleResult);
validationJobResult.warnings = ((List<String>) engineResult.warnings()).toArray(new String[0]); validationRuleResults.add(validationRuleResult);
validationJobResult.errors = ((List<String>) engineResult.errors()).toArray(new String[0]); resultSum += engineResult.score();
System.out.println(validationJobResult + " | " + validationJobResult.hashCode() + "\n");
validationResultRepository.save(validationJobResult);
validationJobResults.add(validationJobResult);
} }
@ -306,12 +376,89 @@ public class ValidationController {
//xmlValidationResponse.setFairRules(fairRules); //xmlValidationResponse.setFairRules(fairRules);
} }
@RequestMapping(value = {"/getResultsByJobId"}, method = RequestMethod.POST, @RequestMapping(value = {"/getResultsByJobId"}, method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)
public List<SummaryResult> getJobResults(@RequestParam(name = "jobId") String jobId){ public List<SummaryResult> getJobResults(@RequestParam(name = "jobId") int jobId){
System.out.println(validationResultRepository.getSummaryResult().toString()); System.out.println(validationResultRepository.getSummaryResult(jobId).toString());
System.out.println("\n\n\n\n\n" + validationResultRepository.getSummaryResult().get(0)); System.out.println("\n\n\n\n\n" + validationResultRepository.getSummaryResult(jobId).get(0));
return validationResultRepository.getSummaryResult(); return validationResultRepository.getSummaryResult(jobId);
}
/*
@RequestMapping(value = {"getErrors"}, method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, List<String>> getErrors(@RequestParam(name = "jobId") int jobId, @RequestParam(name = "ruleName") String ruleName){
List<Object[]> resultList = validationIssueRepository.getErrorsRecordUrls(jobId, ruleName);
Map<String, List<String>> recordUrlsByIssueText = new HashMap<>();
for (Object[] result : resultList) {
String issueText = (String) result[0];
String recordUrl = (String) result[1];
List<String> recordUrls = recordUrlsByIssueText.get(issueText);
if (recordUrls == null) {
recordUrls = new ArrayList<>();
recordUrlsByIssueText.put(issueText, recordUrls);
}
recordUrls.add(recordUrl);
}
System.out.println("issues " + recordUrlsByIssueText.keySet());
return recordUrlsByIssueText;
}*/
@RequestMapping(value = {"getRecordsByRule"}, method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public List<ValidationIssue> getRecordsByRule(@RequestParam(name = "jobId") int jobId, @RequestParam(name = "ruleName") String ruleName){
return validationIssueRepository.getErrors(jobId, ruleName);
}
@RequestMapping(value = {"getErrorsReport"}, method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, List<String>> getErrors(@RequestParam(name = "jobId") int jobId){
List<Object[]> resultList = validationIssueRepository.getAllErrorsRecordUrls(jobId);
Map<String, List<String>> recordUrlsByIssueText = new HashMap<>();
for (Object[] result : resultList) {
String issueText = (String) result[0];
String recordUrl = (String) result[1];
List<String> recordUrls = recordUrlsByIssueText.get(issueText);
if (recordUrls == null) {
recordUrls = new ArrayList<>();
recordUrlsByIssueText.put(issueText, recordUrls);
}
recordUrls.add(recordUrl);
}
System.out.println("issues " + recordUrlsByIssueText.keySet());
return recordUrlsByIssueText;
}
@RequestMapping(value = {"getWarningsReport"}, method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public Map<String, List<String>> getWarningsReport(@RequestParam(name = "jobId") int jobId, @RequestParam(name = "ruleName") String ruleName){
List<Object[]> resultList = validationIssueRepository.getAllWarningsRecordUrls(jobId);
Map<String, List<String>> recordUrlsByIssueText = new HashMap<>();
for (Object[] result : resultList) {
String issueText = (String) result[0];
String recordUrl = (String) result[1];
List<String> recordUrls = recordUrlsByIssueText.get(issueText);
if (recordUrls == null) {
recordUrls = new ArrayList<>();
recordUrlsByIssueText.put(issueText, recordUrls);
}
recordUrls.add(recordUrl);
}
System.out.println("issues " + recordUrlsByIssueText.keySet());
return recordUrlsByIssueText;
} }
public List<String> extractRecordXmls(String xml) throws Exception { public List<String> extractRecordXmls(String xml) throws Exception {

View File

@ -10,27 +10,21 @@ public class SummaryResult {
@Id @Id
String rule_name; String rule_name;
String rule_weight; int rule_weight;
long passed_records; long passed_records;
long failed_records; long failed_records;
long errors;
long warnings;
public SummaryResult(String rule_name, long passed_records, long failed_records, long errors, long warnings) { public SummaryResult(String rule_name, long passed_records, long failed_records) {
this.rule_name = rule_name; this.rule_name = rule_name;
this.passed_records = passed_records; this.passed_records = passed_records;
this.failed_records = failed_records; this.failed_records = failed_records;
this.errors = errors;
this.warnings = warnings;
} }
public SummaryResult(String rule_name, String rule_weight, long passed_records, long failed_records, long errors, long warnings) { public SummaryResult(String rule_name, int rule_weight, long passed_records, long failed_records) {
this.rule_name = rule_name; this.rule_name = rule_name;
this.rule_weight = rule_weight; this.rule_weight = rule_weight;
this.passed_records = passed_records; this.passed_records = passed_records;
this.failed_records = failed_records; this.failed_records = failed_records;
this.errors = errors;
this.warnings = warnings;
} }
public String getRule_name() { public String getRule_name() {
@ -41,11 +35,11 @@ public class SummaryResult {
this.rule_name = rule_name; this.rule_name = rule_name;
} }
public String getRule_weight() { public int getRule_weight() {
return rule_weight; return rule_weight;
} }
public void setRule_weight(String rule_weight) { public void setRule_weight(int rule_weight) {
this.rule_weight = rule_weight; this.rule_weight = rule_weight;
} }
@ -65,22 +59,6 @@ public class SummaryResult {
this.failed_records = failed_records; this.failed_records = failed_records;
} }
public long getErrors() {
return errors;
}
public void setErrors(long errors) {
this.errors = errors;
}
public long getWarnings() {
return warnings;
}
public void setWarnings(long warnings) {
this.warnings = warnings;
}
@Override @Override
public String toString() { public String toString() {
return "SummaryResult{" + return "SummaryResult{" +
@ -88,8 +66,6 @@ public class SummaryResult {
", rule_weight=" + rule_weight + ", rule_weight=" + rule_weight +
", passed_records=" + passed_records + ", passed_records=" + passed_records +
", failed_records=" + failed_records + ", failed_records=" + failed_records +
", errors=" + errors +
", warnings=" + warnings +
'}'; '}';
} }

View File

@ -0,0 +1,79 @@
package eu.dnetlib.validatorapi.entities;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name="validation_issues")
@IdClass(ValidationIssue.class)
public class ValidationIssue implements Serializable {
@Id
@Column(name = "validation_job_id")
public int validationJobId;
@Id
@Column(name = "rule_name")
public String ruleName;
@Id
@Column(name = "record_url")
public String recordUrl;
@Id
@Column(name = "issue_text")
public String issueText;
@Column(name = "issue_type")
public String issueType;
public int getValidationJobId() {
return validationJobId;
}
public void setValidationJobId(int validationJobId) {
this.validationJobId = validationJobId;
}
public String getRuleName() {
return ruleName;
}
public void setRuleName(String ruleName) {
this.ruleName = ruleName;
}
public String getRecordUrl() {
return recordUrl;
}
public void setRecordUrl(String recordUrl) {
this.recordUrl = recordUrl;
}
public String getIssueText() {
return issueText;
}
public void setIssueText(String issueText) {
this.issueText = issueText;
}
public String getIssueType() {
return issueType;
}
public void setIssueType(String issueType) {
this.issueType = issueType;
}
@Override
public String toString() {
return "ValidationIssue{" +
"validationJobId=" + validationJobId +
", ruleName='" + ruleName + '\'' +
", recordUrl='" + recordUrl + '\'' +
", issueText='" + issueText + '\'' +
", issueType='" + issueType + '\'' +
'}';
}
}

View File

@ -1,7 +1,5 @@
package eu.dnetlib.validatorapi.entities; package eu.dnetlib.validatorapi.entities;
import eu.dnetlib.validator2.validation.guideline.Guideline;
import javax.persistence.*; import javax.persistence.*;
import java.util.Date; import java.util.Date;

View File

@ -1,17 +1,12 @@
package eu.dnetlib.validatorapi.entities; package eu.dnetlib.validatorapi.entities;
import eu.dnetlib.validator2.engine.Status;
import eu.dnetlib.validator2.validation.XMLApplicationProfile;
import org.hibernate.annotations.Type;
import javax.persistence.*; import javax.persistence.*;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
@Entity @Entity
@Table(name="validation_results") @Table(name="validation_results")
@IdClass(ValidationJobResult.class) @IdClass(ValidationRuleResult.class)
public class ValidationJobResult implements Serializable { public class ValidationRuleResult implements Serializable {
@Id @Id
@Column(name = "validation_job_id") @Column(name = "validation_job_id")
@ -23,36 +18,31 @@ public class ValidationJobResult implements Serializable {
@Id @Id
@Column(name = "rule_weight") @Column(name = "rule_weight")
public String ruleWeight; public int ruleWeight;
@Id @Id
@Column(name = "record_url") @Column(name = "record_url")
public String recordUrl; public String recordUrl;
//not in use yet
@Column(name = "warnings", columnDefinition = "text[]")
@Type(type = "eu.dnetlib.validatorapi.utils.CustomStringArrayType")
public String[] warnings;
@Column(name = "errors", columnDefinition = "text[]")
@Type(type = "eu.dnetlib.validatorapi.utils.CustomStringArrayType")
public String[] errors;
@Column(name = "internal_error") @Column(name = "internal_error")
public String internalError; public String internalError;
@Column(name = "status") @Column(name = "status")
public String status; public String status;
@Column(name = "score") @Column(name = "score")
public double score; public double score;
public ValidationJobResult() {} public ValidationRuleResult() {}
@Override @Override
public String toString() { public String toString() {
return "ValidationJobResult{" + return "ValidationJobResult{" +
", warnings=" + warnings + "validationJobId=" + validationJobId +
", errors=" + errors + ", ruleName='" + ruleName + '\'' +
", ruleWeight='" + ruleWeight + '\'' +
", recordUrl='" + recordUrl + '\'' +
", internalError='" + internalError + '\'' + ", internalError='" + internalError + '\'' +
", status='" + status + '\'' + ", status='" + status + '\'' +
", score=" + score + ", score=" + score +

View File

@ -0,0 +1,46 @@
package eu.dnetlib.validatorapi.repositories;
import eu.dnetlib.validatorapi.entities.SummaryResult;
import eu.dnetlib.validatorapi.entities.ValidationIssue;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository
public interface ValidationIssueRepository extends JpaRepository<ValidationIssue, Long> {
@Query(value = "SELECT vi.issueText, vi.recordUrl " +
"FROM ValidationIssue vi " +
"WHERE (vi.issueType = 'WARNING' AND vi.validationJobId =:id AND vi.ruleName =:ruleName)" +
"GROUP BY vi.issueText, vi.recordUrl")
List<ValidationIssue> getWarnings(@Param("id") int validationJobId, @Param("ruleName") String ruleName);
@Query(value = "SELECT vi.issueText, vi.recordUrl " +
"FROM ValidationIssue vi " +
"WHERE (vi.issueType = 'ERROR' AND vi.validationJobId =:id AND vi.ruleName =:ruleName)" +
"GROUP BY vi.issueText, vi.recordUrl")
List<ValidationIssue> getErrors(@Param("id") int validationJobId, @Param("ruleName") String ruleName);
@Query(value = "SELECT vi.issueText, vi.recordUrl " +
"FROM ValidationIssue vi " +
"WHERE (vi.issueType = 'ERROR' AND vi.validationJobId =:id)" +
"GROUP BY vi.issueText, vi.recordUrl")
List<Object[]> getAllErrorsRecordUrls(@Param("id") int validationJobId);
@Query(value = "SELECT vi.issueText, vi.recordUrl " +
"FROM ValidationIssue vi " +
"WHERE (vi.issueType = 'WARNING' AND vi.validationJobId =:id)" +
"GROUP BY vi.issueText, vi.recordUrl")
List<Object[]> getAllWarningsRecordUrls(@Param("id") int validationJobId);
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.validatorapi.repository; package eu.dnetlib.validatorapi.repositories;
import eu.dnetlib.validatorapi.entities.ValidationJob; import eu.dnetlib.validatorapi.entities.ValidationJob;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;

View File

@ -1,23 +1,22 @@
package eu.dnetlib.validatorapi.repository; package eu.dnetlib.validatorapi.repositories;
import eu.dnetlib.validatorapi.entities.SummaryResult; import eu.dnetlib.validatorapi.entities.SummaryResult;
import eu.dnetlib.validatorapi.entities.ValidationJobResult; import eu.dnetlib.validatorapi.entities.ValidationRuleResult;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@Repository @Repository
public interface ValidationResultRepository extends JpaRepository<ValidationJobResult, Long> { public interface ValidationResultRepository extends JpaRepository<ValidationRuleResult, Long> {
@Query(value = @Query(value =
"SELECT NEW eu.dnetlib.validatorapi.entities.SummaryResult(sr.ruleName, sr.ruleWeight," + "SELECT NEW eu.dnetlib.validatorapi.entities.SummaryResult(sr.ruleName, sr.ruleWeight," +
"COUNT(CASE WHEN sr.status = 'SUCCESS' THEN 1 END) AS passed_records, " + "COUNT(CASE WHEN sr.status = 'SUCCESS' THEN 1 END) AS passed_records, " +
"COUNT(CASE WHEN sr.status = 'FAILURE' THEN 1 END) AS failed_records, " + "COUNT(CASE WHEN sr.status = 'FAILURE' THEN 1 END) AS failed_records) " +
"COUNT(CASE WHEN array_length(sr.errors, 1) > 0 THEN 1 END) AS errors, " + "FROM ValidationRuleResult sr " + "WHERE sr.validationJobId = :id " +
"COUNT(CASE WHEN array_length(sr.warnings, 1) > 0 THEN 1 END) AS warnings) " +
"FROM ValidationJobResult sr " +
"GROUP BY sr.ruleName, sr.ruleWeight") "GROUP BY sr.ruleName, sr.ruleWeight")
List<SummaryResult> getSummaryResult(); List<SummaryResult> getSummaryResult(@Param("id") int validationJobId);
} }