resource-registry/src/main/java/org/gcube/informationsystem/resourceregistry/types/entities/EntityTypeDefinitionManagem...

194 lines
6.6 KiB
Java
Raw Normal View History

2020-01-27 17:04:45 +01:00
package org.gcube.informationsystem.resourceregistry.types.entities;
2019-11-08 12:29:32 +01:00
import java.util.HashMap;
2020-07-07 17:15:22 +02:00
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.informationsystem.base.reference.AccessType;
import org.gcube.informationsystem.resourceregistry.api.exceptions.AlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
2019-11-08 12:29:32 +01:00
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.EntityAlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaAlreadyPresentException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException;
2020-01-27 17:07:37 +01:00
import org.gcube.informationsystem.resourceregistry.contexts.ContextUtility;
import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext;
import org.gcube.informationsystem.resourceregistry.dbinitialization.DatabaseEnvironment;
2021-02-10 15:54:52 +01:00
import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagementUtility;
import org.gcube.informationsystem.resourceregistry.instances.base.entities.EntityElementManagement;
2019-11-08 12:29:32 +01:00
import org.gcube.informationsystem.resourceregistry.utils.Utility;
import org.gcube.informationsystem.types.TypeMapper;
import org.gcube.informationsystem.types.reference.entities.EntityType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.orientechnologies.orient.core.record.OVertex;
2019-11-08 12:29:32 +01:00
import com.orientechnologies.orient.core.sql.executor.OResult;
import com.orientechnologies.orient.core.sql.executor.OResultSet;
2021-01-20 17:08:59 +01:00
/**
* @author Luca Frosini (ISTI - CNR)
*/
public abstract class EntityTypeDefinitionManagement<E extends EntityType> extends EntityElementManagement<E> {
2019-11-08 12:29:32 +01:00
private static Logger logger = LoggerFactory.getLogger(EntityTypeDefinitionManagement.class);
protected String name;
2020-01-23 17:15:02 +01:00
protected EntityTypeDefinitionManagement(Class<E> clz) {
super(AccessType.ENTITY_TYPE);
this.elementType = TypeMapper.getType(clz);
}
2019-11-08 13:14:56 +01:00
@Override
protected SecurityContext getWorkingContext() throws ResourceRegistryException {
if(workingContext == null) {
workingContext = ContextUtility.getInstance()
.getSecurityContextByUUID(DatabaseEnvironment.SCHEMA_SECURITY_CONTEXT_UUID);
}
return workingContext;
}
2019-11-08 12:29:32 +01:00
public void setName(String name) {
this.name = name;
}
public String getName() {
if(name == null) {
if(element == null) {
if(jsonNode != null) {
name = jsonNode.get(EntityType.NAME_PROPERTY).asText();
}
} else {
name = element.getProperty(EntityType.NAME_PROPERTY);
}
}
return name;
}
2019-11-08 13:14:56 +01:00
@Override
2021-02-16 18:43:47 +01:00
public JsonNode createCompleteJsonNode() throws ResourceRegistryException {
return serializeSelf().deepCopy();
2019-11-08 13:14:56 +01:00
}
@Override
protected OVertex reallyCreate() throws AlreadyPresentException, ResourceRegistryException {
logger.debug("Going to create {} for {}", this.elementType, getName());
2019-11-08 13:14:56 +01:00
return createVertex();
}
@Override
protected OVertex reallyUpdate() throws NotFoundException, ResourceRegistryException {
logger.debug("Going to update {} for {}", this.elementType, getName());
2019-11-08 13:14:56 +01:00
OVertex entityTypeDefinition = getElement();
2021-02-08 16:26:58 +01:00
entityTypeDefinition = (OVertex) updateProperties(oClass, entityTypeDefinition, jsonNode,
2019-11-08 13:14:56 +01:00
ignoreKeys, ignoreStartWithKeys);
return entityTypeDefinition;
}
@Override
protected boolean reallyDelete() throws NotFoundException, ResourceRegistryException {
logger.debug("Going to remove {} for {}", this.elementType, getName());
2019-11-08 13:14:56 +01:00
getElement().delete();
return true;
}
2019-11-08 12:29:32 +01:00
@Override
public OVertex getElement() throws NotFoundException, ResourceRegistryException {
if(element == null) {
try {
element = retrieveElement();
} catch(NotFoundException e) {
throw e;
} catch(ResourceRegistryException e) {
throw e;
} catch(Exception e) {
throw new ResourceRegistryException(e);
}
} else {
if(reload) {
element.reload();
}
}
return element;
}
@Override
public OVertex retrieveElement() throws NotFoundException, ResourceRegistryException {
try {
if(getName() == null) {
throw new NotFoundException("null name does not allow to retrieve the Element");
}
String select = "SELECT FROM " + elementType + " WHERE " + EntityType.NAME_PROPERTY + " = \""
2019-11-08 13:14:56 +01:00
+ getName() + "\"";
2019-11-08 12:29:32 +01:00
OResultSet resultSet = oDatabaseDocument.query(select, new HashMap<>());
if(resultSet == null || !resultSet.hasNext()) {
String error = String.format("No %s with name %s was found", elementType, getName());
logger.info(error);
throw new NotFoundException(error);
}
OResult oResult = resultSet.next();
2021-02-10 15:54:52 +01:00
OVertex element = (OVertex) ElementManagementUtility.getElementFromOptional(oResult.getElement());
2019-11-08 12:29:32 +01:00
logger.trace("{} with id {} is : {}", elementType, getName(), Utility.toJsonString(element, true));
if(resultSet.hasNext()) {
throw new ResourceRegistryException("Found more than one " + elementType + " with name " + getName()
+ ". This is a fatal error please contact Admnistrator");
}
return element;
} catch(NotFoundException e) {
throw getSpecificElementNotFoundException(e);
} catch(ResourceRegistryException e) {
throw e;
} catch(Exception e) {
throw new ResourceRegistryException(e);
}
}
@Override
protected OVertex createVertex() throws EntityAlreadyPresentException, ResourceRegistryException {
logger.trace("Going to create {} for {} ({}) using {}", OVertex.class.getSimpleName(), accessType.getName(),
elementType, jsonNode);
try {
this.element = oDatabaseDocument.newVertex(elementType);
2021-02-08 16:26:58 +01:00
updateProperties(oClass, element, jsonNode, ignoreKeys, ignoreStartWithKeys);
2019-11-08 12:29:32 +01:00
2019-11-08 13:14:56 +01:00
logger.info("Created {} is {}", OVertex.class.getSimpleName(), Utility.toJsonString(element, true));
2019-11-08 12:29:32 +01:00
return element;
} catch(ResourceRegistryException e) {
throw e;
} catch(Exception e) {
logger.trace("Error while creating {} for {} ({}) using {}", OVertex.class.getSimpleName(),
accessType.getName(), elementType, jsonNode, e);
throw new ResourceRegistryException("Error Creating " + elementType + " with " + jsonNode, e.getCause());
}
}
@Override
2019-11-08 13:14:56 +01:00
public String reallyGetAll(boolean polymorphic) throws ResourceRegistryException {
throw new UnsupportedOperationException();
}
@Override
2019-11-08 13:14:56 +01:00
protected NotFoundException getSpecificElementNotFoundException(NotFoundException e) {
return new SchemaNotFoundException(e.getMessage(), e.getCause());
}
@Override
2019-11-08 13:14:56 +01:00
protected AlreadyPresentException getSpecificERAlreadyPresentException(String message) {
return new SchemaAlreadyPresentException(message);
}
}