Skip to content

Commit a60b8a6

Browse files
37 Root identity (#44)
* Set theme jekyll-theme-slate * Create index.md Initialise GH pages * Update root identity resource to match spec * Fix test * Add format and distribution to graph Remove unused URI property on binary array interface * Remove unused imports * Fix output format test
1 parent a8dc12d commit a60b8a6

File tree

15 files changed

+384
-243
lines changed

15 files changed

+384
-243
lines changed

binary-array-ld-cli/src/test/kotlin/net/bald/BinaryArrayConvertCliTest.kt

Lines changed: 194 additions & 176 deletions
Large diffs are not rendered by default.

binary-array-ld-lib/src/main/kotlin/net/bald/BinaryArray.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ import java.io.Closeable
99
* Should be closed after use.
1010
*/
1111
interface BinaryArray: Closeable {
12-
/**
13-
* The URI which identifies the dataset.
14-
*/
15-
val uri: String
16-
1712
/**
1813
* The prefix mapping to apply to the RDF graph.
1914
*/
@@ -23,4 +18,15 @@ interface BinaryArray: Closeable {
2318
* The root container.
2419
*/
2520
val root: Container
21+
22+
/**
23+
* The format of the binary array.
24+
*/
25+
val format: Format
26+
27+
/**
28+
* The distribution of the binary array, if it is available. Otherwise, null.
29+
*/
30+
val distribution: Distribution?
31+
2632
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.bald
2+
3+
/**
4+
* A distribution of a binary array file.
5+
*/
6+
interface Distribution {
7+
/**
8+
* The media type of the binary array file.
9+
*/
10+
val mediaType: String
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.bald
2+
3+
import org.apache.jena.rdf.model.Resource
4+
5+
/**
6+
* A binary array format.
7+
*/
8+
interface Format {
9+
/**
10+
* The resource which represents the format.
11+
*/
12+
val identifier: Resource
13+
}

binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelBinaryArrayBuilder.kt

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,48 @@ package net.bald.model
22

33
import net.bald.BinaryArray
44
import net.bald.vocab.BALD
5+
import org.apache.jena.rdf.model.Literal
56
import org.apache.jena.rdf.model.Model
7+
import org.apache.jena.rdf.model.Resource
8+
import org.apache.jena.rdf.model.ResourceFactory.createResource
9+
import org.apache.jena.rdf.model.ResourceFactory.createStringLiteral
610
import org.apache.jena.shared.PrefixMapping
11+
import org.apache.jena.vocabulary.DCAT
12+
import org.apache.jena.vocabulary.DCTerms
13+
import org.apache.jena.vocabulary.RDF
714
import java.net.URI
815

916
class ModelBinaryArrayBuilder(
1017
private val model: Model,
1118
private val containerFct: ModelContainerBuilder.Factory
1219
) {
1320
fun addBinaryArray(ba: BinaryArray) {
21+
val root = ba.root
22+
val res = model.createResource(root.uri)
23+
1424
addPrefixMapping(ba.prefixMapping)
15-
val baRes = model.createResource(ba.uri, BALD.Container)
16-
containerFct.forParent(baRes).addContainer(ba.root)
25+
addFormat(ba, res)
26+
addDistribution(ba, res)
27+
containerFct.forRoot(model).addContainer(root)
28+
}
29+
30+
private fun addFormat(ba: BinaryArray, root: Resource) {
31+
val format = model.createResource()
32+
.addProperty(RDF.type, DCTerms.MediaType)
33+
.addProperty(DCTerms.identifier, ba.format.identifier)
34+
root.addProperty(DCTerms.format, format)
35+
}
36+
37+
private fun addDistribution(ba: BinaryArray, root: Resource) {
38+
ba.distribution?.let { dist ->
39+
val mediaType = model.createResource()
40+
.addProperty(RDF.type, DCTerms.MediaType)
41+
.addProperty(DCTerms.identifier, dist.mediaType)
42+
val distribution = model.createResource()
43+
.addProperty(RDF.type, DCAT.Distribution)
44+
.addProperty(DCAT.mediaType, mediaType)
45+
root.addProperty(DCAT.distribution, distribution)
46+
}
1747
}
1848

1949
private fun addPrefixMapping(prefixMapping: PrefixMapping) {

binary-array-ld-lib/src/main/kotlin/net/bald/model/ModelContainerBuilder.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,27 @@ package net.bald.model
33
import net.bald.AttributeSource
44
import net.bald.Container
55
import net.bald.vocab.BALD
6+
import org.apache.jena.rdf.model.Model
67
import org.apache.jena.rdf.model.Resource
78

89
open class ModelContainerBuilder(
9-
private val parent: Resource,
10+
private val model: Model,
11+
private val parent: Resource?,
1012
private val varFct: ModelVarBuilder.Factory,
1113
private val attrFct: ModelAttributeBuilder.Factory
1214
) {
15+
constructor(
16+
parent: Resource,
17+
varFct: ModelVarBuilder.Factory,
18+
attrFct: ModelAttributeBuilder.Factory
19+
): this(parent.model, parent, varFct, attrFct)
20+
1321
open fun addContainer(container: Container) {
14-
val containerRes = parent.model.createResource(container.uri, BALD.Container)
22+
val containerRes = model.createResource(container.uri, BALD.Container)
1523
addSubContainers(container, containerRes)
1624
addVars(container, containerRes)
1725
addAttributes(container, containerRes)
18-
parent.addProperty(BALD.contains, containerRes)
26+
parent?.addProperty(BALD.contains, containerRes)
1927
}
2028

2129
private fun addSubContainers(container: Container, containerRes: Resource) {
@@ -40,6 +48,10 @@ open class ModelContainerBuilder(
4048
open fun forParent(parent: Resource): ModelContainerBuilder {
4149
return ModelContainerBuilder(parent, varFct, attrFct)
4250
}
51+
52+
open fun forRoot(model: Model): ModelContainerBuilder {
53+
return ModelContainerBuilder(model, parent = null, varFct, attrFct)
54+
}
4355
}
4456
}
4557

binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayBuilderTest.kt

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,53 @@
11
package net.bald.model
22

33
import bald.model.ModelVerifier
4-
import com.nhaarman.mockitokotlin2.any
54
import com.nhaarman.mockitokotlin2.doReturn
65
import com.nhaarman.mockitokotlin2.mock
76
import com.nhaarman.mockitokotlin2.verify
87
import net.bald.BinaryArray
98
import net.bald.Container
9+
import net.bald.Distribution
10+
import net.bald.Format
1011
import net.bald.vocab.BALD
1112
import org.apache.jena.rdf.model.ModelFactory
13+
import org.apache.jena.rdf.model.ResourceFactory.createResource
1214
import org.apache.jena.shared.PrefixMapping
13-
import org.apache.jena.vocabulary.RDF
1415
import org.apache.jena.vocabulary.SKOS
1516
import org.junit.jupiter.api.Test
1617
import org.junit.jupiter.api.assertThrows
1718
import java.lang.IllegalArgumentException
1819
import kotlin.test.assertEquals
1920

2021
class ModelBinaryArrayBuilderTest {
22+
private val model = ModelFactory.createDefaultModel()
2123
private val containerBuilder = mock<ModelContainerBuilder>()
2224
private val containerFct = mock<ModelContainerBuilder.Factory> {
23-
on { forParent(any()) } doReturn containerBuilder
25+
on { forRoot(model) } doReturn containerBuilder
2426
}
25-
private val model = ModelFactory.createDefaultModel()
2627
private val builder = ModelBinaryArrayBuilder.Factory(containerFct).forModel(model)
27-
private val root = mock<Container>()
28+
private val root = mock<Container> {
29+
on { uri } doReturn "http://test.binary-array-ld.net/example/"
30+
}
2831
private val prefix = PrefixMapping.Factory.create()
2932
.setNsPrefix("bald", BALD.prefix)
3033
.setNsPrefix("skos", SKOS.uri)
34+
private val format = mock<Format> {
35+
on { identifier } doReturn createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")
36+
}
37+
private val distribution = mock<Distribution> {
38+
on { mediaType } doReturn "application/x-netcdf"
39+
}
3140
private val ba = mock<BinaryArray> {
32-
on { uri } doReturn "http://test.binary-array-ld.net/example"
3341
on { this.root } doReturn root
3442
on { prefixMapping } doReturn prefix
35-
}
36-
37-
@Test
38-
fun addBinaryArray_addsFileContainer() {
39-
builder.addBinaryArray(ba)
40-
ModelVerifier(model).resource("http://test.binary-array-ld.net/example") {
41-
statement(RDF.type, BALD.Container)
42-
}
43+
on { format } doReturn format
44+
on { distribution } doReturn distribution
4345
}
4446

4547
@Test
4648
fun addBinaryArray_addsRootContainer() {
4749
builder.addBinaryArray(ba)
48-
verify(containerFct).forParent(model.getResource("http://test.binary-array-ld.net/example"))
50+
verify(containerFct).forRoot(model)
4951
verify(containerBuilder).addContainer(root)
5052
}
5153

@@ -84,4 +86,15 @@ class ModelBinaryArrayBuilderTest {
8486
}
8587
assertEquals("Unable to add prefix mapping eg to model: URI must end with / or #.", iae.message)
8688
}
89+
90+
@Test
91+
fun addBinaryArray_addsFormatAndDistribution() {
92+
builder.addBinaryArray(ba)
93+
ModelVerifier(model).apply {
94+
resource("http://test.binary-array-ld.net/example/") {
95+
format()
96+
distribution()
97+
}
98+
}
99+
}
87100
}

binary-array-ld-lib/src/test/kotlin/net/bald/model/ModelBinaryArrayConverterTest.kt

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package net.bald.model
33
import bald.model.ModelVerifier
44
import com.nhaarman.mockitokotlin2.doReturn
55
import com.nhaarman.mockitokotlin2.mock
6-
import net.bald.BinaryArray
7-
import net.bald.Container
8-
import net.bald.Var
6+
import net.bald.*
97
import net.bald.vocab.BALD
108
import org.apache.jena.rdf.model.Model
9+
import org.apache.jena.rdf.model.ResourceFactory
1110
import org.apache.jena.shared.PrefixMapping
1211
import org.apache.jena.vocabulary.DCTerms
1312
import org.apache.jena.vocabulary.RDF
@@ -46,10 +45,17 @@ class ModelBinaryArrayConverterTest {
4645
.setNsPrefix("bald", BALD.prefix)
4746
.setNsPrefix("skos", SKOS.uri)
4847
.setNsPrefix("dct", DCTerms.NS)
48+
val format = mock<Format> {
49+
on { identifier } doReturn ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")
50+
}
51+
val distribution = mock<Distribution> {
52+
on { mediaType } doReturn "application/x-netcdf"
53+
}
4954
val ba = mock<BinaryArray> {
50-
on { this.uri } doReturn uri
5155
on { this.root } doReturn root
5256
on { prefixMapping } doReturn prefix
57+
on { this.format } doReturn format
58+
on { this.distribution } doReturn distribution
5359
}
5460

5561
val model = convert(ba)
@@ -58,19 +64,18 @@ class ModelBinaryArrayConverterTest {
5864
prefix("bald", BALD.prefix)
5965
prefix("skos", SKOS.uri)
6066
prefix("dct", DCTerms.NS)
61-
resource("http://test.binary-array-ld.net/example") {
67+
resource("http://test.binary-array-ld.net/example/") {
68+
format()
6269
statement(RDF.type, BALD.Container)
63-
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/")) {
64-
statement(RDF.type, BALD.Container)
65-
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/bar")) {
66-
statement(RDF.type, BALD.Resource)
67-
}
68-
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/baz")) {
69-
statement(RDF.type, BALD.Resource)
70-
}
71-
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/foo")) {
72-
statement(RDF.type, BALD.Resource)
73-
}
70+
distribution()
71+
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/bar")) {
72+
statement(RDF.type, BALD.Resource)
73+
}
74+
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/baz")) {
75+
statement(RDF.type, BALD.Resource)
76+
}
77+
statement(BALD.contains, model.createResource("http://test.binary-array-ld.net/example/foo")) {
78+
statement(RDF.type, BALD.Resource)
7479
}
7580
}
7681
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.bald.model
2+
3+
import bald.model.StatementsVerifier
4+
import org.apache.jena.rdf.model.ResourceFactory
5+
import org.apache.jena.vocabulary.DCAT
6+
import org.apache.jena.vocabulary.DCTerms
7+
import org.apache.jena.vocabulary.RDF
8+
9+
fun StatementsVerifier.format() {
10+
statement(DCTerms.format) {
11+
statement(DCTerms.identifier,
12+
ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/"))
13+
statement(RDF.type, DCTerms.MediaType)
14+
}
15+
}
16+
17+
fun StatementsVerifier.distribution() {
18+
statement(DCAT.distribution) {
19+
statement(RDF.type, DCAT.Distribution)
20+
statement(DCAT.mediaType) {
21+
statement(DCTerms.identifier, ResourceFactory.createStringLiteral("application/x-netcdf"))
22+
statement(RDF.type, DCTerms.MediaType)
23+
}
24+
}
25+
}

binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfBinaryArray.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.bald.netcdf
22

33
import net.bald.BinaryArray
4+
import net.bald.Distribution
5+
import net.bald.Format
46
import net.bald.alias.AliasDefinition
57
import net.bald.context.ModelContext
68
import org.apache.jena.shared.PrefixMapping
@@ -15,7 +17,7 @@ import java.io.File
1517
* Should be closed after use.
1618
*/
1719
class NetCdfBinaryArray(
18-
override val uri: String,
20+
val uri: String,
1921
private val file: NetcdfFile,
2022
private val context: ModelContext,
2123
val alias: AliasDefinition
@@ -29,6 +31,9 @@ class NetCdfBinaryArray(
2931
}
3032
}
3133

34+
override val format: Format get() = NetCdfFormat
35+
override val distribution: Distribution get() = NetCdfDistribution()
36+
3237
val prefixSrc: String? get() = prefixSourceName()
3338

3439
override fun close() {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package net.bald.netcdf
2+
3+
import net.bald.Distribution
4+
5+
/**
6+
* NetCDF implementation of [Distribution].
7+
*/
8+
class NetCdfDistribution: Distribution {
9+
override val mediaType: String get() = "application/x-netcdf"
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.bald.netcdf
2+
3+
import net.bald.Format
4+
import org.apache.jena.rdf.model.Resource
5+
import org.apache.jena.rdf.model.ResourceFactory
6+
7+
/**
8+
* NetCDF implementation of [Format].
9+
*/
10+
object NetCdfFormat: Format {
11+
override val identifier: Resource
12+
get() = ResourceFactory.createResource("http://vocab.nerc.ac.uk/collection/M01/current/NC/")
13+
}

binary-array-ld-netcdf/src/main/kotlin/net/bald/netcdf/NetCdfRootContainer.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ class NetCdfRootContainer(
1212
private val ba: NetCdfBinaryArray,
1313
group: Group,
1414
): NetCdfContainer(group) {
15-
override val uri: String get() = ba.uri + "/"
15+
override val uri: String get() {
16+
val uri = ba.uri
17+
return if (uri.endsWith("/")) uri else "$uri/"
18+
}
1619
override val alias: AliasDefinition get() = ba.alias
1720
override val parent: NetCdfContainer? get() = null
1821
override val root: NetCdfContainer get() = this

0 commit comments

Comments
 (0)