Skip to content
Snippets Groups Projects
loaddir.ts 6.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • //funzione che definisce tutti gli elementi responsabili dell'apertura di un file.
    //Sono definiti quindi l'albero e il bottone per l'importazione da locale
    function setImportFile(){
    
      //genero e leggo il contenuto della directory "filesystem"
      var xmlDoc: any;
      var xmlListingFile: any = new XMLHttpRequest();
      xmlListingFile.open("PROPFIND", "CHNET/", false);
      xmlListingFile.setRequestHeader("Depth", "infinity");
      xmlListingFile.onreadystatechange = function(){
        if(xmlListingFile.readyState === 4){
          if(xmlListingFile.status === 207){
            var parser: any = new DOMParser();
            xmlDoc = parser.parseFromString(xmlListingFile.responseText, "text/xml");
          }
        }
      }
      xmlListingFile.send(null);
      
    
      //ora genero l'albero e definisco l'evento in caso di selezione di un nodo
      $('#FileTreeview').treeview({data: generateTree(xmlDoc)});
      $('#FileTreeview').on('nodeSelected', function(e, node){
        if(node['url'] != undefined){
          $("#load-spinner").css("display", "inline");
          openFileFromServer(node['url']);
        }
      });
    
      //bottone per l'importazione locale
      var fileInputButton: any = document.getElementById('myImport'); 
      fileInputButton.onchange = function(){
        $("#load-spinner").css("display", "inline");
        var fileName: string = fileInputButton.files[0];
        var readerObject: any = new FileReader();
        readerObject.readAsBinaryString(fileName);  
        readerObject.onload = function() {
          var fileString: string = readerObject.result; 
          readData(fileString);
        }
      }
    
    }
    
    //funzione che genera automaticamente l'albero
    function generateTree(xmlDoc){
    
      var tree: any = [];
      var first: boolean = true;
      var oldFolderParent: string = "";
      var oldFolder: string = "";
    
      //inizio leggendo tutti gli elementi da inserire nell'albero (caratterizzati
      //dall'avere un url di riferimento)
      var entry: string[] = xmlDoc.getElementsByTagName("D:href");
      
      //per ogni elemento controllo se si tratta di una cartella o di un documento
      for (var i:number = 0; i < entry.length; i++) {
        var path: string[] = entry[i].childNodes[0].nodeValue.split("");
    
        //cartella, creo l'oggetto corrsipondente
        if (path[path.length-1] == "/") { 
          var folderName: string[] = entry[i].childNodes[0].nodeValue.split("/");
          var Folder = {
            text: folderName[folderName.length-2],
            nodes: []
          }
    
          //posiziono la radice del file system, ne memorizzo il path e il padre
          if (first) {
            tree.push(Folder);
            first=false;
            oldFolder = entry[i].childNodes[0].nodeValue;
            oldFolderParent =
              oldFolder.slice(0, oldFolder.lastIndexOf(folderName[folderName.length-2]));
            
          //per ogni cartella determino la relazione con la cartella precedente  
          } else {
            var newFolder: string = entry[i].childNodes[0].nodeValue;
            var newFolderParent: string =
              newFolder.slice(0, newFolder.lastIndexOf(folderName[folderName.length-2]));
    
            //cartella sorella con quella memorizzata
            if(newFolderParent == oldFolderParent){
              oldFolder = newFolder;
              insertOBJinFS(Folder, tree, folderName, 0);
            //cartella figlia di quella memorizzata 
            } else if(newFolderParent == oldFolder){
              oldFolder = newFolder;
              oldFolderParent = newFolderParent;
              insertOBJinFS(Folder, tree, folderName, 0);
            //nessuno dei casi precedenti
            } else { 
              //arretro nell'albero fino a trovare lo stesso padre. Per fare questo
              //tolgo al padre memorizzato in precedenza prima "/" poi il nome dell'
              //ultima cartella
              while(newFolderParent != oldFolderParent){
                oldFolderParent = oldFolderParent.slice(0, oldFolderParent.length-1);
                oldFolderParent = oldFolderParent.slice(0, (oldFolderParent.lastIndexOf("/")+1));
              }
              oldFolder = newFolder;
              insertOBJinFS(Folder, tree, folderName, 0);
            }
          }
    
        //documento, creo l'oggetto corrispondente e lo inserisco nell'albero
        } else {
          var fileName: string[] = entry[i].childNodes[0].nodeValue.split("/");
          var filePath: string = entry[i].childNodes[0].nodeValue;
          var File = {
            text: fileName[fileName.length-1],
            icon: "glyphicon glyphicon-file",
            selectedIcon: "glyphicon glyphicon-file",
            url: filePath
          }
          insertOBJinFS(File, tree, fileName, 1);
        }
      }
      return tree;
    
    }
    
    //funzione che posiziona l'oggetto passato in input nell'albero
    function insertOBJinFS(objfs, tree, objfsName, type){
    
      //determino la profondità dell'oggetto (se è un file devo aggiungere 1 a causa di "/")
      var depth: number = objfsName.length;
      if(type) depth++;
    
      //in base alla profondità determino a quale oggetto agganciare quello in input
      var treePosition: any;
      var l: number = tree.length-1;
      switch(depth){
        case 6: treePosition = tree; break;
        case 7: treePosition = tree[l].nodes; break;
        case 8: treePosition =
          tree[l].nodes[tree[l].nodes.length-1].nodes; break;
        case 9: treePosition = 
          tree[l].nodes[tree[l].nodes.length-1].nodes[tree[l].nodes[tree[l].nodes.length-1].nodes.length-1].nodes;
        break;
        case 10: treePosition = 
          tree[l].nodes[tree[l].nodes.length-1].nodes[tree[l].nodes[tree[l].nodes.length-1].nodes.length-1].nodes[tree[l].nodes[tree[l].nodes.length-1].nodes[tree[l].nodes[tree[l].nodes.length-1].nodes.length-1].nodes.length-1].nodes;
        break;
        default: break;
      }
      treePosition[treePosition.length-1].nodes.push(objfs);
    
    }
    
    //funzione che dato l'url di un file, lo apre e lo legge passandone il contenuto
    //alla funzione readData(). Questa funzione è invocata quando viene selezionato
    //un file dall'albero
    function openFileFromServer(url){
    
      var fileName: string[] = url.split("/");
      console.log("Try to open " + fileName[fileName.length-1] + " ...");
      var txtFile: any = new XMLHttpRequest();
      txtFile.open("GET", url, true);
      txtFile.onreadystatechange = function(){
        if(txtFile.readyState === 4){
          if(txtFile.status === 200){
            readData((txtFile.responseText));
          }
        }
      }
      txtFile.send(null);    
    }