mirror of
https://github.com/GravitLauncher/Launcher
synced 2025-06-28 12:08:09 +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 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();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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.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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue