1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.metapath.cst.path;
7   
8   import java.util.stream.Stream;
9   
10  import dev.metaschema.core.metapath.DynamicContext;
11  import dev.metaschema.core.metapath.cst.AbstractExpression;
12  import dev.metaschema.core.metapath.cst.IExpressionVisitor;
13  import dev.metaschema.core.metapath.item.ISequence;
14  import dev.metaschema.core.metapath.item.ItemUtils;
15  import dev.metaschema.core.metapath.item.node.IDefinitionNodeItem;
16  import dev.metaschema.core.metapath.item.node.INodeItem;
17  import dev.metaschema.core.qname.IEnhancedQName;
18  import dev.metaschema.core.util.ObjectUtils;
19  import edu.umd.cs.findbugs.annotations.NonNull;
20  
21  /**
22   * The CST node for a Metapath
23   * <a href="https://www.w3.org/TR/xpath-31/#dt-expanded-qname">expanded QName
24   * name test</a>.
25   */
26  @SuppressWarnings("PMD.TestClassWithoutTestCases") // not a test
27  public class NameNodeTest
28      extends AbstractExpression
29      implements INodeTestExpression {
30  
31    @NonNull
32    private final IEnhancedQName name;
33  
34    /**
35     * Construct a new expanded QName-based literal expression.
36     *
37     * @param text
38     *          the parsed text of the expression
39     * @param name
40     *          the literal value
41     */
42    public NameNodeTest(@NonNull String text, @NonNull IEnhancedQName name) {
43      super(text);
44      this.name = name;
45    }
46  
47    /**
48     * Get the string value of the name.
49     *
50     * @return the string value of the name
51     */
52    @NonNull
53    public IEnhancedQName getName() {
54      return name;
55    }
56  
57    @Override
58    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
59      return visitor.visitNameNodeTest(this, context);
60    }
61  
62    @Override
63    protected ISequence<? extends INodeItem> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
64      Stream<INodeItem> nodes = ObjectUtils.notNull(focus.stream()
65          .map(item -> ItemUtils.checkItemIsNodeItem(dynamicContext, item)));
66      return ISequence.of(filterStream(nodes));
67    }
68  
69    @Override
70    public boolean match(INodeItem item) {
71      return item instanceof IDefinitionNodeItem
72          && getName().equals(((IDefinitionNodeItem<?, ?>) item).getQName());
73    }
74  
75    @SuppressWarnings("null")
76    @Override
77    public String toCSTString() {
78      return String.format("%s[name=%s]", getClass().getName(), getName());
79    }
80  }