FolderRepositorySource.java

net.minecraft.server.packs.repository.FolderRepositorySource

信息

  • 全限定名:net.minecraft.server.packs.repository.FolderRepositorySource
  • 类型:public class
  • 包:net.minecraft.server.packs.repository
  • 源码路径:src/main/java/net/minecraft/server/packs/repository/FolderRepositorySource.java
  • 起始行号:L29
  • 实现:RepositorySource
  • 职责:

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L30
    • 说明:

      TODO

  • DISCOVERED_PACK_SELECTION_CONFIG

    • 类型: PackSelectionConfig
    • 修饰符: private static final
    • 源码定位: L31
    • 说明:

      TODO

  • folder

    • 类型: Path
    • 修饰符: private final
    • 源码定位: L32
    • 说明:

      TODO

  • packType

    • 类型: PackType
    • 修饰符: private final
    • 源码定位: L33
    • 说明:

      TODO

  • packSource

    • 类型: PackSource
    • 修饰符: private final
    • 源码定位: L34
    • 说明:

      TODO

  • validator

    • 类型: DirectoryValidator
    • 修饰符: private final
    • 源码定位: L35
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.server.packs.repository.FolderRepositorySource.FolderPackDetector
    • 类型: class
    • 修饰符: private static
    • 源码定位: L91
    • 说明:

      TODO

构造器

public FolderRepositorySource(Path folder, PackType packType, PackSource packSource, DirectoryValidator validator) @ L37

  • 构造器名:FolderRepositorySource
  • 源码定位:L37
  • 修饰符:public

参数:

  • folder: Path
  • packType: PackType
  • packSource: PackSource
  • validator: DirectoryValidator

说明:

TODO

方法

下面的方法块按源码顺序生成。

private static String nameFromPath(Path content) @ L44

  • 方法名:nameFromPath
  • 源码定位:L44
  • 返回类型:String
  • 修饰符:private static

参数:

  • content: Path

说明:

TODO

public void loadPacks(Consumer<Pack> result) @ L48

  • 方法名:loadPacks
  • 源码定位:L48
  • 返回类型:void
  • 修饰符:public

参数:

  • result: Consumer

说明:

TODO

private PackLocationInfo createDiscoveredFilePackInfo(Path content) @ L64

  • 方法名:createDiscoveredFilePackInfo
  • 源码定位:L64
  • 返回类型:PackLocationInfo
  • 修饰符:private

参数:

  • content: Path

说明:

TODO

public static void discoverPacks(Path folder, DirectoryValidator validator, BiConsumer<Path,Pack.ResourcesSupplier> result) @ L69

  • 方法名:discoverPacks
  • 源码定位:L69
  • 返回类型:void
  • 修饰符:public static

参数:

  • folder: Path
  • validator: DirectoryValidator
  • result: BiConsumer<Path,Pack.ResourcesSupplier>

说明:

TODO

代码

public class FolderRepositorySource implements RepositorySource {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final PackSelectionConfig DISCOVERED_PACK_SELECTION_CONFIG = new PackSelectionConfig(false, Pack.Position.TOP, false);
    private final Path folder;
    private final PackType packType;
    private final PackSource packSource;
    private final DirectoryValidator validator;
 
    public FolderRepositorySource(Path folder, PackType packType, PackSource packSource, DirectoryValidator validator) {
        this.folder = folder;
        this.packType = packType;
        this.packSource = packSource;
        this.validator = validator;
    }
 
    private static String nameFromPath(Path content) {
        return content.getFileName().toString();
    }
 
    @Override
    public void loadPacks(Consumer<Pack> result) {
        try {
            FileUtil.createDirectoriesSafe(this.folder);
            discoverPacks(this.folder, this.validator, (content, resources) -> {
                PackLocationInfo locationInfo = this.createDiscoveredFilePackInfo(content);
                Pack pack = Pack.readMetaAndCreate(locationInfo, resources, this.packType, DISCOVERED_PACK_SELECTION_CONFIG);
                if (pack != null) {
                    result.accept(pack);
                }
            });
        } catch (IOException var3) {
            LOGGER.warn("Failed to list packs in {}", this.folder, var3);
        }
    }
 
    private PackLocationInfo createDiscoveredFilePackInfo(Path content) {
        String name = nameFromPath(content);
        return new PackLocationInfo("file/" + name, Component.literal(name), this.packSource, Optional.empty());
    }
 
    public static void discoverPacks(Path folder, DirectoryValidator validator, BiConsumer<Path, Pack.ResourcesSupplier> result) throws IOException {
        FolderRepositorySource.FolderPackDetector detector = new FolderRepositorySource.FolderPackDetector(validator);
 
        try (DirectoryStream<Path> contents = Files.newDirectoryStream(folder)) {
            for (Path content : contents) {
                try {
                    List<ForbiddenSymlinkInfo> validationIssues = new ArrayList<>();
                    Pack.ResourcesSupplier resources = detector.detectPackResources(content, validationIssues);
                    if (!validationIssues.isEmpty()) {
                        LOGGER.warn("Ignoring potential pack entry: {}", ContentValidationException.getMessage(content, validationIssues));
                    } else if (resources != null) {
                        result.accept(content, resources);
                    } else {
                        LOGGER.info("Found non-pack entry '{}', ignoring", content);
                    }
                } catch (IOException var10) {
                    LOGGER.warn("Failed to read properties of '{}', ignoring", content, var10);
                }
            }
        }
    }
 
    private static class FolderPackDetector extends PackDetector<Pack.ResourcesSupplier> {
        protected FolderPackDetector(DirectoryValidator validator) {
            super(validator);
        }
 
        protected Pack.@Nullable ResourcesSupplier createZipPack(Path content) {
            FileSystem fileSystem = content.getFileSystem();
            if (fileSystem != FileSystems.getDefault() && !(fileSystem instanceof LinkFileSystem)) {
                FolderRepositorySource.LOGGER.info("Can't open pack archive at {}", content);
                return null;
            } else {
                return new FilePackResources.FileResourcesSupplier(content);
            }
        }
 
        protected Pack.ResourcesSupplier createDirectoryPack(Path content) {
            return new PathPackResources.PathResourcesSupplier(content);
        }
    }
}

引用的其他类

  • Component

    • 引用位置: 方法调用
    • 关联成员: Component.literal()
  • FilePackResources

    • 引用位置: 方法调用/构造调用
    • 关联成员: FilePackResources.FileResourcesSupplier(), FileResourcesSupplier()
  • PackLocationInfo

    • 引用位置: 构造调用/返回值
    • 关联成员: PackLocationInfo()
  • PackSelectionConfig

    • 引用位置: 字段/构造调用
    • 关联成员: PackSelectionConfig()
  • PackType

    • 引用位置: 参数/字段
  • PathPackResources

    • 引用位置: 方法调用/构造调用
    • 关联成员: PathPackResources.PathResourcesSupplier(), PathResourcesSupplier()
  • Pack

    • 引用位置: 参数/方法调用
    • 关联成员: Pack.readMetaAndCreate()
  • PackSource

    • 引用位置: 参数/字段
  • RepositorySource

    • 引用位置: 实现
  • FileUtil

    • 引用位置: 方法调用
    • 关联成员: FileUtil.createDirectoriesSafe()
  • ContentValidationException

    • 引用位置: 方法调用
    • 关联成员: ContentValidationException.getMessage()
  • DirectoryValidator

    • 引用位置: 参数/字段