add support to enable/disable append-mode of DefaultReadGroups via conf

This commit is contained in:
Mykhaylo
2021-10-22 18:40:45 +02:00
parent a0e92a5f18
commit ee857f9412
3 changed files with 233 additions and 5 deletions

View File

@@ -17,6 +17,7 @@ import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -1050,7 +1051,8 @@ prevent the generation of resource policy entry values with null dspace_object a
for (ResourcePolicy defaultPolicy : defaultCollectionPolicies) {
if (!authorizeService
.isAnIdenticalPolicyAlreadyInPlace(context, dso, defaultPolicy.getGroup(), Constants.READ,
defaultPolicy.getID()) && this.isNotAlreadyACustomRPOfThisTypeOnDSO(context, dso)) {
defaultPolicy.getID()) && this.isNotAlreadyACustomRPOfThisTypeOnDSO(context, dso)
&& this.isNotCustomX(context, dso, defaultPolicy)) {
ResourcePolicy newPolicy = resourcePolicyService.clone(context, defaultPolicy);
newPolicy.setdSpaceObject(dso);
newPolicy.setAction(Constants.READ);
@@ -1070,15 +1072,35 @@ prevent the generation of resource policy entry values with null dspace_object a
* @throws SQLException If something goes wrong retrieving the RP on the DSO
*/
private boolean isNotAlreadyACustomRPOfThisTypeOnDSO(Context context, DSpaceObject dso) throws SQLException {
List<ResourcePolicy> readRPs = resourcePolicyService.find(context, dso, Constants.READ);
for (ResourcePolicy readRP : readRPs) {
if (readRP.getRpType() != null && readRP.getRpType().equals(ResourcePolicy.TYPE_CUSTOM)) {
return false;
if (!configurationService.getBooleanProperty("core.authorization.installitem.inheritance-read.append-mode",
false)) {
List<ResourcePolicy> readRPs = resourcePolicyService.find(context, dso, Constants.READ);
for (ResourcePolicy readRP : readRPs) {
if (readRP.getRpType() != null && readRP.getRpType().equals(ResourcePolicy.TYPE_CUSTOM)) {
return false;
}
}
}
return true;
}
private boolean isNotCustomX(Context context, DSpaceObject dso, ResourcePolicy defaultPolicy) throws SQLException {
boolean hasCustomPolicy = resourcePolicyService.find(context, dso, Constants.READ)
.stream()
.filter(rp -> (Objects.nonNull(rp.getRpType()) &&
Objects.equals(rp.getRpType(), ResourcePolicy.TYPE_CUSTOM)))
.findFirst()
.isPresent();
boolean isAnonimousGroup = Objects.nonNull(defaultPolicy.getGroup()) &&
StringUtils.equals(defaultPolicy.getGroup().getName(),Group.ANONYMOUS) ? true : false;
boolean datesAreNull = Objects.isNull(defaultPolicy.getStartDate()) &&
Objects.isNull(defaultPolicy.getEndDate()) ? true : false;
return !(hasCustomPolicy && isAnonimousGroup && datesAreNull);
}
/**
* Returns an iterator of Items possessing the passed metadata field, or only
* those matching the passed value, if value is not Item.ANY