From d6a83c8b61beb7837ea247f80decd3118a491dd0 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 24 Nov 2022 23:09:00 -0600 Subject: [PATCH] Fix event related null pointer issues --- .../abstractEvents/DhApiAfterDhInitEvent.java | 14 ++------ .../abstractEvents/DhApiAfterRenderEvent.java | 12 ++----- .../DhApiBeforeDhInitEvent.java | 12 ++----- .../DhApiBeforeRenderEvent.java | 12 ++----- .../abstractEvents/DhApiLevelLoadEvent.java | 12 ++----- .../abstractEvents/DhApiLevelSaveEvent.java | 12 ++----- .../abstractEvents/DhApiLevelUnloadEvent.java | 12 ++----- .../DependencyInjection/ApiEventInjector.java | 4 +-- .../events/ApiEventDefinitionHandler.java | 32 ++++++++++++++----- .../DhApiOneTimeTestEvent.java | 14 ++------ .../abstractObjects/DhApiTestEvent.java | 14 ++------ .../test/java/tests/EventInjectorTest.java | 16 ++++++---- 12 files changed, 55 insertions(+), 111 deletions(-) diff --git a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterDhInitEvent.java b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterDhInitEvent.java index c4b503282..0891a8384 100644 --- a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterDhInitEvent.java +++ b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterDhInitEvent.java @@ -24,17 +24,9 @@ public abstract class DhApiAfterDhInitEvent implements IDhApiEvent this.afterDistantHorizonsInit(); return false; } - - private static boolean firstTimeSetupComplete = false; - public DhApiAfterDhInitEvent() - { - if (!firstTimeSetupComplete) - { - firstTimeSetupComplete = true; - ApiEventDefinitionHandler.setEventDefinition(DhApiAfterDhInitEvent.class, new DhApiEventDefinition(false, true)); - } - } + + public final static DhApiEventDefinition EVENT_DEFINITION = new DhApiEventDefinition(false, true); @Override - public final DhApiEventDefinition getEventDefinition() { return ApiEventDefinitionHandler.getEventDefinition(DhApiAfterDhInitEvent.class); } + public final DhApiEventDefinition getEventDefinition() { return EVENT_DEFINITION; } } \ No newline at end of file diff --git a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterRenderEvent.java b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterRenderEvent.java index 371f0210e..afcb8ecb9 100644 --- a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterRenderEvent.java +++ b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiAfterRenderEvent.java @@ -26,17 +26,9 @@ public abstract class DhApiAfterRenderEvent implements IDhApiEvent return false; } - private static boolean firstTimeSetupComplete = false; - public DhApiBeforeDhInitEvent() - { - if (!firstTimeSetupComplete) - { - firstTimeSetupComplete = true; - ApiEventDefinitionHandler.setEventDefinition(DhApiBeforeDhInitEvent.class, new DhApiEventDefinition(false, true)); - } - } + public final static DhApiEventDefinition EVENT_DEFINITION = new DhApiEventDefinition(false, true); @Override - public final DhApiEventDefinition getEventDefinition() { return ApiEventDefinitionHandler.getEventDefinition(DhApiBeforeDhInitEvent.class); } + public final DhApiEventDefinition getEventDefinition() { return EVENT_DEFINITION; } } \ No newline at end of file diff --git a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiBeforeRenderEvent.java b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiBeforeRenderEvent.java index 76df6697c..0df7904e3 100644 --- a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiBeforeRenderEvent.java +++ b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiBeforeRenderEvent.java @@ -26,17 +26,9 @@ public abstract class DhApiBeforeRenderEvent implements IDhApiEvent implements public void bind(Class abstractEvent, IDhApiEvent eventImplementation) throws IllegalStateException, IllegalArgumentException { // is this a one time event? - if (ApiEventDefinitionHandler.getEventDefinition(abstractEvent).isOneTimeEvent) + if (ApiEventDefinitionHandler.INSTANCE.getEventDefinition(abstractEvent).isOneTimeEvent) { // has this one time event been fired yet? if (firedOneTimeEventParamsByEventInterface.containsKey(abstractEvent)) @@ -120,7 +120,7 @@ public class ApiEventInjector extends DependencyInjector implements boolean cancelEvent = false; // if this is a one time event, record that it was called - if (ApiEventDefinitionHandler.getEventDefinition(abstractEvent).isOneTimeEvent && + if (ApiEventDefinitionHandler.INSTANCE.getEventDefinition(abstractEvent).isOneTimeEvent && !firedOneTimeEventParamsByEventInterface.containsKey(abstractEvent)) { firedOneTimeEventParamsByEventInterface.put(abstractEvent, eventParameterObject); diff --git a/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java b/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java index 17a7e2237..d55749977 100644 --- a/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java +++ b/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java @@ -19,7 +19,7 @@ package com.seibel.lod.core.events; -import com.seibel.lod.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent; +import com.seibel.lod.api.methods.events.abstractEvents.*; import com.seibel.lod.api.methods.events.interfaces.IDhApiEvent; import com.seibel.lod.api.objects.events.DhApiEventDefinition; import org.apache.logging.log4j.LogManager; @@ -45,7 +45,20 @@ public class ApiEventDefinitionHandler - private ApiEventDefinitionHandler() { } + private ApiEventDefinitionHandler() { this.addInitialBindings(); } + + public void addInitialBindings() + { + this.setEventDefinition(DhApiAfterDhInitEvent.class, DhApiAfterDhInitEvent.EVENT_DEFINITION); + this.setEventDefinition(DhApiAfterRenderEvent.class, DhApiAfterRenderEvent.EVENT_DEFINITION); + this.setEventDefinition(DhApiBeforeDhInitEvent.class, DhApiBeforeDhInitEvent.EVENT_DEFINITION); + this.setEventDefinition(DhApiBeforeRenderEvent.class, DhApiBeforeRenderEvent.EVENT_DEFINITION); + this.setEventDefinition(DhApiLevelLoadEvent.class, DhApiLevelLoadEvent.EVENT_DEFINITION); + this.setEventDefinition(DhApiLevelSaveEvent.class, DhApiLevelSaveEvent.EVENT_DEFINITION); + this.setEventDefinition(DhApiLevelUnloadEvent.class, DhApiLevelUnloadEvent.EVENT_DEFINITION); + + } + /** * This should only be used for unit testing. @@ -55,24 +68,27 @@ public class ApiEventDefinitionHandler - public static void setEventDefinition(Class eventInterface, DhApiEventDefinition definition) + public void setEventDefinition(Class eventInterface, DhApiEventDefinition definition) { - if (INSTANCE.DEFINITIONS_BY_EVENT_INTERFACE.containsKey(eventInterface)) + if (this.DEFINITIONS_BY_EVENT_INTERFACE.containsKey(eventInterface)) { LOGGER.warn("duplicate key added [" + eventInterface.getSimpleName() + "]"); } - INSTANCE.DEFINITIONS_BY_EVENT_INTERFACE.put(eventInterface, definition); + this.DEFINITIONS_BY_EVENT_INTERFACE.put(eventInterface, definition); } - public static DhApiEventDefinition getEventDefinition(Class eventInterface) + public DhApiEventDefinition getEventDefinition(Class eventInterface) { - if (!INSTANCE.DEFINITIONS_BY_EVENT_INTERFACE.containsKey(eventInterface)) + if (!this.DEFINITIONS_BY_EVENT_INTERFACE.containsKey(eventInterface)) { + // attempt to get the definition for this class + + throw new NullPointerException("event definition missing for: [" + eventInterface.getSimpleName() + "]"); } - return INSTANCE.DEFINITIONS_BY_EVENT_INTERFACE.get(eventInterface); + return this.DEFINITIONS_BY_EVENT_INTERFACE.get(eventInterface); } } diff --git a/api/src/test/java/testItems/events/abstractObjects/DhApiOneTimeTestEvent.java b/api/src/test/java/testItems/events/abstractObjects/DhApiOneTimeTestEvent.java index b5ab57285..76eef0c40 100644 --- a/api/src/test/java/testItems/events/abstractObjects/DhApiOneTimeTestEvent.java +++ b/api/src/test/java/testItems/events/abstractObjects/DhApiOneTimeTestEvent.java @@ -2,7 +2,6 @@ package testItems.events.abstractObjects; import com.seibel.lod.api.methods.events.interfaces.IDhApiEvent; import com.seibel.lod.api.objects.events.DhApiEventDefinition; -import com.seibel.lod.core.events.ApiEventDefinitionHandler; /** * A dummy event implementation used for unit testing. @@ -30,17 +29,8 @@ public abstract class DhApiOneTimeTestEvent implements IDhApiEvent return input; } - public static boolean firstTimeSetupComplete = false; - public DhApiOneTimeTestEvent() - { - if (!firstTimeSetupComplete) - { - firstTimeSetupComplete = true; - ApiEventDefinitionHandler.setEventDefinition(DhApiOneTimeTestEvent.class, new DhApiEventDefinition(false, true)); - } - } - + public final static DhApiEventDefinition EVENT_DEFINITION = new DhApiEventDefinition(false, true); @Override - public final DhApiEventDefinition getEventDefinition() { return ApiEventDefinitionHandler.getEventDefinition(DhApiOneTimeTestEvent.class); } + public final DhApiEventDefinition getEventDefinition() { return EVENT_DEFINITION; } } \ No newline at end of file diff --git a/api/src/test/java/testItems/events/abstractObjects/DhApiTestEvent.java b/api/src/test/java/testItems/events/abstractObjects/DhApiTestEvent.java index 5469f1ece..c5bd373e3 100644 --- a/api/src/test/java/testItems/events/abstractObjects/DhApiTestEvent.java +++ b/api/src/test/java/testItems/events/abstractObjects/DhApiTestEvent.java @@ -2,7 +2,6 @@ package testItems.events.abstractObjects; import com.seibel.lod.api.methods.events.interfaces.IDhApiEvent; import com.seibel.lod.api.objects.events.DhApiEventDefinition; -import com.seibel.lod.core.events.ApiEventDefinitionHandler; /** * A dummy event implementation used for unit testing. @@ -31,17 +30,8 @@ public abstract class DhApiTestEvent implements IDhApiEvent return input; } - public static boolean firstTimeSetupComplete = false; - public DhApiTestEvent() - { - if (!firstTimeSetupComplete) - { - firstTimeSetupComplete = true; - ApiEventDefinitionHandler.setEventDefinition(DhApiTestEvent.class, new DhApiEventDefinition(false, false)); - } - } - + public final static DhApiEventDefinition EVENT_DEFINITION = new DhApiEventDefinition(false, false); @Override - public final DhApiEventDefinition getEventDefinition() { return ApiEventDefinitionHandler.getEventDefinition(DhApiTestEvent.class); } + public final DhApiEventDefinition getEventDefinition() { return EVENT_DEFINITION; } } \ No newline at end of file diff --git a/api/src/test/java/tests/EventInjectorTest.java b/api/src/test/java/tests/EventInjectorTest.java index 884daacd1..63813f03a 100644 --- a/api/src/test/java/tests/EventInjectorTest.java +++ b/api/src/test/java/tests/EventInjectorTest.java @@ -1,13 +1,12 @@ package tests; +import com.seibel.lod.api.methods.events.abstractEvents.DhApiAfterDhInitEvent; import com.seibel.lod.api.objects.events.DhApiEventDefinition; import com.seibel.lod.core.DependencyInjection.ApiEventInjector; import com.seibel.lod.core.events.ApiEventDefinitionHandler; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Order; import testItems.events.abstractObjects.DhApiOneTimeTestEvent; import testItems.events.objects.DhOneTimeTestEventHandler; import testItems.events.objects.DhOneTimeTestEventHandlerAlt; @@ -31,8 +30,12 @@ public class EventInjectorTest ApiEventInjector.INSTANCE.clear(); ApiEventDefinitionHandler.INSTANCE.clear(); - DhApiTestEvent.firstTimeSetupComplete = false; - DhApiOneTimeTestEvent.firstTimeSetupComplete = false; + + // register test events + ApiEventDefinitionHandler.INSTANCE.setEventDefinition(DhApiTestEvent.class, DhApiTestEvent.EVENT_DEFINITION); + ApiEventDefinitionHandler.INSTANCE.setEventDefinition(DhApiOneTimeTestEvent.class, DhApiOneTimeTestEvent.EVENT_DEFINITION); + ApiEventDefinitionHandler.INSTANCE.addInitialBindings(); + } @@ -108,8 +111,9 @@ public class EventInjectorTest public void testEventDefinition() { String errorMessagePrefix = "Missing " + DhApiEventDefinition.class.getSimpleName() + " for event class ["; - Assert.assertNotNull(errorMessagePrefix + DhApiTestEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.getEventDefinition(DhApiTestEvent.class)); - Assert.assertNotNull(errorMessagePrefix + DhApiOneTimeTestEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.getEventDefinition(DhApiOneTimeTestEvent.class)); + Assert.assertNotNull(errorMessagePrefix + DhApiTestEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.INSTANCE.getEventDefinition(DhApiTestEvent.class)); + Assert.assertNotNull(errorMessagePrefix + DhApiOneTimeTestEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.INSTANCE.getEventDefinition(DhApiOneTimeTestEvent.class)); + Assert.assertNotNull(errorMessagePrefix + DhApiAfterDhInitEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.INSTANCE.getEventDefinition(DhApiAfterDhInitEvent.class)); } @Test