The target context is now a class variable

This commit is contained in:
Luca Frosini 2021-03-01 17:09:09 +01:00
parent 9cf40bf2fa
commit a6a45d50e2
5 changed files with 65 additions and 36 deletions

View File

@ -21,13 +21,15 @@ public interface ERManagement {
public void setHonourPropagationConstraintsInContextSharing(boolean honourPropagationConstraintsInContextSharing); public void setHonourPropagationConstraintsInContextSharing(boolean honourPropagationConstraintsInContextSharing);
public Map<UUID, JsonNode> internalAddToContext(SecurityContext targetSecurityContext) public Map<UUID, JsonNode> internalAddToContext()
throws ContextException, ResourceRegistryException; throws ContextException, ResourceRegistryException;
public Map<UUID, JsonNode> addToContext(UUID contextUUID) public Map<UUID, JsonNode> addToContext(UUID contextUUID)
throws SchemaViolationException, NotFoundException, ContextException, ResourceRegistryException; throws SchemaViolationException, NotFoundException, ContextException, ResourceRegistryException;
public Map<UUID, JsonNode> internalRemoveFromContext(SecurityContext targetSecurityContext) public void setTargetSecurityContext(SecurityContext targetSecurityContext);
public Map<UUID, JsonNode> internalRemoveFromContext()
throws ContextException, ResourceRegistryException; throws ContextException, ResourceRegistryException;
public Map<UUID, JsonNode> removeFromContext(UUID contextUUID) public Map<UUID, JsonNode> removeFromContext(UUID contextUUID)

View File

@ -52,7 +52,8 @@ public class ERManagementUtility {
((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false); ((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false);
((ERManagement) elementManagement).setDryRunContextSharing(dryRun); ((ERManagement) elementManagement).setDryRunContextSharing(dryRun);
// enforcedInstances.putAll(((ERManagement) elementManagement).internalAddToContext(targetSecurityContext)); // enforcedInstances.putAll(((ERManagement) elementManagement).internalAddToContext(targetSecurityContext));
((ERManagement) elementManagement).internalAddToContext(targetSecurityContext); ((ERManagement) elementManagement).setTargetSecurityContext(targetSecurityContext);
((ERManagement) elementManagement).internalAddToContext();
instancesManagement.put(uuid, elementManagement); instancesManagement.put(uuid, elementManagement);
} }
@ -129,7 +130,8 @@ public class ERManagementUtility {
((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false); ((ERManagement) elementManagement).setHonourPropagationConstraintsInContextSharing(false);
((ERManagement) elementManagement).setDryRunContextSharing(dryRun); ((ERManagement) elementManagement).setDryRunContextSharing(dryRun);
//enforcedInstances.putAll(((ERManagement) elementManagement).internalRemoveFromContext(targetSecurityContext)); //enforcedInstances.putAll(((ERManagement) elementManagement).internalRemoveFromContext(targetSecurityContext));
((ERManagement) elementManagement).internalRemoveFromContext(targetSecurityContext); ((ERManagement) elementManagement).setTargetSecurityContext(targetSecurityContext);
((ERManagement) elementManagement).internalRemoveFromContext();
instancesManagement.put(uuid, elementManagement); instancesManagement.put(uuid, elementManagement);
} }

View File

@ -58,6 +58,11 @@ import com.orientechnologies.orient.core.sql.executor.OResultSet;
*/ */
public abstract class EntityManagement<E extends Entity, ET extends EntityType> extends EntityElementManagement<E, ET> implements ERManagement { public abstract class EntityManagement<E extends Entity, ET extends EntityType> extends EntityElementManagement<E, ET> implements ERManagement {
/**
* The target context of an addToContex/RemoveFromContext
*/
protected SecurityContext targetSecurityContext;
/** /**
* By the default the system execute the the operation of * By the default the system execute the the operation of
* context sharing so this variable is initialised as false. * context sharing so this variable is initialised as false.
@ -105,6 +110,11 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
*/ */
protected boolean honourPropagationConstraintsInContextSharing; protected boolean honourPropagationConstraintsInContextSharing;
@Override
public void setTargetSecurityContext(SecurityContext targetSecurityContext) {
this.targetSecurityContext = targetSecurityContext;
}
public boolean isDryRunContextSharing() { public boolean isDryRunContextSharing() {
return dryRunContextSharing; return dryRunContextSharing;
} }
@ -292,7 +302,7 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
} }
} }
protected Map<UUID,JsonNode> reallyAddToContext(SecurityContext targetSecurityContext) protected Map<UUID,JsonNode> reallyAddToContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
Map<UUID,JsonNode> affectedInstances = new HashMap<>(); Map<UUID,JsonNode> affectedInstances = new HashMap<>();
@ -314,7 +324,8 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
RelationManagement<?,?> relationManagement = getRelationManagement(edge); RelationManagement<?,?> relationManagement = getRelationManagement(edge);
relationManagement.setDryRunContextSharing(dryRunContextSharing); relationManagement.setDryRunContextSharing(dryRunContextSharing);
relationManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); relationManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
affectedInstances.putAll(relationManagement.internalAddToContext(targetSecurityContext)); relationManagement.setTargetSecurityContext(targetSecurityContext);
affectedInstances.putAll(relationManagement.internalAddToContext());
} }
} }
@ -322,10 +333,10 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
} }
@Override @Override
public Map<UUID,JsonNode> internalAddToContext(SecurityContext targetSecurityContext) public Map<UUID,JsonNode> internalAddToContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
try { try {
Map<UUID,JsonNode> affectedInstances = reallyAddToContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = reallyAddToContext();
if(!dryRunContextSharing) { if(!dryRunContextSharing) {
HeaderUtility.updateModifiedByAndLastUpdate(element); HeaderUtility.updateModifiedByAndLastUpdate(element);
element.save(); element.save();
@ -348,9 +359,9 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER); oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER);
oDatabaseDocument.begin(); oDatabaseDocument.begin();
SecurityContext targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID); targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID);
Map<UUID,JsonNode> affectedInstances = internalAddToContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = internalAddToContext();
sanityCheck(); sanityCheck();
@ -382,10 +393,10 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
} }
@Override @Override
public Map<UUID,JsonNode> internalRemoveFromContext(SecurityContext targetSecurityContext) public Map<UUID,JsonNode> internalRemoveFromContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
try { try {
Map<UUID,JsonNode> affectedInstances = reallyRemoveFromContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = reallyRemoveFromContext();
if(!dryRunContextSharing) { if(!dryRunContextSharing) {
HeaderUtility.updateModifiedByAndLastUpdate(element); HeaderUtility.updateModifiedByAndLastUpdate(element);
element.save(); element.save();
@ -400,7 +411,7 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
} }
} }
protected Map<UUID,JsonNode> reallyRemoveFromContext(SecurityContext targetSecurityContext) protected Map<UUID,JsonNode> reallyRemoveFromContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
Map<UUID,JsonNode> affectedInstances = new HashMap<>(); Map<UUID,JsonNode> affectedInstances = new HashMap<>();
@ -412,7 +423,8 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
RelationManagement<?,?> relationManagement = getRelationManagement(edge); RelationManagement<?,?> relationManagement = getRelationManagement(edge);
relationManagement.setDryRunContextSharing(dryRunContextSharing); relationManagement.setDryRunContextSharing(dryRunContextSharing);
relationManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); relationManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
affectedInstances.putAll(relationManagement.internalRemoveFromContext(targetSecurityContext)); relationManagement.setTargetSecurityContext(targetSecurityContext);
affectedInstances.putAll(relationManagement.internalRemoveFromContext());
} }
} }
@ -438,9 +450,9 @@ public abstract class EntityManagement<E extends Entity, ET extends EntityType>
oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER); oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER);
oDatabaseDocument.begin(); oDatabaseDocument.begin();
SecurityContext targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID); targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID);
Map<UUID,JsonNode> affectedInstances = internalRemoveFromContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = internalRemoveFromContext();
sanityCheck(); sanityCheck();

View File

@ -26,7 +26,6 @@ import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resour
import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.entity.resource.ResourceNotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaViolationException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaViolationException;
import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext;
import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext.PermissionMode; import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext.PermissionMode;
import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagementUtility; import org.gcube.informationsystem.resourceregistry.instances.base.ElementManagementUtility;
import org.gcube.informationsystem.resourceregistry.instances.model.relations.ConsistsOfManagement; import org.gcube.informationsystem.resourceregistry.instances.model.relations.ConsistsOfManagement;
@ -244,7 +243,7 @@ public class ResourceManagement extends EntityManagement<Resource, ResourceType>
} }
@Override @Override
protected Map<UUID,JsonNode> reallyAddToContext(SecurityContext targetSecurityContext) protected Map<UUID,JsonNode> reallyAddToContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
Map<UUID,JsonNode> affectedInstances = new HashMap<>(); Map<UUID,JsonNode> affectedInstances = new HashMap<>();
@ -269,7 +268,8 @@ public class ResourceManagement extends EntityManagement<Resource, ResourceType>
RelationManagement<?,?> relationManagement = getRelationManagement(edge); RelationManagement<?,?> relationManagement = getRelationManagement(edge);
relationManagement.setDryRunContextSharing(dryRunContextSharing); relationManagement.setDryRunContextSharing(dryRunContextSharing);
relationManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); relationManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
Map<UUID,JsonNode> resourceCharacterisationInstances = relationManagement.internalAddToContext(targetSecurityContext); relationManagement.setTargetSecurityContext(targetSecurityContext);
Map<UUID,JsonNode> resourceCharacterisationInstances = relationManagement.internalAddToContext();
if(relationManagement instanceof ConsistsOfManagement) { if(relationManagement instanceof ConsistsOfManagement) {
facetCounter = facetCounter + resourceCharacterisationInstances.size(); facetCounter = facetCounter + resourceCharacterisationInstances.size();
} }

View File

@ -57,6 +57,11 @@ import com.orientechnologies.orient.core.record.impl.ODocument;
public abstract class RelationManagement<T extends EntityManagement<? extends Entity, TET>, TET extends EntityType> public abstract class RelationManagement<T extends EntityManagement<? extends Entity, TET>, TET extends EntityType>
extends RelationElementManagement<ResourceManagement, T, ResourceType, TET> implements ERManagement { extends RelationElementManagement<ResourceManagement, T, ResourceType, TET> implements ERManagement {
/**
* The target context of an addToContex/RemoveFromContext
*/
protected SecurityContext targetSecurityContext;
/** /**
* By the default the system execute the the operation of * By the default the system execute the the operation of
* context sharing so this variable is initialised as false. * context sharing so this variable is initialised as false.
@ -104,6 +109,11 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
*/ */
protected boolean honourPropagationConstraintsInContextSharing; protected boolean honourPropagationConstraintsInContextSharing;
@Override
public void setTargetSecurityContext(SecurityContext targetSecurityContext) {
this.targetSecurityContext = targetSecurityContext;
}
public boolean isDryRunContextSharing() { public boolean isDryRunContextSharing() {
return dryRunContextSharing; return dryRunContextSharing;
} }
@ -408,7 +418,7 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
} }
protected Map<UUID,JsonNode> reallyAddToContext(SecurityContext targetSecurityContext) protected Map<UUID,JsonNode> reallyAddToContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
getElement(); getElement();
@ -446,7 +456,8 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
T targetEntityManagement = getTargetEntityManagement(); T targetEntityManagement = getTargetEntityManagement();
targetEntityManagement.setDryRunContextSharing(dryRunContextSharing); targetEntityManagement.setDryRunContextSharing(dryRunContextSharing);
targetEntityManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); targetEntityManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
affectedInstances.putAll(targetEntityManagement.internalAddToContext(targetSecurityContext)); targetEntityManagement.setTargetSecurityContext(targetSecurityContext);
affectedInstances.putAll(targetEntityManagement.internalAddToContext());
if(!dryRunContextSharing) { if(!dryRunContextSharing) {
targetSecurityContext.addElement(getElement(), oDatabaseDocument); targetSecurityContext.addElement(getElement(), oDatabaseDocument);
@ -481,10 +492,10 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
return affectedInstances; return affectedInstances;
} }
public Map<UUID,JsonNode> internalAddToContext(SecurityContext targetSecurityContext) public Map<UUID,JsonNode> internalAddToContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
try { try {
Map<UUID,JsonNode> affectedInstances = reallyAddToContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = reallyAddToContext();
if(propagationConstraint.getAddConstraint()==PropagationConstraint.AddConstraint.propagate) { if(propagationConstraint.getAddConstraint()==PropagationConstraint.AddConstraint.propagate) {
if(!dryRunContextSharing) { if(!dryRunContextSharing) {
HeaderUtility.updateModifiedByAndLastUpdate(element); HeaderUtility.updateModifiedByAndLastUpdate(element);
@ -501,7 +512,7 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
} }
} }
public Map<UUID,JsonNode> forcedAddToContext(SecurityContext targetSecurityContext) public Map<UUID,JsonNode> forcedAddToContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
getElement(); getElement();
@ -511,13 +522,15 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
ResourceManagement resourceManagement = getSourceEntityManagement(); ResourceManagement resourceManagement = getSourceEntityManagement();
resourceManagement.setDryRunContextSharing(dryRunContextSharing); resourceManagement.setDryRunContextSharing(dryRunContextSharing);
resourceManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); resourceManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
affectedInstances.putAll(resourceManagement.internalAddToContext(targetSecurityContext)); resourceManagement.setTargetSecurityContext(targetSecurityContext);
affectedInstances.putAll(resourceManagement.internalAddToContext());
/* Adding target to Context */ /* Adding target to Context */
T targetEntityManagement = getTargetEntityManagement(); T targetEntityManagement = getTargetEntityManagement();
targetEntityManagement.setDryRunContextSharing(dryRunContextSharing); targetEntityManagement.setDryRunContextSharing(dryRunContextSharing);
targetEntityManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); targetEntityManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
affectedInstances.putAll(getTargetEntityManagement().internalAddToContext(targetSecurityContext)); targetEntityManagement.setTargetSecurityContext(targetSecurityContext);
affectedInstances.putAll(getTargetEntityManagement().internalAddToContext());
if(!dryRunContextSharing) { if(!dryRunContextSharing) {
targetSecurityContext.addElement(getElement(), oDatabaseDocument); targetSecurityContext.addElement(getElement(), oDatabaseDocument);
@ -534,9 +547,9 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
workingContext = ContextUtility.getAdminSecurityContext(); workingContext = ContextUtility.getAdminSecurityContext();
oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER); oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER);
SecurityContext targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID); targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID);
Map<UUID,JsonNode> added = forcedAddToContext(targetSecurityContext); Map<UUID,JsonNode> added = forcedAddToContext();
sanityCheck(); sanityCheck();
@ -563,7 +576,7 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
} }
} }
protected Map<UUID,JsonNode> reallyRemoveFromContext(SecurityContext targetSecurityContext) protected Map<UUID,JsonNode> reallyRemoveFromContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
getElement(); getElement();
@ -604,10 +617,10 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
T targetEntityManagement = getTargetEntityManagement(); T targetEntityManagement = getTargetEntityManagement();
targetEntityManagement.setDryRunContextSharing(dryRunContextSharing); targetEntityManagement.setDryRunContextSharing(dryRunContextSharing);
targetEntityManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing); targetEntityManagement.setHonourPropagationConstraintsInContextSharing(honourPropagationConstraintsInContextSharing);
targetEntityManagement.setTargetSecurityContext(targetSecurityContext);
switch(removeConstraint) { switch(removeConstraint) {
case cascade: case cascade:
affectedInstances.putAll(targetEntityManagement.internalRemoveFromContext(targetSecurityContext)); affectedInstances.putAll(targetEntityManagement.internalRemoveFromContext());
break; break;
case cascadeWhenOrphan: case cascadeWhenOrphan:
@ -636,7 +649,7 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
"{} point to {} which is not orphan ({} exists). Giving {} directive, it will be not remove from {}.", "{} point to {} which is not orphan ({} exists). Giving {} directive, it will be not remove from {}.",
element, target, edge, removeConstraint, targetSecurityContext); element, target, edge, removeConstraint, targetSecurityContext);
} else { } else {
affectedInstances.putAll(targetEntityManagement.internalRemoveFromContext(targetSecurityContext)); affectedInstances.putAll(targetEntityManagement.internalRemoveFromContext());
} }
break; break;
@ -650,10 +663,10 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
return affectedInstances; return affectedInstances;
} }
public Map<UUID,JsonNode> internalRemoveFromContext(SecurityContext targetSecurityContext) public Map<UUID,JsonNode> internalRemoveFromContext()
throws ContextException, ResourceRegistryException { throws ContextException, ResourceRegistryException {
try { try {
Map<UUID,JsonNode> affectedInstances = reallyRemoveFromContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = reallyRemoveFromContext();
if(!dryRunContextSharing) { if(!dryRunContextSharing) {
HeaderUtility.updateModifiedByAndLastUpdate(element); HeaderUtility.updateModifiedByAndLastUpdate(element);
element.save(); element.save();
@ -677,9 +690,9 @@ public abstract class RelationManagement<T extends EntityManagement<? extends En
oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER); oDatabaseDocument = workingContext.getDatabaseDocument(PermissionMode.WRITER);
oDatabaseDocument.begin(); oDatabaseDocument.begin();
SecurityContext targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID); targetSecurityContext = ContextUtility.getInstance().getSecurityContextByUUID(contextUUID);
Map<UUID,JsonNode> affectedInstances = internalRemoveFromContext(targetSecurityContext); Map<UUID,JsonNode> affectedInstances = internalRemoveFromContext();
sanityCheck(); sanityCheck();