From dd88daecabef28e2162b0228a183086f75fda517 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Thu, 16 Sep 2021 17:23:13 +0200 Subject: [PATCH] Fixed AddToContext --- .../contexts/security/SecurityContext.java | 4 +- .../model/entities/EntityManagement.java | 24 +++-- .../model/entities/ResourceManagement.java | 6 ++ .../model/relations/RelationManagement.java | 7 +- .../multicontext/AddToContextTest.java | 94 +++++++++++++++---- 5 files changed, 100 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/security/SecurityContext.java b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/security/SecurityContext.java index cb9ba4b..d409637 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/security/SecurityContext.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/security/SecurityContext.java @@ -339,7 +339,9 @@ public class SecurityContext { contextODatabaseDocument = getDatabaseDocument(PermissionMode.READER); ORecord oRecord = contextODatabaseDocument.getRecord(orid); - logger.trace("{}", oRecord); + if(oRecord==null) { + return false; + } return true; } finally { diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java index bb197a2..feb0173 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/EntityManagement.java @@ -137,15 +137,8 @@ public abstract class EntityManagement */ protected Map> relationManagements; - /* - public boolean isAvailableOnContext(SecurityContext securityContext) { - try { - return securityContext.isElementInContext(element); - } catch (ResourceRegistryException e) { - return false; - } - } - */ + /* Indicate that AddToContext skipped the isntance because it was not the source context */ + protected boolean skipped; protected EntityManagement(AccessType accessType) { super(accessType); @@ -164,6 +157,8 @@ public abstract class EntityManagement * so this variable is initialised as true. */ this.honourPropagationConstraintsInContextSharing = true; + + this.skipped = false; } @Override @@ -304,6 +299,7 @@ public abstract class EntityManagement throws ContextException, ResourceRegistryException { if(!sourceSecurityContext.isElementInContext(getElement())) { // The element in not in the source security context. It will be skipped + skipped = true; return; } @@ -337,10 +333,12 @@ public abstract class EntityManagement try { setOperation(Operation.ADD_TO_CONTEXT); reallyAddToContext(); - HeaderUtility.updateModifiedByAndLastUpdate(element); - element.save(); - affectedInstances.put(uuid, serializeAsAffectedInstance()); - sanityCheck(); + if(!skipped) { + HeaderUtility.updateModifiedByAndLastUpdate(element); + element.save(); + affectedInstances.put(uuid, serializeAsAffectedInstance()); + sanityCheck(); + } } catch(ResourceRegistryException e) { throw e; } catch(Exception e) { diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/ResourceManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/ResourceManagement.java index 92e7c32..5c6116a 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/ResourceManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/entities/ResourceManagement.java @@ -262,6 +262,12 @@ public class ResourceManagement extends EntityManagement protected void reallyAddToContext() throws ContextException, ResourceRegistryException { + if(!sourceSecurityContext.isElementInContext(getElement())) { + // The element in not in the source security context. It will be skipped + skipped = true; + return; + } + targetSecurityContext.addElement(getElement(), oDatabaseDocument); /* diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/relations/RelationManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/relations/RelationManagement.java index be5e28f..0c8bb87 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/relations/RelationManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/instances/model/relations/RelationManagement.java @@ -151,10 +151,14 @@ public abstract class RelationManagement createIsCorrelatedTo(Dataset source, Dataset target) throws Exception { + protected IsCorrelatedTo createIsCorrelatedTo(Dataset source, Dataset target, String uuid) throws Exception { PropagationConstraint propagationConstraint = getPropagationConstraint(); IsCorrelatedTo isCorrelatedTo = new IsCorrelatedToImpl(source, target, propagationConstraint); + isCorrelatedTo.setHeader(new HeaderImpl(UUID.fromString(uuid))); IsRelatedToManagement isRelatedToManagement = getIsRelatedToManagement(isCorrelatedTo); String json = isRelatedToManagement.create(); @@ -145,8 +150,67 @@ public class AddToContextTest extends MultiContextTest { return isCorrelatedTo; } + protected void checkNumerOfContext(Dataset datasetR1, int r1Number, Dataset datasetR2, int r2Number, Dataset datasetR3, int r3Number) throws Exception { + setContextByName(GCUBE); + + ContextUtility.getHierarchicalMode().set(true); + ContextUtility.getIncludeInstanceContexts().set(true); + + Dataset r1 = ElementMapper.unmarshal(Dataset.class, getResourceManagement(datasetR1).read()); + @SuppressWarnings("unchecked") + List contextsR1 = (List) r1.getHeader().getAdditionalProperty(Header.__CONTEXTS); + /* + Set contextsR1UUID = org.gcube.informationsystem.resourceregistry.api.contexts.ContextUtility.getContextUUIDSet(contextsR1); + Set contextsR1Fullname = org.gcube.informationsystem.resourceregistry.api.contexts.ContextUtility.getContextFullNameSet(contextsR1UUID); + logger.debug("{}", contextsR1Fullname); + */ + Assert.assertTrue(contextsR1.size()==r1Number); + + Dataset r2 = ElementMapper.unmarshal(Dataset.class, getResourceManagement(datasetR2).read()); + @SuppressWarnings("unchecked") + List contextsR2 = (List) r2.getHeader().getAdditionalProperty(Header.__CONTEXTS); + /* + Set contextsR2UUID = org.gcube.informationsystem.resourceregistry.api.contexts.ContextUtility.getContextUUIDSet(contextsR2); + Set contextsR2Fullname = org.gcube.informationsystem.resourceregistry.api.contexts.ContextUtility.getContextFullNameSet(contextsR2UUID); + logger.debug("{}", contextsR2Fullname); + */ + Assert.assertTrue(contextsR2.size()==r2Number); + + Dataset r3 = ElementMapper.unmarshal(Dataset.class, getResourceManagement(datasetR3).read()); + @SuppressWarnings("unchecked") + List contextsR3 = (List) r3.getHeader().getAdditionalProperty(Header.__CONTEXTS); + /* + Set contextsR3UUID = org.gcube.informationsystem.resourceregistry.api.contexts.ContextUtility.getContextUUIDSet(contextsR3); + Set contextsR3Fullname = org.gcube.informationsystem.resourceregistry.api.contexts.ContextUtility.getContextFullNameSet(contextsR3UUID); + logger.debug("{}", contextsR3Fullname); + */ + Assert.assertTrue(contextsR3.size()==r3Number); + + ContextUtility.getHierarchicalMode().set(false); + ContextUtility.getIncludeInstanceContexts().set(false); + } + + protected ContextCacheRenewal contextCacheRenewal = new ContextCacheRenewal() { + + @Override + public List renew() throws ResourceRegistryException { + try { + ContextManagement contextManagement = new ContextManagement(); + String allString = contextManagement.all(false); + logger.trace(allString); + List all = ElementMapper.unmarshalList(Context.class, allString); + return all; + }catch (Exception e) { + throw new ResourceRegistryException(e); + } + } + + }; + + @Test public void testAddToContextFromDifferentSourceContext() throws Exception { + setContextByName(GCUBE); Dataset datasetR1 = createDataset("R1", "da111111-dada-1111-1111-111111111111"); @@ -158,7 +222,7 @@ public class AddToContextTest extends MultiContextTest { setContextByName(DEVNEXT); datasetR2 = createDataset("R2", "da222222-dada-2222-2222-222222222222"); - IsCorrelatedTo isCorrelatedToR1R2 = createIsCorrelatedTo(datasetR1, datasetR2); + IsCorrelatedTo isCorrelatedToR1R2 = createIsCorrelatedTo(datasetR1, datasetR2, "da111111-1111-aaaa-2222-222222222222"); getResourceManagement(datasetR1).exists(); getIsRelatedToManagement(isCorrelatedToR1R2).exists(); @@ -167,7 +231,7 @@ public class AddToContextTest extends MultiContextTest { setContextByName(DEVSEC); datasetR3 = createDataset("R3", "da333333-dada-3333-3333-333333333333"); - IsCorrelatedTo isCorrelatedToR1R3 = createIsCorrelatedTo(datasetR1, datasetR3); + IsCorrelatedTo isCorrelatedToR1R3 = createIsCorrelatedTo(datasetR1, datasetR3, "da111111-1111-aaaa-3333-333333333333"); getResourceManagement(datasetR1).exists(); getIsRelatedToManagement(isCorrelatedToR1R3).exists(); @@ -237,25 +301,15 @@ public class AddToContextTest extends MultiContextTest { logger.trace("As expected"); } - ContextUtility.getHierarchicalMode().set(true); - ContextUtility.getIncludeInstanceContexts().set(true); - - Dataset r1 = ElementMapper.unmarshal(Dataset.class, getResourceManagement(datasetR1).read()); - @SuppressWarnings("unchecked") - List contextsR1 = (List) r1.getHeader().getAdditionalProperty(Header.__CONTEXTS); - Assert.assertTrue(contextsR1.size()==3); - - Dataset r2 = ElementMapper.unmarshal(Dataset.class, getResourceManagement(datasetR2).read()); - @SuppressWarnings("unchecked") - List contextsR2 = (List) r2.getHeader().getAdditionalProperty(Header.__CONTEXTS); - Assert.assertTrue(contextsR2.size()==1); - - Dataset r3 = ElementMapper.unmarshal(Dataset.class, getResourceManagement(datasetR3).read()); - @SuppressWarnings("unchecked") - List contextsR3 = (List) r3.getHeader().getAdditionalProperty(Header.__CONTEXTS); - Assert.assertTrue(contextsR3.size()==1); + checkNumerOfContext(datasetR1, 3, datasetR2, 1, datasetR3, 1); + setContextByName(DEVNEXT); + addToContextThenTestIfBehaveProperly(datasetR1, false, NEXTNEXT); + checkNumerOfContext(datasetR1, 4, datasetR2, 2, datasetR3, 1); + setContextByName(DEVSEC); + addToContextThenTestIfBehaveProperly(datasetR1, false, DEVVRE); + checkNumerOfContext(datasetR1, 5, datasetR2, 2, datasetR3, 2); } catch (Exception e) { logger.error("", e);