Skip to content

Commit

Permalink
fix (ontology): escape comment (#1833)
Browse files Browse the repository at this point in the history
  • Loading branch information
SepidehAlassi committed Mar 16, 2021
1 parent 153a674 commit 09d4312
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 4 deletions.
Expand Up @@ -3340,16 +3340,17 @@ case class OntologyMetadataV2(ontologyIri: SmartIri,
}

/**
* Undoes the SPARQL-escaping of the `rdfs:label` of this ontology. This method is meant to be used in tests after an update, when the
* Undoes the SPARQL-escaping of the `rdfs:label` and `rdfs:comment` of this ontology. This method is meant to be used in tests after an update, when the
* input (which has been escaped for use in SPARQL) needs to be compared with the updated data
* read back from the triplestore (which is not escaped).
*
* @return a copy of this [[OntologyMetadataV2]] with the `rdfs:label` unescaped.
* @return a copy of this [[OntologyMetadataV2]] with the `rdfs:label` and `rdfs:comment` unescaped.
*/
def unescape: OntologyMetadataV2 = {
val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance

copy(label = label.map(stringFormatter.fromSparqlEncodedString))
copy(label = label.map(stringFormatter.fromSparqlEncodedString),
comment = comment.map(stringFormatter.fromSparqlEncodedString))
}

def toJsonLD(targetSchema: ApiV2Schema): Map[String, JsonLDValue] = {
Expand Down
Expand Up @@ -302,7 +302,9 @@ class OntologyV2R2RSpec extends R2RSpec {
)

private val fooIri = new MutableTestIri
private val barIri = new MutableTestIri
private var fooLastModDate: Instant = Instant.now
private var barLastModDate: Instant = Instant.now

private var anythingLastModDate: Instant = Instant.parse("2017-12-19T15:23:42.166Z")

Expand Down Expand Up @@ -494,7 +496,16 @@ class OntologyV2R2RSpec extends R2RSpec {
val metadata = responseJsonDoc.body
val ontologyIri = metadata.value("@id").asInstanceOf[JsonLDString].value
assert(ontologyIri == "http://0.0.0.0:3333/ontology/0001/bar/v2")
assert(metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString(comment))
assert(
metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString(
stringFormatter.fromSparqlEncodedString(comment)))
barIri.set(ontologyIri)
val lastModDate = metadata.requireDatatypeValueInObject(
key = OntologyConstants.KnoraApiV2Complex.LastModificationDate,
expectedDatatype = OntologyConstants.Xsd.DateTimeStamp.toSmartIri,
validationFun = stringFormatter.xsdDateTimeStampToInstant
)
barLastModDate = lastModDate

clientTestDataCollector.addFile(
TestDataFileContent(
Expand All @@ -509,6 +520,38 @@ class OntologyV2R2RSpec extends R2RSpec {
}
}

"create an empty ontology called 'test' with a comment that has a special character" in {
val label = "The test ontology"
val comment = "some \\\"test\\\" comment"

val params =
s"""{
| "knora-api:ontologyName": "test",
| "knora-api:attachedToProject": {
| "@id": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}"
| },
| "rdfs:label": "$label",
| "rdfs:comment": "$comment",
| "@context": {
| "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
| "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
| }
|}""".stripMargin

Post("/v2/ontologies", HttpEntity(RdfMediaTypes.`application/ld+json`, params)) ~> addCredentials(
BasicHttpCredentials(anythingUsername, password)) ~> ontologiesPath ~> check {
val responseStr = responseAs[String]
assert(status == StatusCodes.OK, responseStr)
val responseJsonDoc = JsonLDUtil.parseJsonLD(responseStr)
val metadata = responseJsonDoc.body
val ontologyIri = metadata.value("@id").asInstanceOf[JsonLDString].value
assert(ontologyIri == "http://0.0.0.0:3333/ontology/0001/test/v2")
assert(
metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString(
stringFormatter.fromSparqlEncodedString(comment)))
}
}

"change the metadata of 'foo'" in {
val newLabel = "The modified foo ontology"
val newComment = "new comment"
Expand Down Expand Up @@ -561,6 +604,46 @@ class OntologyV2R2RSpec extends R2RSpec {
}
}

"change the metadata of 'bar' ontology giving a comment containing a special character" in {
val newComment = "a \\\"new\\\" comment"

val params =
s"""{
| "@id": "${barIri.get}",
| "rdfs:comment": "$newComment",
| "knora-api:lastModificationDate": {
| "@type" : "xsd:dateTimeStamp",
| "@value" : "$barLastModDate"
| },
| "@context": {
| "xsd" : "http://www.w3.org/2001/XMLSchema#",
| "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
| "knora-api" : "http://api.knora.org/ontology/knora-api/v2#"
| }
|}""".stripMargin

Put("/v2/ontologies/metadata", HttpEntity(RdfMediaTypes.`application/ld+json`, params)) ~> addCredentials(
BasicHttpCredentials(anythingUsername, password)) ~> ontologiesPath ~> check {
assert(status == StatusCodes.OK, response.toString)
val responseJsonDoc = responseToJsonLDDocument(response)
val metadata = responseJsonDoc.body
val ontologyIri = metadata.value("@id").asInstanceOf[JsonLDString].value
assert(ontologyIri == barIri.get)
assert(
metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString(
stringFormatter.fromSparqlEncodedString(newComment)))

val lastModDate = metadata.requireDatatypeValueInObject(
key = OntologyConstants.KnoraApiV2Complex.LastModificationDate,
expectedDatatype = OntologyConstants.Xsd.DateTimeStamp.toSmartIri,
validationFun = stringFormatter.xsdDateTimeStampToInstant
)

assert(lastModDate.isAfter(barLastModDate))
barLastModDate = lastModDate
}
}

"delete the comment from 'foo'" in {
val fooIriEncoded = URLEncoder.encode(fooIri.get, "UTF-8")
val lastModificationDate = URLEncoder.encode(fooLastModDate.toString, "UTF-8")
Expand Down

0 comments on commit 09d4312

Please sign in to comment.