[FEATURE] Support OverlayVfsDirectory

This commit is contained in:
Gravita 2025-06-22 18:37:31 +07:00
parent 110c2a089e
commit 37546e8a5a
4 changed files with 95 additions and 20 deletions

View file

@ -5,22 +5,6 @@
public abstract class VfsDirectory extends VfsEntry { public abstract class VfsDirectory extends VfsEntry {
public abstract VfsEntry find(String name); public abstract VfsEntry find(String name);
public VfsEntry resolve(Path path) { public abstract VfsEntry resolve(Path path);
if(path == null) { public abstract Stream<String> getFiles();
return null;
}
VfsDirectory current = this;
for(int i=0;i<path.getNameCount();++i) {
String s = path.getName(i).toString();
VfsEntry entity = current.find(s);
if(entity instanceof VfsDirectory newDir) {
current = newDir;
} else {
return entity;
}
}
return null;
}
protected abstract Stream<String> getFiles();
} }

View file

@ -30,9 +30,25 @@ public VfsEntry find(String name) {
return null; 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") @SuppressWarnings("resource")
@Override @Override
protected Stream<String> getFiles() { public Stream<String> getFiles() {
try { try {
return Files.list(path).map(Path::getFileName).map(Path::toString); return Files.list(path).map(Path::getFileName).map(Path::toString);
} catch (IOException e) { } catch (IOException e) {

View file

@ -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<VfsDirectory> list;
public OverlayVfsDirectory(List<VfsDirectory> 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<String> getFiles() {
Stream<String> stream = Stream.empty();
for(var e : list) {
var result = e.getFiles();
if(result != null) {
stream = Stream.concat(stream, result);
}
}
return stream;
}
}

View file

@ -4,6 +4,7 @@
import pro.gravit.launcher.base.vfs.VfsDirectory; import pro.gravit.launcher.base.vfs.VfsDirectory;
import pro.gravit.launcher.base.vfs.VfsEntry; import pro.gravit.launcher.base.vfs.VfsEntry;
import java.nio.file.Path;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -15,6 +16,30 @@ public VfsEntry find(String name) {
return map.get(name); return map.get(name);
} }
@Override
public VfsEntry resolve(Path path) {
if(path == null) {
return null;
}
VfsDirectory current = this;
for(int i=0;i<path.getNameCount();++i) {
String s = path.getName(i).toString();
VfsEntry entity = current.find(s);
if(entity instanceof VfsDirectory newDir) {
if(entity instanceof SimpleVfsDirectory) {
current = newDir;
} else {
Path newPath = path.subpath(i+1, path.getNameCount());
return newDir.resolve(newPath);
}
} else {
return entity;
}
}
return null;
}
public VfsEntry remove(String name) { public VfsEntry remove(String name) {
return map.remove(name); return map.remove(name);
} }
@ -24,7 +49,7 @@ public void put(String name, VfsEntry entry) {
} }
@Override @Override
protected Stream<String> getFiles() { public Stream<String> getFiles() {
return map.keySet().stream(); return map.keySet().stream();
} }
} }