From e9dfbbd150ec25b777e15b282515e13931d94465 Mon Sep 17 00:00:00 2001 From: Bas de Jong Date: Tue, 7 Oct 2025 23:54:33 +0200 Subject: [PATCH] Renamed asset folder to resource, made resourceLoader more robust. Completed some TODO's, formatting --- .idea/dictionaries/project.xml | 1 + app/src/main/java/org/toop/Main.java | 4 +- app/src/main/java/org/toop/app/App.java | 6 +- .../toop/app/layer/layers/OptionsPopup.java | 2 +- .../main/java/org/toop/local/AppContext.java | 4 +- .../main/java/org/toop/local/AppSettings.java | 2 +- .../main/java/org/toop/framework/Logging.java | 327 +++++++++--------- .../framework/audio/AudioVolumeManager.java | 2 - .../toop/framework/audio/SoundManager.java | 18 +- .../networking/NetworkingClientManager.java | 16 +- .../NetworkingGameClientHandler.java | 6 +- .../{asset => resource}/ResourceLoader.java | 39 ++- .../{asset => resource}/ResourceManager.java | 22 +- .../{asset => resource}/ResourceMeta.java | 4 +- .../events/AssetLoaderEvents.java | 2 +- ...ouldNotCreateResourceFactoryException.java | 12 + .../exceptions/IsNotAResourceException.java | 7 + .../exceptions/ResourceNotFoundException.java | 7 + .../resources/BaseResource.java | 2 +- .../resources/CssAsset.java | 4 +- .../resources/FontAsset.java | 6 +- .../resources/ImageAsset.java | 6 +- .../resources/JsonAsset.java | 6 +- .../resources/LocalizationAsset.java | 10 +- .../resources/MusicAsset.java | 6 +- .../resources/SettingsAsset.java | 2 +- .../resources/SoundEffectAsset.java | 6 +- .../resources/TextAsset.java | 6 +- .../types/BundledResource.java | 4 +- .../types/FileExtension.java | 6 +- .../types/LoadableResource.java | 4 +- .../types/PreloadResource.java | 4 +- 32 files changed, 289 insertions(+), 264 deletions(-) rename framework/src/main/java/org/toop/framework/{asset => resource}/ResourceLoader.java (86%) rename framework/src/main/java/org/toop/framework/{asset => resource}/ResourceManager.java (84%) rename framework/src/main/java/org/toop/framework/{asset => resource}/ResourceMeta.java (85%) rename framework/src/main/java/org/toop/framework/{asset => resource}/events/AssetLoaderEvents.java (84%) create mode 100644 framework/src/main/java/org/toop/framework/resource/exceptions/CouldNotCreateResourceFactoryException.java create mode 100644 framework/src/main/java/org/toop/framework/resource/exceptions/IsNotAResourceException.java create mode 100644 framework/src/main/java/org/toop/framework/resource/exceptions/ResourceNotFoundException.java rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/BaseResource.java (84%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/CssAsset.java (73%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/FontAsset.java (91%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/ImageAsset.java (86%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/JsonAsset.java (93%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/LocalizationAsset.java (95%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/MusicAsset.java (81%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/SettingsAsset.java (97%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/SoundEffectAsset.java (93%) rename framework/src/main/java/org/toop/framework/{asset => resource}/resources/TextAsset.java (85%) rename framework/src/main/java/org/toop/framework/{asset => resource}/types/BundledResource.java (95%) rename framework/src/main/java/org/toop/framework/{asset => resource}/types/FileExtension.java (89%) rename framework/src/main/java/org/toop/framework/{asset => resource}/types/LoadableResource.java (95%) rename framework/src/main/java/org/toop/framework/{asset => resource}/types/PreloadResource.java (92%) diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml index 46f4d3b..c6bca1c 100644 --- a/.idea/dictionaries/project.xml +++ b/.idea/dictionaries/project.xml @@ -13,6 +13,7 @@ toop vmoptions xplugin + yourturn \ No newline at end of file diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index 029fa28..ed1297a 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -1,11 +1,11 @@ package org.toop; import org.toop.app.App; -import org.toop.framework.asset.ResourceLoader; -import org.toop.framework.asset.ResourceManager; import org.toop.framework.audio.SoundManager; import org.toop.framework.networking.NetworkingClientManager; import org.toop.framework.networking.NetworkingInitializationException; +import org.toop.framework.resource.ResourceLoader; +import org.toop.framework.resource.ResourceManager; public final class Main { static void main(String[] args) { diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java index c4c9251..cb4bef0 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -9,10 +9,10 @@ import javafx.stage.Stage; import org.toop.app.layer.Layer; import org.toop.app.layer.layers.MainLayer; import org.toop.app.layer.layers.QuitPopup; -import org.toop.framework.asset.ResourceManager; -import org.toop.framework.asset.resources.CssAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.resource.ResourceManager; +import org.toop.framework.resource.resources.CssAsset; import org.toop.local.AppContext; import org.toop.local.AppSettings; @@ -107,7 +107,7 @@ public final class App extends Application { try { root.getChildren().removeLast(); } catch (Exception e) { - IO.println(e); + IO.println(e); // TODO: Use logger } } diff --git a/app/src/main/java/org/toop/app/layer/layers/OptionsPopup.java b/app/src/main/java/org/toop/app/layer/layers/OptionsPopup.java index 3182812..5dfc130 100644 --- a/app/src/main/java/org/toop/app/layer/layers/OptionsPopup.java +++ b/app/src/main/java/org/toop/app/layer/layers/OptionsPopup.java @@ -10,9 +10,9 @@ import org.toop.app.layer.Container; import org.toop.app.layer.NodeBuilder; import org.toop.app.layer.Popup; import org.toop.app.layer.containers.VerticalContainer; -import org.toop.framework.asset.resources.SettingsAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.resource.resources.SettingsAsset; import org.toop.local.AppContext; import org.toop.local.AppSettings; diff --git a/app/src/main/java/org/toop/local/AppContext.java b/app/src/main/java/org/toop/local/AppContext.java index 886b6c6..4d96fb4 100644 --- a/app/src/main/java/org/toop/local/AppContext.java +++ b/app/src/main/java/org/toop/local/AppContext.java @@ -1,8 +1,8 @@ package org.toop.local; import java.util.Locale; -import org.toop.framework.asset.ResourceManager; -import org.toop.framework.asset.resources.LocalizationAsset; +import org.toop.framework.resource.ResourceManager; +import org.toop.framework.resource.resources.LocalizationAsset; public class AppContext { private static final LocalizationAsset localization = ResourceManager.get("localization"); diff --git a/app/src/main/java/org/toop/local/AppSettings.java b/app/src/main/java/org/toop/local/AppSettings.java index 8f15ab2..70e88bd 100644 --- a/app/src/main/java/org/toop/local/AppSettings.java +++ b/app/src/main/java/org/toop/local/AppSettings.java @@ -3,9 +3,9 @@ package org.toop.local; import java.io.File; import java.util.Locale; import org.toop.app.App; -import org.toop.framework.asset.resources.SettingsAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.resource.resources.SettingsAsset; import org.toop.framework.settings.Settings; public class AppSettings { diff --git a/framework/src/main/java/org/toop/framework/Logging.java b/framework/src/main/java/org/toop/framework/Logging.java index abd13cc..ad28f0b 100644 --- a/framework/src/main/java/org/toop/framework/Logging.java +++ b/framework/src/main/java/org/toop/framework/Logging.java @@ -12,191 +12,190 @@ import org.apache.logging.log4j.core.config.LoggerConfig; *

Provides methods to enable or disable logs globally or per class, with support for specifying * log levels either via {@link Level} enums or string names. */ -// Todo: refactor public final class Logging { - /** Disables all logging globally by setting the root logger level to {@link Level#OFF}. */ - public static void disableAllLogs() { - LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - Configuration config = ctx.getConfiguration(); - LoggerConfig rootLoggerConfig = config.getRootLogger(); - rootLoggerConfig.setLevel(Level.OFF); - ctx.updateLoggers(); - } + /** Disables all logging globally by setting the root logger level to {@link Level#OFF}. */ + public static void disableAllLogs() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + LoggerConfig rootLoggerConfig = config.getRootLogger(); + rootLoggerConfig.setLevel(Level.OFF); + ctx.updateLoggers(); + } - /** Enables all logging globally by setting the root logger level to {@link Level#ALL}. */ - public static void enableAllLogs() { - LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - Configuration config = ctx.getConfiguration(); - LoggerConfig rootLoggerConfig = config.getRootLogger(); - rootLoggerConfig.setLevel(Level.ALL); - ctx.updateLoggers(); - } + /** Enables all logging globally by setting the root logger level to {@link Level#ALL}. */ + public static void enableAllLogs() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + LoggerConfig rootLoggerConfig = config.getRootLogger(); + rootLoggerConfig.setLevel(Level.ALL); + ctx.updateLoggers(); + } - /** - * Enables global logging at a specific level by setting the root logger. - * - * @param level the logging level to enable for all logs - */ - public static void enableAllLogs(Level level) { - LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - Configuration config = ctx.getConfiguration(); - LoggerConfig rootLoggerConfig = config.getRootLogger(); - rootLoggerConfig.setLevel(level); - ctx.updateLoggers(); - } + /** + * Enables global logging at a specific level by setting the root logger. + * + * @param level the logging level to enable for all logs + */ + public static void enableAllLogs(Level level) { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + LoggerConfig rootLoggerConfig = config.getRootLogger(); + rootLoggerConfig.setLevel(level); + ctx.updateLoggers(); + } - /** - * Verifies whether the provided string corresponds to a valid class name. - * - * @param className fully-qualified class name to check - * @return true if the class exists, false otherwise - */ - private static boolean verifyStringIsActualClass(String className) { - try { - Class.forName(className); - return true; - } catch (ClassNotFoundException e) { - return false; - } - } + /** + * Verifies whether the provided string corresponds to a valid class name. + * + * @param className fully-qualified class name to check + * @return true if the class exists, false otherwise + */ + private static boolean verifyStringIsActualClass(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } - /** - * Internal helper to disable logs for a specific class by name. - * - * @param className fully-qualified class name - */ - private static void disableLogsForClassInternal(String className) { - LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - Configuration config = ctx.getConfiguration(); - config.removeLogger(className); - LoggerConfig specificConfig = new LoggerConfig(className, Level.OFF, false); - config.addLogger(className, specificConfig); - ctx.updateLoggers(); - } + /** + * Internal helper to disable logs for a specific class by name. + * + * @param className fully-qualified class name + */ + private static void disableLogsForClassInternal(String className) { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.removeLogger(className); + LoggerConfig specificConfig = new LoggerConfig(className, Level.OFF, false); + config.addLogger(className, specificConfig); + ctx.updateLoggers(); + } - /** - * Disables logs for a specific class. - * - * @param class_ the class for which logs should be disabled - * @param type of the class - */ - public static void disableLogsForClass(Class class_) { - disableLogsForClassInternal(class_.getName()); - } + /** + * Disables logs for a specific class. + * + * @param class_ the class for which logs should be disabled + * @param type of the class + */ + public static void disableLogsForClass(Class class_) { + disableLogsForClassInternal(class_.getName()); + } - /** - * Disables logs for a class specified by fully-qualified name, if the class exists. - * - * @param className fully-qualified class name - */ - public static void disableLogsForClass(String className) { - if (verifyStringIsActualClass(className)) { - disableLogsForClassInternal(className); - } - } + /** + * Disables logs for a class specified by fully-qualified name, if the class exists. + * + * @param className fully-qualified class name + */ + public static void disableLogsForClass(String className) { + if (verifyStringIsActualClass(className)) { + disableLogsForClassInternal(className); + } + } - /** - * Internal helper to enable logs for a specific class at a specific level. - * - * @param className fully-qualified class name - * @param level logging level to set - */ - private static void enableLogsForClassInternal(String className, Level level) { - LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - Configuration config = ctx.getConfiguration(); - LoggerConfig loggerConfig = config.getLoggers().get(className); - if (loggerConfig == null) { - loggerConfig = new LoggerConfig(className, level, false); - config.addLogger(className, loggerConfig); - } else { - loggerConfig.setLevel(level); - } - ctx.updateLoggers(); - } + /** + * Internal helper to enable logs for a specific class at a specific level. + * + * @param className fully-qualified class name + * @param level logging level to set + */ + private static void enableLogsForClassInternal(String className, Level level) { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + LoggerConfig loggerConfig = config.getLoggers().get(className); + if (loggerConfig == null) { + loggerConfig = new LoggerConfig(className, level, false); + config.addLogger(className, loggerConfig); + } else { + loggerConfig.setLevel(level); + } + ctx.updateLoggers(); + } - /** - * Enables logging for a class at a specific level. - * - * @param class_ class to configure - * @param levelToLog the logging level to set - * @param type of the class - */ - public static void enableLogsForClass(Class class_, Level levelToLog) { - enableLogsForClassInternal(class_.getName(), levelToLog); - } + /** + * Enables logging for a class at a specific level. + * + * @param class_ class to configure + * @param levelToLog the logging level to set + * @param type of the class + */ + public static void enableLogsForClass(Class class_, Level levelToLog) { + enableLogsForClassInternal(class_.getName(), levelToLog); + } - /** - * Enables logging for a class specified by name at a specific level, if the class exists. - * - * @param className fully-qualified class name - * @param levelToLog the logging level to set - */ - public static void enableLogsForClass(String className, Level levelToLog) { - if (verifyStringIsActualClass(className)) { - enableLogsForClassInternal(className, levelToLog); - } - } + /** + * Enables logging for a class specified by name at a specific level, if the class exists. + * + * @param className fully-qualified class name + * @param levelToLog the logging level to set + */ + public static void enableLogsForClass(String className, Level levelToLog) { + if (verifyStringIsActualClass(className)) { + enableLogsForClassInternal(className, levelToLog); + } + } - /** - * Enables logging for a class specified by name at a specific level using a string. - * - * @param className fully-qualified class name - * @param levelToLog name of the logging level (e.g., "DEBUG", "INFO") - */ - public static void enableLogsForClass(String className, String levelToLog) { - Level level = Level.valueOf(levelToLog.trim().toUpperCase()); - if (level != null && verifyStringIsActualClass(className)) { - enableLogsForClassInternal(className, level); - } - } + /** + * Enables logging for a class specified by name at a specific level using a string. + * + * @param className fully-qualified class name + * @param levelToLog name of the logging level (e.g., "DEBUG", "INFO") + */ + public static void enableLogsForClass(String className, String levelToLog) { + Level level = Level.valueOf(levelToLog.trim().toUpperCase()); + if (level != null && verifyStringIsActualClass(className)) { + enableLogsForClassInternal(className, level); + } + } - /** Convenience methods for enabling logs at specific levels for classes. */ - public static void enableAllLogsForClass(Class class_) { - enableLogsForClass(class_, Level.ALL); - } + /** Convenience methods for enabling logs at specific levels for classes. */ + public static void enableAllLogsForClass(Class class_) { + enableLogsForClass(class_, Level.ALL); + } - public static void enableAllLogsForClass(String className) { - enableLogsForClass(className, Level.ALL); - } + public static void enableAllLogsForClass(String className) { + enableLogsForClass(className, Level.ALL); + } - public static void enableDebugLogsForClass(Class class_) { - enableLogsForClass(class_, Level.DEBUG); - } + public static void enableDebugLogsForClass(Class class_) { + enableLogsForClass(class_, Level.DEBUG); + } - public static void enableDebugLogsForClass(String className) { - enableLogsForClass(className, Level.DEBUG); - } + public static void enableDebugLogsForClass(String className) { + enableLogsForClass(className, Level.DEBUG); + } - public static void enableErrorLogsForClass(Class class_) { - enableLogsForClass(class_, Level.ERROR); - } + public static void enableErrorLogsForClass(Class class_) { + enableLogsForClass(class_, Level.ERROR); + } - public static void enableErrorLogsForClass(String className) { - enableLogsForClass(className, Level.ERROR); - } + public static void enableErrorLogsForClass(String className) { + enableLogsForClass(className, Level.ERROR); + } - public static void enableFatalLogsForClass(Class class_) { - enableLogsForClass(class_, Level.FATAL); - } + public static void enableFatalLogsForClass(Class class_) { + enableLogsForClass(class_, Level.FATAL); + } - public static void enableFatalLogsForClass(String className) { - enableLogsForClass(className, Level.FATAL); - } + public static void enableFatalLogsForClass(String className) { + enableLogsForClass(className, Level.FATAL); + } - public static void enableInfoLogsForClass(Class class_) { - enableLogsForClass(class_, Level.INFO); - } + public static void enableInfoLogsForClass(Class class_) { + enableLogsForClass(class_, Level.INFO); + } - public static void enableInfoLogsForClass(String className) { - enableLogsForClass(className, Level.INFO); - } + public static void enableInfoLogsForClass(String className) { + enableLogsForClass(className, Level.INFO); + } - public static void enableTraceLogsForClass(Class class_) { - enableLogsForClass(class_, Level.TRACE); - } + public static void enableTraceLogsForClass(Class class_) { + enableLogsForClass(class_, Level.TRACE); + } - public static void enableTraceLogsForClass(String className) { - enableLogsForClass(className, Level.TRACE); - } -} \ No newline at end of file + public static void enableTraceLogsForClass(String className) { + enableLogsForClass(className, Level.TRACE); + } +} diff --git a/framework/src/main/java/org/toop/framework/audio/AudioVolumeManager.java b/framework/src/main/java/org/toop/framework/audio/AudioVolumeManager.java index add826b..e97574a 100644 --- a/framework/src/main/java/org/toop/framework/audio/AudioVolumeManager.java +++ b/framework/src/main/java/org/toop/framework/audio/AudioVolumeManager.java @@ -68,8 +68,6 @@ public class AudioVolumeManager { private void handleMusicVolumeChange(AudioEvents.ChangeMusicVolume event) { this.musicVolume = limitVolume(event.newVolume() / 100); - System.out.println(this.musicVolume); - System.out.println(this.volume); for (MediaPlayer mediaPlayer : sM.getActiveMusic()) { this.updateMusicVolume(mediaPlayer); } diff --git a/framework/src/main/java/org/toop/framework/audio/SoundManager.java b/framework/src/main/java/org/toop/framework/audio/SoundManager.java index 4e1c8b2..13a98cb 100644 --- a/framework/src/main/java/org/toop/framework/audio/SoundManager.java +++ b/framework/src/main/java/org/toop/framework/audio/SoundManager.java @@ -7,12 +7,12 @@ import javax.sound.sampled.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.framework.SnowflakeGenerator; -import org.toop.framework.asset.ResourceManager; -import org.toop.framework.asset.ResourceMeta; -import org.toop.framework.asset.resources.MusicAsset; -import org.toop.framework.asset.resources.SoundEffectAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.resource.ResourceManager; +import org.toop.framework.resource.ResourceMeta; +import org.toop.framework.resource.resources.MusicAsset; +import org.toop.framework.resource.resources.SoundEffectAsset; public class SoundManager { private static final Logger logger = LogManager.getLogger(SoundManager.class); @@ -20,8 +20,6 @@ public class SoundManager { private final Queue backgroundMusicQueue = new LinkedList<>(); private final Map activeSoundEffects = new HashMap<>(); private final HashMap audioResources = new HashMap<>(); - private final SnowflakeGenerator idGenerator = - new SnowflakeGenerator(); // TODO: Don't create a new generator private final AudioVolumeManager audioVolumeManager = new AudioVolumeManager(this); public SoundManager() { @@ -120,7 +118,9 @@ public class SoundManager { logger.info("Playing background music: {}", ma.getFile().getName()); logger.info( "Background music next in line: {}", - backgroundMusicQueue.peek() != null ? backgroundMusicQueue.peek().getFile().getName() : null); + backgroundMusicQueue.peek() != null + ? backgroundMusicQueue.peek().getFile().getName() + : null); } private long playSound(String audioFileName, boolean loop) @@ -149,10 +149,10 @@ public class SoundManager { logger.debug("Playing sound: {}", asset.getFile().getName()); // Generate id for clip - long clipId = idGenerator.nextId(); + long clipId = new SnowflakeGenerator().nextId(); // store it so we can stop it later - activeSoundEffects.put(clipId, clip); // TODO: Do on snowflake for specific sound to stop + activeSoundEffects.put(clipId, clip); // remove when finished (only for non-looping sounds) clip.addLineListener( diff --git a/framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java b/framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java index 9c313d1..d8ed2b9 100644 --- a/framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java +++ b/framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java @@ -45,8 +45,8 @@ public class NetworkingClientManager { } long startClientRequest(String ip, int port) { - long connectionId = new SnowflakeGenerator().nextId(); // TODO: Maybe use the one generated - try { // With EventFlow + long connectionId = new SnowflakeGenerator().nextId(); + try { NetworkingClient client = new NetworkingClient( () -> new NetworkingGameClientHandler(connectionId), @@ -81,19 +81,13 @@ public class NetworkingClientManager { void handleStartClient(NetworkEvents.StartClient event) { long id = this.startClientRequest(event.ip(), event.port()); new Thread( - () -> { - try { - Thread.sleep(100); // TODO: Is this a good idea? + () -> new EventFlow() .addPostEvent( NetworkEvents.StartClientResponse.class, id, event.eventSnowflake()) - .asyncPostEvent(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }) + .asyncPostEvent()) .start(); } @@ -185,7 +179,7 @@ public class NetworkingClientManager { void handleCloseClient(NetworkEvents.CloseClient event) { NetworkingClient client = this.networkClients.get(event.clientId()); - client.closeConnection(); // TODO: Check if not blocking, what if error, mb not remove? + client.closeConnection(); this.networkClients.remove(event.clientId()); logger.info("Client {} closed successfully.", event.clientId()); } diff --git a/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java b/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java index 4e04c56..8c97f60 100644 --- a/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java +++ b/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java @@ -74,7 +74,7 @@ public class NetworkingGameClientHandler extends ChannelInboundHandlerAdapter { gameWinConditionHandler(recSrvRemoved); return; default: - return; + // return } } else { @@ -93,10 +93,10 @@ public class NetworkingGameClientHandler extends ChannelInboundHandlerAdapter { helpHandler(recSrvRemoved); return; default: - return; + // return } } else { - return; // TODO: Should be an error. + logger.error("Could not parse: {}", rec); } } } diff --git a/framework/src/main/java/org/toop/framework/asset/ResourceLoader.java b/framework/src/main/java/org/toop/framework/resource/ResourceLoader.java similarity index 86% rename from framework/src/main/java/org/toop/framework/asset/ResourceLoader.java rename to framework/src/main/java/org/toop/framework/resource/ResourceLoader.java index 829b982..dcada62 100644 --- a/framework/src/main/java/org/toop/framework/asset/ResourceLoader.java +++ b/framework/src/main/java/org/toop/framework/resource/ResourceLoader.java @@ -1,4 +1,4 @@ -package org.toop.framework.asset; +package org.toop.framework.resource; import java.io.File; import java.util.*; @@ -9,12 +9,13 @@ import java.util.function.Function; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.reflections.Reflections; -import org.toop.framework.asset.events.AssetLoaderEvents; -import org.toop.framework.asset.resources.*; -import org.toop.framework.asset.types.BundledResource; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.PreloadResource; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.resource.events.AssetLoaderEvents; +import org.toop.framework.resource.exceptions.CouldNotCreateResourceFactoryException; +import org.toop.framework.resource.resources.*; +import org.toop.framework.resource.types.BundledResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.PreloadResource; /** * Responsible for loading assets from a file system directory into memory. @@ -141,19 +142,24 @@ public class ResourceLoader { } /** Maps a file to a resource instance based on its extension and registered factories. */ - private T resourceMapper(File file, Class type) { + private T resourceMapper(File file) + throws CouldNotCreateResourceFactoryException, IllegalArgumentException { String ext = getExtension(file.getName()); Function factory = registry.get(ext); - if (factory == null) return null; + if (factory == null) + throw new CouldNotCreateResourceFactoryException(registry, file.getName()); BaseResource resource = factory.apply(file); - if (!type.isInstance(resource)) { + if (resource == null) { throw new IllegalArgumentException( - "File " + file.getName() + " is not of type " + type.getSimpleName()); + "File " + + file.getName() + + " is not of type " + + BaseResource.class.getSimpleName()); } - return type.cast(resource); + return ((Class) BaseResource.class).cast(resource); } /** Loads the given list of files into assets, handling bundled and preload resources. */ @@ -162,7 +168,14 @@ public class ResourceLoader { for (File file : files) { boolean skipAdd = false; - BaseResource resource = resourceMapper(file, BaseResource.class); + BaseResource resource = null; + try { + resource = resourceMapper(file); + } catch (CouldNotCreateResourceFactoryException _) { + logger.warn("Could not create resource for: {}", file); + } catch (IllegalArgumentException e) { + logger.error(e); + } switch (resource) { case null -> { continue; @@ -216,7 +229,7 @@ public class ResourceLoader { * {@link FileExtension}. */ private void autoRegisterResources() { - Reflections reflections = new Reflections("org.toop.framework.asset.resources"); + Reflections reflections = new Reflections("org.toop.framework.resource.resources"); Set> classes = reflections.getSubTypesOf(BaseResource.class); for (Class cls : classes) { diff --git a/framework/src/main/java/org/toop/framework/asset/ResourceManager.java b/framework/src/main/java/org/toop/framework/resource/ResourceManager.java similarity index 84% rename from framework/src/main/java/org/toop/framework/asset/ResourceManager.java rename to framework/src/main/java/org/toop/framework/resource/ResourceManager.java index 404b2f5..8bc2d97 100644 --- a/framework/src/main/java/org/toop/framework/asset/ResourceManager.java +++ b/framework/src/main/java/org/toop/framework/resource/ResourceManager.java @@ -1,16 +1,15 @@ -package org.toop.framework.asset; +package org.toop.framework.resource; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.toop.framework.asset.resources.*; +import org.toop.framework.resource.exceptions.ResourceNotFoundException; +import org.toop.framework.resource.resources.*; /** * Centralized manager for all loaded assets in the application. * - *

{@code ResourceManager} maintains a thread-safe registry of {@link ResourceMeta} objects and provides - * utility methods to retrieve assets by name, ID, or type. It works together with {@link + *

{@code ResourceManager} maintains a thread-safe registry of {@link ResourceMeta} objects and + * provides utility methods to retrieve assets by name, ID, or type. It works together with {@link * ResourceLoader} to register assets automatically when they are loaded from the file system. * *

Key responsibilities: @@ -49,7 +48,7 @@ import org.toop.framework.asset.resources.*; * */ public class ResourceManager { - private static final Logger logger = LogManager.getLogger(ResourceManager.class); + // private static final Logger logger = LogManager.getLogger(ResourceManager.class); private static final Map> assets = new ConcurrentHashMap<>(); @@ -61,7 +60,7 @@ public class ResourceManager { * @param loader the loader that has already loaded assets */ public static synchronized void loadAssets(ResourceLoader loader) { - for (var asset : loader.getAssets()) { + for (ResourceMeta asset : loader.getAssets()) { assets.put(asset.getName(), asset); } } @@ -77,12 +76,7 @@ public class ResourceManager { public static T get(String name) { ResourceMeta asset = (ResourceMeta) assets.get(name); if (asset == null) { - throw new TypeNotPresentException( - name, - new RuntimeException( - String.format( - "Type %s not present", - name))); // TODO: Create own exception, BAM + throw new ResourceNotFoundException(name); } return asset.getResource(); } diff --git a/framework/src/main/java/org/toop/framework/asset/ResourceMeta.java b/framework/src/main/java/org/toop/framework/resource/ResourceMeta.java similarity index 85% rename from framework/src/main/java/org/toop/framework/asset/ResourceMeta.java rename to framework/src/main/java/org/toop/framework/resource/ResourceMeta.java index 4632624..4312b84 100644 --- a/framework/src/main/java/org/toop/framework/asset/ResourceMeta.java +++ b/framework/src/main/java/org/toop/framework/resource/ResourceMeta.java @@ -1,7 +1,7 @@ -package org.toop.framework.asset; +package org.toop.framework.resource; import org.toop.framework.SnowflakeGenerator; -import org.toop.framework.asset.resources.BaseResource; +import org.toop.framework.resource.resources.BaseResource; public class ResourceMeta { private final Long id; diff --git a/framework/src/main/java/org/toop/framework/asset/events/AssetLoaderEvents.java b/framework/src/main/java/org/toop/framework/resource/events/AssetLoaderEvents.java similarity index 84% rename from framework/src/main/java/org/toop/framework/asset/events/AssetLoaderEvents.java rename to framework/src/main/java/org/toop/framework/resource/events/AssetLoaderEvents.java index b19709c..04ef018 100644 --- a/framework/src/main/java/org/toop/framework/asset/events/AssetLoaderEvents.java +++ b/framework/src/main/java/org/toop/framework/resource/events/AssetLoaderEvents.java @@ -1,4 +1,4 @@ -package org.toop.framework.asset.events; +package org.toop.framework.resource.events; import org.toop.framework.eventbus.events.EventWithoutSnowflake; diff --git a/framework/src/main/java/org/toop/framework/resource/exceptions/CouldNotCreateResourceFactoryException.java b/framework/src/main/java/org/toop/framework/resource/exceptions/CouldNotCreateResourceFactoryException.java new file mode 100644 index 0000000..aa7b3c0 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/resource/exceptions/CouldNotCreateResourceFactoryException.java @@ -0,0 +1,12 @@ +package org.toop.framework.resource.exceptions; + +import java.util.Map; + +public class CouldNotCreateResourceFactoryException extends RuntimeException { + public CouldNotCreateResourceFactoryException(Map registry, String fileName) { + super( + String.format( + "Could not create resource factory for: %s, isRegistryEmpty: %b", + fileName, registry.isEmpty())); + } +} diff --git a/framework/src/main/java/org/toop/framework/resource/exceptions/IsNotAResourceException.java b/framework/src/main/java/org/toop/framework/resource/exceptions/IsNotAResourceException.java new file mode 100644 index 0000000..41abbde --- /dev/null +++ b/framework/src/main/java/org/toop/framework/resource/exceptions/IsNotAResourceException.java @@ -0,0 +1,7 @@ +package org.toop.framework.resource.exceptions; + +public class IsNotAResourceException extends RuntimeException { + public IsNotAResourceException(Class clazz, String message) { + super(clazz.getName() + " does not implement BaseResource"); + } +} diff --git a/framework/src/main/java/org/toop/framework/resource/exceptions/ResourceNotFoundException.java b/framework/src/main/java/org/toop/framework/resource/exceptions/ResourceNotFoundException.java new file mode 100644 index 0000000..c75de1e --- /dev/null +++ b/framework/src/main/java/org/toop/framework/resource/exceptions/ResourceNotFoundException.java @@ -0,0 +1,7 @@ +package org.toop.framework.resource.exceptions; + +public class ResourceNotFoundException extends RuntimeException { + public ResourceNotFoundException(String name) { + super("Could not find resource: " + name); + } +} diff --git a/framework/src/main/java/org/toop/framework/asset/resources/BaseResource.java b/framework/src/main/java/org/toop/framework/resource/resources/BaseResource.java similarity index 84% rename from framework/src/main/java/org/toop/framework/asset/resources/BaseResource.java rename to framework/src/main/java/org/toop/framework/resource/resources/BaseResource.java index e913026..72da47c 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/BaseResource.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/BaseResource.java @@ -1,4 +1,4 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.*; diff --git a/framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/CssAsset.java similarity index 73% rename from framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/CssAsset.java index f0e6977..0d056ae 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/CssAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/CssAsset.java @@ -1,7 +1,7 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.File; -import org.toop.framework.asset.types.FileExtension; +import org.toop.framework.resource.types.FileExtension; @FileExtension({"css"}) public class CssAsset extends BaseResource { diff --git a/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/FontAsset.java similarity index 91% rename from framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/FontAsset.java index e804ab0..da9c709 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/FontAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/FontAsset.java @@ -1,11 +1,11 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javafx.scene.text.Font; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.PreloadResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.PreloadResource; @FileExtension({"ttf", "otf"}) public class FontAsset extends BaseResource implements PreloadResource { diff --git a/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java similarity index 86% rename from framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java index 27d6ef3..2e6b417 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/ImageAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java @@ -1,10 +1,10 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.File; import java.io.FileInputStream; import javafx.scene.image.Image; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.LoadableResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.LoadableResource; @FileExtension({"png", "jpg", "jpeg"}) public class ImageAsset extends BaseResource implements LoadableResource { diff --git a/framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/JsonAsset.java similarity index 93% rename from framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/JsonAsset.java index 9d9c516..c13849c 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/JsonAsset.java @@ -1,4 +1,4 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -6,8 +6,8 @@ import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.LoadableResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.LoadableResource; @FileExtension({"json"}) public class JsonAsset extends BaseResource implements LoadableResource { diff --git a/framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/LocalizationAsset.java similarity index 95% rename from framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/LocalizationAsset.java index 763f332..2bd2333 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/LocalizationAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/LocalizationAsset.java @@ -1,11 +1,11 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; -import org.toop.framework.asset.types.BundledResource; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.LoadableResource; +import org.toop.framework.resource.types.BundledResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.LoadableResource; /** * Represents a localization resource asset that loads and manages property files containing @@ -38,7 +38,7 @@ public class LocalizationAsset extends BaseResource implements LoadableResource, private final String baseName = "localization"; /** Fallback locale used when no matching locale is found. */ - private final Locale fallback = Locale.forLanguageTag("en_US"); + private final Locale fallback = Locale.forLanguageTag("en"); /** * Constructs a new LocalizationAsset for the specified file. diff --git a/framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java similarity index 81% rename from framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java index 1d79c88..d60b6bc 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/MusicAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java @@ -1,9 +1,9 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.*; import javafx.scene.media.Media; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.LoadableResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.LoadableResource; @FileExtension({"mp3"}) public class MusicAsset extends BaseResource implements LoadableResource { diff --git a/framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/SettingsAsset.java similarity index 97% rename from framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/SettingsAsset.java index d329d98..7728c9a 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/SettingsAsset.java @@ -1,4 +1,4 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.File; import java.util.Locale; diff --git a/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java similarity index 93% rename from framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java index b85951b..c55306a 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java @@ -1,10 +1,10 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.*; import java.nio.file.Files; import javax.sound.sampled.*; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.LoadableResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.LoadableResource; @FileExtension({"wav"}) public class SoundEffectAsset extends BaseResource implements LoadableResource { diff --git a/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/TextAsset.java similarity index 85% rename from framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java rename to framework/src/main/java/org/toop/framework/resource/resources/TextAsset.java index 88c9c33..9d91405 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/TextAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/TextAsset.java @@ -1,11 +1,11 @@ -package org.toop.framework.asset.resources; +package org.toop.framework.resource.resources; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import org.toop.framework.asset.types.FileExtension; -import org.toop.framework.asset.types.LoadableResource; +import org.toop.framework.resource.types.FileExtension; +import org.toop.framework.resource.types.LoadableResource; @FileExtension({"txt", "json", "xml"}) public class TextAsset extends BaseResource implements LoadableResource { diff --git a/framework/src/main/java/org/toop/framework/asset/types/BundledResource.java b/framework/src/main/java/org/toop/framework/resource/types/BundledResource.java similarity index 95% rename from framework/src/main/java/org/toop/framework/asset/types/BundledResource.java rename to framework/src/main/java/org/toop/framework/resource/types/BundledResource.java index a243188..ca63407 100644 --- a/framework/src/main/java/org/toop/framework/asset/types/BundledResource.java +++ b/framework/src/main/java/org/toop/framework/resource/types/BundledResource.java @@ -1,7 +1,7 @@ -package org.toop.framework.asset.types; +package org.toop.framework.resource.types; import java.io.File; -import org.toop.framework.asset.ResourceLoader; +import org.toop.framework.resource.ResourceLoader; /** * Represents a resource that can be composed of multiple files, or "bundled" together under a diff --git a/framework/src/main/java/org/toop/framework/asset/types/FileExtension.java b/framework/src/main/java/org/toop/framework/resource/types/FileExtension.java similarity index 89% rename from framework/src/main/java/org/toop/framework/asset/types/FileExtension.java rename to framework/src/main/java/org/toop/framework/resource/types/FileExtension.java index ab70275..df30efd 100644 --- a/framework/src/main/java/org/toop/framework/asset/types/FileExtension.java +++ b/framework/src/main/java/org/toop/framework/resource/types/FileExtension.java @@ -1,11 +1,11 @@ -package org.toop.framework.asset.types; +package org.toop.framework.resource.types; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.toop.framework.asset.ResourceLoader; -import org.toop.framework.asset.resources.BaseResource; +import org.toop.framework.resource.ResourceLoader; +import org.toop.framework.resource.resources.BaseResource; /** * Annotation to declare which file extensions a {@link BaseResource} subclass can handle. diff --git a/framework/src/main/java/org/toop/framework/asset/types/LoadableResource.java b/framework/src/main/java/org/toop/framework/resource/types/LoadableResource.java similarity index 95% rename from framework/src/main/java/org/toop/framework/asset/types/LoadableResource.java rename to framework/src/main/java/org/toop/framework/resource/types/LoadableResource.java index d43f9c0..32fb0bc 100644 --- a/framework/src/main/java/org/toop/framework/asset/types/LoadableResource.java +++ b/framework/src/main/java/org/toop/framework/resource/types/LoadableResource.java @@ -1,6 +1,6 @@ -package org.toop.framework.asset.types; +package org.toop.framework.resource.types; -import org.toop.framework.asset.ResourceLoader; +import org.toop.framework.resource.ResourceLoader; /** * Represents a resource that can be explicitly loaded and unloaded. diff --git a/framework/src/main/java/org/toop/framework/asset/types/PreloadResource.java b/framework/src/main/java/org/toop/framework/resource/types/PreloadResource.java similarity index 92% rename from framework/src/main/java/org/toop/framework/asset/types/PreloadResource.java rename to framework/src/main/java/org/toop/framework/resource/types/PreloadResource.java index bf4fafd..28f8734 100644 --- a/framework/src/main/java/org/toop/framework/asset/types/PreloadResource.java +++ b/framework/src/main/java/org/toop/framework/resource/types/PreloadResource.java @@ -1,6 +1,6 @@ -package org.toop.framework.asset.types; +package org.toop.framework.resource.types; -import org.toop.framework.asset.ResourceLoader; +import org.toop.framework.resource.ResourceLoader; /** * Marker interface for resources that should be **automatically loaded** by the {@link