From 1fb509fea1cef7a2a070f9ade6de4c2becf4230f Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 13 Jun 2025 15:36:31 -0500 Subject: [PATCH] Prevent multiple copies of enrichment & validation plugins; actually implement QSupplementalInstanceMetaData enrichment --- .../core/instances/QInstanceEnricher.java | 19 ++++++++++++++++++- .../core/instances/QInstanceValidator.java | 15 +++++++++++++-- .../QInstanceEnricherPluginInterface.java | 9 +++++++++ .../QInstanceValidatorPluginInterface.java | 9 +++++++++ .../QSupplementalInstanceMetaData.java | 3 +-- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java index ec32d57d..84046631 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java @@ -47,6 +47,7 @@ import com.kingsrook.qqq.backend.core.instances.enrichment.plugins.QInstanceEnri import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.QSupplementalInstanceMetaData; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.metadata.fields.AdornmentType; @@ -210,6 +211,11 @@ public class QInstanceEnricher ***************************************************************************/ private void enrichInstance() { + for(QSupplementalInstanceMetaData supplementalInstanceMetaData : qInstance.getSupplementalMetaData().values()) + { + supplementalInstanceMetaData.enrich(qInstance); + } + runPlugins(QInstance.class, qInstance, qInstance); } @@ -1477,7 +1483,18 @@ public class QInstanceEnricher if(enrichMethod.isPresent()) { Class parameterType = enrichMethod.get().getParameterTypes()[0]; - enricherPlugins.add(parameterType, plugin); + + Set existingPluginIdentifiers = enricherPlugins.getOrDefault(parameterType, Collections.emptyList()) + .stream().map(p -> p.getPluginIdentifier()) + .collect(Collectors.toSet()); + if(existingPluginIdentifiers.contains(plugin.getPluginIdentifier())) + { + LOG.debug("Enricher plugin is already registered - not re-adding it", logPair("pluginIdentifer", plugin.getPluginIdentifier())); + } + else + { + enricherPlugins.add(parameterType, plugin); + } } else { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java index 89af643f..0ec763f1 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceValidator.java @@ -295,7 +295,18 @@ public class QInstanceValidator if(validateMethod.isPresent()) { Class parameterType = validateMethod.get().getParameterTypes()[0]; - validatorPlugins.add(parameterType, plugin); + + Set existingPluginIdentifiers = validatorPlugins.getOrDefault(parameterType, Collections.emptyList()) + .stream().map(p -> p.getPluginIdentifier()) + .collect(Collectors.toSet()); + if(existingPluginIdentifiers.contains(plugin.getPluginIdentifier())) + { + LOG.debug("Validator plugin is already registered - not re-adding it", logPair("pluginIdentifer", plugin.getPluginIdentifier())); + } + else + { + validatorPlugins.add(parameterType, plugin); + } } else { @@ -313,7 +324,7 @@ public class QInstanceValidator validatorPlugins.clear(); } - + /******************************************************************************* ** Getter for validatorPlugins diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/enrichment/plugins/QInstanceEnricherPluginInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/enrichment/plugins/QInstanceEnricherPluginInterface.java index 30b07f61..cabb2772 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/enrichment/plugins/QInstanceEnricherPluginInterface.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/enrichment/plugins/QInstanceEnricherPluginInterface.java @@ -37,4 +37,13 @@ public interface QInstanceEnricherPluginInterface *******************************************************************************/ void enrich(T object, QInstance qInstance); + + /*************************************************************************** + ** + ***************************************************************************/ + default String getPluginIdentifier() + { + return getClass().getName(); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/validation/plugins/QInstanceValidatorPluginInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/validation/plugins/QInstanceValidatorPluginInterface.java index 9123d398..5276cbeb 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/validation/plugins/QInstanceValidatorPluginInterface.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/validation/plugins/QInstanceValidatorPluginInterface.java @@ -38,4 +38,13 @@ public interface QInstanceValidatorPluginInterface *******************************************************************************/ void validate(T object, QInstance qInstance, QInstanceValidator qInstanceValidator); + + /*************************************************************************** + ** + ***************************************************************************/ + default String getPluginIdentifier() + { + return getClass().getName(); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QSupplementalInstanceMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QSupplementalInstanceMetaData.java index c6acf7a8..326a7c23 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QSupplementalInstanceMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QSupplementalInstanceMetaData.java @@ -24,7 +24,6 @@ package com.kingsrook.qqq.backend.core.model.metadata; import java.util.function.Supplier; import com.kingsrook.qqq.backend.core.instances.QInstanceValidator; -import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; /******************************************************************************* @@ -37,7 +36,7 @@ public interface QSupplementalInstanceMetaData extends TopLevelMetaDataInterface /******************************************************************************* ** *******************************************************************************/ - default void enrich(QTableMetaData table) + default void enrich(QInstance qInstance) { //////////////////////// // noop in base class //