Add fn:error.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/2d421aa6
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/2d421aa6
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/2d421aa6

Branch: refs/heads/master
Commit: 2d421aa66c2fac8b9317321777768e6ae2acca4f
Parents: 88fbc93
Author: Andy Seaborne <[email protected]>
Authored: Wed Dec 13 16:34:11 2017 +0000
Committer: Andy Seaborne <[email protected]>
Committed: Sun Dec 17 20:04:42 2017 +0000

----------------------------------------------------------------------
 .../jena/sparql/function/StandardFunctions.java |  4 ++
 .../jena/sparql/function/library/FN_Error.java  | 66 ++++++++++++++++++++
 .../apache/jena/sparql/expr/TestXSDFuncOp.java  | 22 +++++++
 3 files changed, 92 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/2d421aa6/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
index 1d4b77b..a4e2662 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
@@ -104,6 +104,10 @@ public class StandardFunctions
         // Sections refer to XQ/XP Expression 3.1
         // https://www.w3.org/TR/xpath-functions-3/
 
+        // 3.1.1 fn:error
+        add(registry, xfn+"error",         FN_Error.class) ;
+
+        
 //      5.4.1 fn:concat
 //      5.4.3 fn:substring
 //      5.4.4 fn:string-length

http://git-wip-us.apache.org/repos/asf/jena/blob/2d421aa6/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_Error.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_Error.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_Error.java
new file mode 100644
index 0000000..718ba06
--- /dev/null
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/FN_Error.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.function.library;
+
+import java.util.List ;
+
+import org.apache.jena.atlas.lib.Lib;
+import org.apache.jena.query.QueryBuildException;
+import org.apache.jena.sparql.ARQInternalErrorException;
+import org.apache.jena.sparql.expr.ExprEvalException ;
+import org.apache.jena.sparql.expr.ExprList ;
+import org.apache.jena.sparql.expr.NodeValue ;
+import org.apache.jena.sparql.expr.nodevalue.NodeFunctions;
+import org.apache.jena.sparql.function.FunctionBase;
+
+/** XPath and XQuery Functions and Operators 3.1
+ * <p> 
+ * {@code fn:error()}
+ * <br/>
+ * {@code fn:error(message)}
+ */
+public class FN_Error extends FunctionBase {
+
+    @Override
+    public void checkBuild(String uri, ExprList args) {
+        if ( args.size() != 0 && args.size() != 1 )
+            throw new QueryBuildException("Function '"+Lib.className(this)+"' 
takes zero or one arguments") ;
+    }
+    
+    @Override
+    public NodeValue exec(List<NodeValue> args) {
+        if ( args == null )
+            // The contract on the function interface is that this should not 
happen.
+            throw new ARQInternalErrorException("FunctionBase1: Null args 
list") ;
+        
+        int size = args.size();
+        
+        switch(args.size()) {
+            case 0:
+                throw new ExprEvalException();
+            case 1: {
+                NodeValue nv = args.get(0);
+                String str = NodeFunctions.str(nv.asNode());
+                throw new ExprEvalException(str);
+            }
+            default:
+                    throw new ExprEvalException("fn:error: Wrong number of 
arguments: Wanted 0 or 1, got "+args.size()) ;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/2d421aa6/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
index afa0388..30b853d 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
@@ -947,5 +947,27 @@ public class TestXSDFuncOp extends BaseTest
     @Test public void cast_time_tz_01() { testDateTimeCast(nv_dt_tz1, 
XSDDatatype.XSDtime, nv_t_tz1) ; }
     @Test public void cast_time_tz_02() { testDateTimeCast(nv_dt_tz2, 
XSDDatatype.XSDtime, nv_t_tz2) ; }
     @Test public void cast_time_tz_03() { testDateTimeCast(nv_dt_tz3, 
XSDDatatype.XSDtime, nv_t_tz3) ; }
+    
+    @Test
+    public void fn_error_01() {
+        try {
+            LibTestExpr.eval("fn:error()");
+            fail("No exception");
+        }
+        catch (ExprEvalException ex) {
+            assertNull(ex.getMessage());
+        }
+    }
+
+    @Test
+    public void fn_error_02() {
+        try {
+            LibTestExpr.eval("fn:error('MESSAGE')");
+            fail("No exception");
+        }
+        catch (ExprEvalException ex) {
+            assertEquals("MESSAGE", ex.getMessage());
+        }
+    }
 }
 

Reply via email to