[
https://issues.apache.org/jira/browse/JCRVLT-378?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16934596#comment-16934596
]
Mark Adamcin edited comment on JCRVLT-378 at 9/20/19 5:23 PM:
--------------------------------------------------------------
[~kwin] I think this might be a wider convention for fuzzy default include
behavior.
It uses the opposite type of the first include/exclude as the default return
value. I believe this is done to eliminate boilerplate <exclude pattern=".*"/>
elements when the intent was to include only specific descendants of a filtered
root.
The specific line with this effect is
{{boolean result = !entries.get(0).include;}}
{code:java}
/**
* Evaluates the filters if this set does {@link #covers(String) cover} the
* given item. otherwise {@code false} is returned.
* The result of the evaluation is the polarity of the last matched path.
* If no filter matches it returns {@code true}
* if the first filter is an exclude filter or if no filter is defined;
* {@code false} if the first filter is an include filter.
*
* @param path the path to check
* @return {@code true} if this set matches the item
*/
public boolean contains(@Nonnull String path) {
if (!covers(path)) {
return false;
}
List<Entry<PathFilter>> entries = getEntries();
if (entries.isEmpty()) {
return true;
} else {
boolean result = !entries.get(0).include;
for (Entry<PathFilter> entry: entries) {
if (entry.filter.matches(path)) {
result = entry.include;
}
}
return result;
}
}
{code}
was (Author: madamcin):
[~kwin] I think this might be a wider convention for fuzzy default include
behavior.
It uses the opposite type of the first include/exclude as the default return
value. I believe this is done to eliminate boilerplate <exclude pattern=".*"/>
elements when the intent was to include only specific descendants of a filtered
root.
The specific line with this effect is `boolean result =
!entries.get(0).include;`
{code:java}
/**
* Evaluates the filters if this set does {@link #covers(String) cover} the
* given item. otherwise {@code false} is returned.
* The result of the evaluation is the polarity of the last matched path.
* If no filter matches it returns {@code true}
* if the first filter is an exclude filter or if no filter is defined;
* {@code false} if the first filter is an include filter.
*
* @param path the path to check
* @return {@code true} if this set matches the item
*/
public boolean contains(@Nonnull String path) {
if (!covers(path)) {
return false;
}
List<Entry<PathFilter>> entries = getEntries();
if (entries.isEmpty()) {
return true;
} else {
boolean result = !entries.get(0).include;
for (Entry<PathFilter> entry: entries) {
if (entry.filter.matches(path)) {
result = entry.include;
}
}
return result;
}
}
{code}
> WorkspaceFilter.contains return false negative
> ----------------------------------------------
>
> Key: JCRVLT-378
> URL: https://issues.apache.org/jira/browse/JCRVLT-378
> Project: Jackrabbit FileVault
> Issue Type: Bug
> Components: vlt
> Reporter: Konrad Windszus
> Priority: Major
>
> For this workspace filter
> {code}
> <filter root="/var/acs-commons">
> <include pattern="/var/acs-commons/httpcache"/>
> <include pattern="/var/acs-commons/httpcache/root"/>
> </filter>
> {code}
> The call of {{WorkspaceFilter.contains("/var/acs-commons")}} returns
> {{false}}.
> This is unexpected because this is the root path itself.
> So this node should be installed (including all direct properties) and only
> sub nodes are being filtered with the includes/excludes.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)