if (typeof(JS_LIB_LOADED)=='boolean') { const JS_INMEMORYRDF_LOADED = true; const JS_INMEMORYRDF_FILE = "inMemoryRDF.js"; const JSLIB_INMEM_CONTAINER_PROGID = '@mozilla.org/rdf/container;1'; const JSLIB_INMEM_CONTAINER_UTILS_PROGID = '@mozilla.org/rdf/container-utils;1'; const JSLIB_INMEM_RDF_PROGID = '@mozilla.org/rdf/rdf-service;1'; const JSLIB_INMEM_RDF_MEM_PROGID = '@mozilla.org/rdf/datasource;1?name=in-memory-datasource'; const JSLIB_INMEM_TYPE_BAG = 1; const JSLIB_INMEM_TYPE_ALT = 2; const JSLIB_INMEM_TYPE_SEQ = 3; const JSLIB_INMEM_TYPE_NODE = 4; function inMemRDF(root, xmlns) { this.RDF = jslibGetService(JSLIB_INMEM_RDF_PROGID, "nsIRDFService"); this.RDFC = jslibGetService(JSLIB_INMEM_CONTAINER_PROGID, "nsIRDFContainer"); this.RDFCUtils = jslibGetService(JSLIB_INMEM_CONTAINER_UTILS_PROGID, "nsIRDFContainerUtils"); this.init(root,xmlns); } inMemRDF.prototype = { root : null, // (public) xmlns : null, // (public) 'list' is appended to this value to make the top container RDF : null, // (private) RDFC : null, // (private) RDFCUtils : null, // (private) dsource : null, // (private) debug : 0, // (private) see setDebug // ----------------------------------------------------------------------------------------- init : function (root,xmlns) { this.root = root; this.xmlns = xmlns; // Create an the in-memory XPconnect object. // when this statement is 'createInstance', the 'Delete' method fails. //this.dsource = jslibCreateInstance(JSLIB_INMEM_RDF_MEM_PROGID, "nsIRDFDataSource"); this.dsource = jslibGetService(JSLIB_INMEM_RDF_MEM_PROGID, "nsIRDFDataSource"); this.dsource.Assert( this.RDF.GetResource(this.root), this.RDF.GetResource(this.xmlns+'list'), this.RDF.GetResource(this.root+":seq"), true); this.RDFCUtils.MakeSeq(this.dsource, this.RDF.GetResource(this.root+":seq")); this.RDFC.Init(this.dsource,this.RDF.GetResource(this.root+":seq")); }, // ----------------------------------------------------------------------------------------- addSeq : function (aSeq) { this._debug('addSeq: START. aSeq='+aSeq); var realnode = this._getRealNode(aSeq); var err = null; if (!realnode) err = "inmemoryrdf.js: addSeq: must supply a value for 'aSeq'"; if (realnode == this.root || realnode == this.root+':seq') err="inmemoryrdf.js: addSeq: cannot create a sequence the same name as the root sequence."; if (realnode.lastIndexOf(":") == (realnode.length-1) ) err="inmemoryrdf.js: addSeq: sequence names cannot end in ':'"; if (!err) { var res = this.RDF.GetResource(realnode); var pos = realnode.lastIndexOf(":"); var parent = realnode.slice(0, pos); var parentres = this.RDF.GetResource(parent); this._debug("addSeq: aSeq='"+aSeq+"' realnode='"+realnode+"' parent='"+parent+"'"); if (parentres) { this.RDFCUtils.MakeSeq(this.dsource, res); if ( parent != this.root ) this.RDFC.Init(this.dsource, parentres); this.RDFC.AppendElement(res); } } this._debug('addSeq: DONE. ---------------------------------------------'); if (err)throw(err); return(realnode); }, // ----------------------------------------------------------------------------------------- removeSeq : function (aSeq, deep) { if (aSeq == this.root) throw("Cannot remove root Seq"); this._debug('removeSeq: START. aSeq='+aSeq+' deep='+deep); var realnode = this._getRealNode(aSeq); var res = this.RDF.GetResource(realnode); var err = null; if (this.RDFCUtils.IsSeq(this.dsource, res)) { if (deep) { this._deleteRecursive(res); } this.removeNode(aSeq); } else { this._debug('removeSeq: cannot remove aSeq='+aSeq+', it is a node!'); err = "inmemoryrdf.js: removeSeq: Trying to remove a Seq: '"+aSeq+"', when it's a node is an error."; } this._debug('removeSeq: DONE. ---------------------------------------------'); if (err)throw(err); }, // ----------------------------------------------------------------------------------------- isSeq : function (aSeq) { this._debug('isSeq: START. aSeq='+aSeq); var realnode = this._getRealNode(aSeq); var res = this.RDF.GetResource(realnode); var result=false; if (res && this.RDFCUtils.IsSeq(this.dsource, res)) result=true; this._debug('isSeq: result is: '+result); this._debug('isSeq: DONE. ---------------------------------------------'); }, // ----------------------------------------------------------------------------------------- getSeqSubNodes : function (aSeq) { this._debug('getSeqSubNodes: START. aSeq='+aSeq); var realnode = this._getRealNode(aSeq); var list = new Array; var res = this.RDF.GetResource(realnode); if ( aSeq != this.root ) this.RDFC.Init(this.dsource, res); this._debug('getSeqSubNodes: realnode='+realnode); var elems = this.RDFC.GetElements(); while (elems.hasMoreElements()) { var elem = elems.getNext(); elem = jslibQI(elem, "nsIRDFResource"); if (!this.RDFCUtils.IsSeq(this.dsource, elem)) { list.push(elem.Value); } } this._debug('getSeqSubNodes: list contains ' + list.length + ' elements'); if ( this.debug > 1 ) { for (var i=0;i 1 ) { for (var i=0;i 1 ) { for (var i=0;i 1 ) { for (var i=0;i