From 37546e8a5a11ea7f6566400e9763d8fea3f766a7 Mon Sep 17 00:00:00 2001 From: Gravita <12893402+gravit0@users.noreply.github.com> Date: Sun, 22 Jun 2025 18:37:31 +0700 Subject: [PATCH] [FEATURE] Support OverlayVfsDirectory --- .../launcher/base/vfs/VfsDirectory.java | 20 +------- .../base/vfs/directory/FileVfsDirectory.java | 18 ++++++- .../vfs/directory/OverlayVfsDirectory.java | 50 +++++++++++++++++++ .../vfs/directory/SimpleVfsDirectory.java | 27 +++++++++- 4 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/OverlayVfsDirectory.java diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/VfsDirectory.java b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/VfsDirectory.java index 50f167c2..57d94e8c 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/VfsDirectory.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/VfsDirectory.java @@ -5,22 +5,6 @@ public abstract class VfsDirectory extends VfsEntry { public abstract VfsEntry find(String name); - public VfsEntry resolve(Path path) { - if(path == null) { - return null; - } - - VfsDirectory current = this; - for(int i=0;i getFiles(); + public abstract VfsEntry resolve(Path path); + public abstract Stream getFiles(); } diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/FileVfsDirectory.java b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/FileVfsDirectory.java index ea4cf056..666c4b9b 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/FileVfsDirectory.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/FileVfsDirectory.java @@ -30,9 +30,25 @@ public VfsEntry find(String name) { return null; } + @Override + public VfsEntry resolve(Path path) { + if(path == null) { + return null; + } + + Path target = path.resolve(path); + if(Files.exists(target)) { + if(Files.isDirectory(target)) { + return new FileVfsDirectory(target); + } + return new FileVfsFile(target); + } + return null; + } + @SuppressWarnings("resource") @Override - protected Stream getFiles() { + public Stream getFiles() { try { return Files.list(path).map(Path::getFileName).map(Path::toString); } catch (IOException e) { diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/OverlayVfsDirectory.java b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/OverlayVfsDirectory.java new file mode 100644 index 00000000..0d4d15be --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/OverlayVfsDirectory.java @@ -0,0 +1,50 @@ +package pro.gravit.launcher.base.vfs.directory; + +import pro.gravit.launcher.base.vfs.VfsDirectory; +import pro.gravit.launcher.base.vfs.VfsEntry; + +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +public class OverlayVfsDirectory extends VfsDirectory { + private final List list; + + public OverlayVfsDirectory(List list) { + this.list = list; + } + + @Override + public VfsEntry find(String name) { + for(var e : list) { + var result = e.find(name); + if(result != null) { + return result; + } + } + return null; + } + + @Override + public VfsEntry resolve(Path path) { + for(var e : list) { + var result = e.resolve(path); + if(result != null) { + return result; + } + } + return null; + } + + @Override + public Stream getFiles() { + Stream stream = Stream.empty(); + for(var e : list) { + var result = e.getFiles(); + if(result != null) { + stream = Stream.concat(stream, result); + } + } + return stream; + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/SimpleVfsDirectory.java b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/SimpleVfsDirectory.java index c9212b0c..c2754720 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/SimpleVfsDirectory.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/base/vfs/directory/SimpleVfsDirectory.java @@ -4,6 +4,7 @@ import pro.gravit.launcher.base.vfs.VfsDirectory; import pro.gravit.launcher.base.vfs.VfsEntry; +import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; @@ -15,6 +16,30 @@ public VfsEntry find(String name) { return map.get(name); } + @Override + public VfsEntry resolve(Path path) { + if(path == null) { + return null; + } + + VfsDirectory current = this; + for(int i=0;i getFiles() { + public Stream getFiles() { return map.keySet().stream(); } }