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 ) ;
2021-03-05 11:59:24 +01:00
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));
2021-03-01 17:09:09 +01:00
( ( 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 ) ;
2021-03-05 11:59:24 +01:00
elementManagement . setDryRun ( dryRun ) ;
2021-02-23 14:44:37 +01:00
//enforcedInstances.putAll(((ERManagement) elementManagement).internalRemoveFromContext(targetSecurityContext));
2021-03-01 17:09:09 +01:00
( ( 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 ( ) ;
}
}
}
}