ACS-3365 Add support for GET rule sets isInherited. (#1415)

This commit is contained in:
Tom Page
2022-09-21 09:00:34 +01:00
committed by GitHub
parent 02ba54ab3a
commit 1c69cd2e61
4 changed files with 143 additions and 3 deletions

View File

@@ -208,7 +208,13 @@ public class GetRuleSetsTests extends RestTest
.getRuleSet(ruleSetId); .getRuleSet(ruleSetId);
restClient.assertStatusCodeIs(OK); restClient.assertStatusCodeIs(OK);
ruleSet.assertThat().field("id").is(ruleSetId); ruleSet.assertThat().field("id").is(ruleSetId)
// Also check that the optional fields are not included by default.
.assertThat().field("owningFolder").isNull()
.assertThat().field("inheritedBy").isNull()
.assertThat().field("linkedToBy").isNull()
.assertThat().field("isInherited").isNull()
.assertThat().field("isLinkedTo").isNull();
} }
/** Check we can get a rule set using the "-default-" synonym. */ /** Check we can get a rule set using the "-default-" synonym. */
@@ -360,6 +366,87 @@ public class GetRuleSetsTests extends RestTest
.assertThat().field("id").is(ruleSetId); .assertThat().field("id").is(ruleSetId);
} }
/** Check that a user can see that a rule set is inherited even if they don't have permission to view the inheriting folder. */
@Test
public void getRuleSetAndIsInheritedWithoutPermission()
{
STEP("Create a site owned by admin and add user as a contributor");
SiteModel siteModel = dataSite.usingAdmin().createPrivateRandomSite();
dataUser.addUserToSite(user, siteModel, UserRole.SiteContributor);
STEP("Create a folder with a rule set and a private child folder to inherit it");
FolderModel ruleFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder();
dataContent.usingAdmin().usingResource(ruleFolder).createFolder();
RestRuleModel ruleModel = createRuleModelWithDefaultValues();
coreAPIForUser().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel);
STEP("Remove the user from the site");
dataUser.removeUserFromSite(user, siteModel);
STEP("Get the rule set and isInherited field");
RestRuleSetModel ruleSet = coreAPIForUser().usingNode(ruleFolder)
.include("isInherited", "inheritedBy")
.getDefaultRuleSet();
restClient.assertStatusCodeIs(OK);
ruleSet.assertThat().field("isInherited").is(true)
.assertThat().field("inheritedBy").isEmpty();
}
/** Check that the isInherited field includes rule sets which are only inherited via links. */
@Test
public void getRuleSetAndIsInheritedViaLink()
{
STEP("Create a site and a folder with a rule");
SiteModel siteModel = dataSite.usingUser(user).createPublicRandomSite();
FolderModel ruleFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder();
RestRuleModel ruleModel = createRuleModelWithDefaultValues();
coreAPIForUser().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel);
STEP("Create a second folder in the site that links to the rule set");
FolderModel secondFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder();
dataContent.usingUser(user).usingResource(secondFolder).createFolder();
RestRuleSetLinkModel ruleSetLink = new RestRuleSetLinkModel();
ruleSetLink.setId(ruleFolder.getNodeRef());
coreAPIForUser().usingNode(secondFolder).createRuleLink(ruleSetLink);
STEP("Get the rule set and isInherited field");
RestRuleSetModel ruleSet = coreAPIForUser().usingNode(ruleFolder)
.include("isInherited")
.getDefaultRuleSet();
restClient.assertStatusCodeIs(OK);
ruleSet.assertThat().field("isInherited").is(true);
}
/**
* Check that if a rule set is owned and linked to but not inherited then isInherited returns false.
*/
@Test
public void getRuleSetAndIsInheritedCanBeFalse()
{
STEP("Create a site and a folder with a rule");
SiteModel siteModel = dataSite.usingUser(user).createPublicRandomSite();
FolderModel ruleFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder();
RestRuleModel ruleModel = createRuleModelWithDefaultValues();
coreAPIForUser().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel);
STEP("Create a second folder in the site that links to the rule set");
FolderModel secondFolder = dataContent.usingUser(user).usingSite(siteModel).createFolder();
RestRuleSetLinkModel ruleSetLink = new RestRuleSetLinkModel();
ruleSetLink.setId(ruleFolder.getNodeRef());
coreAPIForUser().usingNode(secondFolder).createRuleLink(ruleSetLink);
STEP("Get the rule set and isInherited field");
RestRuleSetModel ruleSet = coreAPIForUser().usingNode(ruleFolder)
.include("isInherited")
.getDefaultRuleSet();
restClient.assertStatusCodeIs(OK);
ruleSet.assertThat().field("isInherited").is(false);
}
private RestCoreAPI coreAPIForUser() private RestCoreAPI coreAPIForUser()
{ {
return restClient.authenticateUser(user).withCoreAPI(); return restClient.authenticateUser(user).withCoreAPI();

View File

@@ -32,6 +32,7 @@ import static org.alfresco.rest.api.model.rules.InclusionType.OWNED;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.rest.api.model.rules.RuleSet; import org.alfresco.rest.api.model.rules.RuleSet;
import org.alfresco.service.Experimental; import org.alfresco.service.Experimental;
import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef;
@@ -47,6 +48,7 @@ public class RuleSetLoader
protected static final String INCLUSION_TYPE = "inclusionType"; protected static final String INCLUSION_TYPE = "inclusionType";
protected static final String INHERITED_BY = "inheritedBy"; protected static final String INHERITED_BY = "inheritedBy";
protected static final String LINKED_TO_BY = "linkedToBy"; protected static final String LINKED_TO_BY = "linkedToBy";
protected static final String IS_INHERITED = "isInherited";
private static final int MAX_INHERITED_BY_SIZE = 100; private static final int MAX_INHERITED_BY_SIZE = 100;
private NodeService nodeService; private NodeService nodeService;
private RuleService ruleService; private RuleService ruleService;
@@ -98,6 +100,10 @@ public class RuleSetLoader
.collect(Collectors.toList()); .collect(Collectors.toList());
ruleSet.setLinkedToBy(linkedToBy); ruleSet.setLinkedToBy(linkedToBy);
} }
if (includes.contains(IS_INHERITED))
{
ruleSet.setIsInherited(loadIsInherited(ruleSetNodeRef));
}
} }
return ruleSet; return ruleSet;
} }
@@ -107,6 +113,11 @@ public class RuleSetLoader
return ruleService.getFoldersInheritingRuleSet(ruleSetNodeRef, MAX_INHERITED_BY_SIZE); return ruleService.getFoldersInheritingRuleSet(ruleSetNodeRef, MAX_INHERITED_BY_SIZE);
} }
private boolean loadIsInherited(NodeRef ruleSetNodeRef)
{
return AuthenticationUtil.runAsSystem(() -> !ruleService.getFoldersInheritingRuleSet(ruleSetNodeRef, 1).isEmpty());
}
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService)
{ {
this.nodeService = nodeService; this.nodeService = nodeService;

View File

@@ -43,6 +43,7 @@ public class RuleSet
private InclusionType inclusionType; private InclusionType inclusionType;
private List<NodeRef> inheritedBy; private List<NodeRef> inheritedBy;
private List<NodeRef> linkedToBy; private List<NodeRef> linkedToBy;
private Boolean isInherited;
public static RuleSet of(String id) public static RuleSet of(String id)
{ {
@@ -109,6 +110,26 @@ public class RuleSet
this.linkedToBy = linkedToBy; this.linkedToBy = linkedToBy;
} }
/**
* Set a flag indicating that the rule set is inherited by a folder.
*
* @param inherited The flag.
*/
public void setIsInherited(Boolean inherited)
{
isInherited = inherited;
}
/**
* Find if the rule set is inherited by a folder.
*
* @return The value of the flag.
*/
public Boolean getIsInherited()
{
return isInherited;
}
@Override @Override
public String toString() public String toString()
{ {
@@ -119,6 +140,7 @@ public class RuleSet
.add("inclusionType='" + inclusionType + "'") .add("inclusionType='" + inclusionType + "'")
.add("inheritedBy='" + inheritedBy + "'") .add("inheritedBy='" + inheritedBy + "'")
.add("linkedToBy='" + linkedToBy + "'") .add("linkedToBy='" + linkedToBy + "'")
.add("isInherited='" + isInherited + "'")
.toString() .toString()
+ '}'; + '}';
} }
@@ -135,13 +157,14 @@ public class RuleSet
&& Objects.equals(owningFolder, ruleSet.owningFolder) && Objects.equals(owningFolder, ruleSet.owningFolder)
&& inclusionType == ruleSet.inclusionType && inclusionType == ruleSet.inclusionType
&& Objects.equals(inheritedBy, ruleSet.inheritedBy) && Objects.equals(inheritedBy, ruleSet.inheritedBy)
&& Objects.equals(linkedToBy, ruleSet.linkedToBy); && Objects.equals(linkedToBy, ruleSet.linkedToBy)
&& Objects.equals(isInherited, ruleSet.isInherited);
} }
@Override @Override
public int hashCode() public int hashCode()
{ {
return Objects.hash(id, owningFolder, inclusionType, inheritedBy, linkedToBy); return Objects.hash(id, owningFolder, inclusionType, inheritedBy, linkedToBy, isInherited);
} }
public static Builder builder() public static Builder builder()
@@ -156,6 +179,7 @@ public class RuleSet
private InclusionType inclusionType; private InclusionType inclusionType;
private List<NodeRef> inheritedBy; private List<NodeRef> inheritedBy;
private List<NodeRef> linkedToBy; private List<NodeRef> linkedToBy;
private Boolean isInherited;
public Builder id(String id) public Builder id(String id)
{ {
@@ -187,6 +211,12 @@ public class RuleSet
return this; return this;
} }
public Builder isInherited(Boolean isInherited)
{
this.isInherited = isInherited;
return this;
}
public RuleSet create() public RuleSet create()
{ {
final RuleSet ruleSet = new RuleSet(); final RuleSet ruleSet = new RuleSet();
@@ -195,6 +225,7 @@ public class RuleSet
ruleSet.setInclusionType(inclusionType); ruleSet.setInclusionType(inclusionType);
ruleSet.setInheritedBy(inheritedBy); ruleSet.setInheritedBy(inheritedBy);
ruleSet.setLinkedToBy(linkedToBy); ruleSet.setLinkedToBy(linkedToBy);
ruleSet.setIsInherited(isInherited);
return ruleSet; return ruleSet;
} }
} }

View File

@@ -27,6 +27,7 @@ package org.alfresco.rest.api.impl.rules;
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INCLUSION_TYPE; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INCLUSION_TYPE;
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INHERITED_BY; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INHERITED_BY;
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.IS_INHERITED;
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.LINKED_TO_BY; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.LINKED_TO_BY;
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.OWNING_FOLDER; import static org.alfresco.rest.api.impl.rules.RuleSetLoader.OWNING_FOLDER;
import static org.alfresco.rest.api.model.rules.InclusionType.INHERITED; import static org.alfresco.rest.api.model.rules.InclusionType.INHERITED;
@@ -159,4 +160,14 @@ public class RuleSetLoaderTest extends TestCase
RuleSet expected = RuleSet.builder().id(RULE_SET_ID).linkedToBy(List.of(LINKING_FOLDER)).create(); RuleSet expected = RuleSet.builder().id(RULE_SET_ID).linkedToBy(List.of(LINKING_FOLDER)).create();
assertEquals(expected, actual); assertEquals(expected, actual);
} }
@Test
public void testLoadRuleSet_isInherited()
{
// Call the method under test.
RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, FOLDER_NODE, List.of(IS_INHERITED));
RuleSet expected = RuleSet.builder().id(RULE_SET_ID).isInherited(true).create();
assertEquals(expected, actual);
}
} }