if(typeof(JS_LIB_LOADED)=='boolean') { // test to make sure filesystem base class is loaded if(typeof(JS_RDFRESOURCE_LOADED)!='boolean') include(JS_LIB_PATH+'rdf/rdfResource.js'); const JS_RDFCONTAINER_LOADED = true; const JS_RDFCONTAINER_FILE = "rdfContainer.js"; function RDFContainer(aType, aPath, aParent, aDatasource) { if(aDatasource) { this._container_init(aType, aPath, aParent, aDatasource); } } RDFContainer.prototype = new RDFResource; RDFContainer.prototype._container_init = function(aType, aPath, aParent, aDatasource) { this._resource_init(aType, aPath, aParent, aDatasource); }; RDFContainer.prototype.addSeq = function(aSeq) { return this.addContainer(aSeq, "seq"); }; RDFContainer.prototype.addBag = function(aBag) { return this.addContainer(aBag, "bag"); }; RDFContainer.prototype.addAlt = function(aAlt) { return this.addContainer(aAlt, "alt"); }; RDFContainer.prototype.addContainer = function(aContainer, aType) { if(this.isValid()) { if(!aContainer || !aType) jslibError(null, "Must supply two arguments", null, JS_RDFCONTAINER_FILE+":addContainer"); var res = this.RDF.GetResource(this.subject+":"+aContainer); if( this.resource ) { this.RDFC.Init(this.dsource, this.resource ); if(aType == "bag") { this.RDFCUtils.MakeBag(this.dsource, res); } else if(aType == "alt") { this.RDFCUtils.MakeAlt(this.dsource, res); } else { this.RDFCUtils.MakeSeq(this.dsource, res); } this.RDFC.AppendElement(res); } return new RDFContainer(aType, this.subject+":"+aContainer, this.parent, this.dsource); } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":addContainer"); return null; } }; RDFContainer.prototype.getNode = function(aNode) { var rv = null; if(this.isValid()) { var res = this.RDF.GetResource(this.subject+":"+aNode); if(res) { return new RDFResource("node", this.subject+":"+aNode, this.subject, this.dsource); } } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":getNode"); return null; } }; RDFContainer.prototype.addNode = function(aNode) { if(this.isValid()) { var res = this.RDF.GetResource(this.subject+":"+aNode); this.RDFC.Init(this.dsource, this.resource); this.RDFC.AppendElement(res); return new RDFResource("node", this.subject+":"+aNode, this.subject, this.dsource); } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":addNode"); return null; } }; RDFContainer.prototype.addResource = function(aResource) { if(this.isValid()) { var res = aResource.getResource(); this.RDFC.Init(this.dsource, this.resource); this.RDFC.AppendElement(res); } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":addNode"); return null; } }; // FIXME add a getSeq("relative:path"); // RDFContainer.prototype.getSubSeqs = function() { return this.getSubResources("seq"); }; RDFContainer.prototype.getSubBags = function() { return this.getSubResources("bag"); }; RDFContainer.prototype.getSubAlts = function() { return this.getSubResources("alt"); }; RDFContainer.prototype.getSubContainers = function() { return this.getSubResources("all"); }; RDFContainer.prototype.getSubNodes = function() { return this.getSubResources("node"); }; RDFContainer.prototype.getSubResources = function(aType) { if(this.isValid()) { var list = new Array; this.RDFC.Init(this.dsource, this.resource); var elems = this.RDFC.GetElements(); while(elems.hasMoreElements()) { var elem = elems.getNext(); elem = elem.QueryInterface(Components.interfaces.nsIRDFResource); if(aType == "bag") { if(this.RDFCUtils.IsBag(this.dsource, elem)) { list.push(new RDFContainer(aType, elem.Value, this.subject, this.dsource)); } } else if(aType == "alt") { if(this.RDFCUtils.IsAlt(this.dsource, elem)) { list.push(new RDFContainer(aType, elem.Value, this.subject, this.dsource)); } } else if(aType == "seq") { if(this.RDFCUtils.IsSeq(this.dsource, elem)) { list.push(new RDFContainer(aType, elem.Value, this.subject, this.dsource)); } } else if(aType == "all") { if(this.RDFCUtils.IsContainer(this.dsource, elem)) { list.push(new RDFContainer(aType, elem.Value, this.subject, this.dsource)); } } else { if(!this.RDFCUtils.IsContainer(this.dsource, elem)) { list.push(new RDFResource(aType, elem.Value, this.subject, this.dsource)); } } } return list; } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":getSubResources"); return null; } }; RDFContainer.prototype.remove_recursive = function(aPath) { if(this.isValid()) { var res = this.RDF.GetResource(aPath); this.RDFC.Init(this.dsource, res); var elems = this.RDFC.GetElements(); while(elems.hasMoreElements()) { var elem = elems.getNext(); if(this.RDFCUtils.IsContainer(this.dsource, elem)) { this.remove_recursive(elem.QueryInterface(Components.interfaces.nsIRDFResource).Value); this.RDFC.Init(this.dsource, res); } var arcs = this.dsource.ArcLabelsOut(elem); while(arcs.hasMoreElements()) { var arc = arcs.getNext(); var targets = this.dsource.GetTargets(elem, arc, true); while (targets.hasMoreElements()) { var target = targets.getNext(); this.dsource.Unassert(elem, arc, target, true); } } this.RDFC.RemoveElement(elem, false); } this.RDFC.RemoveElement(res, false); } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":remove"); return null; } }; RDFContainer.prototype.remove = function(aDeep) { if(this.isValid()) { if(this.parent != null) { var parentres = this.RDF.GetResource(this.parent); this.RDFC.Init(this.dsource, parentres); } if(aDeep) { this.remove_recursive(this.subject); } var arcs = this.dsource.ArcLabelsOut(this.resource); while(arcs.hasMoreElements()) { var arc = arcs.getNext(); var targets = this.dsource.GetTargets(this.resource, arc, true); while (targets.hasMoreElements()) { var target = targets.getNext(); this.dsource.Unassert(this.resource, arc, target, true); } } if(this.parent != null) { this.RDFC.RemoveElement(this.resource, false); } this.setValid(false); } else { jslibError(null, "RDFContainer is no longer valid!\n", "NS_ERROR_UNEXPECTED", JS_RDFCONTAINER_FILE+":remove"); return null; } }; jslibDebug('*** load: '+JS_RDFCONTAINER_FILE+' OK'); } // END BLOCK JS_LIB_LOADED CHECK else { jslibPrint("JS_RDF library not loaded:\n" + " \tTo load use: chrome://jslib/content/jslib.js\n" + " \tThen: include('chrome://jslib/content/rdf/rdf.js');\n\n"); }