159 lines
7.3 KiB
Java
159 lines
7.3 KiB
Java
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.api.rest.SharingPath.SharingOperation;
|
|
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);
|
|
|
|
for(UUID uuid : expectedInstances.keySet()) {
|
|
String type = expectedInstances.get(uuid).get(Element.CLASS_PROPERTY).asText();
|
|
ElementManagement<?> elementManagement = ElementManagementUtility.getERManagement(type);
|
|
elementManagement.setWorkingContext(adminSecurityContext);
|
|
elementManagement.setoDatabaseDocument(oDatabaseDocument);
|
|
elementManagement.setUUID(uuid);
|
|
elementManagement.setElementType(type);
|
|
((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false);
|
|
((ERManagement) elementManagement).setDryRunContextSharing(dryRun);
|
|
((ERManagement) elementManagement).internalAddToContext(targetSecurityContext);
|
|
((ERManagement) elementManagement).sanityCheck(expectedInstances);
|
|
}
|
|
|
|
/*
|
|
Map<UUID,JsonNode> expectedAdditionaInstances = new HashMap<>();
|
|
SharingOperationValidator operationValidator = new SharingOperationValidator(expectedInstances, SharingOperation.ADD);
|
|
|
|
if(operationValidator.isValidOperation(affectedInstances)) {
|
|
oDatabaseDocument.commit();
|
|
}
|
|
*/
|
|
|
|
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.
|
|
* So no need to collect affected isntance and expected instance can be returned.
|
|
*/
|
|
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);
|
|
|
|
Map<UUID,JsonNode> affectedInstances = new HashMap<>();
|
|
|
|
for(UUID uuid : expectedInstances.keySet()) {
|
|
String type = expectedInstances.get(uuid).get(Element.CLASS_PROPERTY).asText();
|
|
ElementManagement<?> elementManagement = ElementManagementUtility.getERManagement(type);
|
|
elementManagement.setWorkingContext(adminSecurityContext);
|
|
elementManagement.setoDatabaseDocument(oDatabaseDocument);
|
|
elementManagement.setUUID(uuid);
|
|
((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false);
|
|
((ERManagement) elementManagement).setDryRunContextSharing(dryRun);
|
|
|
|
affectedInstances.putAll(((ERManagement) elementManagement).internalRemoveFromContext(targetSecurityContext));
|
|
|
|
((ERManagement) elementManagement).sanityCheck(expectedInstances);
|
|
}
|
|
|
|
SharingOperationValidator operationValidator = new SharingOperationValidator(expectedInstances, SharingOperation.REMOVE);
|
|
|
|
if(operationValidator.isValidOperation(affectedInstances)) {
|
|
oDatabaseDocument.commit();
|
|
}
|
|
|
|
staticLogger.info("{} successfully removed from Context with UUID {} not following Propagation Constraints", instances, contextUUID);
|
|
|
|
return affectedInstances;
|
|
} 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();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|