This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git

commit c1b5161378c9fe042354d17fefb44231f0f0a409
Author: Andy Seaborne <[email protected]>
AuthorDate: Thu May 22 08:24:01 2025 +0100

    GH-3144: Refinements for URI calls to functions
---
 .../org/apache/jena/sparql/core/BasicPattern.java  |  2 +-
 .../jena/sparql/expr/E_AdjustToTimezone.java       |  4 +++
 .../java/org/apache/jena/sparql/expr/E_BNode.java  | 17 +++++----
 .../java/org/apache/jena/sparql/expr/E_IRI.java    | 21 +++++-------
 .../java/org/apache/jena/sparql/expr/E_IRI2.java   |  7 +++-
 .../org/apache/jena/sparql/expr/E_LogicalAnd.java  |  4 +--
 .../org/apache/jena/sparql/expr/E_LogicalOr.java   |  4 +--
 .../java/org/apache/jena/sparql/expr/E_Regex.java  |  4 +++
 .../org/apache/jena/sparql/expr/E_StrReplace.java  | 14 +++++---
 .../java/org/apache/jena/sparql/expr/E_URI.java    | 12 +++----
 .../java/org/apache/jena/sparql/expr/E_URI2.java   | 14 ++++----
 .../org/apache/jena/sparql/expr/E_Version.java     | 19 +++++-----
 .../java/org/apache/jena/sparql/expr/Expr.java     |  2 +-
 .../org/apache/jena/sparql/expr/ExprFunction.java  |  8 ++---
 .../java/org/apache/jena/sparql/expr/ExprNode.java |  6 +++-
 .../{E_Version.java => nodevalue/ARQFuncOp.java}   | 40 +++++++++++-----------
 .../jena/sparql/expr/nodevalue/XSDFuncOp.java      | 22 +++++++++---
 .../sparql/expr/urifunctions/SPARQLDispatch.java   | 37 ++++++++++++++++----
 .../sparql/expr/urifunctions/SPARQLFuncOp.java     | 33 ++++++++++--------
 .../apache/jena/sparql/function/FunctionBase.java  |  2 +-
 .../jena/sparql/function/library/FN_BEV.java       |  2 +-
 .../sparql/function/library/leviathan/md5hash.java |  6 ++--
 .../function/library/leviathan/sha256hash.java     |  4 +--
 .../jena/sparql/sse/builders/BuilderExpr.java      |  2 +-
 .../apache/jena/sparql/syntax/TripleCollector.java |  2 +-
 .../apache/jena/sparql/expr/TestExpressions2.java  |  2 +-
 .../apache/jena/sparql/expr/TestExpressions3.java  |  4 +--
 .../org/apache/jena/sparql/expr/TestNodeValue.java | 30 ++++++++--------
 28 files changed, 192 insertions(+), 132 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java
index 04df9cbb05..5451caaa7a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/BasicPattern.java
@@ -48,7 +48,7 @@ public class BasicPattern implements Iterable<Triple> {
         triples.addAll(other.triples) ;
     }
 
-    private BasicPattern(List<Triple> triples) {
+    public BasicPattern(List<Triple> triples) {
         this.triples = triples ;
     }
 
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java
index 9505496090..abe698b719 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_AdjustToTimezone.java
@@ -25,6 +25,10 @@ import org.apache.jena.sparql.sse.Tags;
 /** Do any of FN_Adjust(date/time)ToTimezone */
 public class E_AdjustToTimezone extends ExprFunctionN {
 
+    public E_AdjustToTimezone(Expr expr1){
+        this(expr1, null);
+    }
+
     public E_AdjustToTimezone(Expr expr1, Expr expr2){
         super(Tags.tagAdjust, expr1, expr2);
     }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java
index 5562bca8c0..9a871cbe0d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_BNode.java
@@ -36,17 +36,17 @@ public class E_BNode implements Unstable
     private static final Symbol keyMap = 
Symbol.create("arq:internal:bNodeMappings");
 
     public static Expr create() {
-        return new E_BNode0();
+        return new BNode0();
     }
 
     public static Expr create(Expr expr) {
-        return new E_BNode1(expr);
+        return new BNode1(expr);
     }
 
     // --- The zero argument case.
-    private static class E_BNode0 extends ExprFunction0  implements Unstable {
+    public static class BNode0 extends ExprFunction0  implements Unstable {
 
-        protected E_BNode0() {
+        protected BNode0() {
             super(symbol);
         }
 
@@ -57,13 +57,13 @@ public class E_BNode implements Unstable
 
         @Override
         public Expr copy() {
-            return new E_BNode0();
+            return new BNode0();
         }
     }
 
     // --- The one argument case.
-    private static class E_BNode1 extends ExprFunction1  implements Unstable {
-        protected E_BNode1(Expr expr) {
+    public static class BNode1 extends ExprFunction1  implements Unstable {
+        protected BNode1(Expr expr) {
             super(expr, symbol);
         }
 
@@ -102,8 +102,7 @@ public class E_BNode implements Unstable
 
         @Override
         public Expr copy(Expr expr) {
-            return new E_BNode1(expr);
+            return new BNode1(expr);
         }
     }
-
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java
index 375103cb74..ff39aab87a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI.java
@@ -34,8 +34,8 @@ import org.apache.jena.sparql.sse.Tags;
  * The function URI(expr) is the same, but under a different name as a
  * subclass.
  * <p>
- * As an ARQ extension , there is also {@code IRI(base, relative)} form which 
is E_IRI2.
- * The relative URI (string or IRI) is resolved against the result of the 
"base" expression.
+ * See also E_IRI2, an ARQ extension. That allows a base and a relative IRI.
+ * The relative URI (string or IRI) is resolved against the result of the 
value of the base expression.
  * which in turn is resolved as per the one-argument form.
  */
 public class E_IRI extends ExprFunction1 {
@@ -62,7 +62,7 @@ public class E_IRI extends ExprFunction1 {
         this.relExpr = relExpr;
     }
 
-    // Evaluation of a "one argument with access to the env.
+    // Evaluation of a "one argument" with access to the env.
     @Override
     protected NodeValue evalSpecial(Binding binding, FunctionEnv env) {
         // IRI(relative)
@@ -72,15 +72,18 @@ public class E_IRI extends ExprFunction1 {
         return resolve(nvRel, baseIRI, env);
     }
 
+    @Override
+    public NodeValue eval(NodeValue v, FunctionEnv env) {
+        // Shouldn't be called. Legacy only.
+        return resolve(v, parserBase, env);
+    }
+
     /*package*/ static NodeValue resolve(NodeValue relative, String baseIRI, 
FunctionEnv env) {
         if ( baseIRI == null ) {
             if ( env.getContext() != null ) {
                 Query query = 
(Query)env.getContext().get(ARQConstants.sysCurrentQuery);
                 if ( query != null )
                     baseIRI = query.getBaseURI();
-                // If still null, NodeFunctions.iri will use the system base.
-//                if ( baseIRI == null )
-//                    baseIRI = IRIs.getBaseStr();
             }
         }
         if ( NodeFunctions.isIRI(relative.asNode()) ) {
@@ -90,12 +93,6 @@ public class E_IRI extends ExprFunction1 {
         return NodeFunctions.iri(relative, baseIRI);
     }
 
-    @Override
-    public NodeValue eval(NodeValue v, FunctionEnv env) {
-        // Shouldn't be called. Legacy only. Does not support baseExpr!=null
-        return resolve(v, parserBase, env);
-    }
-
     @Override
     public Expr copy(Expr expr) {
         return new E_IRI(parserBase, expr);
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java
index d189952f0d..aa6f138a38 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_IRI2.java
@@ -43,14 +43,19 @@ public class E_IRI2 extends ExprFunction2 {
     private static final String sseFunctionName = Tags.tagIri2;
 
     // The base in force when the function was created.
-    // Kept separate from baseExpr so we can see whether it was the one 
argument or two argument form.
     protected final String parserBase;
 
     // ARQ extension: "IRI(base, relative)"
     protected final Expr baseExpr;
     protected final Expr relExpr;
 
+    public E_IRI2(Expr baseExpr, Expr relExpr) {
+        this(baseExpr, null, relExpr);
+    }
+
     public E_IRI2(Expr baseExpr, String parserBaseURI, Expr relExpr) {
+        // BaseStr is the base in force at the time this expression was 
created.
+        // This may be null.
         this(baseExpr, parserBaseURI, relExpr, sparqlPrintName, 
sseFunctionName);
     }
 
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java
index 8a8ff4f9b0..51cabe4ef8 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalAnd.java
@@ -42,7 +42,7 @@ public class E_LogicalAnd extends ExprFunction2
         try {
             NodeValue x = getArg1().eval(binding, env) ;
     
-            if ( ! XSDFuncOp.booleanEffectiveValue(x) )
+            if ( ! XSDFuncOp.effectiveBooleanValue(x) )
                 return NodeValue.FALSE ; 
         } catch (ExprEvalException eee)
         {
@@ -55,7 +55,7 @@ public class E_LogicalAnd extends ExprFunction2
         try {
             NodeValue y = getArg2().eval(binding, env) ;
     
-            if ( ! XSDFuncOp.booleanEffectiveValue(y) )
+            if ( ! XSDFuncOp.effectiveBooleanValue(y) )
                 return NodeValue.FALSE ;
             
             // RHS is true but was there an error earlier?
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java
index 1c09a6698b..f81637863b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_LogicalOr.java
@@ -57,7 +57,7 @@ public class E_LogicalOr extends ExprFunction2
         try {
             NodeValue x = getArg1().eval(binding, env) ;
     
-            if ( XSDFuncOp.booleanEffectiveValue(x) )
+            if ( XSDFuncOp.effectiveBooleanValue(x) )
                        return NodeValue.TRUE ; 
         } catch (ExprEvalException eee)
         {
@@ -70,7 +70,7 @@ public class E_LogicalOr extends ExprFunction2
         try {
             NodeValue y = getArg2().eval(binding, env) ;
     
-               if ( XSDFuncOp.booleanEffectiveValue(y) )
+               if ( XSDFuncOp.effectiveBooleanValue(y) )
                        return NodeValue.TRUE ;
             
             // RHS is false but was there an error earlier?
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java
index eaa58e299a..e924344668 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Regex.java
@@ -33,6 +33,10 @@ public class E_Regex extends ExprFunctionN
     private static final String name = Tags.tagRegex;
     private RegexEngine regexEngine = null;
 
+    public E_Regex(Expr expr, Expr pattern) {
+        this(expr, pattern, null);
+    }
+
     public E_Regex(Expr expr, Expr pattern, Expr flags) {
         super(name, expr, pattern, flags);
         init(pattern, flags);
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
index 3fafec212e..faadfccca2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
@@ -25,19 +25,25 @@ import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ;
 import org.apache.jena.sparql.sse.Tags ;
 
 public class E_StrReplace extends ExprFunctionN {
-    private static final String symbol  = Tags.tagReplace ;
-    private Pattern             pattern = null ;
+    private static final String symbol  = Tags.tagReplace;
+    private final Pattern pattern;
+
+    public E_StrReplace(Expr expr1, Expr expr2, Expr expr3) {
+        this(expr1, expr2, expr3, null);
+    }
 
     public E_StrReplace(Expr expr1, Expr expr2, Expr expr3, Expr expr4) {
-        super(symbol, expr1, expr2, expr3, expr4) ;
+        super(symbol, expr1, expr2, expr3, expr4);
 
+        Pattern pattern0 = null;
         if ( isString(expr2) && (expr4 == null || isString(expr4)) ) {
             String flags = null;
             if ( expr4 != null && expr4.isConstant() && 
expr4.getConstant().isString() )
                 flags = expr4.getConstant().getString();
             String patternStr = expr2.getConstant().getString();
-            pattern = RegexEngine.makePattern("REPLACE", patternStr, flags);
+            pattern0 = RegexEngine.makePattern("REPLACE", patternStr, flags);
         }
+        pattern = pattern0;
     }
 
     private static boolean isString(Expr expr) {
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java
index 162b001584..84072c649b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI.java
@@ -33,19 +33,19 @@ public class E_URI extends E_IRI {
         this(null, relExpr);
     }
 
-    public E_URI(String baseStr, Expr relExpr) {
-        super(baseStr, relExpr, sparqlPrintName, sseFunctionName);
+    public E_URI(String parserBaseURI, Expr relExpr) {
+        super(parserBaseURI, relExpr, sparqlPrintName, sseFunctionName);
     }
 
-    @Override
-    public String getFunctionPrintName(SerializationContext cxt)
-    { return sparqlPrintName ; }
-
     @Override
     public Expr copy(Expr expr) {
         return new E_URI(parserBase, expr);
     }
 
+    @Override
+    public String getFunctionPrintName(SerializationContext cxt)
+    { return sparqlPrintName ; }
+
     @Override
     public int hashCode() {
         return super.hashCode()+1;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java
index 32698e2f95..b05aeb4998 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_URI2.java
@@ -29,23 +29,25 @@ public class E_URI2 extends E_IRI2 {
     private static final String sparqlPrintName = "URI";
     private static final String sseFunctionName = Tags.tagUri2;
 
-    public E_URI2(String baseURI, Expr relExpr) {
-        this(null, baseURI, relExpr);
+    public E_URI2(Expr baseExpr, Expr relExpr) {
+        this(baseExpr, null, relExpr);
     }
 
     public E_URI2(Expr baseExpr, String baseStr, Expr relExpr) {
+        // BaseStr is the base in force at the time this expression was 
created.
+        // This may be null.
         super(baseExpr, baseStr, relExpr, sparqlPrintName, sseFunctionName);
     }
 
-    @Override
-    public String getFunctionPrintName(SerializationContext cxt)
-    { return sparqlPrintName ; }
-
     @Override
     public Expr copy(Expr expr1, Expr expr2) {
         return new E_URI2(expr1, parserBase, expr2);
     }
 
+    @Override
+    public String getFunctionPrintName(SerializationContext cxt)
+    { return sparqlPrintName ; }
+
     @Override
     public int hashCode() {
         return super.hashCode()+1;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java
index 0653096a5e..ec44bf4330 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java
@@ -18,28 +18,25 @@
 
 package org.apache.jena.sparql.expr;
 
-import org.apache.jena.query.ARQ ;
+import org.apache.jena.sparql.expr.nodevalue.ARQFuncOp;
 import org.apache.jena.sparql.function.FunctionEnv ;
 import org.apache.jena.sparql.sse.Tags ;
 
 public class E_Version extends ExprFunction0
 {
     static private String fName = Tags.tagVersion ;
-    
-    public E_Version()
-    {
-        super(fName) ;
+
+    public E_Version() {
+        super(fName);
     }
 
     @Override
-    public Expr copy()
-    {
-        return new E_Version() ;
+    public Expr copy() {
+        return new E_Version();
     }
 
     @Override
-    public NodeValue eval(FunctionEnv env)
-    {
-        return NodeValue.makeString(ARQ.NAME+" "+ARQ.VERSION) ;
+    public NodeValue eval(FunctionEnv env) {
+        return ARQFuncOp.version();
     }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
index 96df7d76e3..d360897c07 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
@@ -38,7 +38,7 @@ public interface Expr
     public static final int CMP_UNEQUAL  = -9 ;
     public static final int CMP_INDETERMINATE  = 
DatatypeConstants.INDETERMINATE ;
 
-    /** Test whether a Constraint is satisfied, given a set of bindings
+    /** Test whether a constraint is satisfied, given a set of bindings.
      *  Includes error propagation and Effective Boolean Value rules.
      *
      * @param binding   The bindings
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java
index 9135fcdbb8..8d6624f97b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunction.java
@@ -96,15 +96,15 @@ public abstract class ExprFunction extends ExprNode
     }
 
     /**
-     * Name used for output in SPARQL format needing functional form (no 
specific keyword).
+     * Name used for output in SPARQL format needing functional syntax: 
name(arg1, arg2, ...)
      * e.g. regexp(), custom functions, ...
      */
     public String getFunctionPrintName(SerializationContext cxt)
     { return funcSymbol.getSymbol(); }
 
     /**
-     * Name used in a functional form (i.e. SPARQL algebra).
-     * getOpName() is used in preference as a short, symbol name.
+     * Name used in the SPARQL algebra.
+     * See also {@link #getOpName} for an operator form.
      */
     public String getFunctionName(SerializationContext cxt)
     { return funcSymbol.getSymbol(); }
@@ -116,7 +116,7 @@ public abstract class ExprFunction extends ExprNode
     /** URI for this function, whether custom or specification defined URI 
(these are keywords in the language) */
     public String getFunctionIRI() { return null; }
 
-    /** Get the symbol name (+, ! etc) for this function -- maybe null for 
none */
+    /** Get the operator symbol name (+, ! etc) for this function -- maybe 
null for none */
     public String getOpName()
     { return opSign; }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
index 03249a637b..85e8190aae 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
@@ -40,7 +40,7 @@ public abstract class ExprNode implements Expr
     public boolean isSatisfied(Binding binding, FunctionEnv funcEnv) {
         try {
             NodeValue v = eval(binding, funcEnv);
-            boolean b = XSDFuncOp.booleanEffectiveValue(v);
+            boolean b = XSDFuncOp.effectiveBooleanValue(v);
             return b;
         }
         catch (ExprEvalException ex) {
@@ -48,7 +48,11 @@ public abstract class ExprNode implements Expr
         }
     }
 
+    /** @deprecated Unnecessary - to be removed */
+    @Deprecated(forRemoval = true)
     public boolean isExpr()     { return true; }
+    /** @deprecated Unnecessary - to be removed */
+    @Deprecated(forRemoval = true)
     public final Expr getExpr() { return this; }
 
     // --- interface Constraint
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/ARQFuncOp.java
similarity index 51%
copy from jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java
copy to 
jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/ARQFuncOp.java
index 0653096a5e..1c8b27e1b3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Version.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/ARQFuncOp.java
@@ -16,30 +16,30 @@
  * limitations under the License.
  */
 
-package org.apache.jena.sparql.expr;
+package org.apache.jena.sparql.expr.nodevalue;
 
-import org.apache.jena.query.ARQ ;
-import org.apache.jena.sparql.function.FunctionEnv ;
-import org.apache.jena.sparql.sse.Tags ;
+import java.util.Optional;
 
-public class E_Version extends ExprFunction0
-{
-    static private String fName = Tags.tagVersion ;
-    
-    public E_Version()
-    {
-        super(fName) ;
-    }
+import org.apache.jena.atlas.lib.Version;
+import org.apache.jena.query.ARQ;
+import org.apache.jena.sparql.expr.NodeValue;
+
+/** Functions specific to ARQ */
+public class ARQFuncOp {
 
-    @Override
-    public Expr copy()
-    {
-        return new E_Version() ;
+    /** The return version information as a human-readable string.*/
+    public static NodeValue version() {
+        String verStr = versionString();
+        return NodeValue.makeString(verStr);
     }
 
-    @Override
-    public NodeValue eval(FunctionEnv env)
-    {
-        return NodeValue.makeString(ARQ.NAME+" "+ARQ.VERSION) ;
+    private static String versionString() {
+        if ( true )
+            return ARQ.NAME+" "+ARQ.VERSION;
+        Optional<String> version = Version.versionForClass(ARQ.class);
+        if ( version.isPresent() )
+            return String.format("Apache Jena version %s", version.get());
+
+        return "Apache Jena";
     }
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index 4a17dbc04c..7bf9ffd8fb 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -295,19 +295,33 @@ public class XSDFuncOp
 
     /** {@literal F&O} fn:not */
     public static NodeValue not(NodeValue nv) {
-        boolean b = XSDFuncOp.booleanEffectiveValue(nv);
+        boolean b = XSDFuncOp.effectiveBooleanValue(nv);
         return NodeValue.booleanReturn(!b);
     }
 
-    /** {@literal F&O} fn:boolean */
+    /** @deprecated Renamed as {@link effectiveBooleanValueAsNodeValue}. */
+    @Deprecated(forRemoval = true)
     public static NodeValue booleanEffectiveValueAsNodeValue(NodeValue nv) {
+        return effectiveBooleanValueAsNodeValue(nv);
+    }
+
+    /** {@literal F&O} fn:boolean */
+    public static NodeValue effectiveBooleanValueAsNodeValue(NodeValue nv) {
         if ( nv.isBoolean() ) // "Optimization" (saves on object churn)
             return nv;
-        return NodeValue.booleanReturn(booleanEffectiveValue(nv));
+        return NodeValue.booleanReturn(effectiveBooleanValue(nv));
     }
 
-    /** {@literal F&O} fn:boolean */
+    /** @deprecated Renamed as {@link effectiveBooleanValue}. */
+    @Deprecated(forRemoval = true)
     public static boolean booleanEffectiveValue(NodeValue nv) {
+        return effectiveBooleanValue(nv);
+    }
+
+    /** {@literal F&O} fn:boolean */
+    public static boolean effectiveBooleanValue(NodeValue nv) {
+        Objects.requireNonNull(nv, "NodeValue is null in call to 
effectiveBooleanValue");
+
         // Apply the "boolean effective value" rules
         // boolean: value of the boolean (strictly, if derived from 
xsd:boolean)
         // plain literal: lexical form length(string) > 0
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java
index 0f40f6287a..c301490275 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLDispatch.java
@@ -123,6 +123,18 @@ public class SPARQLDispatch {
     }
 
     // Switch on arity
+    static void register(Map<String, Call> map, String uri, Function3 
function3, Function4 function4) {
+        Call call = args->{
+            if ( args.length == 3 )
+                return function3.exec(args[0], args[1], args[2]);
+            if ( args.length == 4 )
+                return function4.exec(args[0], args[1], args[2], args[3]);
+            throw exception("%s: Expected three or four arguments. Got %d", 
uri, args.length);
+        };
+        registerCall(map, uri, call);
+    }
+
+    // Arity N
     static void register(Map<String, Call> map, String uri, FunctionN 
function) {
         Call call = args->{
             return function.exec(args);
@@ -150,6 +162,10 @@ public class SPARQLDispatch {
 
     static Map<String, Call> buildDispatchMap() {
         Map<String, Call> map = new HashMap<>();
+
+        // Move out/rename to "FunctionDispatch"
+        // Add ARQ specials.
+
         register(map, "plus", SPARQLFuncOp::sparql_plus );
         register(map, "add", SPARQLFuncOp::sparql_plus );           // Alt 
name.
         register(map, "subtract", SPARQLFuncOp::sparql_subtract );
@@ -161,7 +177,7 @@ public class SPARQLDispatch {
         register(map, "not-equals", SPARQLFuncOp::sparql_not_equals );
         register(map, "greaterThan", SPARQLFuncOp::sparql_greaterThan );
         register(map, "greaterThanOrEqual", 
SPARQLFuncOp::sparql_greaterThanOrEqual );
-        register(map, "lessThan", SPARQLFuncOp::sparql_lessThat );
+        register(map, "lessThan", SPARQLFuncOp::sparql_lessThan );
         register(map, "lessThanOrEqual", SPARQLFuncOp::sparql_lessThanOrEqual 
);
 
         register(map, "and", SPARQLFuncOp::sparql_function_and );
@@ -184,9 +200,13 @@ public class SPARQLDispatch {
         register(map, "floor", SPARQLFuncOp::sparql_floor);
         register(map, "haslang", SPARQLFuncOp::sparql_haslang);
         register(map, "haslangdir", SPARQLFuncOp::sparql_haslangdir);
+
         // Arity 1/2
-        register(map, "iri", x->SPARQLFuncOp.sparql_iri(x), 
(x,b)->SPARQLFuncOp.sparql_iri(x,b));
-        register(map, "uri", SPARQLFuncOp::sparql_uri);
+        //register(map, "iri", x->SPARQLFuncOp.sparql_iri(x), 
(x,b)->SPARQLFuncOp.arq_iri(x,b));
+        register(map, "iri", SPARQLFuncOp::sparql_iri, SPARQLFuncOp::arq_iri);
+        //register(map, "uri", x->SPARQLFuncOp.sparql_uri(x), 
(x,b)->SPARQLFuncOp.arq_uri(x,b));
+        register(map, "uri", SPARQLFuncOp::sparql_uri, SPARQLFuncOp::arq_uri);
+
         register(map, "isBlank", SPARQLFuncOp::sparql_isBlank);
         register(map, "isLiteral", SPARQLFuncOp::sparql_isLiteral);
         register(map, "isNumeric", SPARQLFuncOp::sparql_isNumeric);
@@ -199,8 +219,12 @@ public class SPARQLDispatch {
         register(map, "ucase", SPARQLFuncOp::sparql_ucase);
         register(map, "now", SPARQLFuncOp::sparql_now);
         register(map, "rand", SPARQLFuncOp::sparql_rand);
-        register(map, "regex", SPARQLFuncOp::sparql_regex);
-        register(map, "replace", SPARQLFuncOp::sparql_replace);
+        // Arity 2/3
+        register(map, "regex", SPARQLFuncOp::sparql_regex, 
SPARQLFuncOp::sparql_regex);
+
+        // Arity 3/4
+        register(map, "replace", SPARQLFuncOp::sparql_replace, 
SPARQLFuncOp::sparql_replace);
+
         register(map, "round", SPARQLFuncOp::sparql_round);
         register(map, "sameTerm", SPARQLFuncOp::sparql_sameTerm);
         register(map, "sameValue", SPARQLFuncOp::sparql_sameValue);
@@ -223,6 +247,7 @@ public class SPARQLDispatch {
 
         register(map, "md5", SPARQLFuncOp::sparql_md5);
         register(map, "sha1", SPARQLFuncOp::sparql_sha1);
+        register(map, "sha224", SPARQLFuncOp::sparql_sha224);
         register(map, "sha256", SPARQLFuncOp::sparql_sha256);
         register(map, "sha384", SPARQLFuncOp::sparql_sha384);
         register(map, "sha512", SPARQLFuncOp::sparql_sha512);
@@ -237,7 +262,7 @@ public class SPARQLDispatch {
         register(map, "strlen", SPARQLFuncOp::sparql_strlen);
         register(map, "strstarts", SPARQLFuncOp::sparql_strstarts);
         // Arity 2/3
-        register(map, "substr", (s,x)->SPARQLFuncOp.sparql_substr(s,x), 
(s,x,y)->SPARQLFuncOp.sparql_substr(s,x,y));
+        register(map, "substr", SPARQLFuncOp::sparql_substr, 
SPARQLFuncOp::sparql_substr);
         register(map, "struuid", SPARQLFuncOp::sparql_struuid);
 
         return Map.copyOf(map);
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java
index f04157ed8e..411473218c 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/urifunctions/SPARQLFuncOp.java
@@ -143,7 +143,7 @@ public class SPARQLFuncOp {
         return NodeValue.booleanReturn(r == Expr.CMP_GREATER);
     }
 
-    public static NodeValue sparql_lessThat(NodeValue nv1, NodeValue nv2) {
+    public static NodeValue sparql_lessThan(NodeValue nv1, NodeValue nv2) {
         int r = NodeValue.compare(nv1, nv2);
         return NodeValue.booleanReturn(r == Expr.CMP_LESS);
     }
@@ -158,22 +158,22 @@ public class SPARQLFuncOp {
         return NodeValue.booleanReturn(r == Expr.CMP_LESS || r == 
Expr.CMP_EQUAL);
     }
 
-    // and,or,not as functions (arguments have been evaluated)
+    // and, or, not as functions (arguments have been evaluated)
 
     public static NodeValue sparql_function_and(NodeValue nv1, NodeValue nv2) {
-        boolean arg1 = XSDFuncOp.booleanEffectiveValue(nv1);
-        boolean arg2 = XSDFuncOp.booleanEffectiveValue(nv2);
+        boolean arg1 = XSDFuncOp.effectiveBooleanValue(nv1);
+        boolean arg2 = XSDFuncOp.effectiveBooleanValue(nv2);
         return NodeValue.booleanReturn(arg1 && arg2);
     }
 
     public static NodeValue sparql_function_or(NodeValue nv1, NodeValue nv2) {
-        boolean arg1 = XSDFuncOp.booleanEffectiveValue(nv1);
-        boolean arg2 = XSDFuncOp.booleanEffectiveValue(nv2);
+        boolean arg1 = XSDFuncOp.effectiveBooleanValue(nv1);
+        boolean arg2 = XSDFuncOp.effectiveBooleanValue(nv2);
         return NodeValue.booleanReturn(arg1 || arg2);
     }
 
   public static NodeValue sparql_function_not(NodeValue nv) {
-      boolean arg = XSDFuncOp.booleanEffectiveValue(nv);
+      boolean arg = XSDFuncOp.effectiveBooleanValue(nv);
       return NodeValue.booleanReturn(!arg);
   }
 
@@ -226,11 +226,12 @@ public class SPARQLFuncOp {
     // Term functions : NodeFunctions
 
     public static NodeValue sparql_iri(NodeValue nv) { return 
NodeFunctions.iri(nv, null); }
-    // Extension
-    public static NodeValue sparql_iri(NodeValue nv, NodeValue nvBase) { 
return NodeFunctions.iri(nv, nvBase.getString()); }
-
     public static NodeValue sparql_uri(NodeValue nv) { return sparql_iri(nv); }
 
+    // Extension
+    public static NodeValue arq_iri(NodeValue nv, NodeValue nvBase) { return 
NodeFunctions.iri(nv, nvBase.getString()); }
+    public static NodeValue arq_uri(NodeValue nv, NodeValue nvBase) { return 
NodeFunctions.iri(nv, nvBase.getString()); }
+
     // Only BNODE(), not BNODE(str)
     public static NodeValue sparql_bnode() { return null; }
 
@@ -256,10 +257,7 @@ public class SPARQLFuncOp {
     public static NodeValue sparql_contains(NodeValue nv1, NodeValue nv2) { 
return XSDFuncOp.strContains(nv1, nv2); }
     public static NodeValue sparql_strbefore(NodeValue nv1, NodeValue nv2) { 
return XSDFuncOp.strBefore(nv1, nv2); }
     public static NodeValue sparql_strafter(NodeValue nv1, NodeValue nv2) { 
return XSDFuncOp.strAfter(nv1, nv2); }
-
-    public static NodeValue sparql_concat(NodeValue...args) {
-        return XSDFuncOp.strConcat(List.of(args));
-    }
+    public static NodeValue sparql_concat(NodeValue...args) { return 
XSDFuncOp.strConcat(List.of(args)); }
 
     public static NodeValue sparql_langMatches(NodeValue nv1, NodeValue nv2) { 
return NodeFunctions.langMatches(nv1, nv2); }
 
@@ -270,10 +268,11 @@ public class SPARQLFuncOp {
         return regexEngineCache.get(cacheKey, 
(key)->E_Regex.makeRegexEngine(key.pattern, key.flags));
     }
 
+    public static NodeValue sparql_regex(NodeValue string, NodeValue pattern) 
{ return sparql_regex(string, pattern, null); }
     public static NodeValue sparql_regex(NodeValue string, NodeValue pattern, 
NodeValue flags) {
         // Cache - this means regexes are compiled once.
         String patternStr = pattern.getString();
-        String flagsStr = flags.getString();
+        String flagsStr = (flags == null) ? null : flags.getString();
         RegexEngine regexEngine = getRegexEngine(patternStr, flagsStr);
         String str = string.getString();
         boolean b = regexEngine.match(str);
@@ -283,6 +282,9 @@ public class SPARQLFuncOp {
     public static NodeValue sparql_replace(NodeValue nvStr, NodeValue 
nvPattern, NodeValue nvReplacement)
     { return XSDFuncOp.strReplace(nvStr, nvPattern, nvReplacement); }
 
+    public static NodeValue sparql_replace(NodeValue nvStr, NodeValue 
nvPattern, NodeValue nvReplacement, NodeValue envFlags)
+    { return XSDFuncOp.strReplace(nvStr, nvPattern, nvReplacement, envFlags); }
+
     public static NodeValue sparql_encode(NodeValue nv) { return 
XSDFuncOp.strEncodeForURI(nv); }
     public static NodeValue sparql_abs(NodeValue nv)    { return 
XSDFuncOp.abs(nv); }
     public static NodeValue sparql_round(NodeValue nv)  { return 
XSDFuncOp.round(nv); }
@@ -316,6 +318,7 @@ public class SPARQLFuncOp {
 
     public static NodeValue sparql_md5(NodeValue nv)    { return 
NodeValueDigest.calculateDigest(nv, "MD-5"); }
     public static NodeValue sparql_sha1(NodeValue nv)   { return 
NodeValueDigest.calculateDigest(nv, "SHA-1"); }
+    public static NodeValue sparql_sha224(NodeValue nv) { return 
NodeValueDigest.calculateDigest(nv, "SHA-224"); }
     public static NodeValue sparql_sha256(NodeValue nv) { return 
NodeValueDigest.calculateDigest(nv, "SHA-256"); }
     public static NodeValue sparql_sha384(NodeValue nv) { return 
NodeValueDigest.calculateDigest(nv, "SHA-384"); }
     public static NodeValue sparql_sha512(NodeValue nv) { return 
NodeValueDigest.calculateDigest(nv, "SHA-512"); }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java
index 3268c0f44b..50c145b5b1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionBase.java
@@ -66,5 +66,5 @@ public abstract class FunctionBase implements Function {
     /** Function call to a list of evaluated argument values */
     public abstract NodeValue exec(List<NodeValue> args) ;
 
-    public abstract void checkBuild(String uri, ExprList args) ;
+    public abstract void checkBuild(String uri, ExprList args);
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java
index e454595dca..3e84afc90f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_BEV.java
@@ -29,6 +29,6 @@ public class FN_BEV extends FunctionBase1
     @Override
     public NodeValue exec(NodeValue x)
     {
-        return XSDFuncOp.booleanEffectiveValueAsNodeValue(x) ;
+        return XSDFuncOp.effectiveBooleanValueAsNodeValue(x) ;
     }
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java
index a8f6f7919b..3cab49be6e 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/md5hash.java
@@ -24,9 +24,9 @@ import org.apache.jena.sparql.expr.NodeValue ;
 import org.apache.jena.sparql.function.FunctionBase1 ;
 
 public class md5hash extends FunctionBase1 {
-    
-    private ExprDigest digest = new 
E_MD5(NodeValue.makeBoolean(true).getExpr());
-    
+
+    private ExprDigest digest = new E_MD5(NodeValue.makeBoolean(true));
+
     @Override
     public NodeValue exec(NodeValue v) {
         return digest.eval(v);
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java
index e3224371a4..65b518d8c4 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/leviathan/sha256hash.java
@@ -25,8 +25,8 @@ import org.apache.jena.sparql.function.FunctionBase1 ;
 
 public class sha256hash extends FunctionBase1 {
 
-    private ExprDigest digest = new 
E_SHA256(NodeValue.makeBoolean(true).getExpr());
-    
+    private ExprDigest digest = new E_SHA256(NodeValue.makeBoolean(true));
+
     @Override
     public NodeValue exec(NodeValue v) {
         return digest.eval(v);
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java
index 2e22f1c0f8..189044b597 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderExpr.java
@@ -796,7 +796,7 @@ public class BuilderExpr
         if ( numArgs(list) == 2 ) {
             Expr expr1 = buildExpr(list.get(1));
             Expr expr2 = buildExpr(list.get(2));
-            return new E_URI2(expr1, null, expr2);
+            return new E_URI2(expr1, expr2);
         }
         String baseStr = asString(list.get(1));
         Expr expr1 = buildExpr(list.get(2));
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java
index 2fc60d5b89..d54931acb4 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/TripleCollector.java
@@ -36,7 +36,7 @@ public interface TripleCollector
     // triples 0..(mark-1) before using a mark. That is, use marks in
     // LIFO (stack) order.
 
-    public default int mark() { throw new InternalErrorException("Mark no 
tsupported"); }
+    public default int mark() { throw new InternalErrorException("Mark not 
supported"); }
 
     public default void addTriple(int index, Triple t) { addTriple(t); }
 
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java
index 60e096cf0b..f884ab937e 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions2.java
@@ -245,7 +245,7 @@ public class TestExpressions2
     /*package*/ static void eval(String string, boolean result) {
         Expr expr = ExprUtils.parse(string) ;
         NodeValue nv = expr.eval(null, LibTestExpr.createTest()) ;
-        boolean b = XSDFuncOp.booleanEffectiveValue(nv) ;
+        boolean b = XSDFuncOp.effectiveBooleanValue(nv) ;
         assertEquals(string, result, b) ;
     }
 }
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java
index 324610252c..81c8a01362 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions3.java
@@ -51,7 +51,7 @@ public class TestExpressions3
         Binding binding = binding(bindingStr) ;
         Expr expr = ExprUtils.parse(string) ;
         NodeValue nv = expr.eval(binding, LibTestExpr.createTest()) ;
-        boolean b = XSDFuncOp.booleanEffectiveValue(nv) ;
+        boolean b = XSDFuncOp.effectiveBooleanValue(nv) ;
         assertEquals(string, expected, b) ;
     }
 
@@ -60,7 +60,7 @@ public class TestExpressions3
         Binding binding = binding(bindingStr) ;
         Expr expr = SSE.parseExpr(exprString) ;
         NodeValue nv = expr.eval(binding, LibTestExpr.createTest()) ;
-        boolean b = XSDFuncOp.booleanEffectiveValue(nv) ;
+        boolean b = XSDFuncOp.effectiveBooleanValue(nv) ;
         assertEquals(exprString, expected, b) ;
     }
 
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
index 8e1bf78ffc..24b6ff7cc7 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
@@ -493,7 +493,7 @@ public class TestNodeValue
         assertTrue("Not a boolean: " + v, v.isBoolean());
         // assertTrue("Not a node: "+v, v.hasNode()) ;
         assertTrue("Not true: " + v, v.getBoolean());
-        assertTrue("Not true: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertTrue("Not true: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     @Test
@@ -502,7 +502,7 @@ public class TestNodeValue
         assertTrue("Not a boolean: " + v, v.isBoolean());
         // assertTrue("Not a node: "+v, v.hasNode()) ;
         assertFalse("Not false: " + v, v.getBoolean());
-        assertFalse("Not false: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertFalse("Not false: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     @Test
@@ -693,21 +693,21 @@ public class TestNodeValue
     public void testEBV1() {
         assertTrue("Not a boolean", NodeValue.TRUE.isBoolean());
         assertTrue("Not true", NodeValue.TRUE.getBoolean());
-        assertTrue("Not true", 
XSDFuncOp.booleanEffectiveValue(NodeValue.TRUE));
+        assertTrue("Not true", 
XSDFuncOp.effectiveBooleanValue(NodeValue.TRUE));
     }
 
     @Test
     public void testEBV2() {
         assertTrue("Not a boolean", NodeValue.FALSE.isBoolean());
         assertFalse("Not false", NodeValue.FALSE.getBoolean());
-        assertFalse("Not false", 
XSDFuncOp.booleanEffectiveValue(NodeValue.FALSE));
+        assertFalse("Not false", 
XSDFuncOp.effectiveBooleanValue(NodeValue.FALSE));
     }
 
     @Test
     public void testEBV3() {
         NodeValue v = NodeValue.makeInteger(1);
         assertFalse("It's a boolean: " + v, v.isBoolean());
-        assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertTrue("Not EBV true: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     @Test
@@ -719,7 +719,7 @@ public class TestNodeValue
             fail("getBoolean should fail");
         }
         catch (ExprEvalException e) {}
-        assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertFalse("Not EBV false: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     @Test
@@ -732,7 +732,7 @@ public class TestNodeValue
             fail("getBoolean should fail");
         }
         catch (ExprEvalException e) {}
-        assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertTrue("Not EBV true: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     @Test
@@ -744,7 +744,7 @@ public class TestNodeValue
             fail("getBoolean should fail");
         }
         catch (ExprEvalException e) {}
-        assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertFalse("Not EBV false: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     // EBV includes plain literals which includes language tagged literals.
@@ -752,18 +752,18 @@ public class TestNodeValue
     public void testEBV7() {
         Node x = NodeFactory.createLiteralLang("", "en");
         NodeValue v = NodeValue.makeNode(x);
-        assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertFalse("Not EBV false: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     @Test
     public void testEBV8() {
         Node x = NodeFactory.createLiteralLang("not empty", "en");
         NodeValue v = NodeValue.makeNode(x);
-        assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v));
+        assertTrue("Not EBV true: " + v, XSDFuncOp.effectiveBooleanValue(v));
     }
 
     static boolean ebvDouble(double d) {
-        return XSDFuncOp.booleanEffectiveValue(NodeValue.makeDouble(d));
+        return XSDFuncOp.effectiveBooleanValue(NodeValue.makeDouble(d));
     }
 
     @Test
@@ -783,11 +783,11 @@ public class TestNodeValue
 
         Node x = NodeFactory.createLiteralDT("NaN", XSDDatatype.XSDdouble);
         NodeValue v = NodeValue.makeNode(x);
-        assertFalse(XSDFuncOp.booleanEffectiveValue(v));
+        assertFalse(XSDFuncOp.effectiveBooleanValue(v));
     }
 
     static boolean ebvFloat(float f) {
-        return XSDFuncOp.booleanEffectiveValue(NodeValue.makeFloat(f));
+        return XSDFuncOp.effectiveBooleanValue(NodeValue.makeFloat(f));
     }
 
     @Test
@@ -807,12 +807,12 @@ public class TestNodeValue
 
         Node x = NodeFactory.createLiteralDT("NaN", XSDDatatype.XSDfloat);
         NodeValue v = NodeValue.makeNode(x);
-        assertFalse(XSDFuncOp.booleanEffectiveValue(v));
+        assertFalse(XSDFuncOp.effectiveBooleanValue(v));
     }
 
     private static boolean filterEBV(NodeValue nv) {
         try {
-            return XSDFuncOp.booleanEffectiveValue(nv);
+            return XSDFuncOp.effectiveBooleanValue(nv);
         }
         catch (ExprEvalException ex) {
             return false;


Reply via email to