annotate jamendo/sparql-archived/SeRQL/sesame_client.pl @ 27:d95e683fbd35 tip

Enable CORS on urispace redirects as well
author Chris Cannam
date Tue, 20 Feb 2018 14:52:02 +0000
parents df9685986338
children
rev   line source
Chris@0 1 /*
Chris@0 2 * $Id$
Chris@0 3 *
Chris@0 4 * Copyright (C) 2004 by Maarten Menken mrmenken@cs.vu.nl
Chris@0 5 */
Chris@0 6
Chris@0 7 :- module(sesame_client,
Chris@0 8 [ sesame_login/3, % +User, +Password, +Options
Chris@0 9 sesame_logout/1, % +Options
Chris@0 10
Chris@0 11 sesame_current_repository/3,% -Id, -Attributes, +Options
Chris@0 12 sesame_clear_repository/1, % +Options
Chris@0 13
Chris@0 14 sesame_graph_query/3, % +Query, -RDF, +Options
Chris@0 15 sesame_table_query/3, % +Query, -Row, +Options
Chris@0 16 sesame_extract_rdf/2, % -RDF, +Options
Chris@0 17
Chris@0 18 sesame_upload_file/2, % +File, +Options
Chris@0 19 sesame_assert/2, % +Triples, +Options
Chris@0 20 sesame_retract/2, % +Triple, +Options
Chris@0 21
Chris@0 22 set_sesame_default/1 % +Option
Chris@0 23 ]).
Chris@0 24 :- use_module(library(rdf)).
Chris@0 25 :- use_module(library('http/http_open')).
Chris@0 26 :- use_module(library('http/http_client')).
Chris@0 27 :- use_module(xml_result).
Chris@0 28 :- use_module(library(rdf_write)).
Chris@0 29 :- use_module(library(lists)).
Chris@0 30 :- use_module(library(option)).
Chris@0 31 :- use_module(library(socket)).
Chris@0 32 :- use_module(library(debug)).
Chris@0 33
Chris@0 34
Chris@0 35 /*******************************
Chris@0 36 * REPOSITORIES *
Chris@0 37 *******************************/
Chris@0 38
Chris@0 39 %% sesame_current_repository(-Id, -Attributes, +Options)
Chris@0 40 %
Chris@0 41 % Retrieve the repositories from a Sesame server with their
Chris@0 42 % attributes.
Chris@0 43
Chris@0 44 sesame_current_repository(Id,
Chris@0 45 [ title(Title),
Chris@0 46 readable(Read),
Chris@0 47 writeable(Write)
Chris@0 48 ], Options) :-
Chris@0 49 sesame_param(host(Host), Options),
Chris@0 50 sesame_param(port(Port), Options),
Chris@0 51 sesame_param(path(Path), Options),
Chris@0 52
Chris@0 53 cookie_options(Host, Port, Path, Cookie),
Chris@0 54 atom_concat(Path, '/servlets/listRepositories', ListPath),
Chris@0 55
Chris@0 56 http_open([ protocol(http),
Chris@0 57 host(Host),
Chris@0 58 port(Port),
Chris@0 59 path(ListPath)
Chris@0 60 ], Sesame,
Chris@0 61 Cookie),
Chris@0 62
Chris@0 63 load_structure(stream(Sesame),
Chris@0 64 [ element(repositorylist, _, Repositories) ],
Chris@0 65 [ dialect(xml),
Chris@0 66 space(remove)
Chris@0 67 ]),
Chris@0 68 member(element(repository, Atts, Content), Repositories),
Chris@0 69 xml_req_attribute(Atts, id, Id),
Chris@0 70 xml_req_attribute(Atts, readable, Read),
Chris@0 71 xml_req_attribute(Atts, writeable, Write),
Chris@0 72 memberchk(element(title, _, [Title]), Content).
Chris@0 73
Chris@0 74
Chris@0 75 xml_req_attribute(Atts, Name, Value) :-
Chris@0 76 memberchk(Name=Value, Atts), !.
Chris@0 77 xml_req_attribute(_, Name, _) :-
Chris@0 78 throw(error(existence_error(attribute, Name), _)).
Chris@0 79
Chris@0 80
Chris@0 81 %% sesame_clear_repository(+Options)
Chris@0 82 %
Chris@0 83 % Remove all triples from the given repository
Chris@0 84
Chris@0 85 sesame_clear_repository(Options) :-
Chris@0 86 sesame_param(host(Host), Options),
Chris@0 87 sesame_param(port(Port), Options),
Chris@0 88 sesame_param(path(Path), Options),
Chris@0 89 sesame_param(repository(Repository), Options),
Chris@0 90
Chris@0 91 cookie_options(Host, Port, Path, Cookie),
Chris@0 92 debug(cookie, 'Adding cookie option: ~w', [Cookie]),
Chris@0 93 atom_concat(Path, '/servlets/clearRepository', ActionPath),
Chris@0 94
Chris@0 95 http_post([ protocol(http),
Chris@0 96 host(Host),
Chris@0 97 port(Port),
Chris@0 98 path(ActionPath)
Chris@0 99 ],
Chris@0 100 form([ repository=Repository
Chris@0 101 ]),
Chris@0 102 Reply,
Chris@0 103 [ reply_header(ReplyHeader)
Chris@0 104 | Cookie
Chris@0 105 ]),
Chris@0 106
Chris@0 107 ok(ReplyHeader, Reply).
Chris@0 108
Chris@0 109 ok(ReplyHeader, _Reply) :-
Chris@0 110 memberchk(status(ok, _), ReplyHeader), !.
Chris@0 111 ok(ReplyHeader, _Reply) :-
Chris@0 112 memberchk(status(forbidden, _), ReplyHeader), !,
Chris@0 113 throw(error(permission_error(sesame, http, action), _)). % TBD
Chris@0 114 ok(_, Reply) :-
Chris@0 115 format(user_error, 'ERROR: Reply: ~p~n', [Reply]),
Chris@0 116 fail.
Chris@0 117
Chris@0 118
Chris@0 119 /*******************************
Chris@0 120 * LOGIN *
Chris@0 121 *******************************/
Chris@0 122
Chris@0 123 :- dynamic
Chris@0 124 cookie/4. % Host, Port, Path, Cookie
Chris@0 125
Chris@0 126 %% sesame_login(+User, +Password, Options)
Chris@0 127 %
Chris@0 128 % Perform a login on a remote HTTP Sesame server.
Chris@0 129
Chris@0 130 sesame_login(User, Password, Options) :-
Chris@0 131 sesame_param(host(Host), Options),
Chris@0 132 sesame_param(port(Port), Options),
Chris@0 133 sesame_param(path(Path), Options),
Chris@0 134
Chris@0 135 atom_concat(Path, '/servlets/login', LoginPath),
Chris@0 136
Chris@0 137 ( Password == ''
Chris@0 138 -> PwdOptions = []
Chris@0 139 ; PwdOptions = [ password=Password ]
Chris@0 140 ),
Chris@0 141
Chris@0 142 http_post([ protocol(http),
Chris@0 143 host(Host),
Chris@0 144 port(Port),
Chris@0 145 path(LoginPath)
Chris@0 146 ],
Chris@0 147 form([ user=User
Chris@0 148 | PwdOptions
Chris@0 149 ]),
Chris@0 150 Reply,
Chris@0 151 [ reply_header(ReplyHdr)
Chris@0 152 ]),
Chris@0 153 memberchk(set_cookie(set_cookie(sesame_sid, Cookie, _Opts)), ReplyHdr),
Chris@0 154 retractall(cookie(Host, Port, Path, _)),
Chris@0 155 assert(cookie(Host, Port, Path, Cookie)),
Chris@0 156 ok(ReplyHdr, Reply).
Chris@0 157
Chris@0 158 %% sesame_logout(+Options)
Chris@0 159 %
Chris@0 160 % Perform a logout from a remote HTTP Sesame server.
Chris@0 161
Chris@0 162 sesame_logout(Options) :-
Chris@0 163 sesame_param(host(Host), Options),
Chris@0 164 sesame_param(port(Port), Options),
Chris@0 165 sesame_param(path(Path), Options),
Chris@0 166
Chris@0 167 cookie_options(Host, Port, Path, Cookie),
Chris@0 168
Chris@0 169 atom_concat(Path, '/servlets/logout', LogoutPath),
Chris@0 170
Chris@0 171 http_open([ protocol(http),
Chris@0 172 host(Host),
Chris@0 173 port(Port),
Chris@0 174 path(LogoutPath)
Chris@0 175 ], Sesame,
Chris@0 176 Cookie),
Chris@0 177 close(Sesame),
Chris@0 178 retract(cookie(Host, Port, Path, _)).
Chris@0 179
Chris@0 180 cookie_options(Host, Port, Path,
Chris@0 181 [ request_header('Cookie'=Cookie)
Chris@0 182 ]) :-
Chris@0 183 cookie(Host, Port, Path, CookieValue), !,
Chris@0 184 sformat(Cookie, 'sesame_sid=~w', [CookieValue]).
Chris@0 185 cookie_options(_, _, _, []).
Chris@0 186
Chris@0 187
Chris@0 188
Chris@0 189 /*******************************
Chris@0 190 * QUERY *
Chris@0 191 *******************************/
Chris@0 192
Chris@0 193 %% sesame_graph_query(+Query, rdf(-Subj, -Pred, -Obj), +Options)
Chris@0 194 %
Chris@0 195 % Run query on a remote SeRQL server using the HTTP protocol,
Chris@0 196 % returning the triples of the result-graph one-by-one on
Chris@0 197 % backtracking
Chris@0 198
Chris@0 199 sesame_graph_query(Query, rdf(Subject, Predicate, Object), Options) :-
Chris@0 200 sesame_param(host(Host), Options),
Chris@0 201 sesame_param(port(Port), Options),
Chris@0 202 sesame_param(path(Path), Options),
Chris@0 203 sesame_param(repository(Repository), Options),
Chris@0 204
Chris@0 205 cookie_options(Host, Port, Path, Cookie),
Chris@0 206 atom_concat(Path, '/servlets/evaluateGraphQuery', GraphQueryPath),
Chris@0 207 SearchVars = [ repository = Repository,
Chris@0 208 query = Query,
Chris@0 209 queryLanguage = 'SeRQL'
Chris@0 210 ],
Chris@0 211
Chris@0 212 concat_atom([ 'http', '://', Host, ':', Port,
Chris@0 213 GraphQueryPath,
Chris@0 214 '?', 'repository=', Repository,
Chris@0 215 '&', 'query=', Query
Chris@0 216 ], BaseUri),
Chris@0 217
Chris@0 218 http_open([ protocol(http),
Chris@0 219 host(Host),
Chris@0 220 port(Port),
Chris@0 221 path(GraphQueryPath),
Chris@0 222 search(SearchVars)
Chris@0 223 ], Sesame, Cookie),
Chris@0 224
Chris@0 225 call_cleanup(load_rdf(Sesame, Triples, [base_uri(BaseUri)]),
Chris@0 226 close(Sesame)),
Chris@0 227
Chris@0 228 member(rdf(Subject,Predicate,Object), Triples).
Chris@0 229
Chris@0 230
Chris@0 231 %% sesame_table_query(+Query, -Row, +Options)
Chris@0 232 %
Chris@0 233 % Run query on a remote SeRQL server using the HTTP protocol,
Chris@0 234 % returning the rows of the result-table one-by-one on
Chris@0 235 % backtracking
Chris@0 236
Chris@0 237 sesame_table_query(Query, Row, Options) :-
Chris@0 238 sesame_param(host(Host), Options),
Chris@0 239 sesame_param(port(Port), Options),
Chris@0 240 sesame_param(path(Path), Options),
Chris@0 241 sesame_param(repository(Repository), Options),
Chris@0 242
Chris@0 243 cookie_options(Host, Port, Path, Cookie),
Chris@0 244 atom_concat(Path, '/servlets/evaluateTableQuery', ActionPath),
Chris@0 245 SearchVars = [ repository = Repository,
Chris@0 246 query = Query,
Chris@0 247 queryLanguage = 'SeRQL'
Chris@0 248 ],
Chris@0 249
Chris@0 250 http_open([ protocol(http),
Chris@0 251 host(Host),
Chris@0 252 port(Port),
Chris@0 253 path(ActionPath),
Chris@0 254 search(SearchVars)
Chris@0 255 ], Sesame, Cookie),
Chris@0 256
Chris@0 257 ( debugging(sesame_reply(File))
Chris@0 258 -> open(File, write, Out),
Chris@0 259 copy_stream_data(Sesame, Out),
Chris@0 260 close(Sesame)
Chris@0 261 ; call_cleanup(xml_read_result_table(Sesame, Rows, VarNames),
Chris@0 262 close(Sesame)),
Chris@0 263
Chris@0 264 ( memberchk(variables(VarNames), Options)
Chris@0 265 -> true
Chris@0 266 ; true
Chris@0 267 ),
Chris@0 268
Chris@0 269 member(Row, Rows)
Chris@0 270 ).
Chris@0 271
Chris@0 272
Chris@0 273 %% sesame_extract_rdf(-Triple, +Options)
Chris@0 274 %
Chris@0 275 % Extract all contents from a remote Sesame repository, In
Chris@0 276 % addition to the server location, the following options are
Chris@0 277 % provided:
Chris@0 278 %
Chris@0 279 %% schema(OnOff) Extract schema data [on]
Chris@0 280 %% data(OnOff) Extract RDF data [on]
Chris@0 281 %% explicitOnly(OnOff) Use entailment rules?
Chris@0 282
Chris@0 283 sesame_extract_rdf(Triple, Options) :-
Chris@0 284 sesame_param(host(Host), Options),
Chris@0 285 sesame_param(port(Port), Options),
Chris@0 286 sesame_param(path(Path), Options),
Chris@0 287 sesame_param(repository(Repository), Options),
Chris@0 288
Chris@0 289 option(schema(IncludeSchema), Options, on),
Chris@0 290 option(data(IncludeData), Options, on),
Chris@0 291 option(explicit_only(Explicitonly), Options, off),
Chris@0 292
Chris@0 293 cookie_options(Host, Port, Path, Cookie),
Chris@0 294 atom_concat(Path, '/servlets/extractRDF', ExtractPath),
Chris@0 295 SearchVars = [ repository = Repository,
Chris@0 296 schema = IncludeSchema,
Chris@0 297 data = IncludeData,
Chris@0 298 explicitOnly = Explicitonly
Chris@0 299 ],
Chris@0 300
Chris@0 301 concat_atom([ 'http', '://', Host, ':', Port,
Chris@0 302 ExtractPath,
Chris@0 303 '?', 'repository=', Repository
Chris@0 304 ], BaseUri),
Chris@0 305
Chris@0 306 http_open([ protocol(http),
Chris@0 307 host(Host),
Chris@0 308 port(Port),
Chris@0 309 path(ExtractPath),
Chris@0 310 search(SearchVars)
Chris@0 311 ], Sesame,
Chris@0 312 Cookie),
Chris@0 313
Chris@0 314 call_cleanup(load_rdf(Sesame, Triples, [base_uri(BaseUri)]),
Chris@0 315 close(Sesame)),
Chris@0 316
Chris@0 317 member(Triple, Triples).
Chris@0 318
Chris@0 319
Chris@0 320 /*******************************
Chris@0 321 * UPLOAD *
Chris@0 322 *******************************/
Chris@0 323
Chris@0 324 sesame_upload_file(File, Options) :-
Chris@0 325 sesame_param(host(Host), Options),
Chris@0 326 sesame_param(port(Port), Options),
Chris@0 327 sesame_param(path(Path), Options),
Chris@0 328 sesame_param(repository(Repository), Options),
Chris@0 329
Chris@0 330 option(data_format(DataFormat), Options, rdfxml),
Chris@0 331 option(base_uri(BaseURI), Options, _),
Chris@0 332 option(verify_data(Verify), Options, off),
Chris@0 333
Chris@0 334 ( var(BaseURI)
Chris@0 335 -> absolute_file_name(File, AbsFile),
Chris@0 336 gethostname(MyHost),
Chris@0 337 concat_atom(['file:/', MyHost, '/', AbsFile], BaseURI)
Chris@0 338 ; true
Chris@0 339 ),
Chris@0 340
Chris@0 341 cookie_options(Host, Port, Path, Cookie),
Chris@0 342 atom_concat(Path, '/servlets/uploadFile', ActionPath),
Chris@0 343
Chris@0 344 http_post([ protocol(http),
Chris@0 345 host(Host),
Chris@0 346 port(Port),
Chris@0 347 path(ActionPath)
Chris@0 348 ],
Chris@0 349 form_data([ repository = Repository,
Chris@0 350 fileData = file(File),
Chris@0 351 dataFormat = DataFormat,
Chris@0 352 baseURI = BaseURI,
Chris@0 353 verifyData = Verify
Chris@0 354 ]),
Chris@0 355 Reply,
Chris@0 356 [ reply_header(ReplyHdr)
Chris@0 357 | Cookie
Chris@0 358 ]),
Chris@0 359 ok(ReplyHdr, Reply).
Chris@0 360
Chris@0 361
Chris@0 362 %% sesame_assert(+TripleOrList, +Options)
Chris@0 363 %
Chris@0 364 % Add a triple or list of triples to the server.
Chris@0 365
Chris@0 366 sesame_assert(Var, _) :-
Chris@0 367 var(Var),
Chris@0 368 throw(error(instantiation_error, _)).
Chris@0 369 sesame_assert(rdf(S,P,O), Options) :- !,
Chris@0 370 sesame_assert([rdf(S,P,O)], Options).
Chris@0 371 sesame_assert(Triples, Options) :-
Chris@0 372 sesame_param(host(Host), Options),
Chris@0 373 sesame_param(port(Port), Options),
Chris@0 374 sesame_param(path(Path), Options),
Chris@0 375 sesame_param(repository(Repository), Options),
Chris@0 376
Chris@0 377 option(base_uri(BaseURI), Options, 'foo:bar'),
Chris@0 378
Chris@0 379 cookie_options(Host, Port, Path, Cookie),
Chris@0 380 atom_concat(Path, '/servlets/uploadData', ActionPath),
Chris@0 381
Chris@0 382 new_memory_file(X),
Chris@0 383 open_memory_file(X, write, Out),
Chris@0 384 rdf_write_xml(Out, Triples),
Chris@0 385 close(Out),
Chris@0 386 memory_file_to_atom(X, Data),
Chris@0 387
Chris@0 388 http_post([ protocol(http),
Chris@0 389 host(Host),
Chris@0 390 port(Port),
Chris@0 391 path(ActionPath)
Chris@0 392 ],
Chris@0 393 form([ repository = Repository,
Chris@0 394 data = Data,
Chris@0 395 dataFormat = rdfxml,
Chris@0 396 baseURI = BaseURI,
Chris@0 397 verifyData = off,
Chris@0 398 resultFormat = xml
Chris@0 399 ]),
Chris@0 400 Reply,
Chris@0 401 [ reply_header(ReplyHdr)
Chris@0 402 | Cookie
Chris@0 403 ]),
Chris@0 404 ok(ReplyHdr, Reply).
Chris@0 405
Chris@0 406
Chris@0 407 %% sesame_retract(+Triple, +Options)
Chris@0 408 %
Chris@0 409 % Retract facts from a sesame server
Chris@0 410
Chris@0 411 sesame_retract(Triple, Options) :-
Chris@0 412 sesame_param(host(Host), Options),
Chris@0 413 sesame_param(port(Port), Options),
Chris@0 414 sesame_param(path(Path), Options),
Chris@0 415 sesame_param(repository(Repository), Options),
Chris@0 416
Chris@0 417 cookie_options(Host, Port, Path, Cookie),
Chris@0 418 atom_concat(Path, '/servlets/removeStatements', ActionPath),
Chris@0 419 phrase(remove_options(Triple), TripleOptions),
Chris@0 420
Chris@0 421 http_post([ protocol(http),
Chris@0 422 host(Host),
Chris@0 423 port(Port),
Chris@0 424 path(ActionPath)
Chris@0 425 ],
Chris@0 426 form([ repository = Repository,
Chris@0 427 resultFormat = xml
Chris@0 428 | TripleOptions
Chris@0 429 ]),
Chris@0 430 Reply,
Chris@0 431 [ reply_header(ReplyHdr)
Chris@0 432 | Cookie
Chris@0 433 ]),
Chris@0 434 ok(ReplyHdr, Reply).
Chris@0 435
Chris@0 436 remove_options(rdf(S,P,O)) -->
Chris@0 437 remove_option(S, subject),
Chris@0 438 remove_option(P, predicate),
Chris@0 439 remove_option(O, object).
Chris@0 440
Chris@0 441 remove_option(X, _) -->
Chris@0 442 { var(X) }, !,
Chris@0 443 [].
Chris@0 444 remove_option(X, Field) -->
Chris@0 445 { ntriple_encode(X, Encoded)
Chris@0 446 },
Chris@0 447 [ Field = Encoded
Chris@0 448 ].
Chris@0 449
Chris@0 450 % VERY simple minded encoding. Need to do escapes!!
Chris@0 451
Chris@0 452 ntriple_encode(Atom, Encoded) :-
Chris@0 453 atom(Atom), !,
Chris@0 454 concat_atom(['<', Atom, '>'], Encoded).
Chris@0 455 ntriple_encode(literal(lang(Lang, String)), Encoded) :- !,
Chris@0 456 concat_atom(['"', String, '"@', Lang], Encoded).
Chris@0 457 ntriple_encode(literal(type(Type, String)), Encoded) :- !,
Chris@0 458 concat_atom(['"', String, '"^^<', Type, '>'], Encoded).
Chris@0 459 ntriple_encode(literal(String), Encoded) :-
Chris@0 460 concat_atom(['"', String, '"'], Encoded).
Chris@0 461
Chris@0 462
Chris@0 463 /*******************************
Chris@0 464 * SETTINGS *
Chris@0 465 *******************************/
Chris@0 466
Chris@0 467 :- dynamic
Chris@0 468 sesame_setting/1.
Chris@0 469
Chris@0 470 sesame_param(Param, Options) :-
Chris@0 471 memberchk(Param, Options), !.
Chris@0 472 sesame_param(Param, _Options) :-
Chris@0 473 sesame_setting(Param), !.
Chris@0 474 sesame_param(Param, _Options) :-
Chris@0 475 functor(Param, Name, _),
Chris@0 476 throw(error(existence_error(option, Name), _)).
Chris@0 477
Chris@0 478 %% set_sesame_default(+OptionOrList)
Chris@0 479 %
Chris@0 480 % Set sesame server default options. Provided defaults are:
Chris@0 481 % host, port and repository. For example:
Chris@0 482 %
Chris@0 483 %% set_sesame_default([ host(localhost),
Chris@0 484 %% port(8080)
Chris@0 485 %% repository(world)
Chris@0 486 % ])
Chris@0 487
Chris@0 488 set_sesame_default([]) :- !.
Chris@0 489 set_sesame_default([H|T]) :- !,
Chris@0 490 set_sesame_default(H),
Chris@0 491 set_sesame_default(T).
Chris@0 492 set_sesame_default(Term) :-
Chris@0 493 functor(Term, Name, Arity),
Chris@0 494 functor(Unbound, Name, Arity),
Chris@0 495 retractall(sesame_setting(Unbound)),
Chris@0 496 assert(sesame_setting(Term)).
Chris@0 497