ExtractorSpecWebResource.scala 6.68 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * rico2edm
 * Copyright (C) 2021  UB Basel
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 */


21
package ch.memobase.rico2edm.edm
22

23
import ch.memobase.Utils
24
import ch.memobase.Utils.loadFile
25
26
import ch.memobase.rico2edm.edm.subjects.{ProvidedCHO, WebResource}
import ch.memobase.rico2edm.rdf.writer.RdfXmlWriter
27
import ch.memobase.rico2edm.utils.Keys
28
29
30
import org.eclipse.rdf4j.rio.Rio
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should.Matchers
31
32
33
import ujson.Value

import scala.collection.mutable.ArrayBuffer
34
35
36
37
38
39
40

class ExtractorSpecWebResource extends AnyFunSuite with Matchers {

  private lazy val rawRico = loadFile("src/test/resources/raw1L.json")
  private lazy val rawErroneousFile = loadFile("src/test/resources/raw1LError.json")
  private lazy val rawRicoIndent = loadFile("src/test/resources/rawIndent.json")

41
  private lazy val rawEdmRights = loadFile("src/test/resources/rico.certainty.json")
42
43
  private lazy val graph = Extractors.jsonGraph(rawRico).get

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  private lazy val rawDigiObjectWithDuration = loadFile("src/test/resources/rico.NoPhysicalObject.json")

  private lazy val rawDCFormat = loadFile("src/test/resources/rico.regulatedBy.json")

  private lazy val vimeoSource = loadFile("src/test/resources/apf-001-1284.edm.object.json")


  test ("is vimeo object") {

    val g = Extractors.jsonGraph(vimeoSource).get.arr
    val dO = Extractors.digitalObject(g)

    assert(Extractors.isVimeo(dO.get))
    assert(Extractors.webResourceID(g)(dO.get).get == "https://vimeo.com/118910835")

    //no vimeo ID
    val g1 = Extractors.jsonGraph(rawDCFormat).get.arr
    val d1 = Extractors.digitalObject(g1)
    assert(Extractors.webResourceID(g1)(d1.get).get == "bbb-002-387250-1")

    val webresource: Option[WebResource] = Extractors.webResourceID(g)(dO.get).map(id =>
      WebResource(id))

    assert(webresource.isDefined)
    assert(Utils.serializeRDFModel(webresource.get.getModel).contains("""<edm:WebResource rdf:about="https://vimeo.com/118910835">"""))

  }
71
72


73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  test ("get digital object") {

    val dobject = Extractors.digitalObject(graph.arr)

    val webresource = Extractors.dobjectId(dobject.get).map(new WebResource(_))

    if (webresource.isDefined) {

      val record = Extractors.record(graph.arr).get.obj
      val cho = new ProvidedCHO(Extractors.recordId(record).get)
      cho.addTitel(Extractors.title(record))
      cho.addDescription(Extractors.dctAbstract(record))
      cho.addDescription(Extractors.scopeAndContent(record))
      cho.addDescription(Extractors.descriptiveNote(record))

      /*
      todo wir können präziser dcterms:temporal, dcterms:created and dcterms:issued verwenden
       temporal und issued nutzt Sebastian in IIIF nicht
       ich habe das im Beispielrecord auch noch nicht gesehen - gibt es das?
       */
Silvia Witzig's avatar
Silvia Witzig committed
93
      // cho.addCreationDate(Extractors.creationDate(graph.arr)(record))
94
      webresource.get.getModel.addAll(cho.getModel)
95
96

      assert(Utils.serializeRDFModel(cho.getModel).contains("<dc:description>Veduta dell'albergo</dc:description>"))
97
98
    }

99
  }
100

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  test ("edm:rights property") {

    /*
      Warum jsonGraph(...).get?
      Signatur von Extractors.jsonGraph (Mauszeiger auf jsonGraph und ctrl+Leertaste): String => Try[Value.Value]
      d.h. eine Funktion mit einem Parameter vom Typ String (der gesamte rico Graph, der als event vom Kafka topic kommt
      oder aber der Testgraph in unseren unitTest
      Rückgabewert ist Try[Value.Value]
      Für den Beginn würde ich mir folgendes vorstellen:
      - anders als in Java, PHP,... ist in Scala fast alles ein Typ mit einem Wert (Expression). Du kannst übliche Typen
      wie Int (mit dem Wert Zahl) oder String (Zeichenkette) haben. Try steht für einen Typ,
       der das Ergebnis einet Berechnung repräsentiert. Diese hat entweder den Wert erfolgreich oder fehlerhaft
       Wenn ErgebnisvonTry.get schreibst, bist Du dir sicher, dass die Berechnung (Funktionsergebnis) erfolreich war.
       Wenn das nicht der Fall ist, stürzt Dir das Programm ab

     */
    val graphGet: Value = Extractors.jsonGraph(rawEdmRights).get
    /*
      graphGet.arr wandelt die Typen um. Macht also aus Value.Value einen ArrayBuffer[Value]. Also
      eine Collection mit besonderen Eigenschaften (Eigenschaften von Array)
      gehe hier wieder mit der Maus auf graphGet oder graphGet.arr und drücke ctrl+Leertaste. Dann werden die Typen angezeigt

      Wenn Du den Mauszeiger auf digitalObject setzt und auch dort ctrl+Leertaste drückst, wird Dir die Signatur
      Arr => Try[mutable.LinkedHashMap[String,Value.Value] angezeigt
      Also: wir geben graphGet als Array mit und erhalten einen Wert  Try[das digitale Objekt] zurück.
      Try kann auch hier wieder erfolgreich oder fehlerhaft sein
      in unserem Fall bei der Suche nach Regulationsregeln für das digitale Objekt, gehen wir davon aus, dass wir
      ein digitales Objekt gefunden haben. Deswegen dObj.get
     */
    val dObj = Extractors.digitalObject(graphGet.arr)
    val usage = Extractors.usageRegulationDigitalObject(graphGet.arr)(dObj.get)

133
    //println(usage)
134
    //List(http://rightsstatements.org/vocab/CNE/1.0/)
135
136
137
138


  }

139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
  test ("dcterms:extend on digital object (in opposite to physical object of record) for webresource") {
    val graph = Extractors.jsonGraph(rawDigiObjectWithDuration).get
    val digiObj =  Extractors.digitalObject(graph.arr).get
    val duration = Extractors.resourceDCTermsExtentDigitalObject(digiObj)
    assert(duration.get == "1696.026122")
  }

  test ("dc:format with hasMimeType") {
    val graph = Extractors.jsonGraph(rawDCFormat).get.arr
    val doB = Extractors.digitalObject(graph).get


    val mimeType = Extractors.mimeType(doB)
    assert(mimeType.isDefined && mimeType.get == "image/jpeg")

  }

  test ("create ID for webressource") {

    val graph =  Extractors.jsonGraph(rawRico)


    val dobject = Extractors.digitalObject(graph.get.arr)

    val webresourceId = Extractors.webResourceID(graph.get.arr)(dobject.get)
    assert(webresourceId.isDefined)

    val id = s"https://media.memobase.ch/memo/${webresourceId.get}/master"
    assert (id == "https://media.memobase.ch/memo/ati-001-L_44_13-1/master")


  }
171
172

}