1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.metaschema.core.metapath.impl;
7   
8   import gov.nist.secauto.metaschema.core.metapath.DynamicContext;
9   import gov.nist.secauto.metaschema.core.metapath.IExpression;
10  import gov.nist.secauto.metaschema.core.metapath.IMetapathExpression;
11  import gov.nist.secauto.metaschema.core.metapath.StaticContext;
12  import gov.nist.secauto.metaschema.core.metapath.cst.IExpressionVisitor;
13  import gov.nist.secauto.metaschema.core.metapath.item.IItem;
14  import gov.nist.secauto.metaschema.core.metapath.item.ISequence;
15  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
16  
17  import java.util.List;
18  
19  import edu.umd.cs.findbugs.annotations.NonNull;
20  
21  public abstract class AbstractMetapathExpression implements IMetapathExpression {
22  
23    @NonNull
24    private final String path;
25    @NonNull
26    private final StaticContext staticContext;
27  
28    /**
29     * Construct a new Metapath expression.
30     *
31     * @param path
32     *          the Metapath expression string
33     * @param context
34     *          the static context for expression evaluation
35     */
36    public AbstractMetapathExpression(
37        @NonNull String path,
38        @NonNull StaticContext context) {
39      this.path = path;
40      this.staticContext = context;
41    }
42  
43    @Override
44    public String getPath() {
45      return path;
46    }
47  
48    @Override
49    public StaticContext getStaticContext() {
50      return staticContext;
51    }
52  
53    /**
54     * Get the compiled expression tree for this Metapath expression.
55     *
56     * @return the root expression node
57     */
58    @NonNull
59    protected abstract IExpression getExpression();
60  
61    @Override
62    public Class<? extends IItem> getBaseResultType() {
63      return getExpression().getStaticResultType();
64    }
65  
66    @Override
67    public List<? extends IExpression> getChildren() {
68      return CollectionUtil.singletonList(getExpression());
69    }
70  
71    @Override
72    public ISequence<? extends IItem> accept(DynamicContext dynamicContext, ISequence<?> focus) {
73      return getExpression().accept(dynamicContext, focus);
74    }
75  
76    @Override
77    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
78      return getExpression().accept(visitor, context);
79    }
80  }