| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.data.RdfStore"); |
| dojo.provide("dojo.data.RhizomeStore"); |
| dojo.require("dojo.lang.declare"); |
| dojo.require("dojo.data.core.RemoteStore"); |
| dojo.require("dojo.experimental"); |
| dojo.data.RdfDatatypeSerializer = function (type, convertFunc, uri) { |
| this.type = type; |
| this._converter = convertFunc; |
| this.uri = uri; |
| this.serialize = function (value) { |
| return this._converter.call(value, value); |
| }; |
| }; |
| dojo.declare("dojo.data.RdfStore", dojo.data.core.RemoteStore, {_datatypeMap:{literal:function (value) { |
| var literal = value.value; |
| if (value["xml:lang"]) { |
| literal.lang = value["xml:lang"]; |
| } |
| return literal; |
| }, uri:function (value) { |
| return {id:value.value}; |
| }, bnode:function (value) { |
| return {id:"_:" + value.value}; |
| }, "http://www.w3.org/2001/XMLSchema#int":function (value) { |
| return parseInt(value.value); |
| }, "http://www.w3.org/2001/XMLSchema#integer":function (value) { |
| return parseInt(value.value); |
| }, "http://www.w3.org/2001/XMLSchema#long":function (value) { |
| return parseInt(value.value); |
| }, "http://www.w3.org/2001/XMLSchema#float":function (value) { |
| return parseFloat(value.value); |
| }, "http://www.w3.org/2001/XMLSchema#double":function (value) { |
| return parseFloat(value.value); |
| }, "http://www.w3.org/2001/XMLSchema#boolean":function (value) { |
| return !value || value == "false" || value == "0" ? false : true; |
| }}, _datatypeSerializers:[new dojo.data.RdfDatatypeSerializer(Number, Number.toString, "http://www.w3.org/2001/XMLSchema#float"), new dojo.data.RdfDatatypeSerializer(Boolean, Boolean.toString, "http://www.w3.org/2001/XMLSchema#boolean")], _findDatatypeSerializer:function (value) { |
| var length = this._datatypeSerializers.length; |
| for (var i = 0; i < length; i++) { |
| var datatype = this._datatypeSerializers[i]; |
| if (value instanceof datatype.type) { |
| return datatype; |
| } |
| } |
| }, _toRDFValue:function (value) { |
| var rdfvalue = {}; |
| if (value.id) { |
| if (value.id.slice(0, 2) == "_:") { |
| rdfvalue.type = "bnode"; |
| rdfvalue.value = value.id.substring(2); |
| } else { |
| rdfvalue.type = "uri"; |
| rdfvalue.value = value.id; |
| } |
| } else { |
| if (typeof value == "string" || value instanceof String) { |
| rdfvalue.type = "literal"; |
| rdfvalue.value = value; |
| if (value.lang) { |
| rdfvalue["xml:lang"] = value.lang; |
| } |
| } else { |
| if (typeof value == "number") { |
| value = new Number(value); |
| } else { |
| if (typeof value == "boolean") { |
| value = new Boolean(value); |
| } |
| } |
| var datatype = this._findDatatypeSerializer(value); |
| if (datatype) { |
| rdfvalue = {"type":"typed-literal", "datatype":datatype.uri, "value":value.toString()}; |
| } else { |
| rdfvalue = {"type":"literal", "value":value.toString()}; |
| } |
| } |
| } |
| return rdfvalue; |
| }, _setupSaveRequest:function (saveKeywordArgs, requestKw) { |
| var rdfResult = {"head":{"vars":["s", "p", "o"]}, "results":{"bindings":[]}}; |
| var resources = []; |
| for (var key in this._deleted) { |
| resources.push(key); |
| } |
| rdfResult.results.deleted = resources; |
| for (key in this._changed) { |
| var subject = this._toRDFValue(this.getIdentity(key)); |
| var attributes = this._changed[key]; |
| for (var attr in attributes) { |
| var predicate = {type:"uri", value:attr}; |
| var values = attributes[attr]; |
| if (!values.length) { |
| continue; |
| } |
| var rdfvalues = []; |
| for (var i = 0; i < values.length; i++) { |
| var rdfvalue = this._toRDFValue(values[i]); |
| rdfResult.results.bindings.push({s:subject, p:predicate, o:rdfvalue}); |
| } |
| } |
| } |
| var oldRegistry = dojo.json.jsonRegistry; |
| dojo.json.jsonRegistry = this._jsonRegistry; |
| var jsonString = dojo.json.serialize(rdfResult); |
| dojo.json.jsonRegistry = oldRegistry; |
| requestKw.postContent = jsonString; |
| }, _resultToQueryMetadata:function (json) { |
| return json.head; |
| }, _resultToQueryData:function (json) { |
| var items = {}; |
| var stmts = json.results.bindings; |
| for (var i = 0; i < stmts.length; i++) { |
| var stmt = stmts[i]; |
| var subject = stmt.s.value; |
| if (stmt.s.type == "bnode") { |
| subject = "_:" + subject; |
| } |
| var attributes = data[subject]; |
| if (!attributes) { |
| attributes = {}; |
| data[stmt.s] = attributes; |
| } |
| var attr = attributes[stmt.p.value]; |
| if (!attr) { |
| attributes[stmt.p.value] = [stmt.o]; |
| } else { |
| attr.push(stmt.o); |
| } |
| } |
| return items; |
| }}); |
| dojo.declare("dojo.data.RhizomeStore", dojo.data.RdfStore, {initializer:function (kwArgs) { |
| this._serverQueryUrl = kwArgs.baseUrl + "search?view=json&searchType=RxPath&search="; |
| this._serverSaveUrl = kwArgs.baseUrl + "save-metadata"; |
| }, _resultToQueryMetadata:function (json) { |
| return json; |
| }, _resultToQueryData:function (json) { |
| return json; |
| }, _setupSaveRequest:function (saveKeywordArgs, requestKw) { |
| requestKw.url = this._serverSaveUrl; |
| requestKw.method = "post"; |
| requestKw.mimetype = "text/plain"; |
| var resources = []; |
| for (var key in this._deleted) { |
| resources.push(key); |
| } |
| var changes = {}; |
| for (key in this._changed) { |
| if (!this._added[key]) { |
| resources.push(key); |
| } |
| var attributes = this._changed[key]; |
| var rdfattributes = {}; |
| for (var attr in attributes) { |
| var values = attributes[attr]; |
| if (!values.length) { |
| continue; |
| } |
| var rdfvalues = []; |
| for (var i = 0; i < values.length; i++) { |
| var rdfvalue = this._toRDFValue(values[i]); |
| rdfvalues.push(rdfvalue); |
| } |
| rdfattributes[attr] = rdfvalues; |
| } |
| changes[key] = rdfattributes; |
| } |
| var oldRegistry = dojo.json.jsonRegistry; |
| dojo.json.jsonRegistry = this._jsonRegistry; |
| var jsonString = dojo.json.serialize(changes); |
| dojo.json.jsonRegistry = oldRegistry; |
| requestKw.content = {rdfFormat:"json", resource:resources, metadata:jsonString}; |
| }}); |
| |