Skip to content

Commit f55a2a0

Browse files
RubenVerborghdmitrizagidulin
authored andcommitted
Deduplicate graph reading code.
1 parent acc7151 commit f55a2a0

File tree

3 files changed

+99
-116
lines changed

3 files changed

+99
-116
lines changed

lib/handlers/patch.js

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
module.exports = handler
22

33
var mime = require('mime-types')
4+
var fs = require('fs')
45
var debug = require('../debug').handlers
56
var utils = require('../utils.js')
67
var error = require('../http-error')
8+
var $rdf = require('rdflib')
79

810
const DEFAULT_CONTENT_TYPE = 'text/turtle'
911

@@ -40,16 +42,56 @@ function patchHandler (req, res, next) {
4042

4143
debug('PATCH -- Content-type ' + patchContentType + ' patching target ' + targetContentType + ' <' + targetURI + '>')
4244

45+
// Obtain a patcher for the given patch type
4346
const patch = PATCHERS[patchContentType]
4447
if (!patch) {
4548
return next(error(415, 'Unknown patch content type: ' + patchContentType))
4649
}
47-
patch(filename, targetURI, req.text, function (err, result) {
48-
if (err) {
49-
next(err)
50-
} else {
50+
51+
// Read the RDF graph to be patched
52+
readGraph(filename, targetURI).then((targetKB) => {
53+
// Patch the target graph
54+
patch(targetKB, filename, targetURI, req.text, function (err, result) {
55+
if (err) {
56+
throw err
57+
}
5158
res.send(result)
5259
next()
60+
})
61+
})
62+
.catch(next)
63+
}
64+
65+
// Reads the RDF graph in the given file with the corresponding URI
66+
function readGraph (resourceFile, resourceURI) {
67+
// Read the file
68+
return new Promise((resolve, reject) => {
69+
fs.readFile(resourceFile, {encoding: 'utf8'}, function (err, fileContents) {
70+
if (err) {
71+
// If the file does not exist, assume empty contents
72+
// (it will be created after a successful patch)
73+
if (err.code === 'ENOENT') {
74+
fileContents = ''
75+
// Fail on all other errors
76+
} else {
77+
return reject(error(500, 'Patch: Original file read error:' + err))
78+
}
79+
}
80+
debug('PATCH -- Read target file (%d bytes)', fileContents.length)
81+
resolve(fileContents)
82+
})
83+
})
84+
// Parse the file
85+
.then((fileContents) => {
86+
const graph = $rdf.graph()
87+
const contentType = mime.lookup(resourceFile) || DEFAULT_CONTENT_TYPE
88+
debug('PATCH -- Reading %s with content type %s', resourceURI, contentType)
89+
try {
90+
$rdf.parse(fileContents, graph, resourceURI, contentType)
91+
} catch (err) {
92+
throw error(500, 'Patch: Target ' + contentType + ' file syntax error:' + err)
5393
}
94+
debug('PATCH -- Parsed target file')
95+
return graph
5496
})
5597
}
Lines changed: 34 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,51 @@
11
module.exports = patch
22

3-
var mime = require('mime-types')
4-
var fs = require('fs')
53
var $rdf = require('rdflib')
64
var debug = require('../../debug').handlers
7-
var error = require('../../http-error')
85

9-
const DEFAULT_CONTENT_TYPE = 'text/turtle'
10-
11-
function patch (filename, targetURI, text, callback) {
6+
function patch (targetKB, filename, targetURI, text, callback) {
127
debug('PATCH -- parsing query ...')
138
var patchURI = targetURI // @@@ beware the triples from the patch ending up in the same place
149
var patchKB = $rdf.graph()
15-
var targetKB = $rdf.graph()
16-
var targetContentType = mime.lookup(filename) || DEFAULT_CONTENT_TYPE
1710
var query = $rdf.SPARQLToQuery(text, false, patchKB, patchURI) // last param not used ATM
1811

19-
fs.readFile(filename, {encoding: 'utf8'}, function (err, dataIn) {
20-
if (err) {
21-
return callback(error(404, 'Patch: Original file read error:' + err))
22-
}
23-
24-
debug('PATCH -- File read OK ' + dataIn.length)
25-
debug('PATCH -- parsing target file ...')
26-
27-
try {
28-
$rdf.parse(dataIn, targetKB, targetURI, targetContentType)
29-
} catch (e) {
30-
debug('Patch: Target ' + targetContentType + ' file syntax error:' + e)
31-
return callback(error(500, 'Patch: Target ' + targetContentType + ' file syntax error:' + e))
32-
}
33-
debug('PATCH -- Target parsed OK ')
34-
35-
var bindingsArray = []
36-
37-
var onBindings = function (bindings) {
38-
var b = {}
39-
var v
40-
var x
41-
for (v in bindings) {
42-
if (bindings.hasOwnProperty(v)) {
43-
x = bindings[v]
44-
b[v] = x.uri ? {'type': 'uri', 'value': x.uri} : { 'type': 'literal', 'value': x.value }
45-
if (x.lang) {
46-
b[v]['xml:lang'] = x.lang
47-
}
48-
if (x.dt) {
49-
b[v].dt = x.dt.uri // @@@ Correct? @@ check
50-
}
12+
var bindingsArray = []
13+
14+
var onBindings = function (bindings) {
15+
var b = {}
16+
var v
17+
var x
18+
for (v in bindings) {
19+
if (bindings.hasOwnProperty(v)) {
20+
x = bindings[v]
21+
b[v] = x.uri ? {'type': 'uri', 'value': x.uri} : { 'type': 'literal', 'value': x.value }
22+
if (x.lang) {
23+
b[v]['xml:lang'] = x.lang
24+
}
25+
if (x.dt) {
26+
b[v].dt = x.dt.uri // @@@ Correct? @@ check
5127
}
5228
}
53-
debug('PATCH -- bindings: ' + JSON.stringify(b))
54-
bindingsArray.push(b)
5529
}
56-
57-
var onDone = function () {
58-
debug('PATCH -- Query done, no. bindings: ' + bindingsArray.length)
59-
const result = {
60-
'head': {
61-
'vars': query.vars.map(function (v) {
62-
return v.toNT()
63-
})
64-
},
65-
'results': {
66-
'bindings': bindingsArray
67-
}
30+
debug('PATCH -- bindings: ' + JSON.stringify(b))
31+
bindingsArray.push(b)
32+
}
33+
34+
var onDone = function () {
35+
debug('PATCH -- Query done, no. bindings: ' + bindingsArray.length)
36+
const result = {
37+
'head': {
38+
'vars': query.vars.map(function (v) {
39+
return v.toNT()
40+
})
41+
},
42+
'results': {
43+
'bindings': bindingsArray
6844
}
69-
callback(null, JSON.stringify(result))
7045
}
46+
callback(null, JSON.stringify(result))
47+
}
7148

72-
var fetcher = new $rdf.Fetcher(targetKB, 10000, true)
73-
targetKB.query(query, onBindings, fetcher, onDone)
74-
})
49+
var fetcher = new $rdf.Fetcher(targetKB, 10000, true)
50+
targetKB.query(query, onBindings, fetcher, onDone)
7551
}

lib/handlers/patch/sparql-update-patcher.js

Lines changed: 19 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ var fs = require('fs')
55
var $rdf = require('rdflib')
66
var debug = require('../../debug').handlers
77
var error = require('../../http-error')
8-
const waterfall = require('run-waterfall')
98

109
const DEFAULT_CONTENT_TYPE = 'text/turtle'
1110

12-
function patch (filename, targetURI, text, callback) {
11+
function patch (targetKB, filename, targetURI, text, callback) {
1312
var patchURI = targetURI // @@@ beware the triples from the patch ending up in the same place
1413
var patchKB = $rdf.graph()
15-
var targetKB = $rdf.graph()
1614
var targetContentType = mime.lookup(filename) || DEFAULT_CONTENT_TYPE
1715

1816
debug('PATCH -- parsing patch ...')
@@ -25,56 +23,23 @@ function patch (filename, targetURI, text, callback) {
2523
}
2624
debug('PATCH -- reading target file ...')
2725

28-
waterfall([
29-
(cb) => {
30-
fs.stat(filename, (err) => {
31-
if (!err) return cb()
32-
33-
fs.writeFile(filename, '', (err) => {
34-
if (err) {
35-
return cb(error(err, 'Error creating the patch target'))
36-
}
37-
cb()
38-
})
39-
})
40-
},
41-
(cb) => {
42-
fs.readFile(filename, {encoding: 'utf8'}, function (err, dataIn) {
43-
if (err) {
44-
return cb(error(500, 'Error reading the patch target'))
45-
}
46-
47-
debug('PATCH -- target read OK ' + dataIn.length + ' bytes. Parsing...')
48-
49-
try {
50-
$rdf.parse(dataIn, targetKB, targetURI, targetContentType)
51-
} catch (e) {
52-
debug('Patch: Target ' + targetContentType + ' file syntax error:' + e)
53-
return cb(error(500, 'Patch: Target ' + targetContentType + ' file syntax error:' + e))
54-
}
55-
56-
var target = patchKB.sym(targetURI)
57-
debug('PATCH -- Target parsed OK, patching... ')
58-
59-
targetKB.applyPatch(patchObject, target, function (err) {
60-
if (err) {
61-
var message = err.message || err // returns string at the moment
62-
debug('PATCH FAILED. Returning 409. Message: \'' + message + '\'')
63-
return cb(error(409, 'Error when applying the patch'))
64-
}
65-
debug('PATCH -- Patched. Writeback URI base ' + targetURI)
66-
var data = $rdf.serialize(target, targetKB, targetURI, targetContentType)
67-
// debug('Writeback data: ' + data)
68-
69-
fs.writeFile(filename, data, {encoding: 'utf8'}, function (err, data) {
70-
if (err) {
71-
return cb(error(500, 'Failed to write file back after patch: ' + err))
72-
}
73-
debug('PATCH -- applied OK (sync)')
74-
return cb(null, 'Patch applied OK\n')
75-
})
76-
})
77-
})
26+
var target = patchKB.sym(targetURI)
27+
targetKB.applyPatch(patchObject, target, function (err) {
28+
if (err) {
29+
var message = err.message || err // returns string at the moment
30+
debug('PATCH FAILED. Returning 409. Message: \'' + message + '\'')
31+
return callback(error(409, 'Error when applying the patch'))
7832
}
79-
], callback)
33+
debug('PATCH -- Patched. Writeback URI base ' + targetURI)
34+
var data = $rdf.serialize(target, targetKB, targetURI, targetContentType)
35+
// debug('Writeback data: ' + data)
36+
37+
fs.writeFile(filename, data, {encoding: 'utf8'}, function (err, data) {
38+
if (err) {
39+
return callback(error(500, 'Failed to write file back after patch: ' + err))
40+
}
41+
debug('PATCH -- applied OK (sync)')
42+
return callback(null, 'Patch applied OK\n')
43+
})
44+
})
8045
}

0 commit comments

Comments
 (0)