From 2175ea849fc25d9632a337519981d3008336a703 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Jul 2021 22:09:05 -0700 Subject: [PATCH] only failthrough on FailThroughEvent --- .../dfsek/terra/api/event/events/FailThroughEvent.java | 8 ++++++++ .../event/events/config/ConfigurationDiscoveryEvent.java | 3 ++- .../api/event/events/config/ConfigurationLoadEvent.java | 3 ++- .../api/event/events/config/pack/ConfigPackLoadEvent.java | 3 ++- .../api/event/events/config/type/ConfigTypeLoadEvent.java | 3 ++- .../event/events/config/type/ConfigTypePostLoadEvent.java | 2 +- .../event/events/config/type/ConfigTypePreLoadEvent.java | 2 +- .../com/dfsek/terra/event/FunctionalEventHandlerImpl.java | 3 ++- 8 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java new file mode 100644 index 000000000..6c917c538 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.event.events; + +/** + * An event which (optionally) passes exceptions thrown by listeners to + * the event caller. + */ +public interface FailThroughEvent extends Event { +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java index ada69920a..d1ecb3fcf 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.event.events.config; import com.dfsek.tectonic.config.Configuration; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.Loader; +import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; import java.util.function.BiConsumer; @@ -14,7 +15,7 @@ import java.util.function.Consumer; * Addons should listen to this event if they wish to add * another configuration format. */ -public class ConfigurationDiscoveryEvent implements PackEvent { +public class ConfigurationDiscoveryEvent implements PackEvent, FailThroughEvent { private final ConfigPack pack; private final Loader loader; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java index 2e5492291..b6486a137 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java @@ -4,6 +4,7 @@ import com.dfsek.tectonic.abstraction.AbstractConfiguration; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; +import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.util.reflection.ReflectionUtil; @@ -15,7 +16,7 @@ import java.util.function.Consumer; * Addons should listen to this event if they wish to add * config values to existing {@link ConfigType}s. */ -public class ConfigurationLoadEvent implements PackEvent { +public class ConfigurationLoadEvent implements PackEvent, FailThroughEvent { private final ConfigPack pack; private final AbstractConfiguration configuration; private final Consumer loader; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java index 78fc99f76..72382d3f3 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java @@ -3,12 +3,13 @@ package com.dfsek.terra.api.event.events.config.pack; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; /** * An event related to the loading process of config packs. */ -public abstract class ConfigPackLoadEvent implements PackEvent { +public abstract class ConfigPackLoadEvent implements PackEvent, FailThroughEvent { private final ConfigPack pack; private final ExceptionalConsumer configLoader; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java index bd1836beb..14a4d6d50 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java @@ -2,11 +2,12 @@ package com.dfsek.terra.api.event.events.config.type; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; +import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.reflection.ReflectionUtil; -public abstract class ConfigTypeLoadEvent implements PackEvent { +public abstract class ConfigTypeLoadEvent implements PackEvent, FailThroughEvent { private final ConfigType type; private final CheckedRegistry registry; diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java index d89306ab6..b00140387 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.CheckedRegistry; -public class ConfigTypePostLoadEvent extends ConfigTypeLoadEvent{ +public class ConfigTypePostLoadEvent extends ConfigTypeLoadEvent { public ConfigTypePostLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { super(type, registry, pack); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java index baaaee404..cab922dad 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.registry.CheckedRegistry; -public class ConfigTypePreLoadEvent extends ConfigTypeLoadEvent{ +public class ConfigTypePreLoadEvent extends ConfigTypeLoadEvent { public ConfigTypePreLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { super(type, registry, pack); } diff --git a/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java b/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java index 6e2b7fdc0..8ff120e2e 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java @@ -3,6 +3,7 @@ package com.dfsek.terra.event; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.event.events.Event; +import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.event.functional.EventContext; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; @@ -39,7 +40,7 @@ public class FunctionalEventHandlerImpl implements FunctionalEventHandler { ((EventContextImpl) context).handle(event); } } catch(Exception e) { - if(context.isFailThrough()) throw e; // Rethrow if it's fail-through. + if(context.isFailThrough() && event instanceof FailThroughEvent) throw e; // Rethrow if it's fail-through. StringWriter writer = new StringWriter(); e.printStackTrace(new PrintWriter(writer)); main.logger().warning("Exception occurred during event handling:");