Hi Claude,
As I recall, the intention was that if PatternType is ANY, the name field would
simply be ignored. Probably we should have thrown an exception if someone tried
to create a ResourcePatternFilter with a non-null name and PatternType ANY.
best,
Colin
On Tue, Aug 20, 2024, at 04:19, Claude Warren, Jr wrote:
> Should a ResourcePatternFilter that has a PatternType of ANY and a name of
> WILDCARD_RESOURCE not match any Acls? I think this is a bug.I am writing
> a series of tests to ensure that I have implemented everything correctly in
> the Trie implementation and this has come up.
>
> public boolean matches(ResourcePattern pattern) {
> if (!resourceType.equals(ResourceType.ANY) &&
> !resourceType.equals(pattern.resourceType())) {
> return false;
> }
>
> if (!patternType.equals(PatternType.ANY) &&
> !patternType.equals(PatternType.MATCH) &&
> !patternType.equals(pattern.patternType())) {
> return false;
> }
>
> if (name == null) {
> return true;
> }
>
> if (patternType.equals(PatternType.ANY) ||
> patternType.equals(pattern.patternType())) {
> return name.equals(pattern.name());
> }
>
> switch (pattern.patternType()) {
> case LITERAL:
> return name.equals(pattern.name()) ||
> pattern.name().equals(WILDCARD_RESOURCE);
>
> case PREFIXED:
> return name.startsWith(pattern.name());
>
> default:
> throw new IllegalArgumentException("Unsupported
> PatternType: " + pattern.patternType());
> }
> }
>
> The above code is from the ResourcePatternFilter.
> The first if checks for resource type not matching.
> the second if checks for pattern type not matching.
> the third if will return true if the name is null.
> the fourth if will return true if the name matches in the case where
> pattern type is ANY or has equality. The only possible conditions here are
> ANY, MATCH or equality.
> the switch handles the case where the pattern type does not match.I think
> this can be simplified as:
>
> public boolean matches(ResourcePattern pattern) {
> if (!resourceType.equals(ResourceType.ANY) &&
> !resourceType.equals(pattern.resourceType())) {
> return false;
> }
>
> switch (pattern.patternType()) {
> case UNKNOWN:
> return patternType.equals(pattern.patternType());
>
> case ANY:
> case MATCH:
> return name == null || name.equals(pattern.name()) ||
> pattern.name().equals(WILDCARD_RESOURCE) ||
> name.equals(WILDCARD_RESOURCE);
>
> case LITERAL:
> return patternType.equals(pattern.patternType()) ||
> name == null || name.equals(pattern.name()) ||
> pattern.name().equals(WILDCARD_RESOURCE);
>
> case PREFIXED:
> return patternType.equals(pattern.patternType()) ||
> name == null || name.startsWith(pattern.name()) ||
> pattern.name().equals(WILDCARD_RESOURCE);
>
> default:
> throw new IllegalArgumentException("Unsupported
> PatternType: " + pattern.patternType());
> }
> }
>
>
> The above case still handles the null name and handles the
> WILDCARD_RESOURCE as a valid pattern name. I also think it is simpler to
> read.
>
> Am I missing something?