String (@NotNull Attribute attribute, @Nullable PathMacroFilter filter, boolean caseSensitive, boolean recursively) { String oldValue = attribute.getValue(); if (recursively || (filter != null && filter.recursePathMacros(attribute))) { return substituteRecursively(oldValue, caseSensitive).toString(); } else { return substitute(oldValue, caseSensitive); } }