/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.google.common.base.Splitter * it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap * org.jspecify.annotations.Nullable */ package net.minecraft.server.packs.linkfs; import com.google.common.base.Splitter; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import java.nio.file.FileStore; import java.nio.file.FileSystem; import java.nio.file.Path; import java.nio.file.PathMatcher; import java.nio.file.WatchService; import java.nio.file.attribute.UserPrincipalLookupService; import java.nio.file.spi.FileSystemProvider; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.server.packs.linkfs.LinkFSFileStore; import net.minecraft.server.packs.linkfs.LinkFSPath; import net.minecraft.server.packs.linkfs.LinkFSProvider; import net.minecraft.server.packs.linkfs.PathContents; import org.jspecify.annotations.Nullable; public class LinkFileSystem extends FileSystem { private static final Set VIEWS = Set.of("basic"); public static final String PATH_SEPARATOR = "/"; private static final Splitter PATH_SPLITTER = Splitter.on((char)'/'); private final FileStore store; private final FileSystemProvider provider = new LinkFSProvider(); private final LinkFSPath root; private LinkFileSystem(String name, DirectoryEntry rootEntry) { this.store = new LinkFSFileStore(name); this.root = LinkFileSystem.buildPath(rootEntry, this, "", null); } private static LinkFSPath buildPath(DirectoryEntry entry, LinkFileSystem fileSystem, String selfName, @Nullable LinkFSPath parent) { Object2ObjectOpenHashMap children = new Object2ObjectOpenHashMap(); LinkFSPath result = new LinkFSPath(fileSystem, selfName, parent, new PathContents.DirectoryContents((Map)children)); entry.files.forEach((name, linkTarget) -> children.put(name, (Object)new LinkFSPath(fileSystem, (String)name, result, new PathContents.FileContents((Path)linkTarget)))); entry.children.forEach((name, childEntry) -> children.put(name, (Object)LinkFileSystem.buildPath(childEntry, fileSystem, name, result))); children.trim(); return result; } @Override public FileSystemProvider provider() { return this.provider; } @Override public void close() { } @Override public boolean isOpen() { return true; } @Override public boolean isReadOnly() { return true; } @Override public String getSeparator() { return PATH_SEPARATOR; } @Override public Iterable getRootDirectories() { return List.of(this.root); } @Override public Iterable getFileStores() { return List.of(this.store); } @Override public Set supportedFileAttributeViews() { return VIEWS; } @Override public Path getPath(String first, String ... more) { String joinedPath; Stream path = Stream.of(first); if (more.length > 0) { path = Stream.concat(path, Stream.of(more)); } if ((joinedPath = path.collect(Collectors.joining(PATH_SEPARATOR))).equals(PATH_SEPARATOR)) { return this.root; } if (joinedPath.startsWith(PATH_SEPARATOR)) { LinkFSPath result = this.root; for (String segment : PATH_SPLITTER.split((CharSequence)joinedPath.substring(1))) { if (segment.isEmpty()) { throw new IllegalArgumentException("Empty paths not allowed"); } result = result.resolveName(segment); } return result; } LinkFSPath result = null; for (String segment : PATH_SPLITTER.split((CharSequence)joinedPath)) { if (segment.isEmpty()) { throw new IllegalArgumentException("Empty paths not allowed"); } result = new LinkFSPath(this, segment, result, PathContents.RELATIVE); } if (result == null) { throw new IllegalArgumentException("Empty paths not allowed"); } return result; } @Override public PathMatcher getPathMatcher(String syntaxAndPattern) { throw new UnsupportedOperationException(); } @Override public UserPrincipalLookupService getUserPrincipalLookupService() { throw new UnsupportedOperationException(); } @Override public WatchService newWatchService() { throw new UnsupportedOperationException(); } public FileStore store() { return this.store; } public LinkFSPath rootPath() { return this.root; } public static Builder builder() { return new Builder(); } private record DirectoryEntry(Map children, Map files) { public DirectoryEntry() { this(new HashMap(), new HashMap()); } } public static class Builder { private final DirectoryEntry root = new DirectoryEntry(); public Builder put(List path, String name, Path target) { DirectoryEntry currentEntry = this.root; for (String segment : path) { currentEntry = currentEntry.children.computeIfAbsent(segment, n -> new DirectoryEntry()); } currentEntry.files.put(name, target); return this; } public Builder put(List path, Path target) { if (path.isEmpty()) { throw new IllegalArgumentException("Path can't be empty"); } int lastIndex = path.size() - 1; return this.put(path.subList(0, lastIndex), path.get(lastIndex), target); } public FileSystem build(String name) { return new LinkFileSystem(name, this.root); } } }