1 /* 2 * SPDX-FileCopyrightText: none 3 * SPDX-License-Identifier: CC0-1.0 4 */ 5 6 package gov.nist.secauto.metaschema.core.metapath; 7 8 import gov.nist.secauto.metaschema.core.metapath.cst.IExpressionVisitor; 9 import gov.nist.secauto.metaschema.core.metapath.item.IItem; 10 import gov.nist.secauto.metaschema.core.metapath.item.ISequence; 11 12 import java.util.List; 13 14 import edu.umd.cs.findbugs.annotations.NonNull; 15 16 /** 17 * The common interface of all Metapath expression nodes. 18 * <p> 19 * Metapath expression nodes represent the different types of expressions that 20 * can appear in a Metapath query, forming a composite structure that can be 21 * traversed and evaluated. 22 * 23 * @since 1.0.0 24 * @see gov.nist.secauto.metaschema.core.metapath.cst.IExpressionVisitor 25 */ 26 public interface IExpression { 27 /** 28 * Get the text for the expression. 29 * 30 * @return the expression text 31 */ 32 @NonNull 33 String getText(); 34 35 /** 36 * Retrieve the child expressions associated with this expression. 37 * 38 * @return a list of expressions, which may be empty 39 */ 40 @NonNull 41 List<? extends IExpression> getChildren(); 42 43 /** 44 * The minimum expected result type to be produced when evaluating the 45 * expression. The result may be a sub-class or sub-interface of this value. 46 * 47 * @return the base result type 48 */ 49 @NonNull 50 default Class<? extends IItem> getBaseResultType() { 51 return IItem.class; 52 } 53 54 /** 55 * The expected result type produced by evaluating the expression. The result 56 * must be the same or a sub-class or sub-interface of the value provided by 57 * {@link #getBaseResultType()}. 58 * <p> 59 * This method can be overloaded to provide static analysis of the expression to 60 * determine a more specific result type. 61 * 62 * @return the result type 63 */ 64 @NonNull 65 default Class<? extends IItem> getStaticResultType() { 66 return getBaseResultType(); 67 } 68 69 /** 70 * Produce a string representation of this expression including the expression's 71 * name. 72 * <p> 73 * This method can be overloaded to provide a more appropriate representation of 74 * the expression. 75 * 76 * @return a string representing the data elements of the expression 77 */ 78 @SuppressWarnings("null") 79 @NonNull 80 default String toCSTString() { 81 return String.format("%s[]", getClass().getName()); 82 } 83 84 /** 85 * Provides a double dispatch callback for visitor handling. 86 * 87 * @param dynamicContext 88 * the dynamic evaluation context 89 * @param focus 90 * the outer focus of the expression 91 * @return the result of evaluation 92 */ 93 @NonNull 94 ISequence<? extends IItem> accept(@NonNull DynamicContext dynamicContext, @NonNull ISequence<?> focus); 95 96 /** 97 * Provides a double dispatch callback for visitor handling. 98 * 99 * @param <RESULT> 100 * the type of the evaluation result 101 * @param <CONTEXT> 102 * the type of the visitor context 103 * @param visitor 104 * the visitor calling this method 105 * @param context 106 * the visitor context 107 * @return the result of evaluation 108 */ 109 <RESULT, CONTEXT> RESULT accept(@NonNull IExpressionVisitor<RESULT, CONTEXT> visitor, @NonNull CONTEXT context); 110 }