From 2fd0a3833f17da30a34a42669ccc2cf43d7798ed Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 27 Mar 2020 11:10:25 +0000 Subject: [PATCH] wip on web ui for advanced sharing --- .../WatchedDirectoryManager.groovy | 5 + webui/src/main/css/i2pbote.css | 3 + .../muwire/webui/AdvancedSharingManager.java | 48 ++++++ .../muwire/webui/AdvancedSharingServlet.java | 142 ++++++++++++++++++ .../java/com/muwire/webui/MuWireClient.java | 6 + webui/src/main/js/advancedSharing.js | 3 + webui/src/main/webapp/AdvancedSharing.jsp | 35 +++++ webui/src/main/webapp/sidebar.jsi | 4 + webui/templates/web.xml.template | 15 ++ 9 files changed, 261 insertions(+) create mode 100644 webui/src/main/java/com/muwire/webui/AdvancedSharingManager.java create mode 100644 webui/src/main/java/com/muwire/webui/AdvancedSharingServlet.java create mode 100644 webui/src/main/js/advancedSharing.js create mode 100644 webui/src/main/webapp/AdvancedSharing.jsp diff --git a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy index 6b10864a..67beea02 100644 --- a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy +++ b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy @@ -5,6 +5,7 @@ import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.ThreadFactory +import java.util.stream.Stream import com.muwire.core.EventBus import com.muwire.core.SharedFile @@ -49,6 +50,10 @@ class WatchedDirectoryManager { watchedDirs.containsKey(f) } + public Stream getWatchedDirs() { + watchedDirs.values().stream() + } + public void shutdown() { diskIO.shutdown() timer.cancel() diff --git a/webui/src/main/css/i2pbote.css b/webui/src/main/css/i2pbote.css index 4ec45951..ce5d443c 100644 --- a/webui/src/main/css/i2pbote.css +++ b/webui/src/main/css/i2pbote.css @@ -327,6 +327,9 @@ See also .menu-icon .menuitem.settings .menu-icon:before { content: url("images/ConfigurationPage.png"); } +.menuitem.advancedSharing .menu-icon:before { + content: url("images/AdvancedSharing.png"); +} .menuitem.downloads .menu-icon:before { content: url("images/Downloads.png"); } diff --git a/webui/src/main/java/com/muwire/webui/AdvancedSharingManager.java b/webui/src/main/java/com/muwire/webui/AdvancedSharingManager.java new file mode 100644 index 00000000..ee4fd941 --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/AdvancedSharingManager.java @@ -0,0 +1,48 @@ +package com.muwire.webui; + +import java.io.File; + +import com.muwire.core.Core; +import com.muwire.core.files.DirectoryUnsharedEvent; +import com.muwire.core.files.DirectoryWatchedEvent; +import com.muwire.core.files.directories.UISyncDirectoryEvent; +import com.muwire.core.files.directories.WatchedDirectoryConfigurationEvent; + +public class AdvancedSharingManager { + + private final Core core; + private volatile long revision; + + public AdvancedSharingManager(Core core) { + this.core = core; + } + + public long getRevision() { + return revision; + } + + public void onDirectoryWatchedEvent(DirectoryWatchedEvent e) { + revision++; + } + + public void onDirectoryUnsharedEvent(DirectoryUnsharedEvent e) { + revision++; + } + + + void sync(File dir) { + revision++; + UISyncDirectoryEvent event = new UISyncDirectoryEvent(); + event.setDirectory(dir); + core.getEventBus().publish(event); + } + + void configure(File dir, boolean autoWatch, int syncInterval) { + revision++; + WatchedDirectoryConfigurationEvent event = new WatchedDirectoryConfigurationEvent(); + event.setAutoWatch(autoWatch); + event.setDirectory(dir); + event.setSyncInterval(syncInterval); + core.getEventBus().publish(event); + } +} diff --git a/webui/src/main/java/com/muwire/webui/AdvancedSharingServlet.java b/webui/src/main/java/com/muwire/webui/AdvancedSharingServlet.java new file mode 100644 index 00000000..55a6e36c --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/AdvancedSharingServlet.java @@ -0,0 +1,142 @@ +package com.muwire.webui; + +import java.io.File; +import java.io.IOException; +import java.text.Collator; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.muwire.core.Core; +import com.muwire.core.files.directories.WatchedDirectory; + +import net.i2p.data.DataHelper; + +public class AdvancedSharingServlet extends HttpServlet { + + private Core core; + private AdvancedSharingManager advancedSharingManager; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String section = req.getParameter("section"); + if (section == null) { + resp.sendError(403, "Bad section param"); + return; + } + + StringBuilder sb = new StringBuilder(); + sb.append(""); + + if (section.equals("revision")) { + sb.append("").append(advancedSharingManager.getRevision()).append(""); + } else if (section.equals("dirs")) { + List dirs = core.getWatchedDirectoryManager().getWatchedDirs(). + map(WrappedDir::new). + collect(Collectors.toList()); + DIR_COMPARATORS.sort(dirs, req); + + sb.append(""); + dirs.forEach(d -> d.toXML(sb)); + sb.append(""); + } else { + resp.sendError(403, "Bad section param"); + return; + } + + resp.setContentType("text/xml"); + resp.setCharacterEncoding("UTF-8"); + resp.setDateHeader("Expires", 0); + resp.setHeader("Pragma", "no-cache"); + resp.setHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); + byte[] out = sb.toString().getBytes("UTF-8"); + resp.setContentLength(out.length); + resp.getOutputStream().write(out); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String action = req.getParameter("action"); + if (action == null) { + resp.sendError(403,"Bad param"); + return; + } + String path = req.getParameter("path"); + if (path == null) { + resp.sendError(403, "Bad param"); + return; + } + + File dir = Util.getFromPathElements(path); + + if (action.equals("sync")) { + advancedSharingManager.sync(dir); + Util.pause(); + } else if (action.equals("configure")) { + boolean autoWatch = Boolean.parseBoolean(req.getParameter("autoWatch")); + int syncInterval = Integer.parseInt(req.getParameter("syncInterval")); + advancedSharingManager.configure(dir, autoWatch, syncInterval); + Util.pause(); + resp.sendRedirect("/MuWire/AdvancedSharing"); + } + } + + @Override + public void init(ServletConfig config) throws ServletException { + core = (Core) config.getServletContext().getAttribute("core"); + advancedSharingManager = (AdvancedSharingManager) config.getServletContext().getAttribute("advancedSharingManager"); + } + + private static class WrappedDir { + private final String directory; + private final boolean autoWatch; + private final long lastSync; + private final int syncInterval; + + WrappedDir(WatchedDirectory wd) { + this.directory = wd.getDirectory().getAbsolutePath(); + this.autoWatch = wd.getAutoWatch(); + this.lastSync = wd.getLastSync(); + this.syncInterval = wd.getSyncInterval(); + } + + void toXML(StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(directory)).append(""); + sb.append("").append(autoWatch).append(""); + sb.append("").append(DataHelper.formatTime(lastSync)).append(""); + sb.append("").append(syncInterval).append(""); + sb.append(""); + } + } + + private static final Comparator BY_DIRECTORY = (l, r) -> { + return Collator.getInstance().compare(l.directory, r.directory); + }; + + private static final Comparator BY_AUTOWATCH = (l, r) -> { + return Boolean.compare(l.autoWatch, r.autoWatch); + }; + + private static final Comparator BY_LAST_SYNC = (l, r) -> { + return Long.compare(l.lastSync, r.lastSync); + }; + + private static final Comparator BY_SYNC_INTERVAL = (l, r) -> { + return Integer.compare(l.syncInterval, r.syncInterval); + }; + + private static final ColumnComparators DIR_COMPARATORS = new ColumnComparators<>(); + static { + DIR_COMPARATORS.add("Directory", BY_DIRECTORY); + DIR_COMPARATORS.add("Auto Watch", BY_AUTOWATCH); + DIR_COMPARATORS.add("Last Sync", BY_LAST_SYNC); + DIR_COMPARATORS.add("Sync Interval", BY_SYNC_INTERVAL); + } +} diff --git a/webui/src/main/java/com/muwire/webui/MuWireClient.java b/webui/src/main/java/com/muwire/webui/MuWireClient.java index 91b010a9..636a314c 100644 --- a/webui/src/main/java/com/muwire/webui/MuWireClient.java +++ b/webui/src/main/java/com/muwire/webui/MuWireClient.java @@ -30,6 +30,7 @@ import com.muwire.core.filefeeds.FeedLoadedEvent; import com.muwire.core.filefeeds.UIFeedConfigurationEvent; import com.muwire.core.files.AllFilesLoadedEvent; import com.muwire.core.files.DirectoryUnsharedEvent; +import com.muwire.core.files.DirectoryWatchedEvent; import com.muwire.core.files.FileDownloadedEvent; import com.muwire.core.files.FileHashedEvent; import com.muwire.core.files.FileHashingEvent; @@ -177,6 +178,10 @@ public class MuWireClient { core.getEventBus().register(FeedFetchEvent.class, feedManager); core.getEventBus().register(FeedItemFetchedEvent.class, feedManager); + AdvancedSharingManager advancedSharingManager = new AdvancedSharingManager(core); + core.getEventBus().register(DirectoryWatchedEvent.class, advancedSharingManager); + core.getEventBus().register(DirectoryUnsharedEvent.class, advancedSharingManager); + servletContext.setAttribute("searchManager", searchManager); servletContext.setAttribute("downloadManager", downloadManager); servletContext.setAttribute("connectionCounter", connectionCounter); @@ -186,6 +191,7 @@ public class MuWireClient { servletContext.setAttribute("certificateManager", certificateManager); servletContext.setAttribute("uploadManager", uploadManager); servletContext.setAttribute("feedManager", feedManager); + servletContext.setAttribute("advancedSharingManager", advancedSharingManager); } public String getHome() { diff --git a/webui/src/main/js/advancedSharing.js b/webui/src/main/js/advancedSharing.js new file mode 100644 index 00000000..4baf5345 --- /dev/null +++ b/webui/src/main/js/advancedSharing.js @@ -0,0 +1,3 @@ +function initAdvancedSharing() { + +} \ No newline at end of file diff --git a/webui/src/main/webapp/AdvancedSharing.jsp b/webui/src/main/webapp/AdvancedSharing.jsp new file mode 100644 index 00000000..2db529f7 --- /dev/null +++ b/webui/src/main/webapp/AdvancedSharing.jsp @@ -0,0 +1,35 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page import="com.muwire.webui.*" %> +<%@include file="initcode.jsi"%> + +<% + +String pagetitle=Util._t("Advanced Sharing"); + +%> + + + +<%@ include file="css.jsi"%> + + + + + + +<%@ include file="header.jsi"%> + +
+
+
+
+
+
+
+
+ + diff --git a/webui/src/main/webapp/sidebar.jsi b/webui/src/main/webapp/sidebar.jsi index ae192333..f4129b41 100644 --- a/webui/src/main/webapp/sidebar.jsi +++ b/webui/src/main/webapp/sidebar.jsi @@ -76,6 +76,10 @@ + + + + diff --git a/webui/templates/web.xml.template b/webui/templates/web.xml.template index b2aa92bd..6750bcdb 100644 --- a/webui/templates/web.xml.template +++ b/webui/templates/web.xml.template @@ -85,6 +85,11 @@ com.muwire.webui.FileInfoServlet + + com.muwire.webui.AdvancedSharingServlet + com.muwire.webui.AdvancedSharingServlet + + com.muwire.webui.MuWireServlet /index.jsp @@ -155,6 +160,11 @@ /FileInfo + + com.muwire.webui.AdvancedSharingServlet + /AdvancedShare + + __JASPER__