From 6258dc8c7222faa8782509ba2a94afab5ed6bf67 Mon Sep 17 00:00:00 2001 From: Speiger Date: Mon, 30 Aug 2021 17:38:11 +0200 Subject: [PATCH] Added Custom Parsers for Assets --- .project | 29 ++++++++++--------- .../src/coreengine/assets/AssetManager.java | 9 ++++++ .../speiger/src/coreengine/assets/IAsset.java | 2 ++ .../src/coreengine/assets/IAssetPackage.java | 3 +- .../src/coreengine/assets/IAssetParser.java | 10 +++++++ .../coreengine/assets/impl/FolderAsset.java | 18 +++++++++--- .../assets/impl/FolderAssetPackage.java | 14 +++++++-- .../src/coreengine/assets/impl/ZipAsset.java | 16 ++++++++-- .../assets/impl/ZipAssetPackage.java | 11 ++++++- 9 files changed, 86 insertions(+), 26 deletions(-) create mode 100644 src/main/java/speiger/src/coreengine/assets/IAssetParser.java diff --git a/.project b/.project index 15f798f..3860aaf 100644 --- a/.project +++ b/.project @@ -1,22 +1,23 @@ - SimpleJavaEngine + ModelLoader-SimpleJavaEngine - + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - diff --git a/src/main/java/speiger/src/coreengine/assets/AssetManager.java b/src/main/java/speiger/src/coreengine/assets/AssetManager.java index f95010b..bbfa933 100644 --- a/src/main/java/speiger/src/coreengine/assets/AssetManager.java +++ b/src/main/java/speiger/src/coreengine/assets/AssetManager.java @@ -12,6 +12,7 @@ import java.util.zip.ZipFile; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.collections.objects.maps.impl.hash.Object2ObjectLinkedOpenHashMap; +import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap; import speiger.src.coreengine.assets.impl.FolderAssetPackage; import speiger.src.coreengine.assets.impl.ZipAssetPackage; import speiger.src.coreengine.assets.reloader.IReloadableResource; @@ -19,6 +20,7 @@ import speiger.src.coreengine.assets.reloader.IReloadableResource; public class AssetManager implements IReloadableResource { Map domains = new Object2ObjectLinkedOpenHashMap<>(); + Object2ObjectMap, IAssetParser> parsers = new Object2ObjectLinkedOpenHashMap<>(); Path path; public AssetManager(File file) @@ -35,6 +37,12 @@ public class AssetManager implements IReloadableResource { return path; } + public void registerAssetParser(Class clz, IAssetParser parser) + { + if(clz == null || parser == null) return; + parsers.put(clz, parser); + } + @Override public void reload() { @@ -66,6 +74,7 @@ public class AssetManager implements IReloadableResource } entry.addAssets(packages); } + packages.setParsers(parsers); } public Set getDomains() diff --git a/src/main/java/speiger/src/coreengine/assets/IAsset.java b/src/main/java/speiger/src/coreengine/assets/IAsset.java index f2a753d..3708e95 100644 --- a/src/main/java/speiger/src/coreengine/assets/IAsset.java +++ b/src/main/java/speiger/src/coreengine/assets/IAsset.java @@ -21,4 +21,6 @@ public interface IAsset extends Closeable public BufferedReader getStringReader() throws IOException; public JsonObject getJsonObject() throws IOException; + + public T getCustom(Class clz) throws IOException; } diff --git a/src/main/java/speiger/src/coreengine/assets/IAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/IAssetPackage.java index 5d46f61..d4dcd30 100644 --- a/src/main/java/speiger/src/coreengine/assets/IAssetPackage.java +++ b/src/main/java/speiger/src/coreengine/assets/IAssetPackage.java @@ -1,10 +1,11 @@ package speiger.src.coreengine.assets; import java.util.List; +import java.util.function.Function; public interface IAssetPackage { + public void setParsers(Function, IAssetParser> parsers); public List getDomains(); - public IAsset getAsset(AssetLocation location); } diff --git a/src/main/java/speiger/src/coreengine/assets/IAssetParser.java b/src/main/java/speiger/src/coreengine/assets/IAssetParser.java new file mode 100644 index 0000000..c6e25ec --- /dev/null +++ b/src/main/java/speiger/src/coreengine/assets/IAssetParser.java @@ -0,0 +1,10 @@ +package speiger.src.coreengine.assets; + +import java.io.Closeable; +import java.nio.file.Path; +import java.util.function.Consumer; + +public interface IAssetParser +{ + public T parseAsset(Path path, Consumer autoCloser); +} diff --git a/src/main/java/speiger/src/coreengine/assets/impl/FolderAsset.java b/src/main/java/speiger/src/coreengine/assets/impl/FolderAsset.java index b7f66e9..b95d7d2 100644 --- a/src/main/java/speiger/src/coreengine/assets/impl/FolderAsset.java +++ b/src/main/java/speiger/src/coreengine/assets/impl/FolderAsset.java @@ -8,6 +8,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.function.Function; import javax.imageio.ImageIO; @@ -16,23 +17,26 @@ import com.google.gson.JsonObject; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.coreengine.assets.AssetLocation; import speiger.src.coreengine.assets.IAsset; +import speiger.src.coreengine.assets.IAssetParser; import speiger.src.coreengine.utils.helpers.JsonUtil; public class FolderAsset implements IAsset { + Function, IAssetParser> parsers; AssetLocation location; Path path; List closeable; - public FolderAsset(AssetLocation location, Path path) + public FolderAsset(AssetLocation location, Path path, Function, IAssetParser> parsers) { - this(location, path, new ObjectArrayList<>()); + this(location, path, parsers, new ObjectArrayList<>()); } - public FolderAsset(AssetLocation location, Path path, List closeable) + public FolderAsset(AssetLocation location, Path path, Function, IAssetParser> parsers, List closeable) { this.location = location; this.path = path; + this.parsers = parsers; this.closeable = closeable; } @@ -57,7 +61,7 @@ public class FolderAsset implements IAsset public IAsset subAsset(String alternative) { Path newPath = path.resolveSibling(path.getFileName().toString()+"."+alternative); - return Files.exists(newPath) ? new FolderAsset(location.alternate(alternative), newPath, closeable) : null; + return Files.exists(newPath) ? new FolderAsset(location.alternate(alternative), newPath, parsers, closeable) : null; } @Override @@ -90,6 +94,12 @@ public class FolderAsset implements IAsset return JsonUtil.loadFile(path); } + @Override + public T getCustom(Class clz) throws IOException + { + return clz.cast(parsers.apply(clz).parseAsset(path, closeable::add)); + } + protected T markClosed(T value) { closeable.add(value); diff --git a/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java index a08c3fe..efeafe1 100644 --- a/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java +++ b/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java @@ -6,16 +6,18 @@ import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.function.Function; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.coreengine.assets.AssetLocation; import speiger.src.coreengine.assets.IAsset; import speiger.src.coreengine.assets.IAssetPackage; -import speiger.src.coreengine.assets.impl.FolderAsset; +import speiger.src.coreengine.assets.IAssetParser; public class FolderAssetPackage implements IAssetPackage { Path baseFolder; + Function, IAssetParser> parsers; public FolderAssetPackage(File baseFolder) { @@ -26,7 +28,13 @@ public class FolderAssetPackage implements IAssetPackage { this.baseFolder = baseFolder; } - + + @Override + public void setParsers(Function, IAssetParser> parsers) + { + this.parsers = parsers; + } + @Override public List getDomains() { @@ -49,6 +57,6 @@ public class FolderAssetPackage implements IAssetPackage public IAsset getAsset(AssetLocation location) { Path path = baseFolder.resolve(location.getActualLocation()); - return Files.exists(path) ? new FolderAsset(location, path) : null; + return Files.exists(path) ? new FolderAsset(location, path, parsers) : null; } } \ No newline at end of file diff --git a/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java b/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java index a1accec..1c4c3a3 100644 --- a/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java +++ b/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.function.Function; import javax.imageio.ImageIO; @@ -13,6 +14,7 @@ import com.google.gson.JsonObject; import speiger.src.coreengine.assets.AssetLocation; import speiger.src.coreengine.assets.IAsset; +import speiger.src.coreengine.assets.IAssetParser; import speiger.src.coreengine.utils.helpers.JsonUtil; public class ZipAsset implements IAsset @@ -20,12 +22,14 @@ public class ZipAsset implements IAsset Runnable closer; AssetLocation location; Path path; - - public ZipAsset(Runnable closer, AssetLocation location, Path path) + Function, IAssetParser> parsers; + + public ZipAsset(Runnable closer, AssetLocation location, Path path, Function, IAssetParser> parsers) { this.closer = closer; this.location = location; this.path = path; + this.parsers = parsers; } @Override @@ -52,7 +56,7 @@ public class ZipAsset implements IAsset { if(closer == null) return null; Path newPath = path.resolveSibling(path.getFileName().toString()+"."+alternative); - return Files.exists(newPath) ? new ZipAsset(this::closeInternal, location.alternate(alternative), newPath) : null; + return Files.exists(newPath) ? new ZipAsset(this::closeInternal, location.alternate(alternative), newPath, parsers) : null; } @Override @@ -84,4 +88,10 @@ public class ZipAsset implements IAsset { return JsonUtil.loadFile(path); } + + @Override + public T getCustom(Class clz) throws IOException + { + return clz.cast(parsers.apply(clz).parseAsset(path, T -> {})); + } } \ No newline at end of file diff --git a/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java index f550b2e..1f1dcdf 100644 --- a/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java +++ b/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java @@ -9,15 +9,18 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.coreengine.assets.AssetLocation; import speiger.src.coreengine.assets.IAsset; import speiger.src.coreengine.assets.IAssetPackage; +import speiger.src.coreengine.assets.IAssetParser; public class ZipAssetPackage implements IAssetPackage { Path baseFolder; + Function, IAssetParser> parsers; FileSystem cache; AtomicInteger usedReferences = new AtomicInteger(); Runnable referenceCleaner = this::cleanReference; @@ -32,6 +35,12 @@ public class ZipAssetPackage implements IAssetPackage this.baseFolder = baseFolder; } + @Override + public void setParsers(Function, IAssetParser> parsers) + { + this.parsers = parsers; + } + private void cleanReference() { int left = usedReferences.decrementAndGet(); @@ -77,7 +86,7 @@ public class ZipAssetPackage implements IAssetPackage try { Path path = getReference().getPath(location.getActualLocation()); - return Files.exists(path) ? new ZipAsset(referenceCleaner, location, path) : null; + return Files.exists(path) ? new ZipAsset(referenceCleaner, location, path, parsers) : null; } catch(Exception e) { return null; } }