protected final PersonAttributes mapPersonAttributes(final PersonAttributes person) {
        var personAttributes = person.getAttributes();

        val mappedAttributes = new LinkedCaseInsensitiveMap<List<Object>>();
        if (resultAttributeMapping == null) {
            if (caseInsensitiveResultAttributes != null && !caseInsensitiveResultAttributes.isEmpty()) {
                for (val attribute : personAttributes.entrySet()) {
                    var attributeName = attribute.getKey();
                    mappedAttributes.put(attributeName, canonicalizeAttribute(attributeName, attribute.getValue(), caseInsensitiveResultAttributes));
                }
            } else {
                mappedAttributes.putAll(personAttributes);
            }
        } else {
            for (val resultAttrEntry : resultAttributeMapping.entrySet()) {
                val dataKey = resultAttrEntry.getKey();
                var resultKeys = resultAttrEntry.getValue();
                if (resultKeys == null) {
                    resultKeys = Set.of(dataKey);
                }
                if (resultKeys.size() == 1 && resultKeys.stream().allMatch(s -> !s.isEmpty() && s.charAt(s.length() - 1) == ';')) {
                    var allKeys = personAttributes.keySet().stream().filter(name -> name.startsWith(dataKey + ';')).toList();
                    for (val resultKey : allKeys) {
                        var value = personAttributes.get(resultKey);
                        value = canonicalizeAttribute(resultKey, value, caseInsensitiveResultAttributes);
                        mappedAttributes.put(resultKey, value);
                    }
                } else if (personAttributes.containsKey(dataKey)) {
                    var value = personAttributes.get(dataKey);
                    for (val resultKey : resultKeys) {
                        value = canonicalizeAttribute(resultKey, value, caseInsensitiveResultAttributes);
                        if (resultKey == null) {
                            mappedAttributes.put(dataKey, value);
                        } else {
                            mappedAttributes.put(resultKey, value);
                        }
                    }
                }
            }
        }

        val name = person.getName();
        if (name != null) {
            return new SimplePersonAttributes(usernameCaseCanonicalizationMode.canonicalize(name), mappedAttributes);
        }
        val usernameAttribute = getConfiguredUserNameAttribute();
        return SimplePersonAttributes.fromAttribute(usernameAttribute, mappedAttributes).canonicalize(usernameCaseCanonicalizationMode);
    }
Uses resultAttributeMapping to return a copy of the IPersonAttributes with only the attributes specified in
resultAttributeMapping mapped to their result attribute names.

@param person The IPersonAttributes to map attributes for
@return A copy of the IPersonAttributes with mapped attributes, the original IPersonAttributes if resultAttributeMapping is null.
core/cas-server-core-authentication-api/src/main/java/org/apereo/cas/authentication/attribute/AbstractQueryPersonAttributeDao.java