From a413fab8d51471f20935a2be190a54336d484a36 Mon Sep 17 00:00:00 2001 From: Siphalor Date: Sun, 12 Apr 2026 18:27:07 +0200 Subject: [PATCH] refactor!(core): Add context parameter to Middleware --- ...ttributesReadWriteFilterExtensionImpl.java | 28 ++++----- .../impl/CommentLoaderExtensionImpl.java | 10 +++- .../DefaultMiddlewareContainer.java | 31 +++++++--- .../core/api/middleware/Middleware.java | 14 ++++- .../api/middleware/MiddlewareContainer.java | 8 +-- .../api/CommentModifyingExtension.java | 2 +- .../api/CommentProducerMiddlewareContext.java | 14 +++++ .../comment/impl/CommentExtensionImpl.java | 8 ++- .../TweedEntryWriterCommentMiddleware.java | 13 +++-- .../patch/impl/PatchExtensionImpl.java | 11 ++-- .../pather/impl/PatherExtensionImpl.java | 34 +++++------ .../impl/ReadFallbackExtensionImpl.java | 11 ++-- .../validation/api/ValidationExtension.java | 6 +- .../api/ValidationProvidingExtension.java | 2 +- .../api/ValidatorMiddlewareContext.java | 13 +++++ .../validators/SimpleValidatorMiddleware.java | 5 +- .../impl/ValidationExtensionImpl.java | 57 ++++++++++++------- .../impl/ValidationFallbackExtensionImpl.java | 7 ++- .../impl/CommentExtensionImplTest.java | 5 +- .../ReadWriteExtensionSetupContext.java | 4 +- .../extension/ReaderMiddlewareContext.java | 11 ++++ .../extension/WriterMiddlewareContext.java | 14 +++++ .../impl/ReadWriteExtensionImpl.java | 36 +++++++----- 23 files changed, 234 insertions(+), 110 deletions(-) create mode 100644 tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentProducerMiddlewareContext.java create mode 100644 tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidatorMiddlewareContext.java create mode 100644 tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReaderMiddlewareContext.java create mode 100644 tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/WriterMiddlewareContext.java diff --git a/tweed5/attributes-extension/src/main/java/de/siphalor/tweed5/attributesextension/impl/serde/filter/AttributesReadWriteFilterExtensionImpl.java b/tweed5/attributes-extension/src/main/java/de/siphalor/tweed5/attributesextension/impl/serde/filter/AttributesReadWriteFilterExtensionImpl.java index 7dd05e5..840b52a 100644 --- a/tweed5/attributes-extension/src/main/java/de/siphalor/tweed5/attributesextension/impl/serde/filter/AttributesReadWriteFilterExtensionImpl.java +++ b/tweed5/attributes-extension/src/main/java/de/siphalor/tweed5/attributesextension/impl/serde/filter/AttributesReadWriteFilterExtensionImpl.java @@ -15,6 +15,8 @@ import de.siphalor.tweed5.serde.extension.api.TweedEntryReader; import de.siphalor.tweed5.serde.extension.api.TweedEntryWriter; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteExtensionSetupContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteRelatedExtension; +import de.siphalor.tweed5.serde.extension.api.extension.ReaderMiddlewareContext; +import de.siphalor.tweed5.serde.extension.api.extension.WriterMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult; import de.siphalor.tweed5.serde.extension.impl.TweedEntryReaderWriterImpls; import de.siphalor.tweed5.serde_api.api.DelegatingTweedDataWriter; @@ -158,7 +160,7 @@ public class AttributesReadWriteFilterExtensionImpl } } - private class ReaderMiddleware implements Middleware> { + private class ReaderMiddleware implements Middleware, ReaderMiddlewareContext> { @Override public String id() { return EXTENSION_ID; @@ -175,28 +177,28 @@ public class AttributesReadWriteFilterExtensionImpl } @Override - public TweedEntryReader process(TweedEntryReader inner) { + public TweedEntryReader process(TweedEntryReader inner, ReaderMiddlewareContext context) { assert readWriteContextDataAccess != null; //noinspection unchecked TweedEntryReader> innerCasted = (TweedEntryReader>) inner; - return (TweedEntryReader>) (reader, entry, context) -> { - ReadWriteContextCustomData contextData = context.extensionsData().get(readWriteContextDataAccess); + return (TweedEntryReader>) (reader, entry, readContext) -> { + ReadWriteContextCustomData contextData = readContext.extensionsData().get(readWriteContextDataAccess); if (contextData == null) { contextData = new ReadWriteContextCustomData(); - context.extensionsData().set(readWriteContextDataAccess, contextData); + readContext.extensionsData().set(readWriteContextDataAccess, contextData); } if (!doFiltersMatch(entry, contextData)) { - TweedEntryReaderWriterImpls.NOOP_READER_WRITER.read(reader, entry, context); + TweedEntryReaderWriterImpls.NOOP_READER_WRITER.read(reader, entry, readContext); return TweedReadResult.empty(); } - return innerCasted.read(reader, entry, context); + return innerCasted.read(reader, entry, readContext); }; } } - private class WriterMiddleware implements Middleware> { + private class WriterMiddleware implements Middleware, WriterMiddlewareContext> { @Override public String id() { return EXTENSION_ID; @@ -213,18 +215,18 @@ public class AttributesReadWriteFilterExtensionImpl } @Override - public TweedEntryWriter process(TweedEntryWriter inner) { + public TweedEntryWriter process(TweedEntryWriter inner, WriterMiddlewareContext context) { assert readWriteContextDataAccess != null; //noinspection unchecked TweedEntryWriter> innerCasted = (TweedEntryWriter>) inner; return (TweedEntryWriter<@Nullable Object, @NonNull ConfigEntry<@Nullable Object>>) - (writer, value, entry, context) -> { - ReadWriteContextCustomData contextData = context.extensionsData() + (writer, value, entry, writeContext) -> { + ReadWriteContextCustomData contextData = writeContext.extensionsData() .get(readWriteContextDataAccess); if (contextData == null || contextData.attributeFilters().isEmpty()) { - innerCasted.write(writer, value, entry, context); + innerCasted.write(writer, value, entry, writeContext); return; } @@ -234,7 +236,7 @@ public class AttributesReadWriteFilterExtensionImpl } if (doFiltersMatch(entry, contextData)) { - innerCasted.write(writer, value, entry, context); + innerCasted.write(writer, value, entry, writeContext); } else { try { writer.visitValue(TWEED_DATA_NOTHING_VALUE); diff --git a/tweed5/comment-loader-extension/src/main/java/de/siphalor/tweed5/commentloaderextension/impl/CommentLoaderExtensionImpl.java b/tweed5/comment-loader-extension/src/main/java/de/siphalor/tweed5/commentloaderextension/impl/CommentLoaderExtensionImpl.java index 8fe1de4..76e5aa2 100644 --- a/tweed5/comment-loader-extension/src/main/java/de/siphalor/tweed5/commentloaderextension/impl/CommentLoaderExtensionImpl.java +++ b/tweed5/comment-loader-extension/src/main/java/de/siphalor/tweed5/commentloaderextension/impl/CommentLoaderExtensionImpl.java @@ -6,6 +6,7 @@ import de.siphalor.tweed5.core.api.container.ConfigContainer; import de.siphalor.tweed5.core.api.container.ConfigContainerSetupPhase; import de.siphalor.tweed5.core.api.extension.TweedExtensionSetupContext; import de.siphalor.tweed5.core.api.middleware.Middleware; +import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducerMiddlewareContext; import de.siphalor.tweed5.serde_api.api.IntuitiveVisitingTweedDataReader; import de.siphalor.tweed5.serde_api.api.TweedDataReadException; import de.siphalor.tweed5.serde_api.api.TweedDataReader; @@ -44,8 +45,8 @@ public class CommentLoaderExtensionImpl implements CommentLoaderExtension, Comme } @Override - public Middleware commentMiddleware() { - return new Middleware() { + public Middleware commentMiddleware() { + return new Middleware() { @Override public String id() { return EXTENSION_ID; @@ -62,7 +63,10 @@ public class CommentLoaderExtensionImpl implements CommentLoaderExtension, Comme } @Override - public CommentProducer process(CommentProducer inner) { + public CommentProducer process(CommentProducer inner, CommentProducerMiddlewareContext context) { + if (context.entry().extensionsData().get(loadedCommentAccess) == null) { + return inner; + } return entry -> { String loadedComment = entry.extensionsData().get(loadedCommentAccess); String innerComment = inner.createComment(entry); diff --git a/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/DefaultMiddlewareContainer.java b/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/DefaultMiddlewareContainer.java index eec35e6..16c2fcf 100644 --- a/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/DefaultMiddlewareContainer.java +++ b/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/DefaultMiddlewareContainer.java @@ -8,11 +8,11 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -public class DefaultMiddlewareContainer implements MiddlewareContainer { +public class DefaultMiddlewareContainer implements MiddlewareContainer { private static final String CONTAINER_ID = ""; @Getter - private List> middlewares = new ArrayList<>(); + private List> middlewares = new ArrayList<>(); private final Set middlewareIds = new HashSet<>(); private boolean sealed = false; @@ -22,10 +22,10 @@ public class DefaultMiddlewareContainer implements MiddlewareContainer { } @Override - public void registerAll(Collection> middlewares) { + public void registerAll(Collection> middlewares) { requireUnsealed(); - for (Middleware middleware : middlewares) { + for (Middleware middleware : middlewares) { if (middleware.id().isEmpty()) { throw new IllegalArgumentException("Middleware id cannot be empty"); } @@ -37,7 +37,7 @@ public class DefaultMiddlewareContainer implements MiddlewareContainer { } @Override - public void register(Middleware middleware) { + public void register(Middleware middleware) { requireUnsealed(); if (middleware.id().isEmpty()) { @@ -76,7 +76,7 @@ public class DefaultMiddlewareContainer implements MiddlewareContainer { AcyclicGraphSorter sorter = new AcyclicGraphSorter(allMentionedMiddlewareIds.length); - for (Middleware middleware : middlewares) { + for (Middleware middleware : middlewares) { Integer currentIndex = indecesByMiddlewareId.get(middleware.id()); middleware.mustComeAfter().stream() @@ -87,7 +87,8 @@ public class DefaultMiddlewareContainer implements MiddlewareContainer { .forEach(afterIndex -> sorter.addEdge(currentIndex, afterIndex)); } - Map> middlewaresById = middlewares.stream().collect(Collectors.toMap(Middleware::id, Function.identity())); + Map> middlewaresById = middlewares.stream() + .collect(Collectors.toMap(Middleware::id, Function.identity())); try { int[] sortedIndeces = sorter.sort(); @@ -107,13 +108,27 @@ public class DefaultMiddlewareContainer implements MiddlewareContainer { } @Override + public M process(M inner, C context) { + if (!sealed) { + throw new IllegalStateException("Middleware container has not been sealed"); + } + M combined = inner; + for (int i = middlewares.size() - 1; i >= 0; i--) { + Middleware middleware = middlewares.get(i); + combined = middleware.process(combined, context); + } + return combined; + } + + @Override + @Deprecated public M process(M inner) { if (!sealed) { throw new IllegalStateException("Middleware container has not been sealed"); } M combined = inner; for (int i = middlewares.size() - 1; i >= 0; i--) { - Middleware middleware = middlewares.get(i); + Middleware middleware = middlewares.get(i); combined = middleware.process(combined); } return combined; diff --git a/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/Middleware.java b/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/Middleware.java index 79d516f..1a50d11 100644 --- a/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/Middleware.java +++ b/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/Middleware.java @@ -1,9 +1,11 @@ package de.siphalor.tweed5.core.api.middleware; +import org.jetbrains.annotations.ApiStatus; + import java.util.Collections; import java.util.Set; -public interface Middleware { +public interface Middleware { String DEFAULT_START = "$default.start"; String DEFAULT_END = "$default.end"; @@ -16,5 +18,13 @@ public interface Middleware { return Collections.singleton(DEFAULT_START); } - M process(M inner); + default M process(M inner, C context) { + return process(inner); + } + + @Deprecated + @ApiStatus.OverrideOnly + default M process(M inner) { + return inner; + } } diff --git a/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/MiddlewareContainer.java b/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/MiddlewareContainer.java index 49ab684..174a534 100644 --- a/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/MiddlewareContainer.java +++ b/tweed5/core/src/main/java/de/siphalor/tweed5/core/api/middleware/MiddlewareContainer.java @@ -2,11 +2,11 @@ package de.siphalor.tweed5.core.api.middleware; import java.util.Collection; -public interface MiddlewareContainer extends Middleware { - default void registerAll(Collection> middlewares) { +public interface MiddlewareContainer extends Middleware { + default void registerAll(Collection> middlewares) { middlewares.forEach(this::register); } - void register(Middleware middleware); + void register(Middleware middleware); void seal(); - Collection> middlewares(); + Collection> middlewares(); } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentModifyingExtension.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentModifyingExtension.java index e00d8f6..433ce9d 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentModifyingExtension.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentModifyingExtension.java @@ -3,5 +3,5 @@ package de.siphalor.tweed5.defaultextensions.comment.api; import de.siphalor.tweed5.core.api.middleware.Middleware; public interface CommentModifyingExtension { - Middleware commentMiddleware(); + Middleware commentMiddleware(); } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentProducerMiddlewareContext.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentProducerMiddlewareContext.java new file mode 100644 index 0000000..4093a92 --- /dev/null +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentProducerMiddlewareContext.java @@ -0,0 +1,14 @@ +package de.siphalor.tweed5.defaultextensions.comment.api; + +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Value; + +@Value +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +public class CommentProducerMiddlewareContext { + ConfigEntry entry; +} diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java index 0b6122f..20e253c 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java @@ -6,6 +6,7 @@ import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.extension.TweedExtension; import de.siphalor.tweed5.core.api.extension.TweedExtensionSetupContext; import de.siphalor.tweed5.core.api.middleware.DefaultMiddlewareContainer; +import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducerMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteExtensionSetupContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteRelatedExtension; import de.siphalor.tweed5.defaultextensions.comment.api.CommentExtension; @@ -20,7 +21,7 @@ public class CommentExtensionImpl implements ReadWriteRelatedExtension, CommentE private final ConfigContainer configContainer; @Getter private final PatchworkPartAccess customEntryDataAccess; - private final DefaultMiddlewareContainer middlewareContainer; + private final DefaultMiddlewareContainer middlewareContainer; @Getter private @Nullable PatchworkPartAccess writerInstalledReadWriteContextAccess; @@ -71,7 +72,10 @@ public class CommentExtensionImpl implements ReadWriteRelatedExtension, CommentE public void recomputeFullComments() { configContainer.rootEntry().visitInOrder(entry -> { CustomEntryData entryData = getOrCreateCustomEntryData(entry); - entryData.commentProducer(middlewareContainer.process(_entry -> entryData.baseComment())); + entryData.commentProducer(middlewareContainer.process( + _entry -> entryData.baseComment(), + CommentProducerMiddlewareContext.builder().entry(entry).build() + )); }); } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java index c2a1058..1bfea9f 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java @@ -3,6 +3,7 @@ package de.siphalor.tweed5.defaultextensions.comment.impl; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.serde.extension.api.TweedEntryWriter; +import de.siphalor.tweed5.serde.extension.api.extension.WriterMiddlewareContext; import de.siphalor.tweed5.serde_api.api.DelegatingTweedDataWriter; import de.siphalor.tweed5.serde_api.api.TweedDataVisitor; import de.siphalor.tweed5.serde_api.api.decoration.TweedDataCommentDecoration; @@ -17,7 +18,7 @@ import java.util.ArrayDeque; import java.util.Deque; @RequiredArgsConstructor -class TweedEntryWriterCommentMiddleware implements Middleware> { +class TweedEntryWriterCommentMiddleware implements Middleware, WriterMiddlewareContext> { private final CommentExtensionImpl commentExtension; @Override @@ -26,15 +27,15 @@ class TweedEntryWriterCommentMiddleware implements Middleware process(TweedEntryWriter inner) { + public TweedEntryWriter process(TweedEntryWriter inner, WriterMiddlewareContext context) { PatchworkPartAccess writerInstalledAccess = commentExtension.writerInstalledReadWriteContextAccess(); assert writerInstalledAccess != null; //noinspection unchecked TweedEntryWriter> innerCasted = (TweedEntryWriter>) inner; - return (TweedEntryWriter>) (writer, value, entry, context) -> { - if (!Boolean.TRUE.equals(context.extensionsData().get(writerInstalledAccess))) { - context.extensionsData().set(writerInstalledAccess, Boolean.TRUE); + return (TweedEntryWriter>) (writer, value, entry, writeContext) -> { + if (!Boolean.TRUE.equals(writeContext.extensionsData().get(writerInstalledAccess))) { + writeContext.extensionsData().set(writerInstalledAccess, Boolean.TRUE); writer = new MapEntryKeyDeferringWriter(writer); } @@ -44,7 +45,7 @@ class TweedEntryWriterCommentMiddleware implements Middleware comment)); } - innerCasted.write(writer, value, entry, context); + innerCasted.write(writer, value, entry, writeContext); }; } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/patch/impl/PatchExtensionImpl.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/patch/impl/PatchExtensionImpl.java index 075f2ba..380e397 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/patch/impl/PatchExtensionImpl.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/patch/impl/PatchExtensionImpl.java @@ -6,6 +6,7 @@ import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.serde.extension.api.TweedEntryReader; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteExtensionSetupContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteRelatedExtension; +import de.siphalor.tweed5.serde.extension.api.extension.ReaderMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult; import de.siphalor.tweed5.defaultextensions.patch.api.PatchExtension; import de.siphalor.tweed5.defaultextensions.patch.api.PatchInfo; @@ -81,22 +82,22 @@ public class PatchExtensionImpl implements PatchExtension, ReadWriteRelatedExten } } - private class ReaderMiddleware implements Middleware> { + private class ReaderMiddleware implements Middleware, ReaderMiddlewareContext> { @Override public String id() { return "patch-info-collector"; } @Override - public TweedEntryReader process(TweedEntryReader inner) { + public TweedEntryReader process(TweedEntryReader inner, ReaderMiddlewareContext context) { assert readWriteContextDataAccess != null; //noinspection unchecked TweedEntryReader> innerCasted = (TweedEntryReader>) inner; - return (TweedEntryReader>) (reader, entry, context) -> { - TweedReadResult readResult = innerCasted.read(reader, entry, context); - ReadWriteContextCustomData customData = context.extensionsData().get(readWriteContextDataAccess); + return (TweedEntryReader>) (reader, entry, readContext) -> { + TweedReadResult readResult = innerCasted.read(reader, entry, readContext); + ReadWriteContextCustomData customData = readContext.extensionsData().get(readWriteContextDataAccess); if (customData != null && customData.patchInfo() != null) { customData.patchInfo().addEntry(entry); } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java index 1b1479d..4ece752 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java @@ -5,6 +5,8 @@ import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.serde.extension.api.*; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteExtensionSetupContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteRelatedExtension; +import de.siphalor.tweed5.serde.extension.api.extension.ReaderMiddlewareContext; +import de.siphalor.tweed5.serde.extension.api.extension.WriterMiddlewareContext; import de.siphalor.tweed5.serde_api.api.TweedDataReader; import de.siphalor.tweed5.serde_api.api.TweedDataVisitor; import de.siphalor.tweed5.defaultextensions.pather.api.PathTracking; @@ -48,59 +50,59 @@ public class PatherExtensionImpl implements PatherExtension, ReadWriteRelatedExt return pathTracking.currentPath(); } - private Middleware> createEntryReaderMiddleware() { - return new Middleware>() { + private Middleware, ReaderMiddlewareContext> createEntryReaderMiddleware() { + return new Middleware, ReaderMiddlewareContext>() { @Override public String id() { return EXTENSION_ID; } @Override - public TweedEntryReader process(TweedEntryReader inner) { + public TweedEntryReader process(TweedEntryReader inner, ReaderMiddlewareContext context) { assert rwContextPathTrackingAccess != null; //noinspection unchecked val castedInner = (TweedEntryReader>) inner; - return (TweedDataReader reader, ConfigEntry entry, TweedReadContext context) -> { - PathTracking pathTracking = context.extensionsData().get(rwContextPathTrackingAccess); + return (TweedDataReader reader, ConfigEntry entry, TweedReadContext readContext) -> { + PathTracking pathTracking = readContext.extensionsData().get(rwContextPathTrackingAccess); if (pathTracking != null) { - return castedInner.read(reader, entry, context); + return castedInner.read(reader, entry, readContext); } pathTracking = PathTracking.create(); - context.extensionsData().set(rwContextPathTrackingAccess, pathTracking); - return castedInner.read(new PathTrackingDataReader(reader, pathTracking), entry, context); + readContext.extensionsData().set(rwContextPathTrackingAccess, pathTracking); + return castedInner.read(new PathTrackingDataReader(reader, pathTracking), entry, readContext); }; } }; } - private Middleware> createEntryWriterMiddleware() { - return new Middleware>() { + private Middleware, WriterMiddlewareContext> createEntryWriterMiddleware() { + return new Middleware, WriterMiddlewareContext>() { @Override public String id() { return EXTENSION_ID; } @Override - public TweedEntryWriter process(TweedEntryWriter inner) { + public TweedEntryWriter process(TweedEntryWriter inner, WriterMiddlewareContext context) { assert rwContextPathTrackingAccess != null; //noinspection unchecked val castedInner = (TweedEntryWriter>) inner; - return (TweedDataVisitor writer, Object value, ConfigEntry entry, TweedWriteContext context) -> { - PathTracking pathTracking = context.extensionsData().get(rwContextPathTrackingAccess); + return (TweedDataVisitor writer, Object value, ConfigEntry entry, TweedWriteContext writeContext) -> { + PathTracking pathTracking = writeContext.extensionsData().get(rwContextPathTrackingAccess); if (pathTracking != null) { - castedInner.write(writer, value, entry, context); + castedInner.write(writer, value, entry, writeContext); return; } pathTracking = PathTracking.create(); - context.extensionsData().set(rwContextPathTrackingAccess, pathTracking); + writeContext.extensionsData().set(rwContextPathTrackingAccess, pathTracking); try { - castedInner.write(new PathTrackingDataVisitor(writer, pathTracking), value, entry, context); + castedInner.write(new PathTrackingDataVisitor(writer, pathTracking), value, entry, writeContext); } catch (TweedEntryWriteException e) { PathTracking exceptionPathTracking = e.context().extensionsData().get(rwContextPathTrackingAccess); diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/readfallback/impl/ReadFallbackExtensionImpl.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/readfallback/impl/ReadFallbackExtensionImpl.java index 11841a2..37c3b55 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/readfallback/impl/ReadFallbackExtensionImpl.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/readfallback/impl/ReadFallbackExtensionImpl.java @@ -10,6 +10,7 @@ import de.siphalor.tweed5.defaultextensions.pather.api.PatherExtension; import de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension; import de.siphalor.tweed5.defaultextensions.readfallback.api.ReadFallbackExtension; import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension; +import de.siphalor.tweed5.serde.extension.api.extension.ReaderMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult; import lombok.extern.apachecommons.CommonsLog; import org.jspecify.annotations.NonNull; @@ -30,7 +31,7 @@ public class ReadFallbackExtensionImpl implements ReadFallbackExtension, ReadWri PresetsExtension presetsExtension = configContainer.extension(PresetsExtension.class) .orElseThrow(() -> new IllegalStateException(getClass().getSimpleName() + " requires " + ReadFallbackExtension.class.getSimpleName())); - context.registerReaderMiddleware(new Middleware>() { + context.registerReaderMiddleware(new Middleware, ReaderMiddlewareContext>() { @Override public String id() { return EXTENSION_ID; @@ -47,18 +48,18 @@ public class ReadFallbackExtensionImpl implements ReadFallbackExtension, ReadWri } @Override - public TweedEntryReader process(TweedEntryReader inner) { + public TweedEntryReader process(TweedEntryReader inner, ReaderMiddlewareContext context) { //noinspection unchecked TweedEntryReader> castedInner = (TweedEntryReader>) inner; - return (TweedEntryReader>) (reader, entry, context) -> - castedInner.read(reader, entry, context).catchError( + return (TweedEntryReader>) (reader, entry, readContext) -> + castedInner.read(reader, entry, readContext).catchError( issues -> { Object fallback = presetsExtension.presetValue(entry, PresetsExtension.DEFAULT_PRESET_NAME); return TweedReadResult.withIssues(fallback, issues); }, - context + readContext ); } }); diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java index 7ed5467..be6d764 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java @@ -8,6 +8,7 @@ import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResu import de.siphalor.tweed5.defaultextensions.validation.api.validators.SimpleValidatorMiddleware; import de.siphalor.tweed5.defaultextensions.validation.impl.ValidationExtensionImpl; import de.siphalor.tweed5.patchwork.api.Patchwork; +import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.Nullable; import java.util.*; @@ -55,7 +56,10 @@ public interface ValidationExtension extends TweedExtension { lastId = id; } } - void addValidatorMiddleware(ConfigEntry entry, Middleware validator); + void addValidatorMiddleware( + ConfigEntry entry, + Middleware validator + ); ValidationIssues captureValidationIssues(Patchwork readContextExtensionsData); diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationProvidingExtension.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationProvidingExtension.java index 302ec88..a0f9613 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationProvidingExtension.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationProvidingExtension.java @@ -3,5 +3,5 @@ package de.siphalor.tweed5.defaultextensions.validation.api; import de.siphalor.tweed5.core.api.middleware.Middleware; public interface ValidationProvidingExtension { - Middleware validationMiddleware(); + Middleware validationMiddleware(); } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidatorMiddlewareContext.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidatorMiddlewareContext.java new file mode 100644 index 0000000..96430bc --- /dev/null +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidatorMiddlewareContext.java @@ -0,0 +1,13 @@ +package de.siphalor.tweed5.defaultextensions.validation.api; + +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Value; + +@Value +@AllArgsConstructor(access = lombok.AccessLevel.PRIVATE) +@Builder +public class ValidatorMiddlewareContext { + ConfigEntry entry; +} diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java index b996416..8fac09e 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java @@ -3,6 +3,7 @@ package de.siphalor.tweed5.defaultextensions.validation.api.validators; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator; +import de.siphalor.tweed5.defaultextensions.validation.api.ValidatorMiddlewareContext; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,12 +11,12 @@ import org.jspecify.annotations.Nullable; @Getter @AllArgsConstructor -public class SimpleValidatorMiddleware implements Middleware { +public class SimpleValidatorMiddleware implements Middleware { String id; ConfigEntryValidator validator; @Override - public ConfigEntryValidator process(ConfigEntryValidator inner) { + public ConfigEntryValidator process(ConfigEntryValidator inner, ValidatorMiddlewareContext context) { return new ConfigEntryValidator() { @Override public ValidationResult validate(ConfigEntry configEntry, T value) { diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java index 3847144..32d5e18 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java @@ -11,6 +11,7 @@ import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.core.api.middleware.MiddlewareContainer; import de.siphalor.tweed5.defaultextensions.comment.api.CommentModifyingExtension; import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducer; +import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducerMiddlewareContext; import de.siphalor.tweed5.defaultextensions.pather.api.PathTracking; import de.siphalor.tweed5.defaultextensions.pather.api.PathTrackingConfigEntryValueVisitor; import de.siphalor.tweed5.defaultextensions.pather.api.PatherExtension; @@ -18,6 +19,7 @@ import de.siphalor.tweed5.defaultextensions.pather.api.ValuePathTracking; import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator; import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension; import de.siphalor.tweed5.defaultextensions.validation.api.ValidationProvidingExtension; +import de.siphalor.tweed5.defaultextensions.validation.api.ValidatorMiddlewareContext; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssue; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssueLevel; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssues; @@ -28,10 +30,12 @@ import de.siphalor.tweed5.serde.extension.api.TweedEntryReader; import de.siphalor.tweed5.serde.extension.api.TweedReadContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteExtensionSetupContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteRelatedExtension; +import de.siphalor.tweed5.serde.extension.api.extension.ReaderMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadIssue; import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult; import de.siphalor.tweed5.serde_api.api.TweedDataReader; import lombok.*; +import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.Nullable; import java.util.*; @@ -70,8 +74,8 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid private final ConfigContainer configContainer; private final PatchworkPartAccess customEntryDataAccess; - private final MiddlewareContainer entryValidatorMiddlewareContainer - = new DefaultMiddlewareContainer<>(); + private final MiddlewareContainer + entryValidatorMiddlewareContainer = new DefaultMiddlewareContainer<>(); private @Nullable PatchworkPartAccess readContextValidationIssuesAccess; private @Nullable PatherExtension patherExtension; @@ -97,15 +101,15 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid } @Override - public Middleware commentMiddleware() { - return new Middleware() { + public Middleware commentMiddleware() { + return new Middleware() { @Override public String id() { return EXTENSION_ID; } @Override - public CommentProducer process(CommentProducer inner) { + public CommentProducer process(CommentProducer inner, CommentProducerMiddlewareContext context) { return entry -> { String baseComment = inner.createComment(entry); CustomEntryData entryData = entry.extensionsData().get(customEntryDataAccess); @@ -135,7 +139,10 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid } @Override - public void addValidatorMiddleware(ConfigEntry entry, Middleware validator) { + public void addValidatorMiddleware( + ConfigEntry entry, + Middleware validator + ) { CustomEntryData entryData = getOrCreateCustomEntryData(entry); entryData.addValidator(validator); } @@ -152,13 +159,20 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid CustomEntryData entryData = getOrCreateCustomEntryData(configEntry); if (entryData.validators().isEmpty()) { - entryData.completeValidator(entryValidatorMiddlewareContainer.process(baseValidator)); + entryData.completeValidator(entryValidatorMiddlewareContainer.process( + baseValidator, + ValidatorMiddlewareContext.builder().entry(configEntry).build() + )); } else { - DefaultMiddlewareContainer entrySpecificValidatorContainer = new DefaultMiddlewareContainer<>(); + DefaultMiddlewareContainer entrySpecificValidatorContainer + = new DefaultMiddlewareContainer<>(); entrySpecificValidatorContainer.registerAll(entryValidatorMiddlewareContainer.middlewares()); entrySpecificValidatorContainer.registerAll(entryData.validators()); entrySpecificValidatorContainer.seal(); - entryData.completeValidator(entrySpecificValidatorContainer.process(baseValidator)); + entryData.completeValidator(entrySpecificValidatorContainer.process( + baseValidator, + ValidatorMiddlewareContext.builder().entry(configEntry).build() + )); } } @@ -199,14 +213,14 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid @Data private static class CustomEntryData { @Setter(AccessLevel.NONE) - private @Nullable List> validators; + private @Nullable List> validators; private @Nullable ConfigEntryValidator completeValidator; - public List> validators() { + public List> validators() { return validators == null ? Collections.emptyList() : validators; } - public void addValidator(Middleware validator) { + public void addValidator(Middleware validator) { if (validators == null) { validators = new ArrayList<>(); } @@ -214,7 +228,8 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid } } - private class EntryValidationReaderMiddleware implements Middleware> { + private class EntryValidationReaderMiddleware + implements Middleware, ReaderMiddlewareContext> { @Override public String id() { return EXTENSION_ID; @@ -226,15 +241,15 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid } @Override - public TweedEntryReader process(TweedEntryReader inner) { + public TweedEntryReader process(TweedEntryReader inner, ReaderMiddlewareContext context) { assert readContextValidationIssuesAccess != null && patherExtension != null; //noinspection unchecked TweedEntryReader> castedInner = (TweedEntryReader>) inner; - return (TweedDataReader reader, ConfigEntry entry, TweedReadContext context) -> { - ValidationIssues validationIssues = getOrCreateValidationIssues(context.extensionsData()); + return (TweedDataReader reader, ConfigEntry entry, TweedReadContext readContext) -> { + ValidationIssues validationIssues = getOrCreateValidationIssues(readContext.extensionsData()); - return castedInner.read(reader, entry, context).andThen(value -> { + return castedInner.read(reader, entry, readContext).andThen(value -> { ConfigEntryValidator entryValidator = entry.extensionsData() .get(customEntryDataAccess) .completeValidator(); @@ -246,22 +261,22 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid return TweedReadResult.ok(validationResult.value()); } - String path = patherExtension.getPath(context); + String path = patherExtension.getPath(readContext); validationIssues.issuesByPath().put(path, new ValidationIssues.EntryIssues( entry, validationResult.issues() )); if (validationResult.hasError()) { return TweedReadResult.failed( - mapValidationIssuesToReadIssues(validationResult.issues(), context) + mapValidationIssuesToReadIssues(validationResult.issues(), readContext) ); } else { return TweedReadResult.withIssues( validationResult.value(), - mapValidationIssuesToReadIssues(validationResult.issues(), context) + mapValidationIssuesToReadIssues(validationResult.issues(), readContext) ); } - }, context); + }, readContext); }; } } diff --git a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java index c5874eb..b78d7d2 100644 --- a/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java +++ b/tweed5/default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java @@ -7,6 +7,7 @@ import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.defaultextensions.presets.api.PresetsExtension; import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator; import de.siphalor.tweed5.defaultextensions.validation.api.ValidationProvidingExtension; +import de.siphalor.tweed5.defaultextensions.validation.api.ValidatorMiddlewareContext; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssue; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssueLevel; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; @@ -62,11 +63,11 @@ public class ValidationFallbackExtensionImpl implements ValidationFallbackExtens } @Override - public Middleware validationMiddleware() { + public Middleware validationMiddleware() { return new ValidationFallbackMiddleware(); } - private class ValidationFallbackMiddleware implements Middleware { + private class ValidationFallbackMiddleware implements Middleware { @Override public String id() { return EXTENSION_ID; @@ -83,7 +84,7 @@ public class ValidationFallbackExtensionImpl implements ValidationFallbackExtens } @Override - public ConfigEntryValidator process(ConfigEntryValidator inner) { + public ConfigEntryValidator process(ConfigEntryValidator inner, ValidatorMiddlewareContext context) { return new ConfigEntryValidator() { @Override public ValidationResult validate(ConfigEntry configEntry, T value) { diff --git a/tweed5/default-extensions/src/test/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImplTest.java b/tweed5/default-extensions/src/test/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImplTest.java index db00136..00fc4c3 100644 --- a/tweed5/default-extensions/src/test/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImplTest.java +++ b/tweed5/default-extensions/src/test/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImplTest.java @@ -9,6 +9,7 @@ import de.siphalor.tweed5.core.impl.DefaultConfigContainer; import de.siphalor.tweed5.core.impl.entry.NullableConfigEntryImpl; import de.siphalor.tweed5.core.impl.entry.SimpleConfigEntryImpl; import de.siphalor.tweed5.core.impl.entry.StaticMapCompoundConfigEntryImpl; +import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducerMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.ReadWriteExtension; import de.siphalor.tweed5.serde.hjson.HjsonCommentType; import de.siphalor.tweed5.serde.hjson.HjsonWriter; @@ -144,7 +145,7 @@ class CommentExtensionImplTest { } @Override - public Middleware commentMiddleware() { + public Middleware commentMiddleware() { return new Middleware<>() { @Override public String id() { @@ -152,7 +153,7 @@ class CommentExtensionImplTest { } @Override - public CommentProducer process(CommentProducer inner) { + public CommentProducer process(CommentProducer inner, CommentProducerMiddlewareContext context) { return entry -> "The comment is:\n" + inner.createComment(entry) + "\nEND"; } }; diff --git a/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReadWriteExtensionSetupContext.java b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReadWriteExtensionSetupContext.java index 48cfbc0..3dc29ea 100644 --- a/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReadWriteExtensionSetupContext.java +++ b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReadWriteExtensionSetupContext.java @@ -7,6 +7,6 @@ import de.siphalor.tweed5.patchwork.api.PatchworkPartAccess; public interface ReadWriteExtensionSetupContext { PatchworkPartAccess registerReadWriteContextExtensionData(Class extensionDataClass); - void registerReaderMiddleware(Middleware> middleware); - void registerWriterMiddleware(Middleware> middleware); + void registerReaderMiddleware(Middleware, ReaderMiddlewareContext> middleware); + void registerWriterMiddleware(Middleware, WriterMiddlewareContext> middleware); } diff --git a/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReaderMiddlewareContext.java b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReaderMiddlewareContext.java new file mode 100644 index 0000000..af82bb8 --- /dev/null +++ b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/ReaderMiddlewareContext.java @@ -0,0 +1,11 @@ +package de.siphalor.tweed5.serde.extension.api.extension; + +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import lombok.*; + +@Value +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +public class ReaderMiddlewareContext { + ConfigEntry entry; +} diff --git a/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/WriterMiddlewareContext.java b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/WriterMiddlewareContext.java new file mode 100644 index 0000000..b8bceba --- /dev/null +++ b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/api/extension/WriterMiddlewareContext.java @@ -0,0 +1,14 @@ +package de.siphalor.tweed5.serde.extension.api.extension; + +import de.siphalor.tweed5.core.api.entry.ConfigEntry; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Value; + +@Value +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +public class WriterMiddlewareContext { + ConfigEntry entry; +} diff --git a/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/impl/ReadWriteExtensionImpl.java b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/impl/ReadWriteExtensionImpl.java index 4956e66..8569fe9 100644 --- a/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/impl/ReadWriteExtensionImpl.java +++ b/tweed5/serde-extension/src/main/java/de/siphalor/tweed5/serde/extension/impl/ReadWriteExtensionImpl.java @@ -6,16 +6,18 @@ import de.siphalor.tweed5.core.api.extension.TweedExtension; import de.siphalor.tweed5.core.api.extension.TweedExtensionSetupContext; import de.siphalor.tweed5.core.api.middleware.DefaultMiddlewareContainer; import de.siphalor.tweed5.core.api.middleware.Middleware; +import de.siphalor.tweed5.patchwork.api.Patchwork; +import de.siphalor.tweed5.patchwork.api.PatchworkFactory; +import de.siphalor.tweed5.patchwork.api.PatchworkPartAccess; import de.siphalor.tweed5.serde.extension.api.*; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteExtensionSetupContext; import de.siphalor.tweed5.serde.extension.api.extension.ReadWriteRelatedExtension; +import de.siphalor.tweed5.serde.extension.api.extension.ReaderMiddlewareContext; +import de.siphalor.tweed5.serde.extension.api.extension.WriterMiddlewareContext; import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult; import de.siphalor.tweed5.serde_api.api.TweedDataReader; import de.siphalor.tweed5.serde_api.api.TweedDataVisitor; import de.siphalor.tweed5.serde_api.api.TweedDataWriteException; -import de.siphalor.tweed5.patchwork.api.Patchwork; -import de.siphalor.tweed5.patchwork.api.PatchworkFactory; -import de.siphalor.tweed5.patchwork.api.PatchworkPartAccess; import lombok.Data; import org.jspecify.annotations.Nullable; @@ -24,12 +26,10 @@ import java.util.Collection; public class ReadWriteExtensionImpl implements ReadWriteExtension { private final ConfigContainer configContainer; private final PatchworkPartAccess customEntryDataAccess; - private DefaultMiddlewareContainer> - entryReaderMiddlewareContainer - = new DefaultMiddlewareContainer<>(); - private DefaultMiddlewareContainer> - entryWriterMiddlewareContainer - = new DefaultMiddlewareContainer<>(); + private DefaultMiddlewareContainer, ReaderMiddlewareContext> + entryReaderMiddlewareContainer = new DefaultMiddlewareContainer<>(); + private DefaultMiddlewareContainer, WriterMiddlewareContext> + entryWriterMiddlewareContainer = new DefaultMiddlewareContainer<>(); private @Nullable PatchworkFactory readWriteContextPatchworkFactory; public ReadWriteExtensionImpl(ConfigContainer configContainer, TweedExtensionSetupContext context) { @@ -52,12 +52,16 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { } @Override - public void registerReaderMiddleware(Middleware> middleware) { + public void registerReaderMiddleware( + Middleware, ReaderMiddlewareContext> middleware + ) { entryReaderMiddlewareContainer.register(middleware); } @Override - public void registerWriterMiddleware(Middleware> middleware) { + public void registerWriterMiddleware( + Middleware, WriterMiddlewareContext> middleware + ) { entryWriterMiddlewareContainer.register(middleware); } }; @@ -118,8 +122,14 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { @Override public void initEntry(ConfigEntry configEntry) { CustomEntryData customEntryData = getOrCreateCustomEntryData(configEntry); - customEntryData.readerChain(entryReaderMiddlewareContainer.process(customEntryData.readerDefinition())); - customEntryData.writerChain(entryWriterMiddlewareContainer.process(customEntryData.writerDefinition())); + customEntryData.readerChain(entryReaderMiddlewareContainer.process( + customEntryData.readerDefinition(), + ReaderMiddlewareContext.builder().entry(configEntry).build() + )); + customEntryData.writerChain(entryWriterMiddlewareContainer.process( + customEntryData.writerDefinition(), + WriterMiddlewareContext.builder().entry(configEntry).build() + )); } private CustomEntryData getOrCreateCustomEntryData(ConfigEntry entry) {