1
2
3
4
5
6 package dev.metaschema.core.metapath.cst.path;
7
8 import java.util.function.Predicate;
9 import java.util.stream.Stream;
10
11 import dev.metaschema.core.metapath.DynamicContext;
12 import dev.metaschema.core.metapath.cst.AbstractExpression;
13 import dev.metaschema.core.metapath.cst.IExpressionVisitor;
14 import dev.metaschema.core.metapath.item.ISequence;
15 import dev.metaschema.core.metapath.item.ItemUtils;
16 import dev.metaschema.core.metapath.item.node.IDefinitionNodeItem;
17 import dev.metaschema.core.metapath.item.node.INodeItem;
18 import dev.metaschema.core.util.ObjectUtils;
19 import edu.umd.cs.findbugs.annotations.NonNull;
20 import edu.umd.cs.findbugs.annotations.Nullable;
21
22
23
24
25
26
27 @SuppressWarnings("PMD.TestClassWithoutTestCases")
28 public class WildcardNodeTest
29 extends AbstractExpression
30 implements INodeTestExpression {
31 @Nullable
32 private final Predicate<IDefinitionNodeItem<?, ?>> matcher;
33
34
35
36
37
38
39
40
41
42 public WildcardNodeTest(@NonNull String text, @Nullable IWildcardMatcher matcher) {
43 super(text);
44 this.matcher = matcher;
45 }
46
47 @Override
48 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
49 return visitor.visitWildcardNodeTest(this, context);
50 }
51
52 @Override
53 protected ISequence<? extends INodeItem> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
54 Stream<INodeItem> stream = focus.stream()
55 .map(item -> ItemUtils.checkItemIsNodeItem(dynamicContext, item));
56
57 if (matcher != null) {
58 stream = stream.filter(this::match);
59 }
60
61 return ISequence.of(ObjectUtils.notNull(stream));
62 }
63
64
65
66
67
68
69 @Override
70 @NonNull
71 public <T extends INodeItem> Stream<T> filterStream(@NonNull Stream<T> items) {
72 Stream<T> nodes = items;
73 if (matcher != null) {
74 nodes = INodeTestExpression.super.filterStream(nodes);
75 }
76 return nodes;
77 }
78
79
80
81
82
83
84
85
86 @Override
87 public boolean match(@NonNull INodeItem item) {
88 assert matcher != null;
89 Predicate<IDefinitionNodeItem<?, ?>> test = matcher;
90 return !(item instanceof IDefinitionNodeItem) ||
91 test.test((IDefinitionNodeItem<?, ?>) item);
92 }
93
94 @SuppressWarnings("null")
95 @Override
96 public String toCSTString() {
97 return String.format("%s[%s]", getClass().getName(), matcher == null ? "*:*" : matcher.toString());
98 }
99 }