Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
//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);
}