diff --git a/pom.xml b/pom.xml
index 2b0dc09..cedfc49 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,6 @@
game
1.0-SNAPSHOT
-
@@ -89,14 +88,9 @@
org.projectlombok
lombok
- 1.18.38
+ 1.18.42
provided
-
- org.junit.jupiter
- junit-jupiter
- 5.8.2
-
org.reflections
@@ -107,25 +101,31 @@
com.google.guava
guava
- 31.1-jre
+ 33.5.0-jre
- com.fasterxml.jackson.core
+ tools.jackson.core
jackson-databind
- 2.18.2
+ 3.0.4
- com.fasterxml.jackson.dataformat
+ tools.jackson.dataformat
jackson-dataformat-yaml
- 2.18.2
+ 3.0.4
- junit
- junit
- 4.13.2
+ org.junit.jupiter
+ junit-jupiter
+ 6.0.2
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 6.0.2
test
@@ -134,21 +134,18 @@
slf4j-api
2.0.17
+
ch.qos.logback
logback-classic
- 1.5.18
+ 1.5.25
+
com.github.trilarion
java-vorbis-support
1.2.1
-
- com.esotericsoftware
- kryo
- 5.6.2
-
com.googlecode.lanterna
@@ -159,13 +156,13 @@
org.bytedeco
javacv-platform
- 1.5.10
+ 1.5.12
org.bytedeco
ffmpeg-platform
- 6.1.1-1.5.10
+ 7.1.1-1.5.12
@@ -173,6 +170,7 @@
core
2.5
+
be.tarsos.dsp
jvm
diff --git a/src/main/java/cz/jzitnik/Game.java b/src/main/java/cz/jzitnik/Game.java
index 55f2c52..1e26c6d 100644
--- a/src/main/java/cz/jzitnik/Game.java
+++ b/src/main/java/cz/jzitnik/Game.java
@@ -8,6 +8,8 @@ import cz.jzitnik.utils.ScheduledTaskManager;
import cz.jzitnik.utils.ThreadManager;
import org.reflections.Reflections;
+import java.io.IOException;
+
public class Game {
private final DependencyManager dependencyManager = new DependencyManager(new Reflections("cz.jzitnik"));
@@ -22,14 +24,10 @@ public class Game {
@InjectDependency
private GlobalIOHandlerRepository globalIOHandlerRepository;
- public void start() {
+ public void start() throws IOException {
dependencyManager.inject(this);
- try {
- gameSetup.setup();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ gameSetup.setup();
threadManager.startAll();
scheduledTaskManager.startAll();
globalIOHandlerRepository.setup();
diff --git a/src/main/java/cz/jzitnik/Main.java b/src/main/java/cz/jzitnik/Main.java
index b320606..a649b6d 100644
--- a/src/main/java/cz/jzitnik/Main.java
+++ b/src/main/java/cz/jzitnik/Main.java
@@ -2,8 +2,10 @@ package cz.jzitnik;
// events/handlers/MouseMoveEventHandler.java
+import java.io.IOException;
+
public class Main {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IOException {
new Game().start();
}
}
\ No newline at end of file
diff --git a/src/main/java/cz/jzitnik/game/setup/GameSetup.java b/src/main/java/cz/jzitnik/game/setup/GameSetup.java
index e7f7ed1..b6cff1a 100644
--- a/src/main/java/cz/jzitnik/game/setup/GameSetup.java
+++ b/src/main/java/cz/jzitnik/game/setup/GameSetup.java
@@ -1,7 +1,5 @@
package cz.jzitnik.game.setup;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
import cz.jzitnik.annotations.Dependency;
import cz.jzitnik.annotations.injectors.InjectDependency;
import cz.jzitnik.annotations.injectors.InjectState;
@@ -9,7 +7,11 @@ import cz.jzitnik.game.GameRoom;
import cz.jzitnik.game.GameState;
import cz.jzitnik.game.Player;
import cz.jzitnik.game.ResourceManager;
+import cz.jzitnik.utils.DependencyManager;
import lombok.extern.slf4j.Slf4j;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectReader;
import java.io.IOException;
import java.util.List;
@@ -26,15 +28,22 @@ public class GameSetup {
@InjectDependency
private ObjectMapper objectMapper;
+ @InjectDependency
+ private DependencyManager dependencyManager;
+
public void setup() throws IOException {
//gameState.setScreen(new IntroScene(dependencyManager));
- List rooms = objectMapper.readValue(
- resourceManager.getResourceAsStream("setup/rooms.yaml"),
- new TypeReference<>() {
+ ObjectReader roomsReader = objectMapper.readerFor(
+ new TypeReference>() {
}
+ ).with(dependencyManager);
+ List rooms = roomsReader.readValue(
+ resourceManager.getResourceAsStream("setup/rooms.yaml")
);
- Player player = objectMapper.readValue(resourceManager.getResourceAsStream("setup/player.yaml"), Player.class);
+
+ ObjectReader playerReader = objectMapper.readerFor(Player.class).with(dependencyManager);
+ Player player = playerReader.readValue(resourceManager.getResourceAsStream("setup/player.yaml"));
gameState.setCurrentRoom(rooms.getFirst());
gameState.setPlayer(player);
diff --git a/src/main/java/cz/jzitnik/utils/DependencyManager.java b/src/main/java/cz/jzitnik/utils/DependencyManager.java
index b75875e..df403be 100644
--- a/src/main/java/cz/jzitnik/utils/DependencyManager.java
+++ b/src/main/java/cz/jzitnik/utils/DependencyManager.java
@@ -3,8 +3,6 @@ package cz.jzitnik.utils;
// Don't blame me that I'm using field injection instead of construction injection. I just like it more, leave me alone.
// Yes, I know I'll suffer in the unit tests. (who said there will be any? hmmm)
-import com.fasterxml.jackson.databind.*;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.MutableClassToInstanceMap;
import cz.jzitnik.annotations.Config;
@@ -15,8 +13,10 @@ import cz.jzitnik.annotations.injectors.InjectDependency;
import cz.jzitnik.annotations.injectors.InjectState;
import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.*;
+import tools.jackson.dataformat.yaml.YAMLFactory;
-import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -31,22 +31,17 @@ public class DependencyManager extends InjectableValues {
public DependencyManager(Reflections reflections) {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- mapper.setInjectableValues(this);
data.put(ObjectMapper.class, mapper);
data.put(ClassLoader.class, DependencyManager.class.getClassLoader());
Set> configClasses = reflections.getTypesAnnotatedWith(Config.class);
for (Class> configClass : configClasses) {
- try {
- Config config = configClass.getAnnotation(Config.class);
- assert config != null;
- Path filePath = Path.of("config", config.value());
- InputStream stream = DependencyManager.class.getClassLoader().getResourceAsStream(filePath.toString());
- Object instance = mapper.readValue(stream, configClass);
- configs.put(configClass, instance);
- } catch (IOException e) {
- log.error("Failed to instantiate config class: {}", configClass.getName(), e);
- }
+ Config config = configClass.getAnnotation(Config.class);
+ assert config != null;
+ Path filePath = Path.of("config", config.value());
+ InputStream stream = DependencyManager.class.getClassLoader().getResourceAsStream(filePath.toString());
+ Object instance = mapper.readValue(stream, configClass);
+ configs.put(configClass, instance);
}
Set> classes = reflections.getTypesAnnotatedWith(Dependency.class);
@@ -197,10 +192,7 @@ public class DependencyManager extends InjectableValues {
}
@Override
- public Object findInjectableValue(Object valueId,
- DeserializationContext ctxt,
- BeanProperty forProperty,
- Object beanInstance) throws JsonMappingException {
+ public Object findInjectableValue(DeserializationContext ctxt, Object valueId, BeanProperty forProperty, Object beanInstance, Boolean optional, Boolean useInput) throws JacksonException {
if (valueId instanceof Class> clazz) {
Object dep = data.getInstance(clazz);
if (dep != null) return dep;
@@ -210,6 +202,9 @@ public class DependencyManager extends InjectableValues {
if (clazz == this.getClass()) return this;
+ if (optional) {
+ return null;
+ }
ctxt.reportInputMismatch(forProperty,
"No injectable value found for type: %s", clazz.getName());
} else if (valueId instanceof String key) {
@@ -220,14 +215,25 @@ public class DependencyManager extends InjectableValues {
if (dep.getClass().getName().equalsIgnoreCase(key)) return dep;
}
+ if (optional) {
+ return null;
+ }
+
ctxt.reportInputMismatch(forProperty,
"No injectable value found for key: %s", key);
- } else {
- ctxt.reportInputMismatch(forProperty,
- "Unrecognized inject value id type (%s), expecting Class or String",
- valueId.getClass().getName());
+ } else if (optional) {
+ return null;
}
+ ctxt.reportInputMismatch(forProperty,
+ "Unrecognized inject value id type (%s), expecting Class or String",
+ valueId.getClass().getName());
+
+ return null;
+ }
+
+ @Override
+ public InjectableValues snapshot() {
return null;
}
}