From 8ae735e5c0d8f6bf36d13b48fbecc31e44cd69b5 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sat, 7 Dec 2019 09:31:56 +0000 Subject: [PATCH] get tree structure to display, no collapsing yet --- .../java/com/muwire/webui/FileManager.java | 12 +- .../java/com/muwire/webui/FilesServlet.java | 8 +- webui/src/main/js/files.js | 113 ++++++++++++++---- webui/src/main/webapp/Files.jsp | 4 +- 4 files changed, 112 insertions(+), 25 deletions(-) diff --git a/webui/src/main/java/com/muwire/webui/FileManager.java b/webui/src/main/java/com/muwire/webui/FileManager.java index 47faa0ee..18d1a6c1 100644 --- a/webui/src/main/java/com/muwire/webui/FileManager.java +++ b/webui/src/main/java/com/muwire/webui/FileManager.java @@ -26,6 +26,7 @@ public class FileManager { private final FileTree fileTree = new FileTree<>(); private volatile String hashingFile; + private volatile long revision; public FileManager(Core core) { this.core = core; @@ -33,11 +34,13 @@ public class FileManager { public void onFileLoadedEvent(FileLoadedEvent e) { fileTree.add(e.getLoadedFile().getFile(), e.getLoadedFile()); + revision++; } public void onFileHashedEvent(FileHashedEvent e) { hashingFile = null; fileTree.add(e.getSharedFile().getFile(), e.getSharedFile()); + revision++; } public void onFileHashingEvent(FileHashingEvent e) { @@ -45,8 +48,10 @@ public class FileManager { } public void onFileDownloadedEvent(FileDownloadedEvent e) { - if (core.getMuOptions().getShareDownloadedFiles()) + if (core.getMuOptions().getShareDownloadedFiles()) { fileTree.add(e.getDownloadedFile().getFile(), e.getDownloadedFile()); + revision++; + } } void list(File parent, FileListCallback callback) { @@ -61,6 +66,10 @@ public class FileManager { return core.getFileManager().getFileToSharedFile().size(); } + long getRevision() { + return revision; + } + void share(String filePath) { File file = new File(filePath); FileSharedEvent event = new FileSharedEvent(); @@ -84,6 +93,7 @@ public class FileManager { return; fileTree.remove(file); + revision++; FileUnsharedEvent event = new FileUnsharedEvent(); event.setUnsharedFile(sf); core.getEventBus().publish(event); diff --git a/webui/src/main/java/com/muwire/webui/FilesServlet.java b/webui/src/main/java/com/muwire/webui/FilesServlet.java index fcc6c45e..b824da18 100644 --- a/webui/src/main/java/com/muwire/webui/FilesServlet.java +++ b/webui/src/main/java/com/muwire/webui/FilesServlet.java @@ -31,16 +31,19 @@ public class FilesServlet extends HttpServlet { if (section.equals("status")) { sb.append(""); sb.append("").append(fileManager.numSharedFiles()).append(""); + sb.append("").append(fileManager.getRevision()).append(""); String hashingFile = fileManager.getHashingFile(); if (hashingFile != null) sb.append("").append(Util.escapeHTMLinXML(hashingFile)).append(""); sb.append(""); } else if (section.equals("files")) { sb.append(""); + sb.append("").append(fileManager.getRevision()).append(""); + ListCallback cb = new ListCallback(sb); String encodedPath = req.getParameter("path"); File current = null; - if (encodedPath != null) { + if (encodedPath != null && encodedPath.length() > 0) { String[] split = DataHelper.split(encodedPath, ","); for (String element : split) { element = Base64.decodeToString(element); @@ -88,7 +91,8 @@ public class FilesServlet extends HttpServlet { } @Override public void onDirectory(File f) { - sb.append("").append(Util.escapeHTMLinXML(f.getName())).append(""); + String name = f.getName().isEmpty() ? f.toString() : f.getName(); + sb.append("").append(Util.escapeHTMLinXML(name)).append(""); } } diff --git a/webui/src/main/js/files.js b/webui/src/main/js/files.js index fb986af9..b463cf57 100644 --- a/webui/src/main/js/files.js +++ b/webui/src/main/js/files.js @@ -1,4 +1,38 @@ +class Node { + constructor(nodeId, parent, leaf, path, size, revision) { + this.nodeId = nodeId + this.parent = parent + this.leaf = leaf + this.children = [] + this.path = path + this.size = size + this.revision = revision + } + + updateDiv() { + var div = document.getElementById(this.nodeId) + if (this.leaf) { + div.innerHTML = "
  • "+this.path+"
  • " + } else { + if (this.children.length == 0) { + div.innerHTML = "
  • " + + this.path + "
  • " + } else { + var l = "
  • Collapse "+this.path+"
      " + var i + for (i = 0; i < this.children.length; i++) { + l += "
    • " + l += "
      " + l += "
    • " + } + l += "
  • " + div.innerHTML = l + } + } + } +} + /** * * Base64 encode / decode @@ -141,11 +175,6 @@ _utf8_decode : function (utftext) { } -function initFiles() { - setInterval(refreshStatus, 3000) - setTimeout(refreshStatus, 1) -} - function refreshStatus() { var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { @@ -162,32 +191,74 @@ function refreshStatus() { hashingSpan.innerHTML = "Hashing "+hashing[0].childNodes[0].nodeValue } else hashingSpan.innerHTML = ""; + + var newRevision = xmlDoc.getElementsByTagName("Revision")[0].childNodes[0].nodeValue + if (newRevision > treeRevision) { + // TODO: update expanded nodes + treeRevision = newRevision + } } } xmlhttp.open("GET", "/MuWire/Files?section=status", true) xmlhttp.send(); } -var root = new Node("sharedTree",null,false) +var treeRevision = -1 +var root = new Node("root",null,false,"Shared Files", -1, -1) var nodesById = new Map() -class Node { - constructor(nodeId, parent, leaf, path) { - this.nodeId = nodeId - this.parent = parent - this.leaf = leaf - this.children = [] - this.path = path - } +function initFiles() { + setInterval(refreshStatus, 3000) + setTimeout(refreshStatus, 1) - function updateDiv() { - var div = document.getElementById(this.nodeId) - if (this.leaf) { - div.innerHTML = "
  • "+this.path+
  • - } else { - if (children.length == 0) { - div.innerHTML = "
  • " + this.path + "
  • " + nodesById.set("root",root) + root.updateDiv() +} + +function expand(nodeId) { + var node = nodesById.get(nodeId) + var pathElements = [] + var tmpNode = node + while(tmpNode.parent != null) { + pathElements.push(Base64.encode(tmpNode.path)) + tmpNode = tmpNode.parent + } + var reversedPath = [] + while(pathElements.length > 0) + reversedPath.push(pathElements.pop()) + var encodedPath = reversedPath.join(",") + + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var xmlDoc = this.responseXML + var revision = xmlDoc.getElementsByTagName("Revision")[0].childNodes[0].nodeValue + var fileElements = xmlDoc.getElementsByTagName("File") + var i + for (i = 0; i < fileElements.length; i++) { + var fileName = fileElements[i].getElementsByTagName("Name")[0].childNodes[0].nodeValue + var size = fileElements[i].getElementsByTagName("Size")[0].childNodes[0].nodeValue + var nodeId = node.nodeId + "_"+ fileName + var newFileNode = new Node(nodeId, node, true, fileName, size, revision) + nodesById.set(nodeId, newFileNode) + node.children.push(newFileNode) + } + + var dirElements = xmlDoc.getElementsByTagName("Directory") + for (i = 0; i < dirElements.length; i++) { + var dirName = dirElements[i].childNodes[0].nodeValue + var nodeId = node.nodeId + "_"+ dirName + var newDirNode = new Node(nodeId, node, false, dirName, -1, revision) + nodesById.set(nodeId, newDirNode) + node.children.push(newDirNode) + } + + node.updateDiv() + for (i = 0; i < node.children.length; i++) { + node.children[i].updateDiv() } } } + xmlhttp.open("GET", "/MuWire/Files?section=files&path="+encodedPath, true) + xmlhttp.send() } diff --git a/webui/src/main/webapp/Files.jsp b/webui/src/main/webapp/Files.jsp index 2598a397..55e72aea 100644 --- a/webui/src/main/webapp/Files.jsp +++ b/webui/src/main/webapp/Files.jsp @@ -14,7 +14,9 @@

    Shared Files 0


    -
    +
      +
      +