You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2018/03/14 15:06:41 UTC
[4/7] jena git commit: Towards JENA-632: Conversion of Nodes to
JsonValues.
Towards JENA-632: Conversion of Nodes to JsonValues.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/2dd4418a
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/2dd4418a
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/2dd4418a
Branch: refs/heads/master
Commit: 2dd4418a2271e980511bbd6382c37f5130aa6e3a
Parents: 6e20282
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Mar 13 17:01:52 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Mar 13 17:01:52 2018 +0000
----------------------------------------------------------------------
.../org/apache/jena/sparql/function/js/NV.java | 2 +
.../apache/jena/sparql/lib/RDFTerm2Json.java | 104 +++++++++++++++++++
.../apache/jena/sparql/function/js/TestNV.java | 8 +-
.../java/org/apache/jena/sparql/lib/TS_Lib.java | 31 ++++++
.../jena/sparql/lib/TestRDFTerm2Json.java | 58 +++++++++++
5 files changed, 199 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/2dd4418a/jena-arq/src/main/java/org/apache/jena/sparql/function/js/NV.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/js/NV.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/js/NV.java
index 2abcad1..ffd3824 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/js/NV.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/js/NV.java
@@ -26,6 +26,7 @@ import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.sparql.expr.ExprEvalException;
import org.apache.jena.sparql.expr.NodeValue;
+import org.apache.jena.sparql.lib.RDFTerm2Json;
/**
* General representation of an {@link NodeValue} for JavaScript. Conversion is to native
@@ -34,6 +35,7 @@ import org.apache.jena.sparql.expr.NodeValue;
*
* @see #fromNodeValue
* @see #toNodeValue
+ * @see RDFTerm2Json RDFTerm2Json, for one way conversion JSON.
*/
public class NV implements RDFJS {
http://git-wip-us.apache.org/repos/asf/jena/blob/2dd4418a/jena-arq/src/main/java/org/apache/jena/sparql/lib/RDFTerm2Json.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lib/RDFTerm2Json.java b/jena-arq/src/main/java/org/apache/jena/sparql/lib/RDFTerm2Json.java
new file mode 100644
index 0000000..5f0184c
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lib/RDFTerm2Json.java
@@ -0,0 +1,104 @@
+/*
+ * 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.lib;
+
+import org.apache.jena.atlas.json.*;
+import org.apache.jena.datatypes.RDFDatatype;
+import org.apache.jena.graph.Node;
+import org.apache.jena.rdf.model.impl.Util;
+import org.apache.jena.riot.system.RiotLib;
+import org.apache.jena.sparql.expr.NodeValue;
+import org.apache.jena.sparql.function.js.NV;
+
+/**
+ * General converting of {@link Node}s to JSON.
+ * <p>
+ * This is a one way, lossy, conversion from an RDF Term to the best available JSON value.
+ * <p>
+ * This is not SPARQL results in JSON ({@locde application/result-sets+json}).
+ *
+ * <table>
+ * <tr><th>RDF Term</th><th>JSON value</th></tr>
+ * <tr><td>URI</td><td>String</td></tr>
+ * <tr><td>xsd:string</td><td>String</td></tr>
+ * <tr><td>rdf:langString</td><td>String (no {@literal @}lang)</td></tr>
+ * <tr><td>XSD numeric</td><td>JSON number</td></tr>
+ * <tr><td>xsd:boolean</td><td>boolean</td></tr>
+ * <tr><td>Literal, other datatype</td><td>String, no ^^</td></tr>
+ * <tr><td>Unbound</td><td>JSON null</td></tr>
+ * </table>
+ *
+ * @see NV for conversion to and from {@link NodeValue}s for function argument and results.
+ */
+
+public class RDFTerm2Json {
+ // Six data types that are primitives in JavaScript:
+ // Boolean
+ // Null
+ // Undefined
+ // Number
+ // String
+ // Symbol (new in ECMAScript 6; not in Nashorn/Java8).
+ // and Object
+
+ public static JsonValue fromNode(Node node) {
+ if ( node == null )
+ return JsonNull.instance;
+ if ( node.isURI() )
+ return new JsonString(node.getURI());
+ if ( node.isBlank() ) {
+ Node node2 = RiotLib.blankNodeToIri(node);
+ return new JsonString(node.getURI());
+ }
+ if ( node.isVariable() )
+ return new JsonString("?"+node.getName());
+
+ // Literals.
+ if ( Util.isSimpleString(node) || Util.isLangString(node) )
+ return new JsonString(node.getLiteralLexicalForm());
+
+ // Includes well-formed testing.
+ RDFDatatype dt = node.getLiteralDatatype();
+
+ NodeValue nv = NodeValue.makeNode(node);
+ if ( nv.isNumber() ) {
+ // Order matters here to find the narrowest choice.
+ if ( nv.isInteger() ) {
+ try {
+ return JsonNumber.value(nv.getInteger().longValueExact());
+ } catch (ArithmeticException ex) {
+ // Bad in some way : scale maybe.
+ // Try as decimal.
+ }
+ }
+ if ( nv.isDecimal() )
+ return JsonNumber.value(nv.getDecimal());
+ if ( nv.isDouble() )
+ return JsonNumber.value(nv.getDouble());
+ if ( nv.isFloat() )
+ return JsonNumber.value(nv.getFloat());
+ // Drop through.
+ } else if ( nv.isBoolean() ) {
+ return new JsonBoolean(nv.getBoolean());
+ }
+
+ // else
+ return new JsonString(node.getLiteralLexicalForm());
+ }
+}
http://git-wip-us.apache.org/repos/asf/jena/blob/2dd4418a/jena-arq/src/test/java/org/apache/jena/sparql/function/js/TestNV.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/function/js/TestNV.java b/jena-arq/src/test/java/org/apache/jena/sparql/function/js/TestNV.java
index 728172d..7523185 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/function/js/TestNV.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/function/js/TestNV.java
@@ -32,7 +32,7 @@ public class TestNV {
// No conversion to JS - becomes an NV.
@Test public void nv_5() { test("'2018-01-06T17:56:41.293+00:00'^^xsd:dateTime"); }
- @Test public void nv_6() { test("<http://jena/apche.org/>"); }
+ @Test public void nv_6() { test("<http://jena.apache.org/>"); }
@Test public void nv_7() { test("_:abc123"); }
@Test public void nv_10() {
@@ -44,10 +44,10 @@ public class TestNV {
}
@Test public void nv_12() {
- NodeValue nodeValue = nv("<http://jena/apche.org/>");
+ NodeValue nodeValue = nv("<http://jena.apache.org/>");
NV nv = new NV(nodeValue);
- assertEquals("http://jena/apche.org/", nv.getUri());
- assertEquals("http://jena/apche.org/", nv.getValue());
+ assertEquals("http://jena.apache.org/", nv.getUri());
+ assertEquals("http://jena.apache.org/", nv.getValue());
assertEquals("NamedNode", nv.getTermType());
}
http://git-wip-us.apache.org/repos/asf/jena/blob/2dd4418a/jena-arq/src/test/java/org/apache/jena/sparql/lib/TS_Lib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/lib/TS_Lib.java b/jena-arq/src/test/java/org/apache/jena/sparql/lib/TS_Lib.java
new file mode 100644
index 0000000..b91cb6c
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/lib/TS_Lib.java
@@ -0,0 +1,31 @@
+/*
+ * 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.lib;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses( {
+ TestRDFTerm2Json.class
+})
+public class TS_Lib {
+
+}
http://git-wip-us.apache.org/repos/asf/jena/blob/2dd4418a/jena-arq/src/test/java/org/apache/jena/sparql/lib/TestRDFTerm2Json.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/lib/TestRDFTerm2Json.java b/jena-arq/src/test/java/org/apache/jena/sparql/lib/TestRDFTerm2Json.java
new file mode 100644
index 0000000..edc23cd
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/lib/TestRDFTerm2Json.java
@@ -0,0 +1,58 @@
+/*
+ * 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.lib;
+
+import static org.junit.Assert.assertEquals;
+
+import java.math.BigDecimal;
+
+import org.apache.jena.atlas.json.*;
+import org.apache.jena.graph.Node;
+import org.apache.jena.sparql.lib.RDFTerm2Json;
+import org.apache.jena.sparql.sse.SSE;
+import org.junit.Test;
+
+public class TestRDFTerm2Json {
+
+ @Test public void n2j_1() { test("'abc'", new JsonString("abc")); }
+
+ @Test public void n2j_2() { test("<http://jena.apache.org/>", new JsonString("http://jena.apache.org/")); }
+
+ @Test public void n2j_3() { test("123", JsonNumber.value(123)); }
+
+ @Test public void n2j_4() { test("123.0", JsonNumber.value(new BigDecimal("123.0"))); }
+
+ @Test public void n2j_5() { test("123e0", JsonNumber.value(/*(double)*/123e0)); }
+
+ @Test public void n2j_6() { test("'123e0'^^xsd:float", JsonNumber.value((float)123.0)); }
+
+ @Test public void n2j_7() { test("true", new JsonBoolean(true)); }
+
+ @Test public void n2j_8() { test("'text'@en", new JsonString("text")) ; }
+
+ @Test public void n2j_9() { assertEquals(JsonNull.instance, RDFTerm2Json.fromNode(null)) ; }
+
+
+ private void test(String nodeStr, JsonValue expected) {
+ Node n = SSE.parseNode(nodeStr);
+ JsonValue jv = RDFTerm2Json.fromNode(n);
+ assertEquals(expected, jv);
+ }
+
+}