You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "angela (JIRA)" <ji...@apache.org> on 2019/07/31 15:42:00 UTC

[jira] [Created] (SLING-8605) AclUtil.createLocalRestrictions should use JackrabbitAccessControlList.isMultiValueRestriction(String)

angela created SLING-8605:
-----------------------------

             Summary: 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


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
(v7.6.14#76016)