home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 August / PCpro_2005_08.ISO / files / firefox / ScrapBook.xpi / chrome / scrapbook.jar / content / datasource.js < prev    next >
Encoding:
JavaScript  |  2005-06-04  |  8.0 KB  |  286 lines

  1. /**************************************************
  2. // datasource.js
  3. // Implementation file for RDF DataSource
  4. // 
  5. // Description: Handles the data and tree structure
  6. // Author: Gomita
  7. // Contributors: 
  8. // 
  9. // Version: 
  10. // License: see LICENSE.txt
  11. **************************************************/
  12.  
  13.  
  14. var SBRDF = {
  15.  
  16.  
  17.     data : null,
  18.     file : null,
  19.  
  20.  
  21.  
  22.     init : function()
  23.     {
  24.         try {
  25.             this.file = SBcommon.getScrapBookDir().clone();
  26.             this.file.append("scrapbook.rdf");
  27.             if ( !this.file.exists() )
  28.             {
  29.                 this.file.create(this.file.NORMAL_FILE_TYPE, 0666);
  30.                 var myPath = SBservice.IO.newFileURI(this.file).spec;
  31.                 this.data = SBservice.RDF.GetDataSourceBlocking(myPath);
  32.                 this.createEmptySeq("urn:scrapbook:root");
  33.                 this.flush();
  34.             }
  35.             else
  36.             {
  37.                 this.backup(8);
  38.                 var myPath = SBservice.IO.newFileURI(this.file).spec;
  39.                 this.data = SBservice.RDF.GetDataSourceBlocking(myPath);
  40.             }
  41.         }
  42.         catch(ex) {
  43.             alert("ScrapBook ERROR: Failed to initialize datasource.\n\n" + ex);
  44.         }
  45.     },
  46.  
  47.     backup : function(offset)
  48.     {
  49.         var myDir = SBcommon.getScrapBookDir().clone();
  50.         myDir.append("backup");
  51.         if ( !myDir.exists() ) myDir.create(myDir.DIRECTORY_TYPE, 0700);
  52.         var backupFileName = "scrapbook_" + SBcommon.getTimeStamp().substring(0,offset) + ".rdf";
  53.         try {
  54.             this.file.copyTo(myDir, backupFileName);
  55.         } catch(ex) {
  56.         }
  57.     },
  58.  
  59.     flush : function()
  60.     {
  61.         this.data.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  62.     },
  63.  
  64.     unregister : function()
  65.     {
  66.         SBservice.RDF.UnregisterDataSource(this.data);
  67.     },
  68.  
  69.  
  70.  
  71.     sanitize : function(aVal)
  72.     {
  73.         return aVal.match(/^(<|>|&)/) ? (" " + aVal) : aVal;
  74.     },
  75.  
  76.     addItem : function(aSBitem, aParName, aIdx)
  77.     {
  78.         aSBitem.title   = this.sanitize(aSBitem.title);
  79.         aSBitem.comment = this.sanitize(aSBitem.comment);
  80.         aSBitem.icon    = this.sanitize(aSBitem.icon);
  81.         aSBitem.source  = this.sanitize(aSBitem.source);
  82.         try {
  83.             SBservice.RDFC.Init(this.data, SBservice.RDF.GetResource(aParName));
  84.         } catch(ex) {
  85.             if ( aParName != "urn:scrapbook:root" ) {
  86.                 this.addItem(aSBitem, "urn:scrapbook:root", 0);
  87.             } else {
  88.                 alert("ScrapBook ERROR: Failed to initialize root container.\n\n" + ex);
  89.                 return false;
  90.             }
  91.         }
  92.         try {
  93.             var newRes = SBservice.RDF.GetResource("urn:scrapbook:item" + aSBitem.id);
  94.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "id"),      SBservice.RDF.GetLiteral(aSBitem.id),      true);
  95.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "type"),    SBservice.RDF.GetLiteral(aSBitem.type),    true);
  96.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "title"),   SBservice.RDF.GetLiteral(aSBitem.title),   true);
  97.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "chars"),   SBservice.RDF.GetLiteral(aSBitem.chars),   true);
  98.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "comment"), SBservice.RDF.GetLiteral(aSBitem.comment), true);
  99.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "icon"),    SBservice.RDF.GetLiteral(aSBitem.icon),    true);
  100.             this.data.Assert(newRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "source"),  SBservice.RDF.GetLiteral(aSBitem.source),  true);
  101.             if ( aIdx > 0 ) {
  102.                 SBservice.RDFC.InsertElementAt(newRes, aIdx, true);
  103.             } else {
  104.                 SBservice.RDFC.AppendElement(newRes);
  105.             }
  106.             this.flush();
  107.             return newRes;
  108.         }
  109.         catch(ex) {
  110.             alert("ScrapBook ERROR: Failed to add element to datasource.\n\n" + ex);
  111.             return false;
  112.         }
  113.     },
  114.  
  115.     moveItem : function(curRes, curPar, tarPar, tarRelIdx)
  116.     {
  117.         try {
  118.             SBservice.RDFC.Init(this.data, curPar);
  119.             SBservice.RDFC.RemoveElement(curRes, true);
  120.         } catch(ex) {
  121.             alert("ScrapBook ERROR: Failed to move element at datasource (1).\n\n" + ex);
  122.             return;
  123.         }
  124.         try {
  125.             SBservice.RDFC.Init(this.data, tarPar);
  126.             if ( tarRelIdx > 0 ) {
  127.                 SBservice.RDFC.InsertElementAt(curRes, tarRelIdx, true);
  128.             } else {
  129.                 SBservice.RDFC.AppendElement(curRes);
  130.             }
  131.         }
  132.         catch(ex) {
  133.             alert("ScrapBook ERROR: Failed to move element at datasource (2).\n\n" + ex);
  134.             SBservice.RDFC.Init(this.data, SBservice.RDF.GetResource("urn:scrapbook:root"));
  135.             SBservice.RDFC.AppendElement(curRes, true);
  136.         }
  137.     },
  138.  
  139.     updateItem : function(aRes, aProp, newVal)
  140.     {
  141.         newVal = this.sanitize(newVal);
  142.         try {
  143.             aProp = SBservice.RDF.GetResource(NS_SCRAPBOOK + aProp);
  144.             var oldVal = this.data.GetTarget(aRes, aProp, true);
  145.             oldVal = oldVal.QueryInterface(Components.interfaces.nsIRDFLiteral);
  146.             newVal = SBservice.RDF.GetLiteral(newVal);
  147.             this.data.Change(aRes, aProp, oldVal, newVal);
  148.         }
  149.         catch(ex) {
  150.             alert("ScrapBook ERROR: Failed to update element of datasource.\n" + ex);
  151.         }
  152.     },
  153.  
  154.     createEmptySeq : function(aResName)
  155.     {
  156.         SBservice.RDFCU.MakeSeq(this.data, SBservice.RDF.GetResource(aResName));
  157.     },
  158.  
  159.     deleteItemDescending : function(aRes, aParRes)
  160.     {
  161.         SBservice.RDFC.Init(this.data, aParRes);
  162.         SBservice.RDFC.RemoveElement(aRes, true);
  163.         var rmIDs = addIDs = [];
  164.         var depth = 0;
  165.         do {
  166.             addIDs = this.cleanUpIsolation();
  167.             rmIDs = rmIDs.concat(addIDs);
  168.         }
  169.         while( addIDs.length > 0 && ++depth < 100 );
  170.         return rmIDs;
  171.     },
  172.  
  173.     cleanUpIsolation : function()
  174.     {
  175.         var rmIDs = [];
  176.         try {
  177.             var ResList = this.data.GetAllResources();
  178.             while ( ResList.hasMoreElements() )
  179.             {
  180.                 var aRes = ResList.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  181.                 if ( aRes.Value != "urn:scrapbook:root" && aRes.Value != "urn:scrapbook:search" && !this.data.ArcLabelsIn(aRes).hasMoreElements() )
  182.                 {
  183.                     rmIDs.push( this.removeResource(aRes) );
  184.                 }
  185.             }
  186.         }
  187.         catch(ex) {
  188.             alert("ScrapBook ERROR: Failed to clean up datasource.\n" + ex);
  189.         }
  190.         return rmIDs;
  191.     },
  192.  
  193.     removeResource : function(aRes)
  194.     {
  195.         var names = this.data.ArcLabelsOut(aRes);
  196.         var rmID = this.getProperty("id", aRes);
  197.         while ( names.hasMoreElements() )
  198.         {
  199.             try {
  200.                 var name  = names.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  201.                 var value = this.data.GetTarget(aRes, name, true);
  202.                 this.data.Unassert(aRes, name, value);
  203.             }
  204.             catch(ex) {
  205.             }
  206.         }
  207.         return rmID;
  208.     },
  209.  
  210.  
  211.  
  212.     getContainer : function(aResID, force)
  213.     {
  214.         var aCont = Components.classes['@mozilla.org/rdf/container;1'].createInstance(Components.interfaces.nsIRDFContainer);
  215.         try {
  216.             aCont.Init(this.data, SBservice.RDF.GetResource(aResID));
  217.         } catch(ex) {
  218.             return force ? SBservice.RDFCU.MakeSeq(this.data, SBservice.RDF.GetResource(aResID)) : null;
  219.         }
  220.         return aCont;
  221.     },
  222.  
  223.     clearContainer : function(aResID)
  224.     {
  225.         var aCont = this.getContainer(aResID, true);
  226.         while( aCont.GetCount() )
  227.         {
  228.             aCont.RemoveElementAt(1, true);
  229.         }
  230.     },
  231.  
  232.     removeElementFromContainer : function(aResID, aRes)
  233.     {
  234.         var aCont = this.getContainer(aResID, true);
  235.         aCont.RemoveElement(aRes, true);
  236.     },
  237.  
  238.  
  239.  
  240.     getProperty : function(aProp, aRes)
  241.     {
  242.         if ( aRes.Value == "urn:scrapbook:root" ) return "";
  243.         try {
  244.             var retVal = this.data.GetTarget(aRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + aProp), true);
  245.             return retVal.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  246.         }
  247.         catch(ex) {
  248.             return "";
  249.         }
  250.     },
  251.  
  252.     identify : function(aID)
  253.     {
  254.         var i = 0;
  255.         while ( this.getProperty("id", SBservice.RDF.GetResource("urn:scrapbook:item" + aID)) && i < 100 )
  256.         {
  257.             aID = SBcommon.getTimeStamp(--i);
  258.             dump("*** ScrapBook IDENTIFY RESOURCE ID [" + i + "] " + aID + "\n");
  259.         }
  260.         return aID;
  261.     },
  262.  
  263.     getRelativeIndex : function(aParRes, aRes)
  264.     {
  265.         return SBservice.RDFCU.indexOf(this.data, aParRes, aRes);
  266.     },
  267.  
  268.     findContainerRes : function(aRes)
  269.     {
  270.         var ResList = this.data.GetAllResources();
  271.         while ( ResList.hasMoreElements() )
  272.         {
  273.             var myRes = ResList.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  274.             if ( SBservice.RDFCU.IsContainer(this.data, myRes) == false ) continue;
  275.             if ( myRes.Value == "urn:scrapbook:search" ) continue;
  276.             if ( SBservice.RDFCU.indexOf(this.data, myRes, aRes) != -1 )
  277.             {
  278.                 return myRes;
  279.             }
  280.         }
  281.     },
  282.  
  283. };
  284.  
  285.  
  286.