|
@@ -14,7 +14,7 @@ local pkar = require "pocket_archive"
|
|
|
local model = require "pocket_archive.model"
|
|
|
local mc = require "pocket_archive.monocypher"
|
|
|
local transformers = require "pocket_archive.transformers"
|
|
|
-
|
|
|
+local validator = require "pocket_archive.validator"
|
|
|
|
|
|
local logger = pkar.logger
|
|
|
|
|
@@ -170,18 +170,26 @@ M.generate_sip = function(path)
|
|
|
end
|
|
|
-- Infer structure from paths and row ordering.
|
|
|
for i, v in ipairs(sip) do
|
|
|
- for j = i + 1, #sip do
|
|
|
- if not v["pas:next"] and
|
|
|
- sip[j]["pas:sourcePath"]:match("(.*/)") ==
|
|
|
- v["pas:sourcePath"]:match("(.*/)") then
|
|
|
- v["pas:next"] = sip[j].id
|
|
|
+ local rmod = model.parse_model(v["pas:contentType"])
|
|
|
+ if rmod.properties["pas:next"] then
|
|
|
+ for j = i + 1, #sip do
|
|
|
+ if not v["pas:next"] and
|
|
|
+ sip[j]["pas:sourcePath"]:match("(.*/)") ==
|
|
|
+ v["pas:sourcePath"]:match("(.*/)") then
|
|
|
+ v["pas:next"] = sip[j].id
|
|
|
+ end
|
|
|
end
|
|
|
- if not v["pas:first"] and
|
|
|
- sip[j]["pas:sourcePath"]:match("^" .. escape_pattern(v["pas:sourcePath"])) then
|
|
|
- v["pas:first"] = sip[j].id
|
|
|
+ end
|
|
|
+ if rmod.properties["pas:first"] then
|
|
|
+ for j = i + 1, #sip do
|
|
|
+ if not v["pas:first"] and
|
|
|
+ sip[j]["pas:sourcePath"]:match(
|
|
|
+ "^" .. escape_pattern(v["pas:sourcePath"])
|
|
|
+ ) then
|
|
|
+ v["pas:first"] = sip[j].id
|
|
|
+ end
|
|
|
end
|
|
|
end
|
|
|
- v._sort = nil
|
|
|
end
|
|
|
--require "debugger"()
|
|
|
|
|
@@ -189,19 +197,16 @@ M.generate_sip = function(path)
|
|
|
end
|
|
|
|
|
|
|
|
|
-M.validate = function(sip)
|
|
|
- -- TODO
|
|
|
-end
|
|
|
-
|
|
|
+--[[ Convert a SIP resource table to an in-memory Volksdata graph.
|
|
|
|
|
|
-M.update_rsrc_md = function(rsrc)
|
|
|
- -- TODO use a transaction when volksdata_lua supports it.
|
|
|
+--]]
|
|
|
+M.rsrc_to_graph = function(rsrc)
|
|
|
+ local rmod = model.parse_model(rsrc["pas:contentType"])
|
|
|
logger:info("Updating resource md: ", pp.write(rsrc))
|
|
|
- rmod = model.parse_model(rsrc["pas:contentType"])
|
|
|
- triples = {}
|
|
|
|
|
|
- gr = graph.new(pkar.store, term.DEFAULT_CTX)
|
|
|
local s = term.new_iriref_ns(rsrc.id)
|
|
|
+ triples = {}
|
|
|
+
|
|
|
for k, v in pairs(rsrc) do
|
|
|
-- id is the subject, it won't be an attribute.
|
|
|
if k == "id" then goto skip end
|
|
@@ -210,13 +215,16 @@ M.update_rsrc_md = function(rsrc)
|
|
|
local p = term.new_iriref_ns(k)
|
|
|
local o
|
|
|
if type(v) == "table" then
|
|
|
- for vv, _ in pairs(v) do
|
|
|
+ for vv in pairs(v) do
|
|
|
if ((rmod.properties or NT)[k] or NT).type == "resource" then
|
|
|
o = term.new_iriref_ns(vv)
|
|
|
else o = term.new_lit(vv) end
|
|
|
table.insert(triples, triple.new(s, p, o))
|
|
|
end
|
|
|
else
|
|
|
+ if k == "pas:contentType" then
|
|
|
+ v = "pas:" .. v
|
|
|
+ end
|
|
|
if ((rmod.properties or NT)[k] or NT).type == "resource" then
|
|
|
o = term.new_iriref_ns(v)
|
|
|
else o = term.new_lit(v) end
|
|
@@ -229,6 +237,7 @@ M.update_rsrc_md = function(rsrc)
|
|
|
triples, triple.new(s, pkar.RDF_TYPE, term.new_iriref_ns(m)))
|
|
|
end
|
|
|
|
|
|
+ local gr = graph.new(nil, rsrc.id, true)
|
|
|
-- This is a full replacement.
|
|
|
--require "debugger"()
|
|
|
logger:info("Removing triples.")
|
|
@@ -237,8 +246,27 @@ M.update_rsrc_md = function(rsrc)
|
|
|
-- TODO implement volksdata_lua fn to add a single triple and add triples
|
|
|
-- in the previous loop.
|
|
|
gr:add(triples)
|
|
|
+
|
|
|
+ return gr
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+M.store_updates = function(gr)
|
|
|
+ -- TODO use a transaction when volksdata_lua supports it.
|
|
|
logger:debug("Graph: ", tostring(gr))
|
|
|
for trp in gr:lookup() do logger:debug(tostring(trp)) end
|
|
|
+
|
|
|
+ local val_report = validator.validate(gr)
|
|
|
+ if val_report.max_level == "ERROR" then error(
|
|
|
+ "Validation raised errors: " .. pp.write(val_report))
|
|
|
+ elseif val_report.max_level == "WARN" then logger:warn(
|
|
|
+ "Validation raised warnings: " .. pp.write(val_report))
|
|
|
+ elseif val_report.max_level == "NOTICE" then logger:warn(
|
|
|
+ "Validation raised notices: " .. pp.write(val_report)) end
|
|
|
+
|
|
|
+ local stored_gr = graph.new(pkar.store, term.DEFAULT_CTX)
|
|
|
+
|
|
|
+ return gr:copy(stored_gr)
|
|
|
end
|
|
|
|
|
|
|
|
@@ -309,7 +337,7 @@ M.deposit = function(sip)
|
|
|
tstamp = os.date("!%Y-%m-%dT%TZ")
|
|
|
rsrc["dc:created"] = tstamp
|
|
|
rsrc["dc:modified"] = tstamp
|
|
|
- M.update_rsrc_md(rsrc)
|
|
|
+ M.store_updates(M.rsrc_to_graph(rsrc))
|
|
|
end
|
|
|
|
|
|
-- Remove processing directory.
|