From 8328387e8664c4c16c32f111c9884a8e046d0018 Mon Sep 17 00:00:00 2001 From: Bas de Jong Date: Tue, 30 Sep 2025 21:01:59 +0200 Subject: [PATCH] Reworked resources to be assets, and made AssetManager a singleton --- .../java/org/toop/framework/assets/Asset.java | 6 +-- .../toop/framework/assets/AssetLoader.java | 31 +++++++----- .../toop/framework/assets/AssetManager.java | 48 +++++++++---------- .../{AudioResource.java => AudioAsset.java} | 36 ++++++++++---- .../{Resource.java => BaseResource.java} | 4 +- .../framework/assets/resources/FontAsset.java | 28 +++++++++++ .../assets/resources/FontResource.java | 14 ------ .../assets/resources/ImageAsset.java | 38 +++++++++++++++ .../assets/resources/ImageResource.java | 22 --------- .../assets/resources/LoadableResource.java | 9 ++++ .../assets/resources/ResourceType.java | 5 -- .../framework/assets/resources/TextAsset.java | 33 +++++++++++++ .../assets/resources/TextResource.java | 20 -------- 13 files changed, 182 insertions(+), 112 deletions(-) rename framework/src/main/java/org/toop/framework/assets/resources/{AudioResource.java => AudioAsset.java} (57%) rename framework/src/main/java/org/toop/framework/assets/resources/{Resource.java => BaseResource.java} (86%) create mode 100644 framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java delete mode 100644 framework/src/main/java/org/toop/framework/assets/resources/FontResource.java create mode 100644 framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java delete mode 100644 framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java create mode 100644 framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java delete mode 100644 framework/src/main/java/org/toop/framework/assets/resources/ResourceType.java create mode 100644 framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java delete mode 100644 framework/src/main/java/org/toop/framework/assets/resources/TextResource.java diff --git a/framework/src/main/java/org/toop/framework/assets/Asset.java b/framework/src/main/java/org/toop/framework/assets/Asset.java index 77db13d..51bb675 100644 --- a/framework/src/main/java/org/toop/framework/assets/Asset.java +++ b/framework/src/main/java/org/toop/framework/assets/Asset.java @@ -1,10 +1,10 @@ package org.toop.framework.assets; import org.toop.framework.SnowflakeGenerator; -import org.toop.framework.assets.resources.Resource; +import org.toop.framework.assets.resources.BaseResource; -public class Asset { - private final Long id; // IS this needed? +public class Asset { + private final Long id; private final String name; private final T resource; diff --git a/framework/src/main/java/org/toop/framework/assets/AssetLoader.java b/framework/src/main/java/org/toop/framework/assets/AssetLoader.java index 65d8f5b..db25a17 100644 --- a/framework/src/main/java/org/toop/framework/assets/AssetLoader.java +++ b/framework/src/main/java/org/toop/framework/assets/AssetLoader.java @@ -1,9 +1,8 @@ package org.toop.framework.assets; -import org.toop.framework.assets.resources.AudioResource; -import org.toop.framework.assets.resources.FontResource; -import org.toop.framework.assets.resources.ImageResource; -import org.toop.framework.assets.resources.Resource; +import org.toop.framework.assets.resources.AudioAsset; +import org.toop.framework.assets.resources.BaseResource; +import org.toop.framework.assets.resources.ImageAsset; import java.io.File; import java.io.FileNotFoundException; @@ -12,7 +11,7 @@ import java.util.Objects; public class AssetLoader { private final File rootFolder; - private final ArrayList> assets = new ArrayList<>(); + private final ArrayList> assets = new ArrayList<>(); public AssetLoader(File rootFolder) { this.rootFolder = rootFolder; @@ -23,16 +22,21 @@ public class AssetLoader { return this.rootFolder; } - public ArrayList> getAssets() { + public ArrayList> getAssets() { return this.assets; } - private Resource resourceMapper(File file) throws FileNotFoundException { - return switch (getExtension(file.getName())) { - case "wav" -> new AudioResource(file).load(); - case "png" -> new ImageResource(file).load(); + private T resourceMapper(Class type, File file) throws FileNotFoundException { + BaseResource resource = switch (getExtension(file.getName())) { + case "wav" -> new AudioAsset(file); + case "png" -> new ImageAsset(file); default -> null; }; + + if (resource == null) return null; + if (!type.isInstance(resource)) + throw new IllegalArgumentException("File " + file.getName() + " is not of type " + type); + return type.cast(resource); } public static String getExtension(String name) { @@ -51,9 +55,10 @@ public class AssetLoader { fileSearcher(fileEntry); } else { try { - this.assets.add( - new Asset<>(fileEntry.getName(), this.resourceMapper(fileEntry)) - ); + BaseResource resource = resourceMapper(BaseResource.class, fileEntry); // generic token + if (resource != null) { + this.assets.add(new Asset<>(fileEntry.getName(), resource)); + } } catch (FileNotFoundException e) { throw new RuntimeException(e); } diff --git a/framework/src/main/java/org/toop/framework/assets/AssetManager.java b/framework/src/main/java/org/toop/framework/assets/AssetManager.java index 15d9376..eddf14b 100644 --- a/framework/src/main/java/org/toop/framework/assets/AssetManager.java +++ b/framework/src/main/java/org/toop/framework/assets/AssetManager.java @@ -1,38 +1,38 @@ package org.toop.framework.assets; -import org.apache.maven.surefire.shared.io.function.IOBaseStream; -import org.toop.framework.assets.resources.Resource; +import org.toop.framework.assets.resources.*; -import java.io.File; -import java.nio.file.Path; -import java.util.HashMap; +import java.util.*; public class AssetManager { + private static final AssetManager INSTANCE = new AssetManager(); + private static final Map> assets = new HashMap<>(); - private final HashMap> assets = new HashMap<>(); + private AssetManager() {} - public AssetManager(File rootFolder) { - for (Asset x : new AssetLoader(rootFolder).getAssets()) { - this.assets.put(x.getName(), x); - } + public static AssetManager getInstance() { + return INSTANCE; } - public HashMap> getAllResourceOfType(Class resourceClass) { - HashMap> a = new HashMap<>(); - for (Asset b : this.assets.values()) { - if (resourceClass.isInstance(b.getResource())) { - a.put(b.getName(), (Asset) b); + public ArrayList> getAllOfType(Class type) { + ArrayList> list = new ArrayList<>(); + for (Asset asset : assets.values()) { // <-- use .values() + if (type.isInstance(asset.getResource())) { + @SuppressWarnings("unchecked") + Asset typed = (Asset) asset; + list.add(typed); } } - return a; - } - - public HashMap> getAssets() { - return this.assets; + return list; } - public Asset getAsset(String assetName) { - return assets.get(assetName); + public static Asset getById(String guid) { + return assets.get(guid); } - -} + + public static Optional> findByName(String name) { + return assets.values().stream() + .filter(a -> a.getName().equals(name)) + .findFirst(); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/assets/resources/AudioResource.java b/framework/src/main/java/org/toop/framework/assets/resources/AudioAsset.java similarity index 57% rename from framework/src/main/java/org/toop/framework/assets/resources/AudioResource.java rename to framework/src/main/java/org/toop/framework/assets/resources/AudioAsset.java index 9ad5388..9483059 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/AudioResource.java +++ b/framework/src/main/java/org/toop/framework/assets/resources/AudioAsset.java @@ -3,35 +3,53 @@ package org.toop.framework.assets.resources; import javax.sound.sampled.*; import java.io.*; -public class AudioResource extends Resource implements ResourceType { +public class AudioAsset extends BaseResource implements LoadableResource { private AudioInputStream audioInputStream = null; private Clip clip = null; + private boolean isLoaded = false; - public AudioResource(File audioFile) { + public AudioAsset(final File audioFile) { super(audioFile); } - public AudioInputStream getAudioStream(){ + public AudioInputStream getAudioStream() { return this.audioInputStream; } - public Clip getClip() { - return this.clip; - } - - public AudioResource load() { + @Override + public void load() { try { this.audioInputStream = AudioSystem.getAudioInputStream(this.stream); Clip clip = AudioSystem.getClip(); clip.open(this.audioInputStream); this.clip = clip; + this.isLoaded = true; } catch (UnsupportedAudioFileException | LineUnavailableException e) { throw new RuntimeException(e); } catch (IOException e) { // TODO: Error handling throw new RuntimeException(e); } - return this; } + + @Override + public void unload() { + this.clip.stop(); + this.clip.flush(); + this.clip.close(); + this.clip = null; + this.isLoaded = false; + } + + @Override + public boolean isLoaded() { + return this.isLoaded; + } + + public Clip getClip() { + if (!this.isLoaded) this.load(); + return this.clip; + } + } diff --git a/framework/src/main/java/org/toop/framework/assets/resources/Resource.java b/framework/src/main/java/org/toop/framework/assets/resources/BaseResource.java similarity index 86% rename from framework/src/main/java/org/toop/framework/assets/resources/Resource.java rename to framework/src/main/java/org/toop/framework/assets/resources/BaseResource.java index 72277d0..c4c8568 100644 --- a/framework/src/main/java/org/toop/framework/assets/resources/Resource.java +++ b/framework/src/main/java/org/toop/framework/assets/resources/BaseResource.java @@ -2,12 +2,12 @@ package org.toop.framework.assets.resources; import java.io.*; -public abstract class Resource { +public abstract class BaseResource { final InputStream stream; final File file; - Resource(final File file) { + BaseResource(final File file) { this.file = file; try { this.stream = new BufferedInputStream(new FileInputStream(file)); diff --git a/framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java b/framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java new file mode 100644 index 0000000..3d38f5b --- /dev/null +++ b/framework/src/main/java/org/toop/framework/assets/resources/FontAsset.java @@ -0,0 +1,28 @@ +package org.toop.framework.assets.resources; + +import java.io.File; +import java.io.FileNotFoundException; + +public class FontAsset extends BaseResource implements LoadableResource { + + private boolean isLoaded = false; + + public FontAsset(final File fontFile) { + super(fontFile); + } + + + @Override + public void load() throws FileNotFoundException { + } + + @Override + public void unload() { + + } + + @Override + public boolean isLoaded() { + return false; + } +} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/FontResource.java b/framework/src/main/java/org/toop/framework/assets/resources/FontResource.java deleted file mode 100644 index 5348edb..0000000 --- a/framework/src/main/java/org/toop/framework/assets/resources/FontResource.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.toop.framework.assets.resources; - -import java.io.File; - -public class FontResource extends Resource implements ResourceType { - - public FontResource(File fontFile) { - super(fontFile); - } - - public FontResource load() { - return this; - } -} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java b/framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java new file mode 100644 index 0000000..731b0ba --- /dev/null +++ b/framework/src/main/java/org/toop/framework/assets/resources/ImageAsset.java @@ -0,0 +1,38 @@ +package org.toop.framework.assets.resources; + +import javafx.scene.image.Image; +import java.io.File; +import java.io.FileNotFoundException; + +public class ImageAsset extends BaseResource implements LoadableResource { + private Image image; + private boolean isLoaded = false; + + public ImageAsset(final File file) throws FileNotFoundException { + super(file); + } + + @Override + public void load() { + if (!this.isLoaded) { + this.image = new Image(this.stream); + this.isLoaded = true; + } + } + + @Override + public void unload() { + this.image = null; + this.isLoaded = false; + } + + @Override + public boolean isLoaded() { + return this.isLoaded; + } + + public Image getImage() { + if (!this.isLoaded) load(); + return image; + } +} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java b/framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java deleted file mode 100644 index 44548d3..0000000 --- a/framework/src/main/java/org/toop/framework/assets/resources/ImageResource.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.toop.framework.assets.resources; - -import javafx.scene.image.Image; -import java.io.File; - -public class ImageResource extends Resource implements ResourceType { - - private Image image = null; - - public ImageResource(File imageFile) { - super(imageFile); - } - - public Image getImage() { - return this.image; - } - - public ImageResource load() { - this.image = new Image(this.stream); - return this; - } -} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java b/framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java new file mode 100644 index 0000000..5d97257 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/assets/resources/LoadableResource.java @@ -0,0 +1,9 @@ +package org.toop.framework.assets.resources; + +import java.io.FileNotFoundException; + +public interface LoadableResource { + void load() throws FileNotFoundException; + void unload(); + boolean isLoaded(); +} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/ResourceType.java b/framework/src/main/java/org/toop/framework/assets/resources/ResourceType.java deleted file mode 100644 index c9ad398..0000000 --- a/framework/src/main/java/org/toop/framework/assets/resources/ResourceType.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.toop.framework.assets.resources; - -public interface ResourceType { - T load(); -} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java b/framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java new file mode 100644 index 0000000..db890a0 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/assets/resources/TextAsset.java @@ -0,0 +1,33 @@ +package org.toop.framework.assets.resources; + +import org.w3c.dom.Text; + +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class TextAsset extends BaseResource implements LoadableResource { + + TextAsset(final File file) { + super(file); + } + + @Override + public void load() throws FileNotFoundException { + + } + + @Override + public void unload() { + + } + + @Override + public boolean isLoaded() { + return false; + } +} diff --git a/framework/src/main/java/org/toop/framework/assets/resources/TextResource.java b/framework/src/main/java/org/toop/framework/assets/resources/TextResource.java deleted file mode 100644 index a325733..0000000 --- a/framework/src/main/java/org/toop/framework/assets/resources/TextResource.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.toop.framework.assets.resources; - -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; -import javax.sound.sampled.LineUnavailableException; -import javax.sound.sampled.UnsupportedAudioFileException; -import java.io.File; -import java.io.IOException; - -public class TextResource extends Resource implements ResourceType { - - TextResource(File file) { - super(file); - } - - public TextResource load() { - return this; - } - -}