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.cst.IExpressionVisitor;
11  import dev.metaschema.core.metapath.item.node.IFlagNodeItem;
12  import dev.metaschema.core.metapath.item.node.INodeItem;
13  import dev.metaschema.core.qname.IEnhancedQName;
14  import dev.metaschema.core.util.ObjectUtils;
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  
17  /**
18   * A Metapath path expression that finds any child {@link IFlagNodeItem} that
19   * matches the provided {@code test}.
20   * <p>
21   * Based on the XPath 3.1
22   * <a href="https://www.w3.org/TR/xpath-31/#id-steps">step</a> syntax.
23   */
24  public class FlagStep
25      extends AbstractStepExpression<IFlagNodeItem> {
26  
27    /**
28     * Construct a new expression that finds any child {@link IFlagNodeItem} that
29     * matches the provided {@code test}.
30     *
31     * @param text
32     *          the parsed text of the expression
33     * @param test
34     *          the test to use to match
35     */
36    public FlagStep(@NonNull String text, @NonNull INodeTestExpression test) {
37      super(text, test);
38    }
39  
40    @Override
41    public Class<IFlagNodeItem> getBaseResultType() {
42      return IFlagNodeItem.class;
43    }
44  
45    @Override
46    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
47      return visitor.visitFlagStep(this, context);
48    }
49  
50    @Override
51    protected Stream<? extends IFlagNodeItem> getChildNodes(INodeItem focus) {
52      return focus.flags();
53    }
54  
55    @Override
56    protected Stream<? extends IFlagNodeItem> getChildNodesWithName(
57        INodeItem focus,
58        IEnhancedQName name) {
59      return ObjectUtils.notNull(Stream.ofNullable(focus.getFlagByName(name)));
60    }
61  }