From 1116e14fc7ff84a6b3e6fd61220d440114643670 Mon Sep 17 00:00:00 2001 From: collinsmith Date: Tue, 29 Sep 2020 12:10:23 -0700 Subject: [PATCH] Refined implementation FileHandleAdapter changed to abstract class FileHandleAdapter now incorporates Reader functionality via #adapt(FileHandle,Class) Removed specialized functions from AsyncAssetLoader (should be callable directly now) Refactor renamed readers to adapters AssetLoader changed from interface to abstract class AssetLoader requires type reference and is more similar to LibGDX implementation Adjusted test case with new API --- core/src/com/riiablo/assets/AssetLoader.java | 23 +++++++++++-- core/src/com/riiablo/assets/AssetManager.java | 26 +++++++------- .../com/riiablo/assets/AsyncAssetLoader.java | 27 +++------------ .../com/riiablo/assets/FileHandleAdapter.java | 34 +++++++++++++++---- .../riiablo/assets/GdxFileHandleAdapter.java | 13 ++++--- .../riiablo/assets/MPQFileHandleAdapter.java | 13 ++++--- .../com/riiablo/assets/loaders/DCCLoader.java | 22 +++--------- .../riiablo/assets/loaders/MusicLoader.java | 26 ++------------ .../com/riiablo/assets/AssetManagerTest.java | 9 +++-- 9 files changed, 94 insertions(+), 99 deletions(-) diff --git a/core/src/com/riiablo/assets/AssetLoader.java b/core/src/com/riiablo/assets/AssetLoader.java index 8dc2989f..c86513f2 100644 --- a/core/src/com/riiablo/assets/AssetLoader.java +++ b/core/src/com/riiablo/assets/AssetLoader.java @@ -2,7 +2,24 @@ package com.riiablo.assets; import com.badlogic.gdx.utils.Array; -public interface AssetLoader { - FileHandleResolver resolver(); - Array getDependencies(Asset asset); +public class AssetLoader { + final FileHandleResolver resolver; + final Class type; + + protected AssetLoader(FileHandleResolver resolver, Class type) { + this.resolver = resolver; + this.type = type; + } + + public final Class type() { + return type; + } + + public final FileHandleResolver resolver() { + return resolver; + } + + public Array getDependencies(Asset asset) { + return null; + } } diff --git a/core/src/com/riiablo/assets/AssetManager.java b/core/src/com/riiablo/assets/AssetManager.java index ede0b881..4c70a6bb 100644 --- a/core/src/com/riiablo/assets/AssetManager.java +++ b/core/src/com/riiablo/assets/AssetManager.java @@ -1,6 +1,12 @@ package com.riiablo.assets; -import io.netty.util.AsciiString; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Disposable; +import com.riiablo.logger.LogManager; +import com.riiablo.logger.Logger; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -11,13 +17,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Disposable; - -import com.riiablo.logger.LogManager; -import com.riiablo.logger.Logger; +import io.netty.util.AsciiString; /** * n io threads perform async io to retrieve ByteBuf or MPQInputStream @@ -34,7 +34,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. final ArrayBlockingQueue completedTasks = new ArrayBlockingQueue<>(256); final ArrayList drain = new ArrayList<>(256); - final Map readers = new ConcurrentHashMap<>(); + final Map adapters = new ConcurrentHashMap<>(); final ExecutorService io; final ExecutorService async; @@ -87,7 +87,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. return loader; } - public void setLoader(Class type, AssetLoader loader) { + public void setLoader(Class type, AssetLoader loader) { if (type == null) throw new IllegalArgumentException("type cannot be null"); if (loader == null) throw new IllegalArgumentException("loader cannot be null"); log.debug("Loader set {} -> {}", type.getSimpleName(), loader.getClass()); @@ -95,7 +95,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. } public FileHandleAdapter getAdapter(Class type) { - return readers.get(type); + return adapters.get(type); } FileHandleAdapter findAdapter(Class type) { @@ -108,7 +108,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. if (type == null) throw new IllegalArgumentException("type cannot be null"); if (adapter == null) throw new IllegalArgumentException("adapter cannot be null"); log.debug("Adapter set {} -> {}", type.getSimpleName(), adapter.getClass()); - readers.put(type, adapter); + adapters.put(type, adapter); } public void clear() { @@ -166,7 +166,7 @@ public class AssetManager implements Disposable, LoadTask.Callback, AsyncReader. if (adapter instanceof AsyncAdapter) { // io.submit(((AsyncReader) reader).readFuture(asset, this)); } else { - ((AsyncAssetLoader) loader).loadAsync(this, asset, adapter, handle); + ((AsyncAssetLoader) loader).loadAsync(this, asset, adapter.adapt(handle, loader.type())); } } else { // io.submit(reader.create(asset)); diff --git a/core/src/com/riiablo/assets/AsyncAssetLoader.java b/core/src/com/riiablo/assets/AsyncAssetLoader.java index 02e38967..7cb58b99 100644 --- a/core/src/com/riiablo/assets/AsyncAssetLoader.java +++ b/core/src/com/riiablo/assets/AsyncAssetLoader.java @@ -1,31 +1,14 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.badlogic.gdx.files.FileHandle; -public abstract class AsyncAssetLoader implements AssetLoader { - final Reader reader; +import java.io.InputStream; - public AsyncAssetLoader(Reader reader) { - this.reader = reader; - } +import io.netty.buffer.ByteBuf; - protected Reader reader() { - return reader; - } - - void loadAsync(AssetManager assets, Asset asset, FileHandleAdapter adapter, F handle) { - loadAsync(assets, asset, reader.get(adapter, handle)); - } - - void unloadAsync(AssetManager assets, Asset asset, FileHandleAdapter adapter, F handle) { - unloadAsync(assets, asset, reader.get(adapter, handle)); - } - - T loadSync(AssetManager assets, Asset asset, FileHandleAdapter adapter, F handle) { - return loadSync(assets, asset, reader.get(adapter, handle)); +public abstract class AsyncAssetLoader extends AssetLoader { + public AsyncAssetLoader(FileHandleResolver resolver, Class type) { + super(resolver, type); } protected abstract void loadAsync(AssetManager assets, Asset asset, V data); diff --git a/core/src/com/riiablo/assets/FileHandleAdapter.java b/core/src/com/riiablo/assets/FileHandleAdapter.java index ca99d6a9..9ade7873 100644 --- a/core/src/com/riiablo/assets/FileHandleAdapter.java +++ b/core/src/com/riiablo/assets/FileHandleAdapter.java @@ -1,12 +1,32 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.badlogic.gdx.files.FileHandle; -public interface FileHandleAdapter { - byte[] readBytes(T handle); - InputStream read(T handle); - ByteBuf readByteBuf(T handle); +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import io.netty.buffer.ByteBuf; + +public abstract class FileHandleAdapter { + final Class type; + final Map readers; + + protected FileHandleAdapter(Class type) { + this.type = type; + this.readers = new HashMap<>(); + readers.put(type, new AsyncAssetLoader.ReflectiveReader<>()); + readers.put(InputStream.class, new AsyncAssetLoader.InputStreamReader<>()); + readers.put(byte[].class, new AsyncAssetLoader.ByteArrayReader<>()); + readers.put(ByteBuf.class, new AsyncAssetLoader.ByteBufReader<>()); + } + + @SuppressWarnings("unchecked") + public V adapt(F handle, Class type) { + return (V) readers.get(type).get(this, handle); + } + + public abstract byte[] readBytes(F handle); + public abstract InputStream read(F handle); + public abstract ByteBuf readByteBuf(F handle); } diff --git a/core/src/com/riiablo/assets/GdxFileHandleAdapter.java b/core/src/com/riiablo/assets/GdxFileHandleAdapter.java index 29ab08a7..74a85e28 100644 --- a/core/src/com/riiablo/assets/GdxFileHandleAdapter.java +++ b/core/src/com/riiablo/assets/GdxFileHandleAdapter.java @@ -1,11 +1,16 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.badlogic.gdx.files.FileHandle; -public class GdxFileHandleAdapter implements FileHandleAdapter { +import java.io.InputStream; + +import io.netty.buffer.ByteBuf; + +public final class GdxFileHandleAdapter extends FileHandleAdapter { + public GdxFileHandleAdapter() { + super(FileHandle.class); + } + @Override public byte[] readBytes(FileHandle handle) { return handle.readBytes(); diff --git a/core/src/com/riiablo/assets/MPQFileHandleAdapter.java b/core/src/com/riiablo/assets/MPQFileHandleAdapter.java index 2804f2ba..e6d8b88f 100644 --- a/core/src/com/riiablo/assets/MPQFileHandleAdapter.java +++ b/core/src/com/riiablo/assets/MPQFileHandleAdapter.java @@ -1,11 +1,16 @@ package com.riiablo.assets; -import io.netty.buffer.ByteBuf; -import java.io.InputStream; - import com.riiablo.mpq_bytebuf.MPQFileHandle; -public class MPQFileHandleAdapter implements FileHandleAdapter, AsyncAdapter { +import java.io.InputStream; + +import io.netty.buffer.ByteBuf; + +public final class MPQFileHandleAdapter extends FileHandleAdapter implements AsyncAdapter { + public MPQFileHandleAdapter() { + super(MPQFileHandle.class); + } + @Override public byte[] readBytes(MPQFileHandle handle) { throw new UnsupportedOperationException(); diff --git a/core/src/com/riiablo/assets/loaders/DCCLoader.java b/core/src/com/riiablo/assets/loaders/DCCLoader.java index 2efdc56f..6eccc797 100644 --- a/core/src/com/riiablo/assets/loaders/DCCLoader.java +++ b/core/src/com/riiablo/assets/loaders/DCCLoader.java @@ -1,25 +1,16 @@ package com.riiablo.assets.loaders; -import io.netty.buffer.ByteBuf; - -import com.badlogic.gdx.utils.Array; - import com.riiablo.assets.Asset; import com.riiablo.assets.AssetManager; import com.riiablo.assets.AsyncAssetLoader; import com.riiablo.assets.FileHandleResolver; -import com.riiablo.assets.MPQFileHandleResolver; import com.riiablo.codec.DCC; -import com.riiablo.mpq.MPQFileHandle; -public class DCCLoader extends AsyncAssetLoader { - DCCLoader() { - super(new ByteBufReader()); - } +import io.netty.buffer.ByteBuf; - @Override - public FileHandleResolver resolver() { - return new MPQFileHandleResolver(); +public class DCCLoader extends AsyncAssetLoader { + public DCCLoader(FileHandleResolver resolver) { + super(resolver, ByteBuf.class); } @Override @@ -36,9 +27,4 @@ public class DCCLoader extends AsyncAssetLoader { public DCC loadSync(AssetManager assets, Asset asset, ByteBuf data) { throw new UnsupportedOperationException(); } - - @Override - public Array getDependencies(Asset asset) { - throw new UnsupportedOperationException(); - } } diff --git a/core/src/com/riiablo/assets/loaders/MusicLoader.java b/core/src/com/riiablo/assets/loaders/MusicLoader.java index 77042e7d..7ccf2230 100644 --- a/core/src/com/riiablo/assets/loaders/MusicLoader.java +++ b/core/src/com/riiablo/assets/loaders/MusicLoader.java @@ -1,30 +1,15 @@ package com.riiablo.assets.loaders; -import io.netty.util.AsciiString; - import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; - import com.riiablo.assets.Asset; import com.riiablo.assets.AssetManager; import com.riiablo.assets.AsyncAssetLoader; -import com.riiablo.assets.DelimiterPathTransformer; import com.riiablo.assets.FileHandleResolver; -public class MusicLoader extends AsyncAssetLoader { - MusicLoader() { - super(new ReflectiveReader<>()); - } - - @Override - public FileHandleResolver resolver() { - return new FileHandleResolver(DelimiterPathTransformer.INSTANCE) { - @Override - protected FileHandle resolveTransformed(AsciiString path) { - throw new UnsupportedOperationException(); - } - }; +public class MusicLoader extends AsyncAssetLoader { + MusicLoader(FileHandleResolver resolver) { + super(resolver, FileHandle.class); } @Override @@ -41,9 +26,4 @@ public class MusicLoader extends AsyncAssetLoader public Music loadSync(AssetManager assets, Asset asset, FileHandle data) { throw new UnsupportedOperationException(); } - - @Override - public Array getDependencies(Asset asset) { - throw new UnsupportedOperationException(); - } } diff --git a/core/test/com/riiablo/assets/AssetManagerTest.java b/core/test/com/riiablo/assets/AssetManagerTest.java index 2a1527fe..836418cb 100644 --- a/core/test/com/riiablo/assets/AssetManagerTest.java +++ b/core/test/com/riiablo/assets/AssetManagerTest.java @@ -1,17 +1,16 @@ package com.riiablo.assets; -import org.junit.BeforeClass; -import org.junit.Test; - import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; - import com.riiablo.RiiabloTest; import com.riiablo.logger.Level; import com.riiablo.logger.LogManager; import com.riiablo.mpq_bytebuf.MPQFileHandle; import com.riiablo.mpq_bytebuf.MPQFileHandleResolver; +import org.junit.BeforeClass; +import org.junit.Test; + public class AssetManagerTest extends RiiabloTest { @BeforeClass public static void before() { @@ -21,7 +20,7 @@ public class AssetManagerTest extends RiiabloTest { @Test public void init() { AssetManager assets = new AssetManager(1); - MPQFileHandleResolver resolver = new MPQFileHandleResolver(Gdx.files.absolute("C:\\diablo")); + MPQFileHandleResolver resolver = new MPQFileHandleResolver(Gdx.files.absolute("C:\\diablo ii")); assets.setAdapter(FileHandle.class, new GdxFileHandleAdapter()); assets.setAdapter(MPQFileHandle.class, new MPQFileHandleAdapter()); assets.dispose();