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