Compare commits

...

5 Commits

12 changed files with 226 additions and 205 deletions

View File

@ -68,14 +68,6 @@ public class ReportController {
public List<SummaryResult> getSummaryFromDB(@RequestParam(name = "jobId") int jobId,
@RequestParam(name= "guidelines", required = false) Optional<String> guidelines) {
List<SummaryResult> srlist = summaryValidationJobRepository.findByValidationJobIdOrderByRuleName(jobId);
/* SummaryResult sr = new SummaryResult();
sr.setValidationJobId(jobId);
sr.setRule_name("Access Rights");
System.out.println("\n>>" + summaryValidationJobRepository.findAll());*/
/* for (SummaryResult sr:srlist) {
System.out.println(sr);
}*/
return srlist;
}

View File

@ -13,12 +13,6 @@ public class SummaryResultId implements Serializable {
SummaryResultId that = (SummaryResultId) o;
System.out.println("\n\n\n\n");
System.out.println("Validation job id " + validationJobId);
System.out.println("rule_name " + ruleName);
System.out.println("\n\n\n\n");
if (validationJobId != that.validationJobId) return false;
return ruleName != null ? ruleName.equals(that.ruleName) : that.ruleName == null;
}

View File

@ -2,7 +2,7 @@ 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.validator2.validation.guideline.openaire.AbstractOpenAireProfile;
import eu.dnetlib.validatorapi.entities.*;
import eu.dnetlib.validatorapi.exceptions.ValidationException;
import eu.dnetlib.validatorapi.repositories.SummaryValidationJobRepository;
@ -12,6 +12,8 @@ import eu.dnetlib.validatorapi.repositories.ValidationResultRepository;
import eu.dnetlib.validatorapi.routes.FairOaiPmhRoute2;
import eu.dnetlib.validatorapi.routes.SimpleOaiPmhRoute;
import eu.dnetlib.validatorapi.utils.CheckCertificate;
import eu.dnetlib.validatorapi.utils.PrefixInitializer;
import eu.dnetlib.validatorapi.utils.ProfileInitializer;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ProducerTemplate;
@ -79,8 +81,8 @@ public class ValidationController {
@RequestParam(name="set", required = false) String set, @RequestParam(name="metadataPrefix", defaultValue = "oai_dc") String metadataPrefix,
@RequestParam(name="batchsize", defaultValue = "50") int batchSize) {
AbstractOpenAireProfile profile = initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = initializeFairProfile(guidelinesProfileName);
AbstractOpenAireProfile profile = ProfileInitializer.initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = ProfileInitializer.initializeFairProfile(guidelinesProfileName);
if (profile == null && fairProfile == null) {
log.error("Exception: No valid guidelines");
new Exception("Validation Job stopped unexpectedly. No valid guidelines were provided.");
@ -193,9 +195,9 @@ public class ValidationController {
@RequestParam(name="numberOfRecords", defaultValue = "10") int numberOfRecords,
@RequestParam(name="set", required = false) Optional<String> set) {
AbstractOpenAireProfile profile = initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = initializeFairProfile(guidelinesProfileName);
String metadataPrefix = initializeMetadataPrefix(guidelinesProfileName);
AbstractOpenAireProfile profile = ProfileInitializer.initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = ProfileInitializer.initializeFairProfile(guidelinesProfileName);
String metadataPrefix = PrefixInitializer.initializeMetadataPrefix(guidelinesProfileName);
if (profile == null && fairProfile == null) {
log.error("Exception: No valid guidelines " + guidelinesProfileName + ".");
@ -401,54 +403,7 @@ public class ValidationController {
return "-";
}
private AbstractOpenAireProfile initializeOpenAireProfile(String guidelinesProfileName) {
System.out.println("GUIDELINES " + guidelinesProfileName);
if (guidelinesProfileName.equals("OpenAIRE Guidelines for Data Archives Profile v2")) {
return new DataArchiveGuidelinesV2Profile();
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v3")) {
return new LiteratureGuidelinesV3Profile();
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v4")) {
return new LiteratureGuidelinesV4Profile();
} else if (guidelinesProfileName.equals("OpenAIRE FAIR Guidelines for Data Repositories Profile")) {//in case they give only fair. TODO: is ti possible?
return new FAIR_Data_GuidelinesProfile();
}
return null;
}
private String initializeMetadataPrefix(String guidelinesProfileName) {
if (guidelinesProfileName.equals("OpenAIRE Guidelines for Data Archives Profile v2") ||
guidelinesProfileName.equals("OpenAIRE FAIR Guidelines for Data Repositories Profile")) {
return "oai_datacite";
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v3")) {
return "oai_dc";
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v4")) {
return "oai_openaire";
}
return null;
}
private AbstractOpenAireProfile initializeFairProfile(String guidelinesProfileName) {
if (guidelinesProfileName.equals("OpenAIRE Guidelines for Data Archives Profile v2")) {
return new FAIR_Data_GuidelinesProfile();
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v4")) {
return new FAIR_Literature_GuidelinesV4Profile();
}
return null;
}
private Document parseResponse(InputStream stream)
@ -481,8 +436,8 @@ public class ValidationController {
List<RuleInfo> resultRules = null;
List<RuleInfo> fairRules = null;
AbstractOpenAireProfile profile = initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = initializeFairProfile(guidelinesProfileName);
AbstractOpenAireProfile profile = ProfileInitializer.initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = ProfileInitializer.initializeFairProfile(guidelinesProfileName);
validationJob.guidelines = profile.name();
validationJobRepository.save(validationJob);
@ -581,9 +536,9 @@ public class ValidationController {
//@RequestParam(name="metadataPrefix", defaultValue = "oai_dc") String metadataPrefix
) {
AbstractOpenAireProfile profile = initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = initializeFairProfile(guidelinesProfileName);
String metadataPrefix = initializeMetadataPrefix(guidelinesProfileName);
AbstractOpenAireProfile profile = ProfileInitializer.initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = ProfileInitializer.initializeFairProfile(guidelinesProfileName);
String metadataPrefix = PrefixInitializer.initializeMetadataPrefix(guidelinesProfileName);
String endpoint = "oaipmh://"+baseURL + "?verb=ListRecords&metadataPrefix=" + metadataPrefix;
ProducerTemplate producerTemplate = camelContext.createProducerTemplate();

View File

@ -2,9 +2,12 @@ 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 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.validatorapi.entities.*;
import eu.dnetlib.validatorapi.utils.ProfileInitializer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.*;
@ -35,20 +38,8 @@ public class ValidatorController {
List<RuleInfo> 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();
}
AbstractOpenAireProfile profile = ProfileInitializer.initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = ProfileInitializer.initializeFairProfile(guidelinesProfileName);
if(profile == null && fairProfile == null) {
log.error("Exception: No valid guidelines");
@ -151,6 +142,85 @@ public class ValidatorController {
return xmlValidationResponse;
}
@RequestMapping(value = {"/validateRecord"}, method = RequestMethod.POST)
public XmlValidationResponse validateRecord(@RequestParam(name = "guidelines") String guidelinesProfileName, @RequestBody String xml) {
XmlValidationResponse xmlValidationResponse = new XmlValidationResponse();
AbstractOpenAireProfile profile = ProfileInitializer.initializeOpenAireProfile(guidelinesProfileName);
AbstractOpenAireProfile fairProfile = ProfileInitializer.initializeFairProfile(guidelinesProfileName);
if(profile == null && fairProfile == null) {
log.error("Exception: No valid guidelines");
new Exception("Validation stopped unexpectedly. No valid guidelines were provided.");
}
Map<String, Double> scorePerDoc = new LinkedHashMap<>();
List<ValidationIssue> validationIssues = new ArrayList<>();
List<SummaryResult> summaryResults = new ArrayList<>();
try {
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(xml)));
XMLApplicationProfile.ValidationResult validationResult;
Map<String, Guideline.Result> results;
if (profile != null) {
validationResult = profile.validate("id", doc); //what id is that?
results = validationResult.getResults();
for (Map.Entry entry : results.entrySet()) { //for each rule of the record
final Guideline.Result engineResult = (Guideline.Result) entry.getValue();
String ruleName = entry.getKey().toString();
ValidationRuleResult validationRuleResult = new ValidationRuleResult();
constructXmlValidationResponse(xmlValidationResponse, validationRuleResult, profile.name(),
ruleName, profile, engineResult);
//TODO check if I want a global status
/*if (validationRuleResult.status.equals("FAILURE") || validationRuleResult.internalError!=null) {
this.status = "FAILURE";
}*/
}
}
if (fairProfile != null) {
validationResult = fairProfile.validate("id", doc); //what id is that?
results = validationResult.getResults();
for (Map.Entry entry : results.entrySet()) { //for each rule of the record
final Guideline.Result engineResult = (Guideline.Result) entry.getValue();
String ruleName = entry.getKey().toString();
ValidationRuleResult validationRuleResult = new ValidationRuleResult();
constructXmlValidationResponse(xmlValidationResponse, validationRuleResult, profile.name(),
ruleName, profile, engineResult);
//TODO check if I want a global failure
/*if (validationRuleResult.status.equals("FAILURE") || validationRuleResult.internalError!=null) {
this.status = "FAILURE";
}*/
}
}
}
catch(Exception e) {
log.debug(e.getMessage());
log.debug(e);
e.printStackTrace();
// resultMessages.add("Error processing input");
}
// return resultMessages;
return xmlValidationResponse;
}
@RequestMapping(method = RequestMethod.POST, value = {"/validate-file"})
public List<String> validateXmlImport(@RequestParam("guidelines") String guidelinesProfileName, @RequestParam("file") MultipartFile multipartFile) throws IOException {
String filePath = "src/main/resources/xmlFile.tmp";
@ -209,4 +279,49 @@ public class ValidatorController {
return resultMessages;
}
private XmlValidationResponse constructXmlValidationResponse(XmlValidationResponse xmlValidationResponse, ValidationRuleResult validationRuleResult, String guidelines,
String ruleName, AbstractOpenAireProfile profile, Guideline.Result engineResult) {
SummaryResultWithIssueMessages summaryResult = new SummaryResultWithIssueMessages();
summaryResult.ruleName = ruleName;
summaryResult.validationJobId = -1;
summaryResult.guidelines = guidelines;
validationRuleResult.score = engineResult.getScore();
summaryResult.rule_status = engineResult.getStatus().toString();
summaryResult.passed_records = 1;
if (profile.guideline(ruleName) != null) {
summaryResult.rule_weight = profile.guideline(ruleName).getWeight();
if (profile.guideline(ruleName).getRequirementLevel() != null
&& profile.guideline(ruleName).getRequirementLevel().name()!=null)
summaryResult.requirement_level = profile.guideline(ruleName).getRequirementLevel().name();
if (profile.guideline(ruleName).getDescription() != null)
summaryResult.description = profile.guideline(ruleName).getDescription();
if (profile.guideline(ruleName).getFairPrinciples() != null)
summaryResult.fair_principles = profile.guideline(ruleName).getFairPrinciples();
if (profile.guideline(ruleName).getLink() != null)
summaryResult.link = profile.guideline(ruleName).getLink();
}
summaryResult.internal_error = engineResult.getInternalError();
summaryResult.has_warnings = (engineResult.getWarnings().size()>0);
summaryResult.has_errors = (engineResult.getErrors().size()>0);
xmlValidationResponse.getSummaryResults().add(summaryResult);
for (String error: engineResult.getErrors()) {
ValidationIssue validationIssue = new ValidationIssue(ruleName, error, "ERROR");
summaryResult.issues.add(validationIssue);
}
for (String warning: engineResult.getWarnings()) {
ValidationIssue validationIssue = new ValidationIssue(ruleName, warning, "WARNING");
summaryResult.issues.add(validationIssue);
}
return xmlValidationResponse;
}
}

View File

@ -0,0 +1,8 @@
package eu.dnetlib.validatorapi.entities;
import java.util.ArrayList;
import java.util.List;
public class SummaryResultWithIssueMessages extends SummaryResult {
public List<ValidationIssue> issues = new ArrayList<>();
}

View File

@ -36,6 +36,12 @@ public class ValidationIssue implements Serializable {
this.issueType = issueType;
}
public ValidationIssue(String ruleName, String issueText, String issueType) {
this.ruleName = ruleName;
this.issueText = issueText;
this.issueType = issueType;
}
public long getValidationJobId() {
return validationJobId;
}

View File

@ -1,5 +1,6 @@
package eu.dnetlib.validatorapi.entities;
import java.util.ArrayList;
import java.util.List;
public class XmlValidationResponse {
@ -8,6 +9,8 @@ public class XmlValidationResponse {
List<RuleInfo> rules;
List<RuleInfo> fairRules;
List<SummaryResultWithIssueMessages> summaryResults = new ArrayList<>();
public String getValidationScore() {
return validationScore;
}
@ -39,4 +42,12 @@ public class XmlValidationResponse {
public void setFairRules(List<RuleInfo> fairRules) {
this.fairRules = fairRules;
}
public List<SummaryResultWithIssueMessages> getSummaryResults() {
return summaryResults;
}
public void setSummaryResults(List<SummaryResultWithIssueMessages> summaryResults) {
this.summaryResults = summaryResults;
}
}

View File

@ -29,7 +29,6 @@ public class XmlProcessor implements Processor {
private final AbstractOpenAireProfile profile;
private ValidationJob validationJob;
// private final ValidationIssueRepository validationIssueRepository;
private final long maxNumberOfRecords;
private int processedRecords;
private String status = "SUCCESS";

View File

@ -1,80 +0,0 @@
package eu.dnetlib.validatorapi.utils;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.usertype.UserType;
import java.io.Serializable;
import java.sql.*;
import java.util.Arrays;
public class CustomStringArrayType implements UserType {
@Override
public int[] sqlTypes() {
return new int[]{Types.ARRAY};
}
@Override
public Class returnedClass() {
return String[].class;
}
@Override
public boolean equals(Object o1, Object o2) throws HibernateException {
if (o1 instanceof String[] && o2 instanceof String[]) {
return Arrays.deepEquals((String[])o1, (String[])o2);
} else {
return false;
}
}
@Override
public int hashCode(Object o) throws HibernateException {
return Arrays.hashCode((String[])o);
}
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names,
SharedSessionContractImplementor sharedSessionContractImplementor, Object o)
throws HibernateException, SQLException {
Array array = resultSet.getArray(names[0]);
return array != null ? array.getArray() : null;
}
@Override
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index,
SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException {
if (value != null && preparedStatement != null) {
Array array = sharedSessionContractImplementor.connection().createArrayOf("text", (String[])value);
preparedStatement.setArray(index, array);
} else {
preparedStatement.setNull(index, sqlTypes()[0]);
}
}
@Override
public Object deepCopy(Object o) throws HibernateException {
String[] a = (String[])o;
return Arrays.copyOf(a, a.length);
}
@Override
public boolean isMutable() {
return false;
}
@Override
public Serializable disassemble(Object o) throws HibernateException {
return (Serializable) o;
}
@Override
public Object assemble(Serializable serializable, Object o) throws HibernateException {
return serializable;
}
@Override
public Object replace(Object o, Object o1, Object o2) throws HibernateException {
return o;
}
}

View File

@ -1,35 +0,0 @@
package eu.dnetlib.validatorapi.utils;
import org.apache.camel.AggregationStrategy;
import org.apache.camel.Exchange;
public class ListSetAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
return newExchange;
}
String oldBody = oldExchange.getIn().getBody(String.class);
String newBody = newExchange.getIn().getBody(String.class);
oldExchange.getIn().setBody(oldBody + newBody);
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;
}*/
}

View File

@ -0,0 +1,21 @@
package eu.dnetlib.validatorapi.utils;
public class PrefixInitializer {
public static String initializeMetadataPrefix(String guidelinesProfileName) {
if (guidelinesProfileName.equals("OpenAIRE Guidelines for Data Archives Profile v2") ||
guidelinesProfileName.equals("OpenAIRE FAIR Guidelines for Data Repositories Profile")) {
return "oai_datacite";
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v3")) {
return "oai_dc";
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v4")) {
return "oai_openaire";
}
return null;
}
}

View File

@ -0,0 +1,35 @@
package eu.dnetlib.validatorapi.utils;
import eu.dnetlib.validator2.validation.guideline.openaire.*;
public class ProfileInitializer {
public static AbstractOpenAireProfile initializeOpenAireProfile(String guidelinesProfileName) {
if (guidelinesProfileName.equals("OpenAIRE Guidelines for Data Archives Profile v2")) {
return new DataArchiveGuidelinesV2Profile();
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v3")) {
return new LiteratureGuidelinesV3Profile();
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v4")) {
return new LiteratureGuidelinesV4Profile();
} else if (guidelinesProfileName.equals("OpenAIRE FAIR Guidelines for Data Repositories Profile")) {//in case they give only fair. TODO: is ti possible?
return new FAIR_Data_GuidelinesProfile();
}
return null;
}
public static AbstractOpenAireProfile initializeFairProfile(String guidelinesProfileName) {
if (guidelinesProfileName.equals("OpenAIRE Guidelines for Data Archives Profile v2")) {
return new FAIR_Data_GuidelinesProfile();
} else if (guidelinesProfileName.equals("OpenAIRE Guidelines for Literature Repositories Profile v4")) {
return new FAIR_Literature_GuidelinesV4Profile();
}
return null;
}
}