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.IModelNodeItem;
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 IModelNodeItem} 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  @SuppressWarnings("rawtypes")
25  public class ModelInstanceStep
26      extends AbstractStepExpression<IModelNodeItem> {
27  
28    /**
29     * Construct a new expression that finds any child {@link IModelNodeItem} that
30     * matches the provided {@code test}.
31     *
32     * @param text
33     *          the parsed text of the expression
34     * @param test
35     *          the test to use to match
36     */
37    public ModelInstanceStep(@NonNull String text, @NonNull INodeTestExpression test) {
38      super(text, test);
39    }
40  
41    @Override
42    public Class<IModelNodeItem> getBaseResultType() {
43      return IModelNodeItem.class;
44    }
45  
46    @Override
47    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
48      return visitor.visitModelInstanceStep(this, context);
49    }
50  
51    @Override
52    protected Stream<? extends IModelNodeItem<?, ?>> getChildNodes(INodeItem focus) {
53      return focus.modelItems();
54    }
55  
56    @Override
57    protected Stream<? extends IModelNodeItem<?, ?>> getChildNodesWithName(
58        INodeItem focus,
59        IEnhancedQName name) {
60      return ObjectUtils.notNull(focus.getModelItemsByName(name).stream());
61    }
62  }