From f2e000ef8a1d93c35bb7f24c352ac29b5e49c58e Mon Sep 17 00:00:00 2001 From: JFronny Date: Wed, 15 Sep 2021 17:13:14 +0200 Subject: [PATCH] Generify filter utils --- .../filters/FileFilterEventImpl.java | 9 +-- .../filters/util/FileExclusionProvider.java | 34 +++-------- .../filters/util/FileExpansionProvider.java | 32 +++------- .../filters/util/FileFallbackProvider.java | 60 ++++++++----------- .../filters/util/FileRpoSearchProvider.java | 41 +++++++++++++ 5 files changed, 87 insertions(+), 89 deletions(-) create mode 100644 src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java index 0c506b5..bc67962 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java @@ -11,8 +11,6 @@ import io.gitlab.jfronny.respackopts.filters.util.FileFallbackProvider; import net.minecraft.resource.AbstractFileResourcePack; import net.minecraft.util.Identifier; -import java.io.FileNotFoundException; -import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; public class FileFilterEventImpl { @@ -21,13 +19,12 @@ public class FileFilterEventImpl { UserResourceEvents.OPEN.register((type, id, previous, pack) -> { if (skip(pack)) return previous; String name = new ResourcePath(type, id).getName(); - IOException ex = new FileNotFoundException(); if (pack.contains(type, id)) { if (containsFileWasFallback.get()) - return FileFallbackProvider.getReplacement(pack, name, ex); - return FileExpansionProvider.replace(previous, pack, name, ex); + return FileFallbackProvider.getReplacement(pack, name); + return FileExpansionProvider.replace(previous, pack, name); } - throw ex; + return previous; }); UserResourceEvents.FIND_RESOURCE.register((type, namespace, prefix, maxDepth, pathFilter, previous, pack) -> { // Warning: the Identifiers here DON'T CONTAIN THE TYPE! diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExclusionProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExclusionProvider.java index e58fffe..7ad1aa2 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExclusionProvider.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExclusionProvider.java @@ -1,36 +1,20 @@ package io.gitlab.jfronny.respackopts.filters.util; -import io.gitlab.jfronny.libjf.data.ResourcePath; import io.gitlab.jfronny.libjf.data.WrappedPack; import io.gitlab.jfronny.respackopts.Respackopts; -import io.gitlab.jfronny.respackopts.data.FileRpo; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; +import io.gitlab.jfronny.respackopts.util.RpoFormatException; public class FileExclusionProvider { public static boolean fileHidden(WrappedPack pack, String name) { - if (name.endsWith(Respackopts.FILE_EXTENSION)) - return false; - ResourcePath rpoPath; - try { - rpoPath = new ResourcePath(name + Respackopts.FILE_EXTENSION); - if (!pack.contains(rpoPath.getType(), rpoPath.getId())) - return false; - } catch (Throwable e) { - Respackopts.LOGGER.error("Could not check file filter status", e); - return false; - } - try (InputStream stream = pack.open(rpoPath.getType(), rpoPath.getId()); Reader w = new InputStreamReader(stream)) { - FileRpo rpo = Respackopts.GSON.fromJson(w, FileRpo.class); + return FileRpoSearchProvider.modifyWithRpo(name, pack, rpo -> { if (rpo.conditions == null) return false; - return !rpo.conditions.evaluate(Respackopts.getId(pack)); - } - catch (Throwable e) { - Respackopts.LOGGER.error("Could not load RPO file " + name, e); - return false; - } + try { + return !rpo.conditions.evaluate(Respackopts.getId(pack)); + } catch (RpoFormatException e) { + Respackopts.LOGGER.error("Could not evaluate condition " + name, e); + return false; + } + }, false); } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExpansionProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExpansionProvider.java index 2264a91..b997ecc 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExpansionProvider.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileExpansionProvider.java @@ -1,9 +1,7 @@ package io.gitlab.jfronny.respackopts.filters.util; -import io.gitlab.jfronny.libjf.data.ResourcePath; import io.gitlab.jfronny.libjf.data.WrappedPack; import io.gitlab.jfronny.respackopts.Respackopts; -import io.gitlab.jfronny.respackopts.data.FileRpo; import meteordevelopment.starscript.Script; import java.io.*; @@ -18,28 +16,16 @@ public class FileExpansionProvider { return new ByteArrayInputStream(s.getBytes()); } - //TODO move check to see if file has rpo (and parse it if it does) to shared location - public static InputStream replace(InputStream inputStream, WrappedPack pack, String name, IOException ex) throws IOException { - if (name.endsWith(Respackopts.FILE_EXTENSION)) - return inputStream; - ResourcePath rpoPath; - try { - rpoPath = new ResourcePath(name + Respackopts.FILE_EXTENSION); - if (!pack.contains(rpoPath.getType(), rpoPath.getId())) - return inputStream; - } catch (Throwable e) { - Respackopts.LOGGER.error("Could not check file filter status", e); - return inputStream; - } - try (InputStream stream = pack.open(rpoPath.getType(), rpoPath.getId()); Reader w = new InputStreamReader(stream)) { - FileRpo rpo = Respackopts.GSON.fromJson(w, FileRpo.class); + public static InputStream replace(InputStream inputStream, WrappedPack pack, String name) { + return FileRpoSearchProvider.modifyWithRpo(name, pack, rpo -> { if (rpo.expansions == null || rpo.expansions.isEmpty()) return inputStream; - return replace(inputStream, rpo.expansions); - } - catch (Exception e) { - Respackopts.LOGGER.error("Could not generate replacement for " + name + " in " + pack.getName(), e); - } - throw ex; + try { + return replace(inputStream, rpo.expansions); + } catch (IOException e) { + Respackopts.LOGGER.error("Could not perform file expansion on " + name, e); + return inputStream; + } + }, inputStream); } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileFallbackProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileFallbackProvider.java index 371b432..8af4b1b 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileFallbackProvider.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileFallbackProvider.java @@ -3,63 +3,53 @@ package io.gitlab.jfronny.respackopts.filters.util; import io.gitlab.jfronny.libjf.data.ResourcePath; import io.gitlab.jfronny.libjf.data.WrappedPack; import io.gitlab.jfronny.respackopts.Respackopts; -import io.gitlab.jfronny.respackopts.data.FileRpo; import net.minecraft.resource.ResourceType; import net.minecraft.util.Identifier; -import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; import java.util.Collection; import java.util.List; public class FileFallbackProvider { public static boolean fileVisible(WrappedPack pack, String name) { - if (name.endsWith(Respackopts.FILE_EXTENSION)) - return false; - try (ResourcePath fbt = new ResourcePath(name + Respackopts.FILE_EXTENSION); InputStream stream = pack.open(fbt.getType(), fbt.getId()); Reader w = new InputStreamReader(stream)) { - if (pack.contains(fbt.getType(), fbt.getId())) { - FileRpo rpo = Respackopts.GSON.fromJson(w, FileRpo.class); - if (rpo.fallbacks != null) { - List arr = rpo.fallbacks; - for (String s : arr) { - ResourcePath tmp = new ResourcePath(s); - if (pack.contains(tmp.getType(), tmp.getId())) - return true; - } - } - } - } - catch (Exception e) { - Respackopts.LOGGER.error("Could not determine visibility of " + name, e); - } - return false; - } - - public static InputStream getReplacement(WrappedPack pack, String name, IOException ex) throws IOException { - try (ResourcePath fbt = new ResourcePath(name + Respackopts.FILE_EXTENSION); InputStream stream = pack.open(fbt.getType(), fbt.getId()); Reader w = new InputStreamReader(stream)) { - FileRpo rpo = Respackopts.GSON.fromJson(w, FileRpo.class); + return FileRpoSearchProvider.modifyWithRpo(name, pack, rpo -> { if (rpo.fallbacks != null) { List arr = rpo.fallbacks; for (String s : arr) { ResourcePath tmp = new ResourcePath(s); if (pack.contains(tmp.getType(), tmp.getId())) - return pack.open(tmp.getType(), tmp.getId()); + return true; } } - } - catch (Exception e) { - Respackopts.LOGGER.error("Could not determine replacement for " + name, e); - } - throw ex; + return false; + }, false); + } + + public static InputStream getReplacement(WrappedPack pack, String name) { + return FileRpoSearchProvider.modifyWithRpo(name, pack, rpo -> { + try { + if (rpo.fallbacks != null) { + List arr = rpo.fallbacks; + for (String s : arr) { + ResourcePath tmp = new ResourcePath(s); + if (pack.contains(tmp.getType(), tmp.getId())) + return pack.open(tmp.getType(), tmp.getId()); + } + } + Respackopts.LOGGER.error("Could not determine replacement for " + name); + } + catch (Exception e) { + Respackopts.LOGGER.error("Could not determine replacement for " + name, e); + } + return null; + }, null); } public static void addFallbackResources(WrappedPack pack, Collection ret, String namespace, ResourceType type) { // Warning: the Identifiers here DON'T CONTAIN THE TYPE! Therefore, it needs to be added when calling a method that generates a ResourcePath! for (Identifier identifier : ret) { String path = identifier.getPath(); - if (path.endsWith(Respackopts.FILE_EXTENSION)) { + if (FileRpoSearchProvider.isRpo(path)) { String expectedTarget = path.substring(0, path.length() - Respackopts.FILE_EXTENSION.length()); if (ret.stream().noneMatch(s -> s.getPath().equals(expectedTarget)) && fileVisible(pack, type.getDirectory() + "/" + expectedTarget)) { ret.add(new Identifier(namespace, expectedTarget)); diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java new file mode 100644 index 0000000..cf5ab6e --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java @@ -0,0 +1,41 @@ +package io.gitlab.jfronny.respackopts.filters.util; + +import io.gitlab.jfronny.libjf.data.ResourcePath; +import io.gitlab.jfronny.libjf.data.WrappedPack; +import io.gitlab.jfronny.respackopts.Respackopts; +import io.gitlab.jfronny.respackopts.data.FileRpo; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; + +public class FileRpoSearchProvider { + public static boolean isRpo(String fileName) { + return fileName.endsWith(Respackopts.FILE_EXTENSION); + } + + public static T modifyWithRpo(String fileName, WrappedPack pack, ModifiedGenerator getModified, T defaultValue) { + if (FileRpoSearchProvider.isRpo(fileName)) + return defaultValue; + ResourcePath rpoPath; + try { + rpoPath = new ResourcePath(fileName + Respackopts.FILE_EXTENSION); + if (!pack.contains(rpoPath.getType(), rpoPath.getId())) + return defaultValue; + } catch (Throwable e) { + Respackopts.LOGGER.error("Could not check file filter status", e); + return defaultValue; + } + try (InputStream stream = pack.open(rpoPath.getType(), rpoPath.getId()); Reader w = new InputStreamReader(stream)) { + return getModified.getModified(Respackopts.GSON.fromJson(w, FileRpo.class)); + } + catch (Exception e) { + Respackopts.LOGGER.error("Could not generate replacement for " + rpoPath.getName() + " in " + pack.getName(), e); + return defaultValue; + } + } + + public interface ModifiedGenerator { + T getModified(FileRpo rpo); + } +}