Added facet schema validation

This commit is contained in:
Luca Frosini 2021-02-22 11:19:11 +01:00
parent f767fc021a
commit b276fecdc8
1 changed files with 62 additions and 3 deletions

View File

@ -1,5 +1,7 @@
package org.gcube.informationsystem.resourceregistry.instances.model.entities;
import java.util.Set;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.informationsystem.base.reference.AccessType;
import org.gcube.informationsystem.model.reference.entities.Facet;
@ -8,6 +10,11 @@ import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegis
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetAlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetAvailableInAnotherContextException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.facet.FacetNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaViolationException;
import org.gcube.informationsystem.resourceregistry.types.CachedType;
import org.gcube.informationsystem.resourceregistry.types.TypesCache;
import org.gcube.informationsystem.types.reference.entities.FacetType;
import org.gcube.informationsystem.types.reference.properties.PropertyDefinition;
import com.orientechnologies.orient.core.record.OVertex;
@ -58,10 +65,62 @@ public class FacetManagement extends EntityManagement<Facet> {
getElement().delete();
return true;
}
private String getNotNullErrorMessage(String fieldName) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("The type ");
stringBuffer.append(typeName);
stringBuffer.append(" defines the fields ");
stringBuffer.append(fieldName);
stringBuffer.append(" as not nullable. Null or no value has been provided instead.");
return stringBuffer.toString();
}
private String getMandatoryErrorMessage(String fieldName) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("The type ");
stringBuffer.append(typeName);
stringBuffer.append(" defines the fields ");
stringBuffer.append(fieldName);
stringBuffer.append(" as mandatory but no value has been provided.");
return stringBuffer.toString();
}
@Override
public void sanityCheck() throws ResourceRegistryException {
// TODO Auto-generated method stub
public void sanityCheck() throws SchemaViolationException, ResourceRegistryException {
// OrientDB distributed mode does not support
// mandatory and notnull constraints due to technical problem
// https://www.orientdb.com/docs/last/java/Graph-Schema-Property.html#using-constraints
// Going to validate them here
JsonNode facetInstance = createCompleteJsonNode();
TypesCache typesCache = TypesCache.getInstance();
CachedType cachedType = typesCache.getCachedType(typeName);
FacetType facetType = (FacetType) cachedType.getType();
Set<PropertyDefinition> definedProperties = facetType.getProperties();
for(PropertyDefinition propertyDefinition : definedProperties) {
String fieldName = propertyDefinition.getName();
if(propertyDefinition.isMandatory() && !facetInstance.has(fieldName)) {
if(propertyDefinition.isNotnull()) {
// If the field is mandatory but null value is accepted I add the
// field as null value
element.setProperty(fieldName, null);
} else {
throw new SchemaViolationException(getMandatoryErrorMessage(fieldName));
}
}
JsonNode jsonNode = facetInstance.get(fieldName);
if(!propertyDefinition.isNotnull() && jsonNode==null) {
throw new SchemaViolationException(getNotNullErrorMessage(fieldName));
}
// leaving the rest of validation to OrientDB
}
}