From 9d03d042086ee24ef431fc5efe48d0f82d0cf74e Mon Sep 17 00:00:00 2001 From: simonoakesepimorphics <37299842+simonoakesepimorphics@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:42:10 +0000 Subject: [PATCH 1/9] Set theme jekyll-theme-slate --- docs/_config.yml | 1 + docs/index.md | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 docs/_config.yml create mode 100644 docs/index.md diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..c741881 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-slate \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..74b82c0 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,37 @@ +## Welcome to GitHub Pages + +You can use the [editor on GitHub](https://github.com/simonoakesepimorphics/net.binary_array_ld.bald/edit/master/docs/index.md) to maintain and preview the content for your website in Markdown files. + +Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files. + +### Markdown + +Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for + +```markdown +Syntax highlighted code block + +# Header 1 +## Header 2 +### Header 3 + +- Bulleted +- List + +1. Numbered +2. List + +**Bold** and _Italic_ and `Code` text + +[Link](url) and ![Image](src) +``` + +For more details see [GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/). + +### Jekyll Themes + +Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/simonoakesepimorphics/net.binary_array_ld.bald/settings). The name of this theme is saved in the Jekyll `_config.yml` configuration file. + +### Support or Contact + +Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and we’ll help you sort it out. From 7341d52b2f75e618bd36443f7335d03470529b50 Mon Sep 17 00:00:00 2001 From: simonoakesepimorphics <37299842+simonoakesepimorphics@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:43:19 +0000 Subject: [PATCH 2/9] Create index.md Initialise GH pages From 59994327d7ad89ed4e1b92a856a64a872f1862c4 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Tue, 13 Jul 2021 13:53:39 +0100 Subject: [PATCH 3/9] Update root identity resource to match spec --- .../net/bald/BinaryArrayConvertCliTest.kt | 319 ++++++++---------- .../net/bald/model/ModelBinaryArrayBuilder.kt | 3 +- .../net/bald/model/ModelContainerBuilder.kt | 18 +- .../bald/model/ModelBinaryArrayBuilderTest.kt | 14 +- .../model/ModelBinaryArrayConverterTest.kt | 21 +- .../src/main/resources/jsonld/identity.json | 4 - 6 files changed, 177 insertions(+), 202 deletions(-) diff --git a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt index be117f7..4bd3996 100644 --- a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt +++ b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt @@ -52,18 +52,15 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { - resource(inputFileUri) { + // A-1 + resource("$inputFileUri/") { statement(RDF.type, BALD.Container) - // A-1 - statement(BALD.contains, model.createResource("$inputFileUri/")) { - statement(RDF.type, BALD.Container) - // A-2 - statement(BALD.contains, model.createResource("$inputFileUri/var0")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("$inputFileUri/var1")) { - statement(RDF.type, BALD.Resource) - } + // A-2 + statement(BALD.contains, model.createResource("$inputFileUri/var0")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("$inputFileUri/var1")) { + statement(RDF.type, BALD.Resource) } } } @@ -81,17 +78,14 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { // A-1 - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/")) { - statement(RDF.type, BALD.Container) - // A-2 - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { - statement(RDF.type, BALD.Resource) - } + // A-2 + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { + statement(RDF.type, BALD.Resource) } } } @@ -136,18 +130,15 @@ class BinaryArrayConvertCliTest { ModelVerifier(model).apply { prefix("bald", BALD.prefix) prefix("skos", SKOS.uri) - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.isPrefixedBy, createPlainLiteral("prefix_list")) + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { + statement(RDF.type, BALD.Resource) } + statement(BALD.isPrefixedBy, createPlainLiteral("prefix_list")) } } } @@ -179,35 +170,32 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/")) { + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0")) { statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0/var2")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0/var3")) { - statement(RDF.type, BALD.Resource) - } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0/var2")) { + statement(RDF.type, BALD.Resource) } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group1")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group1/var4")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group1/var5")) { - statement(RDF.type, BALD.Resource) - } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0/var3")) { + statement(RDF.type, BALD.Resource) } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group1")) { + statement(RDF.type, BALD.Container) + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group1/var4")) { statement(RDF.type, BALD.Resource) } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group1/var5")) { statement(RDF.type, BALD.Resource) } } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { + statement(RDF.type, BALD.Resource) + } } } } @@ -358,51 +346,48 @@ class BinaryArrayConvertCliTest { prefix("bald", BALD.prefix) prefix("skos", SKOS.uri) prefix("dct", DCTerms.NS) - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { + statement(TestVocab.orderedVar) { + list( + createResource("http://test.binary-array-ld.net/example/var0"), + createResource("http://test.binary-array-ld.net/example/foo/bar/var2"), + createResource("http://test.binary-array-ld.net/example/baz/var3") + ) + } + statement(TestVocab.rootVar, createResource("http://test.binary-array-ld.net/example/var0")) + statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/foo/bar/var2")) + statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/foo/var1")) + statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/var0")) statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/")) { - statement(TestVocab.orderedVar) { - list( - createResource("http://test.binary-array-ld.net/example/var0"), - createResource("http://test.binary-array-ld.net/example/foo/bar/var2"), - createResource("http://test.binary-array-ld.net/example/baz/var3") - ) + statement(SKOS.prefLabel, createPlainLiteral("Variable reference metadata example")) + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/baz")) { + statement(RDF.type, BALD.Container) + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/baz/var3")) { + statement(RDF.type, BALD.Resource) } + } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo")) { statement(TestVocab.rootVar, createResource("http://test.binary-array-ld.net/example/var0")) - statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/foo/bar/var2")) - statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/foo/var1")) - statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/var0")) + statement(TestVocab.siblingVar, createResource("http://test.binary-array-ld.net/example/baz/var3")) statement(RDF.type, BALD.Container) - statement(SKOS.prefLabel, createPlainLiteral("Variable reference metadata example")) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/baz")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/baz/var3")) { - statement(RDF.type, BALD.Resource) - } - } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo")) { - statement(TestVocab.rootVar, createResource("http://test.binary-array-ld.net/example/var0")) - statement(TestVocab.siblingVar, createResource("http://test.binary-array-ld.net/example/baz/var3")) + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo/bar")) { statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo/bar")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo/bar/var2")) { - statement(TestVocab.parentVar, createResource("http://test.binary-array-ld.net/example/foo/var1")) - statement(RDF.type, BALD.Resource) - statement(SKOS.prefLabel, createPlainLiteral("var2")) - } - } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo/var1")) { - statement(TestVocab.references, createPlainLiteral("var9")) - statement(TestVocab.siblingVar, createResource("http://test.binary-array-ld.net/example/foo/bar/var2")) + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo/bar/var2")) { + statement(TestVocab.parentVar, createResource("http://test.binary-array-ld.net/example/foo/var1")) statement(RDF.type, BALD.Resource) + statement(SKOS.prefLabel, createPlainLiteral("var2")) } } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0")) { + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/foo/var1")) { + statement(TestVocab.references, createPlainLiteral("var9")) + statement(TestVocab.siblingVar, createResource("http://test.binary-array-ld.net/example/foo/bar/var2")) statement(RDF.type, BALD.Resource) } - statement(BALD.isPrefixedBy, createPlainLiteral("prefix_list")) } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.isPrefixedBy, createPlainLiteral("prefix_list")) } } } @@ -422,54 +407,51 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/elev"), sortAnon = ::sortRefs) { - statement(RDF.type, BALD.Array) - statement(RDFS.label, createPlainLiteral("height")) - statement(BALD.references) { - statement(RDF.type, BALD.Reference) - statement(BALD.sourceRefShape) { - list(15, 10) - } - statement(BALD.target, createResource("http://test.binary-array-ld.net/example/lat")) - statement(BALD.targetRefShape) { - list(15, 1) - } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/elev"), sortAnon = ::sortRefs) { + statement(RDF.type, BALD.Array) + statement(RDFS.label, createPlainLiteral("height")) + statement(BALD.references) { + statement(RDF.type, BALD.Reference) + statement(BALD.sourceRefShape) { + list(15, 10) } - statement(BALD.references) { - statement(RDF.type, BALD.Reference) - statement(BALD.sourceRefShape) { - list(15, 10) - } - statement(BALD.target, createResource("http://test.binary-array-ld.net/example/lon")) - statement(BALD.targetRefShape) { - list(1, 10) - } + statement(BALD.target, createResource("http://test.binary-array-ld.net/example/lat")) + statement(BALD.targetRefShape) { + list(15, 1) } - statement(BALD.shape) { + } + statement(BALD.references) { + statement(RDF.type, BALD.Reference) + statement(BALD.sourceRefShape) { list(15, 10) } - } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/lat")) { - statement(RDF.type, BALD.Array) - statement(RDFS.label, createPlainLiteral("latitude")) - statement(BALD.arrayFirstValue, createTypedLiteral("6.5", XSDDatatype.XSDfloat)) - statement(BALD.arrayLastValue, createTypedLiteral("-6.5", XSDDatatype.XSDfloat)) - statement(BALD.shape) { - list(15) + statement(BALD.target, createResource("http://test.binary-array-ld.net/example/lon")) + statement(BALD.targetRefShape) { + list(1, 10) } } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/lon")) { - statement(RDF.type, BALD.Array) - statement(RDFS.label, createPlainLiteral("longitude")) - statement(BALD.arrayFirstValue, createTypedLiteral("0.5", XSDDatatype.XSDfloat)) - statement(BALD.arrayLastValue, createTypedLiteral("9.5", XSDDatatype.XSDfloat)) - statement(BALD.shape) { - list(10) - } + statement(BALD.shape) { + list(15, 10) + } + } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/lat")) { + statement(RDF.type, BALD.Array) + statement(RDFS.label, createPlainLiteral("latitude")) + statement(BALD.arrayFirstValue, createTypedLiteral("6.5", XSDDatatype.XSDfloat)) + statement(BALD.arrayLastValue, createTypedLiteral("-6.5", XSDDatatype.XSDfloat)) + statement(BALD.shape) { + list(15) + } + } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/lon")) { + statement(RDF.type, BALD.Array) + statement(RDFS.label, createPlainLiteral("longitude")) + statement(BALD.arrayFirstValue, createTypedLiteral("0.5", XSDDatatype.XSDfloat)) + statement(BALD.arrayLastValue, createTypedLiteral("9.5", XSDDatatype.XSDfloat)) + statement(BALD.shape) { + list(10) } } } @@ -491,61 +473,58 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0"), sortAnon = ::sortRefs) { - statement(RDF.type, BALD.Array) - statement(BALD.references) { - statement(RDF.type, BALD.Reference) - statement(BALD.sourceRefShape) { - list(10, 90, 15, 1) - } - statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var1")) - statement(BALD.targetRefShape) { - list(1, 90, 15, 60) - } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0"), sortAnon = ::sortRefs) { + statement(RDF.type, BALD.Array) + statement(BALD.references) { + statement(RDF.type, BALD.Reference) + statement(BALD.sourceRefShape) { + list(10, 90, 15, 1) } - statement(BALD.references) { - statement(RDF.type, BALD.Reference) - statement(BALD.sourceRefShape) { - list(10, 90, 15) - } - statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var2")) - statement(BALD.targetRefShape) { - list(1, 1, 15) - } + statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var1")) + statement(BALD.targetRefShape) { + list(1, 90, 15, 60) } - statement(BALD.shape) { + } + statement(BALD.references) { + statement(RDF.type, BALD.Reference) + statement(BALD.sourceRefShape) { list(10, 90, 15) } - } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var1")) { - statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var2")) - statement(RDF.type, BALD.Array) - statement(BALD.references) { - statement(RDF.type, BALD.Reference) - statement(BALD.sourceRefShape) { - list(90, 15, 60) - } - statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var2")) - statement(BALD.targetRefShape) { - list(1, 15, 1) - } + statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var2")) + statement(BALD.targetRefShape) { + list(1, 1, 15) } - statement(BALD.shape) { + } + statement(BALD.shape) { + list(10, 90, 15) + } + } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var1")) { + statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var2")) + statement(RDF.type, BALD.Array) + statement(BALD.references) { + statement(RDF.type, BALD.Reference) + statement(BALD.sourceRefShape) { list(90, 15, 60) } - } - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var2")) { - statement(RDF.type, BALD.Array) - statement(BALD.shape) { - list(15) + statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var2")) + statement(BALD.targetRefShape) { + list(1, 15, 1) } } - statement(BALD.isPrefixedBy, createPlainLiteral("prefix_list")) + statement(BALD.shape) { + list(90, 15, 60) + } } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var2")) { + statement(RDF.type, BALD.Array) + statement(BALD.shape) { + list(15) + } + } + statement(BALD.isPrefixedBy, createPlainLiteral("prefix_list")) } } } diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt index eb276a5..3250642 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt @@ -12,8 +12,7 @@ class ModelBinaryArrayBuilder( ) { fun addBinaryArray(ba: BinaryArray) { addPrefixMapping(ba.prefixMapping) - val baRes = model.createResource(ba.uri, BALD.Container) - containerFct.forParent(baRes).addContainer(ba.root) + containerFct.forRoot(model).addContainer(ba.root) } private fun addPrefixMapping(prefixMapping: PrefixMapping) { diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelContainerBuilder.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelContainerBuilder.kt index 7ed0224..4a3ca52 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelContainerBuilder.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelContainerBuilder.kt @@ -3,19 +3,27 @@ package net.bald.model import net.bald.AttributeSource import net.bald.Container import net.bald.vocab.BALD +import org.apache.jena.rdf.model.Model import org.apache.jena.rdf.model.Resource open class ModelContainerBuilder( - private val parent: Resource, + private val model: Model, + private val parent: Resource?, private val varFct: ModelVarBuilder.Factory, private val attrFct: ModelAttributeBuilder.Factory ) { + constructor( + parent: Resource, + varFct: ModelVarBuilder.Factory, + attrFct: ModelAttributeBuilder.Factory + ): this(parent.model, parent, varFct, attrFct) + open fun addContainer(container: Container) { - val containerRes = parent.model.createResource(container.uri, BALD.Container) + val containerRes = model.createResource(container.uri, BALD.Container) addSubContainers(container, containerRes) addVars(container, containerRes) addAttributes(container, containerRes) - parent.addProperty(BALD.contains, containerRes) + parent?.addProperty(BALD.contains, containerRes) } private fun addSubContainers(container: Container, containerRes: Resource) { @@ -40,6 +48,10 @@ open class ModelContainerBuilder( open fun forParent(parent: Resource): ModelContainerBuilder { return ModelContainerBuilder(parent, varFct, attrFct) } + + open fun forRoot(model: Model): ModelContainerBuilder { + return ModelContainerBuilder(model, parent = null, varFct, attrFct) + } } } diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt index a07bb5c..50dfbea 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt @@ -18,11 +18,11 @@ import java.lang.IllegalArgumentException import kotlin.test.assertEquals class ModelBinaryArrayBuilderTest { + private val model = ModelFactory.createDefaultModel() private val containerBuilder = mock() private val containerFct = mock { - on { forParent(any()) } doReturn containerBuilder + on { forRoot(model) } doReturn containerBuilder } - private val model = ModelFactory.createDefaultModel() private val builder = ModelBinaryArrayBuilder.Factory(containerFct).forModel(model) private val root = mock() private val prefix = PrefixMapping.Factory.create() @@ -34,18 +34,10 @@ class ModelBinaryArrayBuilderTest { on { prefixMapping } doReturn prefix } - @Test - fun addBinaryArray_addsFileContainer() { - builder.addBinaryArray(ba) - ModelVerifier(model).resource("http://test.binary-array-ld.net/example") { - statement(RDF.type, BALD.Container) - } - } - @Test fun addBinaryArray_addsRootContainer() { builder.addBinaryArray(ba) - verify(containerFct).forParent(model.getResource("http://test.binary-array-ld.net/example")) + verify(containerFct).forRoot(model) verify(containerBuilder).addContainer(root) } diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt index 7fcc885..e6eec31 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt @@ -58,19 +58,16 @@ class ModelBinaryArrayConverterTest { prefix("bald", BALD.prefix) prefix("skos", SKOS.uri) prefix("dct", DCTerms.NS) - resource("http://test.binary-array-ld.net/example") { + resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/bar")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/baz")) { - statement(RDF.type, BALD.Resource) - } - statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/foo")) { - statement(RDF.type, BALD.Resource) - } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/bar")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/baz")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/foo")) { + statement(RDF.type, BALD.Resource) } } } diff --git a/binary-array-ld-test/src/main/resources/jsonld/identity.json b/binary-array-ld-test/src/main/resources/jsonld/identity.json index a054b21..6cbebc8 100644 --- a/binary-array-ld-test/src/main/resources/jsonld/identity.json +++ b/binary-array-ld-test/src/main/resources/jsonld/identity.json @@ -1,9 +1,5 @@ { "@graph" : [ { - "@id" : "http://test.binary-array-ld.net/example", - "@type" : "https://www.opengis.net/def/binary-array-ld/Container", - "contains" : "http://test.binary-array-ld.net/example/" - }, { "@id" : "http://test.binary-array-ld.net/example/", "@type" : "https://www.opengis.net/def/binary-array-ld/Container", "contains" : [ "http://test.binary-array-ld.net/example/var1", "http://test.binary-array-ld.net/example/var0" ] From a947817a5336abdd700eb1e4a6fa20ad8b50f768 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Tue, 13 Jul 2021 14:07:02 +0100 Subject: [PATCH 4/9] Fix test --- .../net/bald/BinaryArrayConvertCliTest.kt | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt index 2a2110b..0c3f92e 100644 --- a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt +++ b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt @@ -475,22 +475,15 @@ class BinaryArrayConvertCliTest { ModelVerifier(model).apply { resource("http://test.binary-array-ld.net/example/") { statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/")) { - statement(RDF.type, BALD.Container) - statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0"), sortAnon = ::sortRefs) { - statement(createProperty("${TestVocab.prefix}name"), createStringLiteral("var0")) - statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var1")) - statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var2")) - statement(RDF.type, BALD.Array) - statement(BALD.references) { - statement(RDF.type, BALD.Reference) - statement(BALD.sourceRefShape) { - list(10, 90, 15, 1) - } - statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var1")) - statement(BALD.targetRefShape) { - list(1, 90, 15, 60) - } + statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0"), sortAnon = ::sortRefs) { + statement(createProperty("${TestVocab.prefix}name"), createStringLiteral("var0")) + statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var1")) + statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var2")) + statement(RDF.type, BALD.Array) + statement(BALD.references) { + statement(RDF.type, BALD.Reference) + statement(BALD.sourceRefShape) { + list(10, 90, 15, 1) } statement(BALD.target, createResource("http://test.binary-array-ld.net/example/var1")) statement(BALD.targetRefShape) { From 2e07fb13bf738642f6829cede672e59033dd0d51 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Thu, 15 Jul 2021 14:31:31 +0100 Subject: [PATCH 5/9] Add format and distribution to graph Remove unused URI property on binary array interface --- .../net/bald/BinaryArrayConvertCliTest.kt | 38 +++++++++++++++++++ .../src/main/kotlin/net/bald/BinaryArray.kt | 16 +++++--- .../src/main/kotlin/net/bald/Distribution.kt | 11 ++++++ .../src/main/kotlin/net/bald/Format.kt | 13 +++++++ .../net/bald/model/ModelBinaryArrayBuilder.kt | 33 +++++++++++++++- .../bald/model/ModelBinaryArrayBuilderTest.kt | 27 ++++++++++++- .../model/ModelBinaryArrayConverterTest.kt | 18 +++++++-- .../net/bald/model/StatementsVerifierExt.kt | 25 ++++++++++++ .../net/bald/netcdf/NetCdfBinaryArray.kt | 7 +++- .../net/bald/netcdf/NetCdfDistribution.kt | 10 +++++ .../kotlin/net/bald/netcdf/NetCdfFormat.kt | 13 +++++++ .../net/bald/netcdf/NetCdfRootContainer.kt | 5 ++- .../net/bald/netcdf/NetCdfBinaryArrayTest.kt | 2 +- 13 files changed, 203 insertions(+), 15 deletions(-) create mode 100644 binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt create mode 100644 binary-array-ld-lib/src/main/kotlin/net/bald/Format.kt create mode 100644 binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt create mode 100644 binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt create mode 100644 binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfFormat.kt diff --git a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt index 0c3f92e..dfc4f32 100644 --- a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt +++ b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt @@ -3,6 +3,7 @@ package net.bald import bald.TestVocab import bald.jsonld.ResourceFileConverter import bald.model.ModelVerifier +import bald.model.StatementsVerifier import bald.netcdf.CdlConverter.writeToNetCdf import net.bald.vocab.BALD import org.apache.jena.datatypes.xsd.XSDDatatype @@ -54,7 +55,9 @@ class BinaryArrayConvertCliTest { ModelVerifier(model).apply { // A-1 resource("$inputFileUri/") { + format() statement(RDF.type, BALD.Container) + distribution() // A-2 statement(BALD.contains, model.createResource("$inputFileUri/var0")) { statement(RDF.type, BALD.Resource) @@ -79,7 +82,9 @@ class BinaryArrayConvertCliTest { ModelVerifier(model).apply { // A-1 resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() // A-2 statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { statement(RDF.type, BALD.Resource) @@ -131,7 +136,9 @@ class BinaryArrayConvertCliTest { prefix("bald", BALD.prefix) prefix("skos", SKOS.uri) resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { statement(RDF.type, BALD.Resource) } @@ -171,7 +178,9 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0")) { statement(RDF.type, BALD.Container) statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/group0/var2")) { @@ -227,7 +236,9 @@ class BinaryArrayConvertCliTest { prefix("dct", DCTerms.NS) prefix("xsd", XSD.NS) resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { statement(RDF.type, BALD.Resource) } @@ -261,12 +272,14 @@ class BinaryArrayConvertCliTest { prefix("skos", SKOS.uri) prefix("dct", DCTerms.NS) resource("http://test.binary-array-ld.net/example/") { + format() statement(DCTerms.publisher, createResource("${BALD.prefix}Organisation")) // D-4 statement(createProperty("http://test.binary-array-ld.net/example/date"), createPlainLiteral("2020-10-29")) statement(RDF.type, BALD.Container) // D-2 statement(SKOS.prefLabel, createPlainLiteral("Attributes metadata example")) + distribution() statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { statement(RDF.type, BALD.Array) statement(RDF.type, BALD.Resource) @@ -304,11 +317,13 @@ class BinaryArrayConvertCliTest { prefix("skos", SKOS.uri) prefix("dct", DCTerms.NS) resource("http://test.binary-array-ld.net/example/") { + format() // D-3 statement(DCTerms.publisher, createResource("${BALD.prefix}Organisation")) statement(createProperty("http://test.binary-array-ld.net/example/date"), createPlainLiteral("2020-10-29")) statement(RDF.type, BALD.Container) statement(SKOS.prefLabel, createPlainLiteral("Alias metadata example")) + distribution() statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { statement(RDF.type, BALD.Array) statement(RDF.type, BALD.Resource) @@ -347,6 +362,7 @@ class BinaryArrayConvertCliTest { prefix("skos", SKOS.uri) prefix("dct", DCTerms.NS) resource("http://test.binary-array-ld.net/example/") { + format() statement(TestVocab.orderedVar) { list( createResource("http://test.binary-array-ld.net/example/var0"), @@ -360,6 +376,7 @@ class BinaryArrayConvertCliTest { statement(TestVocab.unorderedVar, createResource("http://test.binary-array-ld.net/example/var0")) statement(RDF.type, BALD.Container) statement(SKOS.prefLabel, createPlainLiteral("Variable reference metadata example")) + distribution() statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/baz")) { statement(RDF.type, BALD.Container) statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/baz/var3")) { @@ -408,7 +425,9 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/elev"), sortAnon = ::sortRefs) { statement(RDF.type, BALD.Array) statement(RDFS.label, createPlainLiteral("height")) @@ -474,7 +493,9 @@ class BinaryArrayConvertCliTest { val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") ModelVerifier(model).apply { resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() statement(BALD.contains, createResource("http://test.binary-array-ld.net/example/var0"), sortAnon = ::sortRefs) { statement(createProperty("${TestVocab.prefix}name"), createStringLiteral("var0")) statement(TestVocab.references, createResource("http://test.binary-array-ld.net/example/var1")) @@ -539,4 +560,21 @@ class BinaryArrayConvertCliTest { res.id.toString() } } + + private fun StatementsVerifier.format() { + statement(DCTerms.format) { + statement(DCTerms.identifier, createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")) + statement(RDF.type, DCTerms.MediaType) + } + } + + private fun StatementsVerifier.distribution() { + statement(DCAT.distribution) { + statement(RDF.type, DCAT.Distribution) + statement(DCAT.mediaType) { + statement(DCTerms.identifier, createStringLiteral("application/x-netcdf")) + statement(RDF.type, DCTerms.MediaType) + } + } + } } \ No newline at end of file diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt index e63dd90..c60e8a3 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt @@ -9,11 +9,6 @@ import java.io.Closeable * Should be closed after use. */ interface BinaryArray: Closeable { - /** - * The URI which identifies the dataset. - */ - val uri: String - /** * The prefix mapping to apply to the RDF graph. */ @@ -23,4 +18,15 @@ interface BinaryArray: Closeable { * The root container. */ val root: Container + + /** + * The format of the binary array. + */ + val format: Format + + /** + * The distribution of the binary array, if it is available. Otherwise, null. + */ + val distribution: Distribution? + } \ No newline at end of file diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt new file mode 100644 index 0000000..92b2e0a --- /dev/null +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt @@ -0,0 +1,11 @@ +package net.bald + +/** + * A distribution of a binary array file. + */ +interface Distribution { + /** + * The media type of the binary array file. + */ + val mediaType: String +} \ No newline at end of file diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/Format.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/Format.kt new file mode 100644 index 0000000..b2d0fc6 --- /dev/null +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/Format.kt @@ -0,0 +1,13 @@ +package net.bald + +import org.apache.jena.rdf.model.Resource + +/** + * A binary array format. + */ +interface Format { + /** + * The resource which represents the format. + */ + val identifier: Resource +} \ No newline at end of file diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt index 3250642..99b756f 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt @@ -2,8 +2,15 @@ package net.bald.model import net.bald.BinaryArray import net.bald.vocab.BALD +import org.apache.jena.rdf.model.Literal import org.apache.jena.rdf.model.Model +import org.apache.jena.rdf.model.Resource +import org.apache.jena.rdf.model.ResourceFactory.createResource +import org.apache.jena.rdf.model.ResourceFactory.createStringLiteral import org.apache.jena.shared.PrefixMapping +import org.apache.jena.vocabulary.DCAT +import org.apache.jena.vocabulary.DCTerms +import org.apache.jena.vocabulary.RDF import java.net.URI class ModelBinaryArrayBuilder( @@ -11,8 +18,32 @@ class ModelBinaryArrayBuilder( private val containerFct: ModelContainerBuilder.Factory ) { fun addBinaryArray(ba: BinaryArray) { + val root = ba.root + val res = model.createResource(root.uri) + addPrefixMapping(ba.prefixMapping) - containerFct.forRoot(model).addContainer(ba.root) + addFormat(ba, res) + addDistribution(ba, res) + containerFct.forRoot(model).addContainer(root) + } + + private fun addFormat(ba: BinaryArray, root: Resource) { + val format = model.createResource() + .addProperty(RDF.type, DCTerms.MediaType) + .addProperty(DCTerms.identifier, ba.format.identifier) + root.addProperty(DCTerms.format, format) + } + + private fun addDistribution(ba: BinaryArray, root: Resource) { + ba.distribution?.let { dist -> + val mediaType = model.createResource() + .addProperty(RDF.type, DCTerms.MediaType) + .addProperty(DCTerms.identifier, dist.mediaType) + val distribution = model.createResource() + .addProperty(RDF.type, DCAT.Distribution) + .addProperty(DCAT.mediaType, mediaType) + root.addProperty(DCAT.distribution, distribution) + } } private fun addPrefixMapping(prefixMapping: PrefixMapping) { diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt index 50dfbea..d48b58f 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt @@ -7,8 +7,11 @@ import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.verify import net.bald.BinaryArray import net.bald.Container +import net.bald.Distribution +import net.bald.Format import net.bald.vocab.BALD import org.apache.jena.rdf.model.ModelFactory +import org.apache.jena.rdf.model.ResourceFactory.createResource import org.apache.jena.shared.PrefixMapping import org.apache.jena.vocabulary.RDF import org.apache.jena.vocabulary.SKOS @@ -24,14 +27,23 @@ class ModelBinaryArrayBuilderTest { on { forRoot(model) } doReturn containerBuilder } private val builder = ModelBinaryArrayBuilder.Factory(containerFct).forModel(model) - private val root = mock() + private val root = mock { + on { uri } doReturn "http://test.binary-array-ld.net/example/" + } private val prefix = PrefixMapping.Factory.create() .setNsPrefix("bald", BALD.prefix) .setNsPrefix("skos", SKOS.uri) + private val format = mock { + on { identifier } doReturn createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/") + } + private val distribution = mock { + on { mediaType } doReturn "application/x-netcdf" + } private val ba = mock { - on { uri } doReturn "http://test.binary-array-ld.net/example" on { this.root } doReturn root on { prefixMapping } doReturn prefix + on { format } doReturn format + on { distribution } doReturn distribution } @Test @@ -76,4 +88,15 @@ class ModelBinaryArrayBuilderTest { } assertEquals("Unable to add prefix mapping eg to model: URI must end with / or #.", iae.message) } + + @Test + fun addBinaryArray_addsFormatAndDistribution() { + builder.addBinaryArray(ba) + ModelVerifier(model).apply { + resource("http://test.binary-array-ld.net/example/") { + format() + distribution() + } + } + } } \ No newline at end of file diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt index e6eec31..08ab698 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt @@ -1,14 +1,15 @@ package net.bald.model import bald.model.ModelVerifier +import bald.model.StatementsVerifier import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock -import net.bald.BinaryArray -import net.bald.Container -import net.bald.Var +import net.bald.* import net.bald.vocab.BALD import org.apache.jena.rdf.model.Model +import org.apache.jena.rdf.model.ResourceFactory import org.apache.jena.shared.PrefixMapping +import org.apache.jena.vocabulary.DCAT import org.apache.jena.vocabulary.DCTerms import org.apache.jena.vocabulary.RDF import org.apache.jena.vocabulary.SKOS @@ -46,10 +47,17 @@ class ModelBinaryArrayConverterTest { .setNsPrefix("bald", BALD.prefix) .setNsPrefix("skos", SKOS.uri) .setNsPrefix("dct", DCTerms.NS) + val format = mock { + on { identifier } doReturn ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/") + } + val distribution = mock { + on { mediaType } doReturn "application/x-netcdf" + } val ba = mock { - on { this.uri } doReturn uri on { this.root } doReturn root on { prefixMapping } doReturn prefix + on { this.format } doReturn format + on { this.distribution } doReturn distribution } val model = convert(ba) @@ -59,7 +67,9 @@ class ModelBinaryArrayConverterTest { prefix("skos", SKOS.uri) prefix("dct", DCTerms.NS) resource("http://test.binary-array-ld.net/example/") { + format() statement(RDF.type, BALD.Container) + distribution() statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/bar")) { statement(RDF.type, BALD.Resource) } diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt new file mode 100644 index 0000000..55bad0e --- /dev/null +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt @@ -0,0 +1,25 @@ +package net.bald.model + +import bald.model.StatementsVerifier +import org.apache.jena.rdf.model.ResourceFactory +import org.apache.jena.vocabulary.DCAT +import org.apache.jena.vocabulary.DCTerms +import org.apache.jena.vocabulary.RDF + +fun StatementsVerifier.format() { + statement(DCTerms.format) { + statement(DCTerms.identifier, + ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")) + statement(RDF.type, DCTerms.MediaType) + } +} + +fun StatementsVerifier.distribution() { + statement(DCAT.distribution) { + statement(RDF.type, DCAT.Distribution) + statement(DCAT.mediaType) { + statement(DCTerms.identifier, ResourceFactory.createStringLiteral("application/x-netcdf")) + statement(RDF.type, DCTerms.MediaType) + } + } +} \ No newline at end of file diff --git a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt index 34201d4..3f6f702 100644 --- a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt +++ b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt @@ -1,6 +1,8 @@ package net.bald.netcdf import net.bald.BinaryArray +import net.bald.Distribution +import net.bald.Format import net.bald.alias.AliasDefinition import net.bald.context.ModelContext import org.apache.jena.shared.PrefixMapping @@ -15,7 +17,7 @@ import java.io.File * Should be closed after use. */ class NetCdfBinaryArray( - override val uri: String, + val uri: String, private val file: NetcdfFile, private val context: ModelContext, val alias: AliasDefinition @@ -29,6 +31,9 @@ class NetCdfBinaryArray( } } + override val format: Format get() = NetCdfFormat + override val distribution: Distribution get() = NetCdfDistribution() + val prefixSrc: String? get() = prefixSourceName() override fun close() { diff --git a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt new file mode 100644 index 0000000..ca106c1 --- /dev/null +++ b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt @@ -0,0 +1,10 @@ +package net.bald.netcdf + +import net.bald.Distribution + +/** + * NetCDF implementation of [Distribution]. + */ +class NetCdfDistribution: Distribution { + override val mediaType: String get() = "application/x-netcdf" +} \ No newline at end of file diff --git a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfFormat.kt b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfFormat.kt new file mode 100644 index 0000000..8a244e6 --- /dev/null +++ b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfFormat.kt @@ -0,0 +1,13 @@ +package net.bald.netcdf + +import net.bald.Format +import org.apache.jena.rdf.model.Resource +import org.apache.jena.rdf.model.ResourceFactory + +/** + * NetCDF implementation of [Format]. + */ +object NetCdfFormat: Format { + override val identifier: Resource + get() = ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/") +} \ No newline at end of file diff --git a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfRootContainer.kt b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfRootContainer.kt index b6a39e8..839ac3e 100644 --- a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfRootContainer.kt +++ b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfRootContainer.kt @@ -12,7 +12,10 @@ class NetCdfRootContainer( private val ba: NetCdfBinaryArray, group: Group, ): NetCdfContainer(group) { - override val uri: String get() = ba.uri + "/" + override val uri: String get() { + val uri = ba.uri + return if (uri.endsWith("/")) uri else "$uri/" + } override val alias: AliasDefinition get() = ba.alias override val parent: NetCdfContainer? get() = null override val root: NetCdfContainer get() = this diff --git a/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt b/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt index 79e6d57..97a8ec5 100644 --- a/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt +++ b/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt @@ -33,7 +33,7 @@ class NetCdfBinaryArrayTest { fun uri_withUri_returnsValue() { val uri = "http://test.binary-array-ld.net/identity.nc" val ba = fromCdl("/netcdf/identity.cdl", uri) - assertEquals(uri, ba.uri) + assertEquals("$uri/", ba.root.uri) } /** From 16885f0db23b417f45c63e567199a353c48f9fbe Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Thu, 15 Jul 2021 14:31:44 +0100 Subject: [PATCH 6/9] Remove unused imports --- .../test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt | 2 -- .../test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt | 2 -- 2 files changed, 4 deletions(-) diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt index d48b58f..87c5f9b 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt @@ -1,7 +1,6 @@ package net.bald.model import bald.model.ModelVerifier -import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.verify @@ -13,7 +12,6 @@ import net.bald.vocab.BALD import org.apache.jena.rdf.model.ModelFactory import org.apache.jena.rdf.model.ResourceFactory.createResource import org.apache.jena.shared.PrefixMapping -import org.apache.jena.vocabulary.RDF import org.apache.jena.vocabulary.SKOS import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt index 08ab698..11d5442 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt @@ -1,7 +1,6 @@ package net.bald.model import bald.model.ModelVerifier -import bald.model.StatementsVerifier import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock import net.bald.* @@ -9,7 +8,6 @@ import net.bald.vocab.BALD import org.apache.jena.rdf.model.Model import org.apache.jena.rdf.model.ResourceFactory import org.apache.jena.shared.PrefixMapping -import org.apache.jena.vocabulary.DCAT import org.apache.jena.vocabulary.DCTerms import org.apache.jena.vocabulary.RDF import org.apache.jena.vocabulary.SKOS From 4f9b97e1e4bb8146fe0697157a25c5b7a9507b9a Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Thu, 15 Jul 2021 14:38:03 +0100 Subject: [PATCH 7/9] Fix output format test --- .../net/bald/BinaryArrayConvertCliTest.kt | 7 ++++--- .../src/main/resources/jsonld/identity.json | 19 ------------------- 2 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 binary-array-ld-test/src/main/resources/jsonld/identity.json diff --git a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt index dfc4f32..6f8e40e 100644 --- a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt +++ b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt @@ -5,6 +5,7 @@ import bald.jsonld.ResourceFileConverter import bald.model.ModelVerifier import bald.model.StatementsVerifier import bald.netcdf.CdlConverter.writeToNetCdf +import com.fasterxml.jackson.databind.ObjectMapper import net.bald.vocab.BALD import org.apache.jena.datatypes.xsd.XSDDatatype import org.apache.jena.rdf.model.ModelFactory.createDefaultModel @@ -106,9 +107,9 @@ class BinaryArrayConvertCliTest { inputFile.absolutePath, outputFile.absolutePath ) - val result = outputFile.readText() - val expected = javaClass.getResource("/jsonld/identity.json").readText() - assertEquals(expected, result) + val result = ObjectMapper().readTree(outputFile) + // Unable to test JSON-LD directly due to unpredictable ordering of blank nodes + assertEquals(setOf("@context", "@graph"), result.fieldNames().asSequence().toSet()) } @Test diff --git a/binary-array-ld-test/src/main/resources/jsonld/identity.json b/binary-array-ld-test/src/main/resources/jsonld/identity.json deleted file mode 100644 index 6cbebc8..0000000 --- a/binary-array-ld-test/src/main/resources/jsonld/identity.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "@graph" : [ { - "@id" : "http://test.binary-array-ld.net/example/", - "@type" : "https://www.opengis.net/def/binary-array-ld/Container", - "contains" : [ "http://test.binary-array-ld.net/example/var1", "http://test.binary-array-ld.net/example/var0" ] - }, { - "@id" : "http://test.binary-array-ld.net/example/var0", - "@type" : "https://www.opengis.net/def/binary-array-ld/Resource" - }, { - "@id" : "http://test.binary-array-ld.net/example/var1", - "@type" : "https://www.opengis.net/def/binary-array-ld/Resource" - } ], - "@context" : { - "contains" : { - "@id" : "https://www.opengis.net/def/binary-array-ld/contains", - "@type" : "@id" - } - } -} From 6e9842614cfc1f739dc96adbae4df9dccb833611 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Fri, 16 Jul 2021 11:40:16 +0100 Subject: [PATCH 8/9] Add download url option and graph output --- .../kotlin/net/bald/BinaryArrayConvertCli.kt | 3 +- .../kotlin/net/bald/CommandLineOptions.kt | 1 + .../net/bald/BinaryArrayConvertCliTest.kt | 30 ++++++++++++++++++- .../src/main/kotlin/net/bald/BinaryArray.kt | 1 - .../src/main/kotlin/net/bald/Distribution.kt | 8 +++++ .../net/bald/model/ModelBinaryArrayBuilder.kt | 5 ++++ .../bald/model/ModelBinaryArrayBuilderTest.kt | 3 +- .../net/bald/model/StatementsVerifierExt.kt | 7 +++-- .../net/bald/netcdf/NetCdfBinaryArray.kt | 29 ++++++++++++++---- .../net/bald/netcdf/NetCdfDistribution.kt | 5 +++- .../net/bald/netcdf/NetCdfBinaryArrayTest.kt | 29 ++++++++++++++++-- 11 files changed, 105 insertions(+), 16 deletions(-) diff --git a/binary-array-ld-cli/src/main/kotlin/net/bald/BinaryArrayConvertCli.kt b/binary-array-ld-cli/src/main/kotlin/net/bald/BinaryArrayConvertCli.kt index f43aa97..24d219e 100644 --- a/binary-array-ld-cli/src/main/kotlin/net/bald/BinaryArrayConvertCli.kt +++ b/binary-array-ld-cli/src/main/kotlin/net/bald/BinaryArrayConvertCli.kt @@ -21,6 +21,7 @@ class BinaryArrayConvertCli { addOption("a", "alias", true, "Comma-delimited list of RDF alias files.") addOption("c", "context", true, "Comma-delimited list of JSON-LD context files.") addOption("o", "output", true, "Output format. eg. ttl, json-ld, rdfxml.") + addOption("d", "download", true, "The URL from which the original file can be downloaded.") addOption("h", "help", false, "Show help.") } @@ -42,7 +43,7 @@ class BinaryArrayConvertCli { val context = context(opts.contextLocs) val alias = alias(opts.aliasLocs) val inputLoc = opts.inputLoc ?: throw IllegalArgumentException("First argument is required: NetCDF file to convert.") - val ba = NetCdfBinaryArray.create(inputLoc, opts.uri, context, alias) + val ba = NetCdfBinaryArray.create(inputLoc, opts.uri, context, alias, opts.downloadUrl) val model = ba.use(ModelBinaryArrayConverter::convert) val outputFormat = opts.outputFormat ?: "ttl" diff --git a/binary-array-ld-cli/src/main/kotlin/net/bald/CommandLineOptions.kt b/binary-array-ld-cli/src/main/kotlin/net/bald/CommandLineOptions.kt index bcd1f20..528f79a 100644 --- a/binary-array-ld-cli/src/main/kotlin/net/bald/CommandLineOptions.kt +++ b/binary-array-ld-cli/src/main/kotlin/net/bald/CommandLineOptions.kt @@ -13,5 +13,6 @@ class CommandLineOptions( val aliasLocs: List get() = cmd.getOptionValue("alias")?.split(",") ?: emptyList() val contextLocs: List get() = cmd.getOptionValue("context")?.split(",") ?: emptyList() val outputFormat: String? get() = cmd.getOptionValue("output") + val downloadUrl: String? get() = cmd.getOptionValue("download") val help: Boolean get() = cmd.hasOption("help") } \ No newline at end of file diff --git a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt index 6f8e40e..853b5d7 100644 --- a/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt +++ b/binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt @@ -97,6 +97,33 @@ class BinaryArrayConvertCliTest { } } + @Test + fun run_withDownloadUrl_outputsDownloadUrl() { + val inputFile = writeToNetCdf("/netcdf/identity.cdl") + val outputFile = createTempFile() + run( + "--uri", "http://test.binary-array-ld.net/example", + "--download", "http://test.binary-array-ld.net/download/example.nc", + inputFile.absolutePath, + outputFile.absolutePath + ) + + val model = createDefaultModel().read(outputFile.toURI().toString(), "ttl") + ModelVerifier(model).apply { + resource("http://test.binary-array-ld.net/example/") { + format() + statement(RDF.type, BALD.Container) + distribution("http://test.binary-array-ld.net/download/example.nc") + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var0")) { + statement(RDF.type, BALD.Resource) + } + statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/var1")) { + statement(RDF.type, BALD.Resource) + } + } + } + } + @Test fun run_withOutputFormat_outputsToFile() { val inputFile = writeToNetCdf("/netcdf/identity.cdl") @@ -569,9 +596,10 @@ class BinaryArrayConvertCliTest { } } - private fun StatementsVerifier.distribution() { + private fun StatementsVerifier.distribution(downloadUrl: String? = null) { statement(DCAT.distribution) { statement(RDF.type, DCAT.Distribution) + if (downloadUrl != null) statement(DCAT.downloadURL, createResource(downloadUrl)) statement(DCAT.mediaType) { statement(DCTerms.identifier, createStringLiteral("application/x-netcdf")) statement(RDF.type, DCTerms.MediaType) diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt index c60e8a3..d1d827e 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt @@ -28,5 +28,4 @@ interface BinaryArray: Closeable { * The distribution of the binary array, if it is available. Otherwise, null. */ val distribution: Distribution? - } \ No newline at end of file diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt index 92b2e0a..59a068c 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/Distribution.kt @@ -1,5 +1,7 @@ package net.bald +import org.apache.jena.rdf.model.Resource + /** * A distribution of a binary array file. */ @@ -8,4 +10,10 @@ interface Distribution { * The media type of the binary array file. */ val mediaType: String + + /** + * The URL from which this distribution of the file can be downloaded, if it has one. + * Otherwise, null. + */ + val downloadUrl: Resource? } \ No newline at end of file diff --git a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt index 99b756f..d0c170f 100644 --- a/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt +++ b/binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt @@ -42,6 +42,11 @@ class ModelBinaryArrayBuilder( val distribution = model.createResource() .addProperty(RDF.type, DCAT.Distribution) .addProperty(DCAT.mediaType, mediaType) + .apply { + dist.downloadUrl?.let { downloadUrl -> + addProperty(DCAT.downloadURL, downloadUrl) + } + } root.addProperty(DCAT.distribution, distribution) } } diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt index 87c5f9b..db879db 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt @@ -36,6 +36,7 @@ class ModelBinaryArrayBuilderTest { } private val distribution = mock { on { mediaType } doReturn "application/x-netcdf" + on { downloadUrl } doReturn createResource("http://test.binary-array-ld.net/download/example.nc") } private val ba = mock { on { this.root } doReturn root @@ -93,7 +94,7 @@ class ModelBinaryArrayBuilderTest { ModelVerifier(model).apply { resource("http://test.binary-array-ld.net/example/") { format() - distribution() + distribution("http://test.binary-array-ld.net/download/example.nc") } } } diff --git a/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt b/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt index 55bad0e..8061a9f 100644 --- a/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt +++ b/binary-array-ld-lib/src/test/kotlin/net/bald/model/StatementsVerifierExt.kt @@ -2,21 +2,22 @@ package net.bald.model import bald.model.StatementsVerifier import org.apache.jena.rdf.model.ResourceFactory +import org.apache.jena.rdf.model.ResourceFactory.createResource import org.apache.jena.vocabulary.DCAT import org.apache.jena.vocabulary.DCTerms import org.apache.jena.vocabulary.RDF fun StatementsVerifier.format() { statement(DCTerms.format) { - statement(DCTerms.identifier, - ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")) + statement(DCTerms.identifier, createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")) statement(RDF.type, DCTerms.MediaType) } } -fun StatementsVerifier.distribution() { +fun StatementsVerifier.distribution(downloadUrl: String? = null) { statement(DCAT.distribution) { statement(RDF.type, DCAT.Distribution) + if (downloadUrl != null) statement(DCAT.downloadURL, createResource(downloadUrl)) statement(DCAT.mediaType) { statement(DCTerms.identifier, ResourceFactory.createStringLiteral("application/x-netcdf")) statement(RDF.type, DCTerms.MediaType) diff --git a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt index 3f6f702..a864bf9 100644 --- a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt +++ b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt @@ -5,12 +5,14 @@ import net.bald.Distribution import net.bald.Format import net.bald.alias.AliasDefinition import net.bald.context.ModelContext +import org.apache.jena.rdf.model.ResourceFactory.createResource import org.apache.jena.shared.PrefixMapping import ucar.nc2.AttributeContainer import ucar.nc2.Group import ucar.nc2.NetcdfFile import ucar.nc2.NetcdfFiles import java.io.File +import java.net.URI /** * NetCDF implementation of [BinaryArray]. @@ -20,7 +22,8 @@ class NetCdfBinaryArray( val uri: String, private val file: NetcdfFile, private val context: ModelContext, - val alias: AliasDefinition + val alias: AliasDefinition, + private val downloadUrl: String? ): BinaryArray { override val root: NetCdfContainer get() = container(file.rootGroup) @@ -32,7 +35,18 @@ class NetCdfBinaryArray( } override val format: Format get() = NetCdfFormat - override val distribution: Distribution get() = NetCdfDistribution() + override val distribution: Distribution get() { + val downloadUrl = downloadUrl ?: file.location.takeIf(::isHttp) + val res = downloadUrl?.let(::createResource) + return NetCdfDistribution(res) + } + + private fun isHttp(loc: String): Boolean { + return try { + val scheme = URI(loc).scheme + scheme == "http" || scheme == "https" + } catch (e: Exception) { false } + } val prefixSrc: String? get() = prefixSourceName() @@ -75,6 +89,7 @@ class NetCdfBinaryArray( * @param uri The URI which identifies the dataset. * @param context The external context with which to resolve prefix mappings. * @param alias The alias definition with which to resolve resource and property references. + * @param downloadUrl The URL from which the file can be downloaded, if it has one. Otherwise, null. * @return A [BinaryArray] representation of the NetCDF file. */ @JvmStatic @@ -82,11 +97,12 @@ class NetCdfBinaryArray( fileLoc: String, uri: String? = null, context: ModelContext? = null, - alias: AliasDefinition? = null + alias: AliasDefinition? = null, + downloadUrl: String? = null ): NetCdfBinaryArray { val file = NetcdfFiles.open(fileLoc) val requiredUri = uri ?: uri(fileLoc) - return create(file, requiredUri, context, alias) + return create(file, requiredUri, context, alias, downloadUrl) } /** @@ -105,11 +121,12 @@ class NetCdfBinaryArray( file: NetcdfFile, uri: String, context: ModelContext? = null, - alias: AliasDefinition? = null + alias: AliasDefinition? = null, + downloadUrl: String? = null ): NetCdfBinaryArray { val requiredContext = context ?: ModelContext.Empty val requiredAlias = alias ?: AliasDefinition.Empty - return NetCdfBinaryArray(uri, file, requiredContext, requiredAlias) + return NetCdfBinaryArray(uri, file, requiredContext, requiredAlias, downloadUrl) } private fun uri(fileLoc: String): String { diff --git a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt index ca106c1..e57aac5 100644 --- a/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt +++ b/binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfDistribution.kt @@ -1,10 +1,13 @@ package net.bald.netcdf import net.bald.Distribution +import org.apache.jena.rdf.model.Resource /** * NetCDF implementation of [Distribution]. */ -class NetCdfDistribution: Distribution { +class NetCdfDistribution( + override val downloadUrl: Resource? = null +): Distribution { override val mediaType: String get() = "application/x-netcdf" } \ No newline at end of file diff --git a/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt b/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt index 97a8ec5..de229d9 100644 --- a/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt +++ b/binary-array-ld-netcdf/src/test/kotlin/net/bald/netcdf/NetCdfBinaryArrayTest.kt @@ -18,12 +18,19 @@ import org.apache.jena.vocabulary.SKOS import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import kotlin.test.assertEquals +import kotlin.test.assertNull class NetCdfBinaryArrayTest { - private fun fromCdl(cdlLoc: String, uri: String? = null, context: ModelContext? = null, alias: AliasDefinition? = null): BinaryArray { + private fun fromCdl( + cdlLoc: String, + uri: String? = null, + context: ModelContext? = null, + alias: AliasDefinition? = null, + downloadUrl: String? = null + ): BinaryArray { val file = writeToNetCdf(cdlLoc) - return NetCdfBinaryArray.create(file.absolutePath, uri, context, alias) + return NetCdfBinaryArray.create(file.absolutePath, uri, context, alias, downloadUrl) } /** @@ -47,6 +54,24 @@ class NetCdfBinaryArrayTest { assertEquals(expectedUri, ba.uri) } + @Test + fun distribution_withDownloadUrl_returnsDistribution() { + val downloadUrl = "http://test.binary-array-ld.net/download/identity.nc" + val ba = fromCdl("/netcdf/identity.cdl", "http://test.binary-array-ld.net/identity.nc", downloadUrl = downloadUrl) + val distribution = ba.distribution + assertEquals(downloadUrl, distribution?.downloadUrl?.uri) + assertEquals("application/x-netcdf", distribution?.mediaType) + } + + @Test + fun distribution_withoutDownloadUrl_returnsEmptyDistribution() { + val ba = fromCdl("/netcdf/identity.cdl", "http://test.binary-array-ld.net/identity.nc") + val distribution = ba.distribution + assertNull(distribution?.downloadUrl?.uri) + assertEquals("application/x-netcdf", distribution?.mediaType) + } + + /** * Requirements class A-2 */ From 29835fda8bfb42e0394fc843c1690458fe142947 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Fri, 16 Jul 2021 12:18:27 +0100 Subject: [PATCH 9/9] Add download url docs --- README.md | 3 -- .../main/java/net/bald/NetCdfConvertJava.java | 4 +-- docs/alias.md | 2 +- docs/cli.md | 7 +++- docs/context.md | 2 +- docs/download.md | 32 +++++++++++++++++++ docs/lib.md | 4 +++ docs/usage.md | 3 +- 8 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 docs/download.md diff --git a/README.md b/README.md index da3d5fa..126a03d 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,3 @@ the `ncgen` command line tool must be available on your system. You can use Maven to build this project and each of its modules with `mvn clean package`. After building, the JAR for the command line application is located at `binary-array-ld-cli/target/bald-cli.jar`. - - - diff --git a/binary-array-ld-demo/src/main/java/net/bald/NetCdfConvertJava.java b/binary-array-ld-demo/src/main/java/net/bald/NetCdfConvertJava.java index 9b9b0fe..17501a5 100644 --- a/binary-array-ld-demo/src/main/java/net/bald/NetCdfConvertJava.java +++ b/binary-array-ld-demo/src/main/java/net/bald/NetCdfConvertJava.java @@ -27,7 +27,7 @@ public static void convert() throws Exception { public static void convertWithExternalPrefixes() throws Exception { PrefixMapping prefix = ModelFactory.createDefaultModel().read("/path/to/context.json", "json-ld"); ModelContext context = ModelContext.create(prefix); - BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", context, null); + BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", context, null, null); Model model = ModelBinaryArrayConverter.convert(ba); try (OutputStream output = new FileOutputStream("/path/to/output.ttl")) { @@ -38,7 +38,7 @@ public static void convertWithExternalPrefixes() throws Exception { public static void convertWithAliases() throws Exception { Model aliasModel = ModelFactory.createDefaultModel().read("/path/to/alias.ttl", "ttl"); AliasDefinition alias = ModelAliasDefinition.create(aliasModel); - BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", null, alias); + BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", null, alias, null); Model model = ModelBinaryArrayConverter.convert(ba); try (OutputStream output = new FileOutputStream("/path/to/output.ttl")) { diff --git a/docs/alias.md b/docs/alias.md index d871944..b85e58a 100644 --- a/docs/alias.md +++ b/docs/alias.md @@ -40,7 +40,7 @@ and an alias definition to create a `BinaryArray` with both. ```java Model aliasModel = ModelFactory.createDefaultModel().read("/path/to/alias.ttl", "ttl"); AliasDefinition alias = ModelAliasDefinition.create(aliasModel); -BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", null, alias); +BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", null, alias, null); Model model = ModelBinaryArrayConverter.convert(ba); try (OutputStream output = new FileOutputStream("/path/to/output.ttl")) { diff --git a/docs/cli.md b/docs/cli.md index c167623..764720a 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -46,6 +46,10 @@ You can find the documentation for this feature [here](context.md#cli). The CLI supports [aliases](alias.md). You can find the documentation for this feature [here](alias.md#cli). +### Download URL + +The CLI supports [download URLs](download.md). + ### Quick Reference You can supply command line options in long form with the `--` prefix or short form with `-`, @@ -57,4 +61,5 @@ followed by their value. | --uri | -u | The URI which identifies the dataset. | Input file URI | | --output | -o | Output format, eg. ttl, json-ld, rdfxml. | ttl | | --context | -c | Comma-delimited list of JSON-LD context files. || -| --alias | -a | Comma-delimited list of RDF alias files. || \ No newline at end of file +| --alias | -a | Comma-delimited list of RDF alias files. || +| --download | -d | The URL from which the original file can be downloaded, if available. || \ No newline at end of file diff --git a/docs/context.md b/docs/context.md index 36e777e..defa5ad 100644 --- a/docs/context.md +++ b/docs/context.md @@ -30,7 +30,7 @@ to create a `BinaryArray` with both. ```java PrefixMapping prefix = ModelFactory.createDefaultModel().read("/path/to/context.json", "json-ld"); ModelContext context = ModelContext.create(prefix); -BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", context, null); +BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.nc", "http://test.binary-array-ld.net/example", context, null, null); Model model = ModelBinaryArrayConverter.convert(ba); try (OutputStream output = new FileOutputStream("/path/to/output.ttl")) { diff --git a/docs/download.md b/docs/download.md new file mode 100644 index 0000000..9f6beb8 --- /dev/null +++ b/docs/download.md @@ -0,0 +1,32 @@ +# Download URL + +The BALD CLI and library allow you to specify a download URL for the given NetCDF file, +as described in the [draft specification](http://docs.opengeospatial.org/DRAFTS/19-002.html#_download_url). + +If you don't specify a download URL, but the given location of the NetCDF file is a remote URL (ie. it has `http` or `https` scheme), +then the download URL will be inferred to be the same. + +## CLI + +You can optionally provide the download URL as a command line argument. +Use the `--download` or `-d` option to specify the download URL for the NetCDF file. + +#### Example +``` +java -jar bald-cli.jar --download http://test.binary-array-ld.net/download/netcdf.nc /path/to/netcdf.nc /path/to/graph.ttl +``` + +## Library + +You can optionally provide the download URL as a parameter to the `NetCdfBinaryArray.create` method. +Otherwise, you can simply pass in a null value. + +#### Example +```java +BinaryArray ba = NetCdfBinaryArray.create("/path/to/input.ttl", "http://test.binary-array-ld.net/example", null, null, "http://test.binary-array-ld.net/download/netcdf.nc"); +Model model = ModelBinaryArrayConverter.convert(ba); + +try (OutputStream output = new FileOutputStream("/path/to/output.ttl")) { + model.write(output, "ttl"); +} +``` \ No newline at end of file diff --git a/docs/lib.md b/docs/lib.md index 977ac52..cff9141 100644 --- a/docs/lib.md +++ b/docs/lib.md @@ -64,3 +64,7 @@ You can find the documentation for this feature [here](context.md#library). The library supports [aliases](alias.md). You can find the documentation for this feature [here](alias.md#library). + +### Download URL + +The library supports [download URLs](download.md). diff --git a/docs/usage.md b/docs/usage.md index b8262db..e70cb70 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -6,4 +6,5 @@ This project can be used as a command line interface or as a library. ### Features * [Context](context.md) -* [Aliases](alias.md) \ No newline at end of file +* [Aliases](alias.md) +* [Download URL](download.md) \ No newline at end of file