Skip to content
Snippets Groups Projects
loaddir.ts 6.04 KiB
Newer Older
//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);    
}