resource-registry/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/ERManagementUtility.java

187 lines
8.4 KiB
Java
Raw Normal View History

2021-02-05 17:50:16 +01:00
package org.gcube.informationsystem.resourceregistry.instances.model;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.informationsystem.base.reference.Element;
import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.context.ContextException;
import org.gcube.informationsystem.resourceregistry.contexts.ContextUtility;
import org.gcube.informationsystem.resourceregistry.contexts.security.AdminSecurityContext;
import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext;
import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext.PermissionMode;
import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagement;
import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagementUtility;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
public class ERManagementUtility {
private static Logger staticLogger = LoggerFactory.getLogger(ERManagementUtility.class);
public static Map<UUID,JsonNode> addToContextNoPropagationConstraint(Map<UUID, JsonNode> expectedInstances, UUID contextUUID, boolean dryRun)
throws NotFoundException, ContextException, ResourceRegistryException {
Set<UUID> instances = expectedInstances.keySet();
staticLogger.info("Going to add {} to Context with UUID {} not following Propagation Constraints", instances, contextUUID);
ODatabaseDocument current = ContextUtility.getCurrentODatabaseDocumentFromThreadLocal();
ODatabaseDocument oDatabaseDocument = null;
try {
AdminSecurityContext adminSecurityContext = ContextUtility.getAdminSecurityContext();
oDatabaseDocument = adminSecurityContext.getDatabaseDocument(PermissionMode.WRITER);
oDatabaseDocument.begin();
SecurityContext targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID);
2021-02-23 14:44:37 +01:00
// Map<UUID, JsonNode> enforcedInstances = new HashMap<>();
2021-02-22 16:36:19 +01:00
Map<UUID, ElementManagement<?,?>> instancesManagement = new HashMap<>();
2021-02-23 14:44:37 +01:00
Set<UUID> uuids = expectedInstances.keySet();
for(UUID uuid : uuids) {
2021-02-05 17:50:16 +01:00
String type = expectedInstances.get(uuid).get(Element.CLASS_PROPERTY).asText();
2021-02-22 16:36:19 +01:00
ElementManagement<?,?> elementManagement = ElementManagementUtility.getERManagement(type);
2021-02-10 15:45:48 +01:00
elementManagement.setWorkingContext(adminSecurityContext);
2021-02-23 14:44:37 +01:00
elementManagement.setODatabaseDocument(oDatabaseDocument);
2021-02-05 17:50:16 +01:00
elementManagement.setUUID(uuid);
elementManagement.setElementType(type);
elementManagement.setDryRun(dryRun);
2021-02-05 17:50:16 +01:00
((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false);
2021-02-23 14:44:37 +01:00
// enforcedInstances.putAll(((ERManagement) elementManagement).internalAddToContext(targetSecurityContext));
((ERManagement) elementManagement).setTargetSecurityContext(targetSecurityContext);
((ERManagement) elementManagement).internalAddToContext();
2021-02-19 19:32:23 +01:00
instancesManagement.put(uuid, elementManagement);
}
2021-02-23 14:44:37 +01:00
/*
for(UUID uuid : uuids) {
2021-02-22 16:36:19 +01:00
ElementManagement<?,?> elementManagement = instancesManagement.get(uuid);
2021-02-23 14:44:37 +01:00
((ERManagement) elementManagement).contextSanityCheck(targetSecurityContext, expectedInstances);
2021-02-05 17:50:16 +01:00
}
2021-02-23 14:44:37 +01:00
*/
2021-02-05 17:50:16 +01:00
/*
SharingOperationValidator operationValidator = new SharingOperationValidator(expectedInstances, SharingOperation.ADD);
2021-02-23 14:44:37 +01:00
if(operationValidator.isValidOperation(enforcedInstances)) {
2021-02-05 17:50:16 +01:00
oDatabaseDocument.commit();
}
*/
2021-02-23 14:44:37 +01:00
oDatabaseDocument.activateOnCurrentThread();
2021-02-05 17:50:16 +01:00
oDatabaseDocument.commit();
staticLogger.info("{} successfully added to Context with UUID {} not following Propagation Constraints", instances, contextUUID);
/*
* Without following the propagation constraint no instances are enforced to be added
* to the context. The sanity check ensure that the graph is consistent otherwise a
* an exception is raised.
2021-02-19 19:38:10 +01:00
* So no need to collect affected instances and expected instance can be returned.
2021-02-05 17:50:16 +01:00
*/
return expectedInstances;
} catch(ResourceRegistryException e) {
staticLogger.error("Unable to add {} to Context with UUID {} not following Propagation Constraints - Reason is {}", instances, contextUUID, e.getMessage());
if(oDatabaseDocument != null) {
oDatabaseDocument.rollback();
}
throw e;
} catch(Exception e) {
staticLogger.error("Unable to add {} to Context with UUID {} not following Propagation Constraints.", instances, contextUUID, e.getMessage());
if(oDatabaseDocument != null) {
oDatabaseDocument.rollback();
}
throw new ContextException(e);
} finally {
if(oDatabaseDocument != null) {
oDatabaseDocument.close();
}
if(current!=null) {
current.activateOnCurrentThread();
}
}
}
public static Map<UUID,JsonNode> removeFromContextNoPropagationConstraint(Map<UUID, JsonNode> expectedInstances, UUID contextUUID, boolean dryRun)
throws NotFoundException, ContextException, ResourceRegistryException {
Set<UUID> instances = expectedInstances.keySet();
staticLogger.info("Going to remove {} from Context with UUID {} not following Propagation Constraints", instances, contextUUID);
ODatabaseDocument current = ContextUtility.getCurrentODatabaseDocumentFromThreadLocal();
ODatabaseDocument oDatabaseDocument = null;
try {
AdminSecurityContext adminSecurityContext = ContextUtility.getAdminSecurityContext();
oDatabaseDocument = adminSecurityContext.getDatabaseDocument(PermissionMode.WRITER);
oDatabaseDocument.begin();
SecurityContext targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID);
2021-02-23 14:44:37 +01:00
//Map<UUID, JsonNode> enforcedInstances = new HashMap<>();
2021-02-22 16:36:19 +01:00
Map<UUID, ElementManagement<?,?>> instancesManagement = new HashMap<>();
2021-02-05 17:50:16 +01:00
for(UUID uuid : expectedInstances.keySet()) {
String type = expectedInstances.get(uuid).get(Element.CLASS_PROPERTY).asText();
2021-02-22 16:36:19 +01:00
ElementManagement<?,?> elementManagement = ElementManagementUtility.getERManagement(type);
2021-02-10 15:45:48 +01:00
elementManagement.setWorkingContext(adminSecurityContext);
2021-02-23 14:44:37 +01:00
elementManagement.setODatabaseDocument(oDatabaseDocument);
2021-02-05 17:50:16 +01:00
elementManagement.setUUID(uuid);
((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false);
elementManagement.setDryRun(dryRun);
2021-02-23 14:44:37 +01:00
//enforcedInstances.putAll(((ERManagement) elementManagement).internalRemoveFromContext(targetSecurityContext));
((ERManagement) elementManagement).setTargetSecurityContext(targetSecurityContext);
((ERManagement) elementManagement).internalRemoveFromContext();
2021-02-19 19:38:10 +01:00
instancesManagement.put(uuid, elementManagement);
}
for(UUID uuid : expectedInstances.keySet()) {
2021-02-22 16:36:19 +01:00
ElementManagement<?,?> elementManagement = instancesManagement.get(uuid);
2021-02-19 19:38:10 +01:00
// TODO
elementManagement.sanityCheck();
2021-02-05 17:50:16 +01:00
}
2021-02-19 19:32:23 +01:00
/*
2021-02-05 17:50:16 +01:00
SharingOperationValidator operationValidator = new SharingOperationValidator(expectedInstances, SharingOperation.REMOVE);
2021-02-23 14:44:37 +01:00
if(operationValidator.isValidOperation(enforcedInstances)) {
2021-02-05 17:50:16 +01:00
oDatabaseDocument.commit();
}
2021-02-19 19:32:23 +01:00
*/
2021-02-05 17:50:16 +01:00
2021-02-23 14:44:37 +01:00
oDatabaseDocument.commit();
2021-02-05 17:50:16 +01:00
staticLogger.info("{} successfully removed from Context with UUID {} not following Propagation Constraints", instances, contextUUID);
2021-02-19 19:38:10 +01:00
/*
* Without following the propagation constraint no instances are enforced to be added
* to the context. The sanity check ensure that the graph is consistent otherwise a
* an exception is raised.
* So no need to collect affected instances and expected instance can be returned.
*/
return expectedInstances;
2021-02-05 17:50:16 +01:00
} catch(ResourceRegistryException e) {
staticLogger.error("Unable to remove {} from Context with UUID {} not following Propagation Constraints - Reason is {}", instances, contextUUID, e.getMessage());
if(oDatabaseDocument != null) {
oDatabaseDocument.rollback();
}
throw e;
} catch(Exception e) {
staticLogger.error("Unable to remove {} from Context with UUID {} not following Propagation Constraints.", instances, contextUUID, e.getMessage());
if(oDatabaseDocument != null) {
oDatabaseDocument.rollback();
}
throw new ContextException(e);
} finally {
if(oDatabaseDocument != null) {
oDatabaseDocument.close();
}
if(current!=null) {
current.activateOnCurrentThread();
}
}
}
}