From f4d9f4bab768576843fc1137d3f80b6ba79f8a11 Mon Sep 17 00:00:00 2001 From: MK13 Date: Fri, 12 Aug 2022 22:26:17 +0200 Subject: [PATCH] #12 App widgets --- .gitignore | 21 +++++++++ .../controller/DashboardController.java | 2 + .../i18n/dashboard_messages.properties | 3 ++ .../i18n/dashboard_messages_de_DE.properties | 3 ++ .../resources/static/css/dashboard_main.css | 32 ++++++++++++++ .../resources/templates/dashboard/index.html | 9 +++- .../de/nbscloud/files/FileSystemService.java | 36 +++++++++++++--- .../main/java/de/nbscloud/files/FilesApp.java | 15 ++++++- .../files/controller/WidgetController.java | 43 +++++++++++++++++++ .../files/widget/DiskUsageWidget.java | 11 +++++ .../resources/i18n/files_messages.properties | 6 +++ .../i18n/files_messages_de_DE.properties | 6 +++ .../main/resources/static/css/files_main.css | 4 ++ .../templates/files/widgets/diskUsage.html | 21 +++++++++ .../nbscloud/webcontainer/registry/App.java | 7 +++ .../webcontainer/registry/Widget.java | 5 +++ .../resources/config/application.properties | 2 +- 17 files changed, 218 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 dashboard/src/main/resources/i18n/dashboard_messages.properties create mode 100644 dashboard/src/main/resources/i18n/dashboard_messages_de_DE.properties create mode 100644 files/src/main/java/de/nbscloud/files/controller/WidgetController.java create mode 100644 files/src/main/java/de/nbscloud/files/widget/DiskUsageWidget.java create mode 100644 files/src/main/resources/templates/files/widgets/diskUsage.html create mode 100644 web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/Widget.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb6509f --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Compiled class file +*.class + +# Log file +*.log + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +*/target/* +.idea/* \ No newline at end of file diff --git a/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java b/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java index a75362c..dbc1674 100644 --- a/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java +++ b/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java @@ -8,6 +8,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletRequest; +import java.util.stream.Collectors; @Controller public class DashboardController { @@ -20,6 +21,7 @@ public class DashboardController { @GetMapping("/dashboard") public String start(Model model, HttpServletRequest httpServletRequest, String sortOrder) { model.addAttribute("apps", this.appRegistry.getAll()); + model.addAttribute("widgets", this.appRegistry.getAll().stream().flatMap(a -> a.getWidgets().stream()).collect(Collectors.toList())); this.webContainerSharedConfig.addDefaults(model); return "dashboard/index"; diff --git a/dashboard/src/main/resources/i18n/dashboard_messages.properties b/dashboard/src/main/resources/i18n/dashboard_messages.properties new file mode 100644 index 0000000..0e41302 --- /dev/null +++ b/dashboard/src/main/resources/i18n/dashboard_messages.properties @@ -0,0 +1,3 @@ +nbscloud.dashboard.greeting=Welcome to nbscloud + +nbscloud.dashboard.index.title=nbscloud\: dashboard \ No newline at end of file diff --git a/dashboard/src/main/resources/i18n/dashboard_messages_de_DE.properties b/dashboard/src/main/resources/i18n/dashboard_messages_de_DE.properties new file mode 100644 index 0000000..46cc008 --- /dev/null +++ b/dashboard/src/main/resources/i18n/dashboard_messages_de_DE.properties @@ -0,0 +1,3 @@ +nbscloud.dashboard.greeting=Willkommen bei nbscloud + +nbscloud.dashboard.index.title=nbscloud\: \u00DCbersicht \ No newline at end of file diff --git a/dashboard/src/main/resources/static/css/dashboard_main.css b/dashboard/src/main/resources/static/css/dashboard_main.css index c663e10..1670d0d 100644 --- a/dashboard/src/main/resources/static/css/dashboard_main.css +++ b/dashboard/src/main/resources/static/css/dashboard_main.css @@ -1,3 +1,35 @@ #content-container { padding-top: 2em; +} + +#widgets-container { + padding: 2em; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-start; + align-content: space-between; + row-gap: 2em; + column-gap: 2em; +} + +.widget { + flex-grow: 1; + background-color: #1d2121; + padding: 1em; +} + +.widget-heading { + +} + +.greeting { + display: block; + font-size: 1.5em; + margin-top: 0.83em; + margin-bottom: 0.83em; + margin-left: 0; + margin-right: 0; + font-weight: bold; } \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/dashboard/index.html b/dashboard/src/main/resources/templates/dashboard/index.html index 192fcd1..f606efb 100644 --- a/dashboard/src/main/resources/templates/dashboard/index.html +++ b/dashboard/src/main/resources/templates/dashboard/index.html @@ -14,7 +14,14 @@
- Welcome to nbscloud +
+

+

+
+ + + +
diff --git a/files/src/main/java/de/nbscloud/files/FileSystemService.java b/files/src/main/java/de/nbscloud/files/FileSystemService.java index 69f1cad..422221a 100644 --- a/files/src/main/java/de/nbscloud/files/FileSystemService.java +++ b/files/src/main/java/de/nbscloud/files/FileSystemService.java @@ -12,9 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.time.LocalDateTime; @@ -160,7 +158,7 @@ public class FileSystemService { Files.walkFileTree(targetPath, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if(Files.isDirectory(file)) { + if (Files.isDirectory(file)) { return FileVisitResult.CONTINUE; } @@ -207,7 +205,7 @@ public class FileSystemService { } } - private long getSize(Path name) { + public long getSize(Path name) { try { return Files.size(name); } catch (IOException e) { @@ -215,6 +213,34 @@ public class FileSystemService { } } + public String getDevice() { + try { + final Process process = Runtime.getRuntime() + .exec(new String[]{"findmnt", "-n", "-o", "SOURCE", "--target", this.locationTracker.getBaseDirPath().toString()}); + final String device = new BufferedReader(new InputStreamReader(process.getInputStream())).readLine(); + + process.destroy(); + + return device; + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + + public long getSpaceOnDevice(String device) { + try { + final Process process = Runtime.getRuntime() + .exec(new String[]{"lsblk", "-b", "-o", "SIZE", "-n", device}); + final String space = new BufferedReader(new InputStreamReader(process.getInputStream())).readLine(); + + process.destroy(); + + return Long.parseLong(space); + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + public String getMimeType(String name) { try { final String detectedMimeType = this.mimeTypeDetector.detectMimeType(this.locationTracker.resolve(name)); diff --git a/files/src/main/java/de/nbscloud/files/FilesApp.java b/files/src/main/java/de/nbscloud/files/FilesApp.java index f49f557..808e973 100644 --- a/files/src/main/java/de/nbscloud/files/FilesApp.java +++ b/files/src/main/java/de/nbscloud/files/FilesApp.java @@ -1,19 +1,27 @@ package de.nbscloud.files; +import de.nbscloud.files.widget.DiskUsageWidget; import de.nbscloud.webcontainer.registry.App; import de.nbscloud.webcontainer.registry.AppRegistry; +import de.nbscloud.webcontainer.registry.Widget; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + @Component public class FilesApp implements App, InitializingBean { + public static final String ID = "files"; + @Autowired private AppRegistry appRegistry; @Override public String getId() { - return "files"; + return ID; } @Override @@ -31,6 +39,11 @@ public class FilesApp implements App, InitializingBean { return 10; } + @Override + public Collection getWidgets() { + return List.of(new DiskUsageWidget()); + } + @Override public void afterPropertiesSet() throws Exception { this.appRegistry.registerApp(this); diff --git a/files/src/main/java/de/nbscloud/files/controller/WidgetController.java b/files/src/main/java/de/nbscloud/files/controller/WidgetController.java new file mode 100644 index 0000000..0bc7aa3 --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/controller/WidgetController.java @@ -0,0 +1,43 @@ +package de.nbscloud.files.controller; + +import de.nbscloud.files.FileSystemService; +import de.nbscloud.files.LocationTracker; +import de.nbscloud.files.config.FilesConfig; +import de.nbscloud.webcontainer.shared.config.WebContainerSharedConfig; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.nio.file.Paths; + +@Controller +public class WidgetController { + private static final Logger logger = LoggerFactory.getLogger(WidgetController.class); + + @Autowired + private FilesConfig filesConfig; + @Autowired + private LocationTracker locationTracker; + @Autowired + private WebContainerSharedConfig webContainerSharedConfig; + @Autowired + private FileSystemService fileSystemService; + + @GetMapping("files/widgets/diskUsage") + public String getDiskUsage(HttpServletRequest request, HttpServletResponse response, Model model) { + final String device = this.fileSystemService.getDevice(); + + model.addAttribute("baseDir", this.filesConfig.getBaseDir()); + model.addAttribute("device", device); + model.addAttribute("available", this.fileSystemService.getSpaceOnDevice(device)); + model.addAttribute("used", FileUtils.sizeOfDirectory(Paths.get(this.filesConfig.getBaseDir()).toFile())); + + return "files/widgets/diskUsage :: file-disk-usage"; + } +} diff --git a/files/src/main/java/de/nbscloud/files/widget/DiskUsageWidget.java b/files/src/main/java/de/nbscloud/files/widget/DiskUsageWidget.java new file mode 100644 index 0000000..ae8440e --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/widget/DiskUsageWidget.java @@ -0,0 +1,11 @@ +package de.nbscloud.files.widget; + +import de.nbscloud.files.FilesApp; +import de.nbscloud.webcontainer.registry.Widget; + +public class DiskUsageWidget implements Widget { + @Override + public String getPath() { + return FilesApp.ID + "/widgets/diskUsage"; + } +} diff --git a/files/src/main/resources/i18n/files_messages.properties b/files/src/main/resources/i18n/files_messages.properties index 6fd8be1..b6a010f 100644 --- a/files/src/main/resources/i18n/files_messages.properties +++ b/files/src/main/resources/i18n/files_messages.properties @@ -24,6 +24,12 @@ nbscloud.files.share.submit=Share nbscloud.files.share-message=Shared file\:\u0020 +nbscloud.files.file-disk-usage-widget.heading=files disk usage +nbscloud.files.file-disk-usage-widget-table.basedir=Base dir\: +nbscloud.files.file-disk-usage-widget-table.device=Host device\: +nbscloud.files.file-disk-usage-widget-table.available=Available\: +nbscloud.files.file-disk-usage-widget-table.used=Used\: + nbscloud.files.delete.success=File deleted nbscloud.files.rename.success=File renamed nbscloud.files.created.file.success=File created diff --git a/files/src/main/resources/i18n/files_messages_de_DE.properties b/files/src/main/resources/i18n/files_messages_de_DE.properties index e9d5f70..481b34e 100644 --- a/files/src/main/resources/i18n/files_messages_de_DE.properties +++ b/files/src/main/resources/i18n/files_messages_de_DE.properties @@ -24,6 +24,12 @@ nbscloud.files.share.submit=Teilen nbscloud.files.share-message=Datei geteilt\:\u0020 +nbscloud.files.file-disk-usage-widget.heading=Dateien Festplattennutzung +nbscloud.files.file-disk-usage-widget-table.basedir=Verzeichnis\: +nbscloud.files.file-disk-usage-widget-table.device=Ger\u00E4t\: +nbscloud.files.file-disk-usage-widget-table.available=Verf\u00FCgbar\: +nbscloud.files.file-disk-usage-widget-table.used=Belegt\: + nbscloud.files.delete.success=Datei gel\u00F6scht nbscloud.files.rename.success=Datei verschoben/umbenannt nbscloud.files.created.file.success=Datei erstellt diff --git a/files/src/main/resources/static/css/files_main.css b/files/src/main/resources/static/css/files_main.css index e85e71f..0203256 100644 --- a/files/src/main/resources/static/css/files_main.css +++ b/files/src/main/resources/static/css/files_main.css @@ -174,4 +174,8 @@ #gallery-link { text-decoration: none; +} + +#file-disk-usage-widget { + display: block; } \ No newline at end of file diff --git a/files/src/main/resources/templates/files/widgets/diskUsage.html b/files/src/main/resources/templates/files/widgets/diskUsage.html new file mode 100644 index 0000000..4cc86ad --- /dev/null +++ b/files/src/main/resources/templates/files/widgets/diskUsage.html @@ -0,0 +1,21 @@ +
+

+ + + + + + + + + +
+ +
+ +
+ +
+ +
+

\ No newline at end of file diff --git a/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java index 0a2a9ce..f86f22b 100644 --- a/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java +++ b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java @@ -1,5 +1,8 @@ package de.nbscloud.webcontainer.registry; +import java.util.Collection; +import java.util.Collections; + public interface App { // New app: // 1) Create module @@ -15,4 +18,8 @@ public interface App { String getStartPath(); int getIndex(); + + default Collection getWidgets() { + return Collections.EMPTY_LIST; + } } diff --git a/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/Widget.java b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/Widget.java new file mode 100644 index 0000000..9b9aef7 --- /dev/null +++ b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/Widget.java @@ -0,0 +1,5 @@ +package de.nbscloud.webcontainer.registry; + +public interface Widget { + String getPath(); +} diff --git a/web-container/src/main/resources/config/application.properties b/web-container/src/main/resources/config/application.properties index 19652e5..5b78e18 100644 --- a/web-container/src/main/resources/config/application.properties +++ b/web-container/src/main/resources/config/application.properties @@ -9,7 +9,7 @@ info.build.group=@project.groupId@ info.build.artifact=@project.artifactId@ info.build.version=@project.version@ -spring.messages.basename=i18n/container_messages,i18n/files_messages +spring.messages.basename=i18n/container_messages,i18n/files_messages,i18n/dashboard_messages spring.servlet.multipart.max-file-size=-1 spring.servlet.multipart.max-request-size=-1