[ 
https://issues.apache.org/jira/browse/SLING-8605?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Robert Munteanu resolved SLING-8605.
------------------------------------
    Resolution: Fixed

Reapplied in [sling-org-apache-sling-jcr-repoinit commit 
f142c89|https://github.com/apache/sling-org-apache-sling-jcr-repoinit/commit/f142c89],
 now that Jackrabbit and Oak versions are updated.

> AclUtil.createLocalRestrictions should use 
> JackrabbitAccessControlList.isMultiValueRestriction(String)
> ------------------------------------------------------------------------------------------------------
>
>                 Key: SLING-8605
>                 URL: https://issues.apache.org/jira/browse/SLING-8605
>             Project: Sling
>          Issue Type: Bug
>          Components: Repoinit
>            Reporter: angela
>            Assignee: Robert Munteanu
>            Priority: Major
>             Fix For: Repoinit JCR 1.1.14
>
>
> today the {{AclUtil.createLocalRestrictions}} looks at the length of the 
> value array to determine if a given restriction is intended to be multivalued 
> or not. this may lead to an unexpected exception in cases where a single 
> value is defined for a restriction that is defined to be multivalued. instead 
> of looking at the length of the array, the code should make use of 
> {{JackrabbitAccessControlList.isMultiValueRestriction}} in order to find out 
> if a given restriction is multivalued or not.
> here the proposed change (also using the 'checkState' method that is part of 
> the patch for SLING-8604:
> {code}
>     private static LocalRestrictions 
> createLocalRestrictions(List<RestrictionClause> list, 
> JackrabbitAccessControlList jacl, Session s) throws RepositoryException {
>         Map<String,Value> restrictions = new HashMap<>();
>         Map<String,Value[]> mvrestrictions = new HashMap<>();
>         if(list != null && !list.isEmpty()){
>             ValueFactory vf = s.getValueFactory();
>            for(RestrictionClause rc : list){
>                String restrictionName = rc.getName();
>                int type = jacl.getRestrictionType(restrictionName);
>                boolean isMvRestriction = 
> jacl.isMultiValueRestriction(restrictionName);
>                Value[] values = new Value[rc.getValues().size()];
>                for(int i=0;i<values.length;i++) {
>                    values[i] = vf.createValue(rc.getValues().get(i),type);
>                }
>                if("rep:glob".equals(restrictionName) && values.length == 0) {
>                    // SLING-7280 - special case for rep:glob which supports 
> an empty string
>                    // to mean "no values"
>                    restrictions.put(restrictionName, vf.createValue(""));
>                } else if (isMvRestriction) {
>                    mvrestrictions.put(restrictionName, values);
>                } else {
>                    checkState(values.length == 1, "Expected just one value 
> for single valued restriction with name " + restrictionName);
>                    restrictions.put(restrictionName, values[0]);
>                }
>            }
>         }
>         return new LocalRestrictions(restrictions,mvrestrictions);
>     }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to