From 36dff476ea510450d0d59f683d2a702c89335293 Mon Sep 17 00:00:00 2001 From: Siphalor Date: Sun, 2 Nov 2025 19:46:58 +0100 Subject: [PATCH] feat(weaver-pojo-presets-ext): Implement POJO weaving for presets --- tweed5-minecraft/bundle/build.gradle.kts | 1 + .../api/DefaultTweedMinecraftWeaving.java | 6 ++ .../api/FabricConfigContainerHelper.java | 22 +++++ tweed5/settings.gradle.kts | 1 + .../build.gradle.kts | 9 ++ .../gradle.properties | 2 + .../api/DefaultPresetWeavingProcessor.java | 48 +++++++++++ .../weaver/pojoext/presets/api/Preset.java | 12 +++ .../presets/api/PresetsWeavingProcessor.java | 75 +++++++++++++++++ .../pojoext/presets/api/package-info.java | 4 + .../api/PresetsWeavingProcessorTest.java | 82 +++++++++++++++++++ .../weaving/TweedPojoWeavingExtension.java | 2 + .../weaving/TweedPojoWeaverBootstrapper.java | 25 ++++-- 13 files changed, 283 insertions(+), 6 deletions(-) create mode 100644 tweed5/weaver-pojo-presets-extension/build.gradle.kts create mode 100644 tweed5/weaver-pojo-presets-extension/gradle.properties create mode 100644 tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/DefaultPresetWeavingProcessor.java create mode 100644 tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/Preset.java create mode 100644 tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessor.java create mode 100644 tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/package-info.java create mode 100644 tweed5/weaver-pojo-presets-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessorTest.java diff --git a/tweed5-minecraft/bundle/build.gradle.kts b/tweed5-minecraft/bundle/build.gradle.kts index 110498f..319d93b 100644 --- a/tweed5-minecraft/bundle/build.gradle.kts +++ b/tweed5-minecraft/bundle/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation("de.siphalor.tweed5:tweed5-serde-extension") implementation("de.siphalor.tweed5:tweed5-weaver-pojo") implementation("de.siphalor.tweed5:tweed5-weaver-pojo-attributes-extension") + implementation("de.siphalor.tweed5:tweed5-weaver-pojo-presets-extension") implementation("de.siphalor.tweed5:tweed5-weaver-pojo-serde-extension") implementation("de.siphalor.tweed5:tweed5-weaver-pojo-validation-extension") } diff --git a/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/DefaultTweedMinecraftWeaving.java b/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/DefaultTweedMinecraftWeaving.java index e1f4b2c..c67a20a 100644 --- a/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/DefaultTweedMinecraftWeaving.java +++ b/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/DefaultTweedMinecraftWeaving.java @@ -9,6 +9,8 @@ import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension; import de.siphalor.tweed5.defaultextensions.validationfallback.api.ValidationFallbackExtension; import de.siphalor.tweed5.weaver.pojo.api.annotation.*; import de.siphalor.tweed5.weaver.pojoext.attributes.api.AttributesPojoWeavingProcessor; +import de.siphalor.tweed5.weaver.pojoext.presets.api.DefaultPresetWeavingProcessor; +import de.siphalor.tweed5.weaver.pojoext.presets.api.PresetsWeavingProcessor; import de.siphalor.tweed5.weaver.pojoext.serde.api.auto.AutoReadWritePojoWeavingProcessor; import de.siphalor.tweed5.weaver.pojoext.serde.api.auto.DefaultReadWriteMappings; import de.siphalor.tweed5.weaver.pojoext.validation.api.ValidatorsPojoWeavingProcessor; @@ -26,7 +28,9 @@ import java.lang.annotation.Target; DefaultReadWriteMappings.class, CompoundWeaving.class }) +@PojoWeaving @TweedExtension(ReadWriteExtension.class) +@TweedExtension(PresetsExtension.class) @TweedExtension(ValidationExtension.class) @TweedExtension(ValidationFallbackExtension.class) @TweedExtension(AttributesExtension.class) @@ -34,6 +38,8 @@ import java.lang.annotation.Target; @PojoWeavingExtension(AutoReadWritePojoWeavingProcessor.class) @PojoWeavingExtension(ValidatorsPojoWeavingProcessor.class) @PojoWeavingExtension(AttributesPojoWeavingProcessor.class) +@PojoWeavingExtension(PresetsWeavingProcessor.class) +@PojoWeavingExtension(DefaultPresetWeavingProcessor.class) @DefaultWeavingExtensions @DefaultReadWriteMappings @CompoundWeaving diff --git a/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/FabricConfigContainerHelper.java b/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/FabricConfigContainerHelper.java index a0dc11b..467dc85 100644 --- a/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/FabricConfigContainerHelper.java +++ b/tweed5-minecraft/fabric-helper/src/main/java/de/siphalor/tweed5/fabric/helper/api/FabricConfigContainerHelper.java @@ -8,6 +8,7 @@ import de.siphalor.tweed5.dataapi.api.TweedDataWriter; import de.siphalor.tweed5.dataapi.api.TweedSerde; import de.siphalor.tweed5.defaultextensions.patch.api.PatchExtension; import de.siphalor.tweed5.defaultextensions.patch.api.PatchInfo; +import de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension; import de.siphalor.tweed5.patchwork.api.Patchwork; import lombok.Getter; import lombok.extern.apachecommons.CommonsLog; @@ -29,6 +30,7 @@ public class FabricConfigContainerHelper { private final ConfigContainer configContainer; private final ReadWriteExtension readWriteExtension; private final @Nullable PatchExtension patchExtension; + private final @Nullable PresetsExtension presetsExtension; private final TweedSerde serde; @Getter private final String modId; @@ -54,10 +56,16 @@ public class FabricConfigContainerHelper { this.readWriteExtension = configContainer.extension(ReadWriteExtension.class) .orElseThrow(() -> new IllegalStateException("ReadWriteExtension not declared in config container")); this.patchExtension = configContainer.extension(PatchExtension.class).orElse(null); + this.presetsExtension = configContainer.extension(PresetsExtension.class).orElse(null); this.serde = serde; this.modId = modId; } + public T loadAndUpdateInConfigDirectory() { + T defaultPresetValue = getDefaultPresetValue(); + return loadAndUpdateInConfigDirectory(() -> configContainer.rootEntry().deepCopy(defaultPresetValue)); + } + public T loadAndUpdateInConfigDirectory(Supplier defaultValueSupplier) { T configValue = readConfigInConfigDirectory(defaultValueSupplier); writeConfigInConfigDirectory(configValue); @@ -89,6 +97,11 @@ public class FabricConfigContainerHelper { } } + public T readConfigInConfigDirectory() { + T defaultPresetValue = getDefaultPresetValue(); + return readConfigInConfigDirectory(() -> configContainer.rootEntry().deepCopy(defaultPresetValue)); + } + public T readConfigInConfigDirectory(Supplier defaultValueSupplier) { File configFile = getConfigFile(); if (!configFile.exists()) { @@ -158,4 +171,13 @@ public class FabricConfigContainerHelper { } return tempConfigDirectory; } + + private T getDefaultPresetValue() { + if (presetsExtension == null) { + throw new IllegalStateException( + "No presets extension registered, either register such extension or provide a default value manually" + ); + } + return presetsExtension.presetValue(configContainer.rootEntry(), PresetsExtension.DEFAULT_PRESET_NAME); + } } diff --git a/tweed5/settings.gradle.kts b/tweed5/settings.gradle.kts index 48eb052..fca6060 100644 --- a/tweed5/settings.gradle.kts +++ b/tweed5/settings.gradle.kts @@ -32,6 +32,7 @@ includeNormalModule("type-utils") includeNormalModule("utils") includeNormalModule("weaver-pojo") includeNormalModule("weaver-pojo-attributes-extension") +includeNormalModule("weaver-pojo-presets-extension") includeNormalModule("weaver-pojo-serde-extension") includeNormalModule("weaver-pojo-validation-extension") diff --git a/tweed5/weaver-pojo-presets-extension/build.gradle.kts b/tweed5/weaver-pojo-presets-extension/build.gradle.kts new file mode 100644 index 0000000..c13cb2c --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("de.siphalor.tweed5.base-module") +} + +dependencies { + api(project(":tweed5-construct")) + api(project(":tweed5-default-extensions")) + api(project(":tweed5-weaver-pojo")) +} diff --git a/tweed5/weaver-pojo-presets-extension/gradle.properties b/tweed5/weaver-pojo-presets-extension/gradle.properties new file mode 100644 index 0000000..01ddfb1 --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/gradle.properties @@ -0,0 +1,2 @@ +module.name = Presets Extension for Tweed 5 Weaver POJO +module.description = Allows declaring presets on POJOs using annotations. diff --git a/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/DefaultPresetWeavingProcessor.java b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/DefaultPresetWeavingProcessor.java new file mode 100644 index 0000000..67b591c --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/DefaultPresetWeavingProcessor.java @@ -0,0 +1,48 @@ +package de.siphalor.tweed5.weaver.pojoext.presets.api; + +import de.siphalor.tweed5.core.api.container.ConfigContainer; +import de.siphalor.tweed5.core.api.entry.CompoundConfigEntry; +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension; +import de.siphalor.tweed5.weaver.pojo.api.weaving.TweedPojoWeavingExtension; +import lombok.RequiredArgsConstructor; +import lombok.extern.apachecommons.CommonsLog; + +@CommonsLog +@RequiredArgsConstructor +public class DefaultPresetWeavingProcessor implements TweedPojoWeavingExtension { + private final ConfigContainer configContainer; + + @Override + public void setup(SetupContext context) { + } + + @Override + public void afterWeave() { + PresetsExtension presetsExtension = configContainer.extension(PresetsExtension.class) + .orElseThrow(() -> new IllegalStateException( + "Can only use " + DefaultPresetWeavingProcessor.class.getSimpleName() + + " if " + PresetsExtension.class.getSimpleName() + " is registered" + )); + + if (presetsExtension.presetValue(configContainer.rootEntry(), PresetsExtension.DEFAULT_PRESET_NAME) != null) { + log.debug("Default preset already registered, skipping auto instantiation"); + return; + } + + T defaultValue = instantiateEntry(configContainer.rootEntry()); + + presetsExtension.presetValue(configContainer.rootEntry(), PresetsExtension.DEFAULT_PRESET_NAME, defaultValue); + } + + private T instantiateEntry(ConfigEntry entry) { + if (entry instanceof CompoundConfigEntry) { + return ((CompoundConfigEntry) entry).instantiateCompoundValue(); + } else { + throw new IllegalArgumentException( + "Can only determine default preset from instantiation for POJOs. " + + "Only apply " + getClass().getSimpleName() + " to POJOs." + ); + } + } +} diff --git a/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/Preset.java b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/Preset.java new file mode 100644 index 0000000..36e695e --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/Preset.java @@ -0,0 +1,12 @@ +package de.siphalor.tweed5.weaver.pojoext.presets.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Preset { + String value(); +} diff --git a/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessor.java b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessor.java new file mode 100644 index 0000000..69ec1ad --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessor.java @@ -0,0 +1,75 @@ +package de.siphalor.tweed5.weaver.pojoext.presets.api; + +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension; +import de.siphalor.tweed5.typeutils.api.type.ActualType; +import de.siphalor.tweed5.weaver.pojo.api.weaving.TweedPojoWeavingExtension; +import de.siphalor.tweed5.weaver.pojo.api.weaving.WeavingContext; +import lombok.extern.apachecommons.CommonsLog; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; + +@CommonsLog +public class PresetsWeavingProcessor implements TweedPojoWeavingExtension { + private static final int REQUIRED_FIELD_MODIFIERS = Modifier.STATIC | Modifier.FINAL; + + @Override + public void setup(SetupContext context) { + } + + @Override + public void afterWeaveEntry(ActualType valueType, ConfigEntry configEntry, WeavingContext context) { + Map presets = new HashMap<>(); + for (Field field : valueType.declaredType().getFields()) { + Preset presetAnnotation = field.getAnnotation(Preset.class); + if (presetAnnotation == null) { + continue; + } + + if ((field.getModifiers() & REQUIRED_FIELD_MODIFIERS) != REQUIRED_FIELD_MODIFIERS) { + log.warn( + "@Preset field " + field.getName() + " in class " + field.getDeclaringClass().getName() + + " is not static and final, skipping preset" + ); + continue; + } + + if (presets.containsKey(presetAnnotation.value())) { + log.warn( + "Duplicate preset name " + presetAnnotation.value() + " in class " + + field.getDeclaringClass().getName() + ", skipping preset" + ); + presets.remove(presetAnnotation.value()); + continue; + } + + if (!configEntry.valueClass().isAssignableFrom(field.getType())) { + log.warn( + "@Preset field " + field.getName() + " in class " + field.getDeclaringClass().getName() + + " has incompatible type, skipping preset" + ); + continue; + } + + try { + //noinspection unchecked + presets.put(presetAnnotation.value(), (T) field.get(null)); + } catch (IllegalAccessException e) { + log.warn( + "Failed to access preset field " + field.getName() + " in class " + + field.getDeclaringClass().getName(), + e + ); + } + } + + if (!presets.isEmpty()) { + PresetsExtension presetsExtension = configEntry.container().extension(PresetsExtension.class) + .orElseThrow(() -> new IllegalStateException("PresetsExtension not declared in config container")); + presets.forEach((name, value) -> presetsExtension.presetValue(configEntry, name, value)); + } + } +} diff --git a/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/package-info.java b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/package-info.java new file mode 100644 index 0000000..10cfa61 --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/presets/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojoext.presets.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5/weaver-pojo-presets-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessorTest.java b/tweed5/weaver-pojo-presets-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessorTest.java new file mode 100644 index 0000000..ee1dff7 --- /dev/null +++ b/tweed5/weaver-pojo-presets-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/presets/api/PresetsWeavingProcessorTest.java @@ -0,0 +1,82 @@ +package de.siphalor.tweed5.weaver.pojoext.presets.api; + +import de.siphalor.tweed5.core.api.container.ConfigContainer; +import de.siphalor.tweed5.core.api.entry.CompoundConfigEntry; +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension; +import de.siphalor.tweed5.weaver.pojo.api.annotation.*; +import de.siphalor.tweed5.weaver.pojo.impl.weaving.TweedPojoWeaverBootstrapper; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.junit.jupiter.api.Test; + +import static de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension.presetValue; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.type; + +class PresetsWeavingProcessorTest { + + @Test + void test() { + ConfigContainer configContainer = TweedPojoWeaverBootstrapper.create(Config.class).weave(); + configContainer.initialize(); + PresetsExtension presetsExtension = configContainer.extension(PresetsExtension.class).orElseThrow(); + + Config defaultPreset = + presetsExtension.presetValue(configContainer.rootEntry(), PresetsExtension.DEFAULT_PRESET_NAME); + Config presetA = presetsExtension.presetValue(configContainer.rootEntry(), "a"); + Config presetB = presetsExtension.presetValue(configContainer.rootEntry(), "b"); + + assertThat(defaultPreset).isEqualTo(new Config()); + assertThat(presetA).isEqualTo(Config.PRESET_A); + assertThat(presetB).isEqualTo(Config.PRESET_B); + + assertThat(configContainer.rootEntry()).asInstanceOf(type(CompoundConfigEntry.class)).satisfies( + compound -> assertThat(compound.subEntries().get("subConfig")) + .asInstanceOf(type(ConfigEntry.class)) + .satisfies( + entry -> assertThat(entry.call(presetValue(PresetsExtension.DEFAULT_PRESET_NAME))) + .isEqualTo(new SubConfig("DEFAULT")), + entry -> assertThat(entry.call(presetValue("a"))).isEqualTo(new SubConfig("AAA")), + entry -> assertThat(entry.call(presetValue("b"))).isEqualTo(new SubConfig("BBB")), + entry -> assertThat(entry.call(presetValue("special"))).isEqualTo(SubConfig.SPECIAL_PRESET) + ) + ); + } + + @PojoWeaving + @TweedExtension(PresetsExtension.class) + @PojoWeavingExtension(DefaultPresetWeavingProcessor.class) + @PojoWeavingExtension(PresetsWeavingProcessor.class) + @DefaultWeavingExtensions + @CompoundWeaving + // lombok + @NoArgsConstructor + @AllArgsConstructor + @EqualsAndHashCode + @ToString + public static class Config { + @Preset("a") + public static final Config PRESET_A = new Config("a", 1, true, new SubConfig("AAA")); + @Preset("b") + public static final Config PRESET_B = new Config("b", 2, false, new SubConfig("BBB")); + + public String string = "default"; + public int integer = 1234; + public boolean bool; + public SubConfig subConfig = new SubConfig("DEFAULT"); + } + + @CompoundWeaving + @NoArgsConstructor + @AllArgsConstructor + @EqualsAndHashCode + @ToString + public static class SubConfig { + @Preset("special") + public static final SubConfig SPECIAL_PRESET = new SubConfig("SPECIAL"); + public String value; + } +} diff --git a/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingExtension.java b/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingExtension.java index 17e2298..62e4c95 100644 --- a/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingExtension.java +++ b/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingExtension.java @@ -27,6 +27,8 @@ public interface TweedPojoWeavingExtension extends TweedPojoWeavingFunction { default void afterWeaveEntry(ActualType valueType, ConfigEntry configEntry, WeavingContext context) {} + default void afterWeave() {} + interface SetupContext { PatchworkPartAccess registerWeavingContextExtensionData(Class dataClass); } diff --git a/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java b/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java index 428b04a..778b41c 100644 --- a/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java +++ b/tweed5/weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java @@ -123,6 +123,8 @@ public class TweedPojoWeaverBootstrapper { configContainer.attachTree(rootEntry); + runAfterWeaveHooks(); + return configContainer; } @@ -145,7 +147,7 @@ public class TweedPojoWeaverBootstrapper { ) { extensionsData = extensionsData.copy(); - runBeforeWeaveHooks(valueType, extensionsData, protoContext); + runBeforeWeaveEntryHooks(valueType, extensionsData, protoContext); WeavingContext context = WeavingContext.builder() .parent(protoContext.parent()) @@ -161,7 +163,7 @@ public class TweedPojoWeaverBootstrapper { try { ConfigEntry configEntry = weavingExtension.weaveEntry(valueType, context); if (configEntry != null) { - runAfterWeaveHooks(valueType, configEntry, context); + runAfterWeaveEntryHooks(valueType, configEntry, context); return configEntry; } } catch (Exception e) { @@ -175,7 +177,12 @@ public class TweedPojoWeaverBootstrapper { throw new PojoWeavingException( "Failed to weave entry for " + valueType + " at " + Arrays.toString(context.path()) - + ": No matching weavers found" + + ": No matching weavers found.\n" + + "Registered weaving extensions: " + + weavingExtensions.stream() + .map(TweedPojoWeavingExtension::getClass) + .map(Class::getName) + .collect(Collectors.joining(", ")) ); } @@ -207,7 +214,7 @@ public class TweedPojoWeaverBootstrapper { try { ConfigEntry configEntry = weavingExtension.weaveEntry(valueType, context); if (configEntry != null) { - runAfterWeaveHooks(valueType, configEntry, context); + runAfterWeaveEntryHooks(valueType, configEntry, context); return configEntry; } } catch (Exception e) { @@ -225,7 +232,7 @@ public class TweedPojoWeaverBootstrapper { ); } - private void runBeforeWeaveHooks( + private void runBeforeWeaveEntryHooks( ActualType dataClass, Patchwork extensionsData, ProtoWeavingContext protoContext @@ -243,7 +250,7 @@ public class TweedPojoWeaverBootstrapper { } } - private void runAfterWeaveHooks(ActualType dataClass, ConfigEntry configEntry, WeavingContext context) { + private void runAfterWeaveEntryHooks(ActualType dataClass, ConfigEntry configEntry, WeavingContext context) { for (TweedPojoWeavingExtension weavingExtension : weavingExtensions) { try { weavingExtension.afterWeaveEntry(dataClass, configEntry, context); @@ -256,4 +263,10 @@ public class TweedPojoWeaverBootstrapper { } } } + + private void runAfterWeaveHooks() { + for (TweedPojoWeavingExtension weavingExtension : weavingExtensions) { + weavingExtension.afterWeave(); + } + } }