mirror of
https://github.com/GravitLauncher/Launcher
synced 2025-06-28 03:58:07 +03:00
[FEATURE] Support OverlayVfsDirectory
This commit is contained in:
parent
110c2a089e
commit
37546e8a5a
4 changed files with 95 additions and 20 deletions
|
@ -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<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();
|
||||
public abstract VfsEntry resolve(Path path);
|
||||
public abstract Stream<String> getFiles();
|
||||
}
|
||||
|
|
|
@ -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<String> getFiles() {
|
||||
public Stream<String> getFiles() {
|
||||
try {
|
||||
return Files.list(path).map(Path::getFileName).map(Path::toString);
|
||||
} catch (IOException e) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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<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) {
|
||||
return map.remove(name);
|
||||
}
|
||||
|
@ -24,7 +49,7 @@ public void put(String name, VfsEntry entry) {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected Stream<String> getFiles() {
|
||||
public Stream<String> getFiles() {
|
||||
return map.keySet().stream();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue