From 216111f1031482a68dcc1b6068c37adc84a7ee8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois-Paul=20Servant?= Date: Tue, 31 Jan 2017 10:06:25 +0100 Subject: [PATCH 1/5] writing jsonld: preserve id of blanknodes if they are valid jsonld blanknode identifiers --- .../org/apache/jena/riot/out/NodeToLabel.java | 4 +- .../jena/riot/writer/JenaRDF2JSONLD.java | 21 ++++- .../jena/riot/writer/TestJsonLDWriter.java | 79 ++++++++++++++++++- 3 files changed, 98 insertions(+), 6 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/riot/out/NodeToLabel.java b/jena-arq/src/main/java/org/apache/jena/riot/out/NodeToLabel.java index cc31917692c..c008b163de8 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/out/NodeToLabel.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/out/NodeToLabel.java @@ -32,6 +32,8 @@ public class NodeToLabel extends MapWithScope { + public static final String ALLOCATOR_INC_LABEL_PREFIX = "_:b"; + /** Allocation from a single scope; just the label matters. */ static public NodeToLabel createScopeByDocument() { return new NodeToLabel(new SingleScopePolicy(), new AllocatorIncLabel()) ; } @@ -169,7 +171,7 @@ private static class AllocatorIncLabel extends AllocatorBase @Override protected String labelForBlank(Node node) { - return "_:b"+Integer.toString(X++) ; + return ALLOCATOR_INC_LABEL_PREFIX+Integer.toString(X++) ; } } diff --git a/jena-arq/src/main/java/org/apache/jena/riot/writer/JenaRDF2JSONLD.java b/jena-arq/src/main/java/org/apache/jena/riot/writer/JenaRDF2JSONLD.java index 2fe678ba8ea..5f4e0d684df 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/writer/JenaRDF2JSONLD.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/writer/JenaRDF2JSONLD.java @@ -32,7 +32,7 @@ import com.github.jsonldjava.core.JsonLdError ; import com.github.jsonldjava.core.RDFDataset ; -/** Convert from JSON-LD syntax to JSON-LD internal representation of a dataset, using Jena Quads/Nodes etc */ +/** Convert from Jena RDFDataset (Quads/Nodes etc) to JSON-LD internal representation of a dataset */ class JenaRDF2JSONLD implements com.github.jsonldjava.core.RDFParser { NodeToLabel labels = SyntaxLabels.createNodeToLabel() ; @@ -91,11 +91,24 @@ public RDFDataset parse(Object object) throws JsonLdError { return result ; } - private String blankNodeOrIRIString(Node x) + String blankNodeOrIRIString(Node x) { if ( x.isURI() ) return x.getURI() ; - if ( x.isBlank() ) - return labels.get(null, x) ; + if ( x.isBlank() ) { + // return a valid jsond blanknode identifier for x + String lab = x.getBlankNodeLabel(); + if (lab.startsWith("_:")) { + // blank node's label is a valid jsonld blanknode identifier + // we can use it + // except if it is one that can be generated by labels + if (!lab.startsWith(NodeToLabel.ALLOCATOR_INC_LABEL_PREFIX)) { + return lab; + } + } + // generate a valid, nice looking, jsonld blanknode id + // (typically, replace long ids generated by jena (eg. 46b9fa5f:159f1461113:-7fff) by short ones eg. "_:b13") + return labels.get(null, x) ; + } return null ; } } diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java index 82aaa6bece0..10f8a24ed3b 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java @@ -17,28 +17,38 @@ */ package org.apache.jena.riot.writer; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; +import java.nio.charset.StandardCharsets; import org.apache.jena.atlas.json.JsonObject; import org.apache.jena.atlas.json.JsonString; import org.apache.jena.atlas.junit.BaseTest; +import org.apache.jena.query.Dataset; import org.apache.jena.query.DatasetFactory; +import org.apache.jena.rdf.model.AnonId; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.RDFNode; import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.JsonLDWriteContext; +import org.apache.jena.riot.Lang; import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.riot.RDFFormat; import org.apache.jena.riot.WriterDatasetRIOT; import org.apache.jena.riot.system.PrefixMap; import org.apache.jena.riot.system.RiotLib; +import org.apache.jena.riot.system.StreamRDFLib; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.util.Context; import org.apache.jena.vocabulary.RDF; +import org.apache.jena.vocabulary.RDFS; import org.apache.log4j.Logger; import org.junit.Test; @@ -460,15 +470,73 @@ private Model simpleModel(String ns) { // compactArrays is false -> an array for all props, even when there's only one value assertTrue(jsonld.indexOf("\"jobTitle\" : [ \"Professor\" ]") > -1); } + + /** + * Test blanknodes. + * + * Several graphs, blanknodes with an id given by the user, or generated by jena + */ + @Test public final void blankNodesTest() throws IOException { + // create a dataset with one named graph, and some blanknodes + + Dataset ds = null; + Model m = ModelFactory.createDefaultModel(); + Model m2 = ModelFactory.createDefaultModel(); + ds = DatasetFactory.create(m); + String namedModelName = "http://ex.com/namedgraph"; + ds.addNamedModel(namedModelName, m2); + + Resource s = m.createResource(); + String bn1InDefaultGraphLabel = "blank node 1 in default graph"; + m.add(s, RDFS.label, bn1InDefaultGraphLabel); + + s = m2.createResource(); + String bn2InNamedGraphLabel = "blank node 2 in named graph"; + m2.add(s, RDFS.label, bn2InNamedGraphLabel); + + // blanknodes with given id, shared by the 2 graphs + + s = m.createResource(AnonId.create("_:foo")); + m.add(s, RDFS.label, "_:foo in default graph"); + + s = m2.createResource(AnonId.create("_:foo")); + m2.add(s, RDFS.label, "_:foo in named graph"); + + s = m.createResource(AnonId.create("xxx")); + m.add(s, RDFS.label, "xxx in default"); + + s = m2.createResource(AnonId.create("xxx")); + m2.add(s, RDFS.label, "xxx in named"); + + // this id will probably be changed in output + s = m.createResource(AnonId.create("_:b0")); + m.add(s, RDFS.label, "? in default graph"); + + s = m2.createResource(AnonId.create("_:b0")); + m2.add(s, RDFS.label, "? in named graph"); + + // write to jsonld and parse it back + + String jsonld = dataset2jsonld(ds.asDatasetGraph(), RDFFormat.JSONLD, null); + // System.out.println(jsonld); + Dataset ds2 = jsonld2dataset(jsonld, null); + + assertTrue(ds2.getDefaultModel().isIsomorphicWith(ds.getDefaultModel())); + assertTrue(ds2.getNamedModel(namedModelName).isIsomorphicWith(ds.getNamedModel(namedModelName))); + } + // // some utilities // private String toString(Model m, RDFFormat f, Context jenaContext) { + return dataset2jsonld(DatasetFactory.create(m).asDatasetGraph(), f, jenaContext); + } + + private String dataset2jsonld(DatasetGraph g, RDFFormat f, Context jenaContext) { try(ByteArrayOutputStream out = new ByteArrayOutputStream()) { WriterDatasetRIOT w = RDFDataMgr.createDatasetWriter(f) ; - DatasetGraph g = DatasetFactory.create(m).asDatasetGraph(); PrefixMap pm = RiotLib.prefixMap(g); String base = null; w.write(out, g, pm, base, jenaContext) ; @@ -483,6 +551,15 @@ private Model parse(String jsonld) { m.read(reader, null, "JSON-LD"); return m; } + + private Dataset jsonld2dataset(String jsonld, Context jenaCtx) throws IOException { + Dataset ds = DatasetFactory.create(); + try (InputStream in = new ByteArrayInputStream(jsonld.getBytes(StandardCharsets.UTF_8))) { + RDFDataMgr.parse(StreamRDFLib.dataset(ds.asDatasetGraph()), in, null, Lang.JSONLD, jenaCtx); + } + return ds; + } + private static RDFFormat[] JSON_LD_FORMATS = { RDFFormat.JSONLD_COMPACT_PRETTY, From 767bf5b261782b87f489a2f509fa743f7dea3541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois-Paul=20Servant?= Date: Tue, 31 Jan 2017 10:18:19 +0100 Subject: [PATCH 2/5] cleaning --- .../test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java index 10f8a24ed3b..78b2fb8c631 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java @@ -17,8 +17,6 @@ */ package org.apache.jena.riot.writer; -import static org.junit.Assert.assertTrue; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; From 849e070ad1122ad28bc080d295c8d174aa87af95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois-Paul=20Servant?= Date: Tue, 31 Jan 2017 10:28:24 +0100 Subject: [PATCH 3/5] improved test --- .../apache/jena/riot/writer/TestJsonLDWriter.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java index 78b2fb8c631..38b949c715b 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java @@ -513,12 +513,18 @@ private Model simpleModel(String ns) { s = m2.createResource(AnonId.create("_:b0")); m2.add(s, RDFS.label, "? in named graph"); - // write to jsonld and parse it back + // write to jsonld String jsonld = dataset2jsonld(ds.asDatasetGraph(), RDFFormat.JSONLD, null); - // System.out.println(jsonld); - Dataset ds2 = jsonld2dataset(jsonld, null); + System.out.println(jsonld); + // check we have kept the blanknodes identifiers that were valid jsonld bn identifiers + assertTrue(jsonld.indexOf("\"_:foo\"") > -1); + assertTrue(jsonld.indexOf("\"xxx\"") < 0); + + // parse jsonld back and check we get same thing + + Dataset ds2 = jsonld2dataset(jsonld, null); assertTrue(ds2.getDefaultModel().isIsomorphicWith(ds.getDefaultModel())); assertTrue(ds2.getNamedModel(namedModelName).isIsomorphicWith(ds.getNamedModel(namedModelName))); } From 72fa0b51c679c7e403dd0e0ef8f4b0b3300c64b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois-Paul=20Servant?= Date: Tue, 31 Jan 2017 10:52:01 +0100 Subject: [PATCH 4/5] cleaning --- .../java/org/apache/jena/riot/writer/TestJsonLDWriter.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java index 38b949c715b..662251d5c53 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java @@ -485,12 +485,10 @@ private Model simpleModel(String ns) { ds.addNamedModel(namedModelName, m2); Resource s = m.createResource(); - String bn1InDefaultGraphLabel = "blank node 1 in default graph"; - m.add(s, RDFS.label, bn1InDefaultGraphLabel); + m.add(s, RDFS.label, "blank node 1 in default graph"); s = m2.createResource(); - String bn2InNamedGraphLabel = "blank node 2 in named graph"; - m2.add(s, RDFS.label, bn2InNamedGraphLabel); + m2.add(s, RDFS.label, "blank node 2 in named graph"); // blanknodes with given id, shared by the 2 graphs From aadc7b0180f217d87558c96df1b799a9cb133fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois-Paul=20Servant?= Date: Tue, 31 Jan 2017 11:52:38 +0100 Subject: [PATCH 5/5] assertFalse(TestJsonLDWriter.contains(indexof() > -1) ! --- .../jena/riot/writer/TestJsonLDWriter.java | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java index 662251d5c53..f801acb9cd0 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java @@ -69,21 +69,21 @@ public class TestJsonLDWriter extends BaseTest { // pretty is pretty s = toString(m, RDFFormat.JSONLD_EXPAND_PRETTY, null); - assertTrue(s.trim().indexOf("\n") > -1); + assertTrue(s.trim().contains("\n")); s = toString(m, RDFFormat.JSONLD_COMPACT_PRETTY, null); - assertTrue(s.trim().indexOf("\n") > -1); + assertTrue(s.trim().contains("\n")); s = toString(m, RDFFormat.JSONLD_FLATTEN_PRETTY, null); - assertTrue(s.trim().indexOf("\n") > -1); + assertTrue(s.trim().contains("\n")); // and flat is flat s = toString(m, RDFFormat.JSONLD_EXPAND_FLAT, null); - assertTrue(s.trim().indexOf("\n") < 0); + assertFalse(s.trim().contains("\n")); s = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, null); - assertTrue(s.trim().indexOf("\n") < 0); + assertFalse(s.trim().contains("\n")); s = toString(m, RDFFormat.JSONLD_FLATTEN_FLAT, null); - assertTrue(s.trim().indexOf("\n") < 0); - assertTrue(s.trim().indexOf("\n") < 0); + assertFalse(s.trim().contains("\n")); + assertFalse(s.trim().contains("\n")); // JSON_LD FRAME case not tested here, but in testFrames } @@ -99,20 +99,20 @@ public class TestJsonLDWriter extends BaseTest { // there's no "@context" in expand s = toString(m, RDFFormat.JSONLD_EXPAND_PRETTY, null); - assertTrue(s.indexOf("@context") < 0); + assertFalse(s.contains("@context")); s = toString(m, RDFFormat.JSONLD_EXPAND_FLAT, null); - assertTrue(s.indexOf("@context") < 0); + assertFalse(s.contains("@context")); // there's an "@context" in compact and flatten s = toString(m, RDFFormat.JSONLD_COMPACT_PRETTY, null); - assertTrue(s.indexOf("@context") > -1); + assertTrue(s.contains("@context")); s = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, null); - assertTrue(s.indexOf("@context") > -1); + assertTrue(s.contains("@context")); s = toString(m, RDFFormat.JSONLD_FLATTEN_PRETTY, null); - assertTrue(s.indexOf("@context") > -1); + assertTrue(s.contains("@context")); s = toString(m, RDFFormat.JSONLD_FLATTEN_FLAT, null); - assertTrue(s.indexOf("@context") > -1); + assertTrue(s.contains("@context")); } private Model simpleModel(String ns) { @@ -148,7 +148,7 @@ private Model simpleModel(String ns) { Model m = simpleModel(ns); m.setNsPrefix("", ns); String jsonld = toString(m, RDFFormat.JSONLD_COMPACT_PRETTY, null); - assertTrue(jsonld.indexOf("\"\"") < 0); + assertFalse(jsonld.contains("\"\"")); Model m2 = parse(jsonld); assertTrue(m2.isIsomorphicWith(m)); } @@ -168,7 +168,7 @@ private Model simpleModel(String ns) { String s1 = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, null); // there's a prefix in m, and we find it in the output String prefixStringInResult = "\"ex\":\"" + ns + "\""; - assertTrue(s1.indexOf(prefixStringInResult) > -1); + assertTrue(s1.contains(prefixStringInResult)); Model m1 = parse(s1); // this is the json object associated to "@context" in s1 @@ -188,7 +188,7 @@ private Model simpleModel(String ns) { m.removeNsPrefix("ex"); String s2 = toString(m, RDFFormat.JSONLD_COMPACT_PRETTY, null); // model wo prefix -> no more prefix string in result: - assertTrue(s2.indexOf(prefixStringInResult) < 0); + assertFalse(s2.contains(prefixStringInResult)); // the model wo prefix, output as jsonld using a context that defines the prefix JsonLDWriteContext jenaCtx = new JsonLDWriteContext(); @@ -197,7 +197,7 @@ private Model simpleModel(String ns) { String s3 = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, jenaCtx); assertTrue(s3.length() == s1.length()); - assertTrue(s3.indexOf(prefixStringInResult) > 0); + assertTrue(s3.contains(prefixStringInResult)); Model m3 = parse(s3); assertTrue(m3.isIsomorphicWith(m)); assertTrue(m3.isIsomorphicWith(m1)); @@ -209,7 +209,7 @@ private Model simpleModel(String ns) { String s4 = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, jenaCtx); assertTrue(s4.length() == s1.length()); - assertTrue(s4.indexOf(prefixStringInResult) > 0); + assertTrue(s4.contains(prefixStringInResult)); Model m4 = parse(s4); assertTrue(m4.isIsomorphicWith(m)); assertTrue(m4.isIsomorphicWith(m1)); @@ -227,7 +227,7 @@ private Model simpleModel(String ns) { String s1 = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, null); // there's a prefix in m, and we find it in the output String prefixStringInResult = "\"ex\":\"" + ns + "\""; - assertTrue(s1.indexOf(prefixStringInResult) > -1); + assertTrue(s1.contains(prefixStringInResult)); Model m1 = parse(s1); // the context used in this case, as it would automatically be created as none is set @@ -238,7 +238,7 @@ private Model simpleModel(String ns) { m.removeNsPrefix("ex"); String s2 = toString(m, RDFFormat.JSONLD_COMPACT_PRETTY, null); // model wo prefix -> no more prefix string in result: - assertTrue(s2.indexOf(prefixStringInResult) < 0); + assertFalse(s2.contains(prefixStringInResult)); // the model wo prefix, output as jsonld using a context that defines the prefix Context jenaCtx = new Context(); @@ -246,7 +246,7 @@ private Model simpleModel(String ns) { String s3 = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, jenaCtx); assertTrue(s3.length() == s1.length()); - assertTrue(s3.indexOf(prefixStringInResult) > 0); + assertTrue(s3.contains(prefixStringInResult)); Model m3 = parse(s3); assertTrue(m3.isIsomorphicWith(m)); assertTrue(m3.isIsomorphicWith(m1)); @@ -278,7 +278,7 @@ private Model simpleModel(String ns) { } catch (Throwable e) { // maybe test run in a setting wo external connectivity - not a real problem String mess = e.getMessage(); - if ((mess != null) && (mess.indexOf("loading remote context failed") > -1)) { + if ((mess != null) && (mess.contains("loading remote context failed"))) { Logger.getLogger(getClass()).info(mess); e.printStackTrace(); } else { @@ -316,14 +316,14 @@ private Model simpleModel(String ns) { String jsonld; jsonld = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, jenaCtx); String c = "\"@context\":\"http://schema.org/\""; - assertTrue(jsonld.indexOf(c) > -1); + assertTrue(jsonld.contains(c)); // change @context to a given ctx String ctx = "{\"jobTitle\":{\"@id\":\"http://ex.com/jobTitle\"},\"url\":{\"@id\":\"http://ex.com/url\"},\"name\":{\"@id\":\"http://ex.com/name\"}}"; jenaCtx.setJsonLDContextSubstitution(ctx); jsonld = toString(m, RDFFormat.JSONLD_COMPACT_FLAT, jenaCtx); - assertTrue(jsonld.indexOf("http://ex.com/name") > -1); + assertTrue(jsonld.contains("http://ex.com/name")); } /** @@ -361,7 +361,7 @@ private Model simpleModel(String ns) { // 2 persons in m2 assertTrue(m2.listStatements((Resource) null, RDF.type, person).toList().size() == 2); // something we hadn't tested in prettyIsNotFlat - assertTrue(jsonld.trim().indexOf("\n") > -1); + assertTrue(jsonld.trim().contains("\n")); // only output the subjects which have a jobTitle @@ -375,7 +375,7 @@ private Model simpleModel(String ns) { // 1 subject with a jobTitle in m2 assertTrue(m2.listStatements((Resource) null, m.createProperty(ns + "jobTitle"), (RDFNode) null).toList().size() == 1); // something we hadn't tested in prettyIsNotFlat - assertTrue(jsonld.trim().indexOf("\n") < 0); + assertFalse(jsonld.trim().contains("\n")); } /** @@ -396,7 +396,7 @@ private Model simpleModel(String ns) { // without following line in JsonLDWriter, the test fails // if (! isLangString(o) && ! isSimpleString(o) ) String vv = "\"plangstring\":{\"@language\":\"fr\",\"@value\":\"a langstring\"}"; - assertTrue(jsonld.indexOf(vv) > -1); + assertTrue(jsonld.contains(vv)); } /** @@ -414,8 +414,8 @@ private Model simpleModel(String ns) { String jsonld = toString(m, RDFFormat.JSONLD, null); // in one case, we have "name" : "xxx", and the other "http://.../name" : "yyy" - assertTrue(jsonld.indexOf("\"name\" : \"") > -1); - assertTrue(jsonld.indexOf("/name\" : \"") > -1); + assertTrue(jsonld.contains("\"name\" : \"")); + assertTrue(jsonld.contains("/name\" : \"")); m.setNsPrefix("ns1", ns1); m.setNsPrefix("ns2", "http://ex.com/"); @@ -430,8 +430,8 @@ private Model simpleModel(String ns) { "name" : "schema.org name", "ns2:name" : "ex.com name", */ - assertTrue(jsonld.indexOf("\"name\" : \"") > -1); - assertTrue((jsonld.indexOf("\"ns1:name\" : \"") > -1) || (jsonld.indexOf("\"ns2:name\" : \"") > -1)); + assertTrue(jsonld.contains("\"name\" : \"")); + assertTrue((jsonld.contains("\"ns1:name\" : \"")) || (jsonld.contains("\"ns2:name\" : \""))); } /** Test passing a JsonLdOptions through Context */ @@ -448,9 +448,9 @@ private Model simpleModel(String ns) { String jsonld = toString(m, RDFFormat.JSONLD, null); // compactArrays is true -> no "@graph" - assertTrue(jsonld.indexOf("@graph") < 0); + assertFalse(jsonld.contains("@graph")); // compactArrays is true -> string, not an array for props with one value - assertTrue(jsonld.indexOf("\"jobTitle\" : \"Professor\"") > -1); + assertTrue(jsonld.contains("\"jobTitle\" : \"Professor\"")); // now output using a value for JsonLdOptions in Context that sets compactArrays to false @@ -464,9 +464,9 @@ private Model simpleModel(String ns) { jsonld = toString(m, RDFFormat.JSONLD, jenaCtx); // compactArrays is false -> a "@graph" node - assertTrue(jsonld.indexOf("@graph") > -1); + assertTrue(jsonld.contains("@graph")); // compactArrays is false -> an array for all props, even when there's only one value - assertTrue(jsonld.indexOf("\"jobTitle\" : [ \"Professor\" ]") > -1); + assertTrue(jsonld.contains("\"jobTitle\" : [ \"Professor\" ]")); } /** @@ -517,8 +517,8 @@ private Model simpleModel(String ns) { System.out.println(jsonld); // check we have kept the blanknodes identifiers that were valid jsonld bn identifiers - assertTrue(jsonld.indexOf("\"_:foo\"") > -1); - assertTrue(jsonld.indexOf("\"xxx\"") < 0); + assertTrue(jsonld.contains("\"_:foo\"")); + assertFalse(jsonld.contains("\"xxx\"")); // parse jsonld back and check we get same thing