Generify filter utils

This commit is contained in:
JFronny 2021-09-15 17:13:14 +02:00
parent b416df7b0c
commit f2e000ef8a
No known key found for this signature in database
GPG Key ID: BEC5ACBBD4EE17E5
5 changed files with 87 additions and 89 deletions

View File

@ -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!

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<String> 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<String> 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<String> 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<Identifier> 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));

View File

@ -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> T modifyWithRpo(String fileName, WrappedPack pack, ModifiedGenerator<T> 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> {
T getModified(FileRpo rpo);
}
}