From 5f43ae9fd93a4fa8207837c8c89efffd1e25d9c4 Mon Sep 17 00:00:00 2001 From: Igor Egorov Date: Fri, 2 May 2025 15:17:41 +0300 Subject: [PATCH 1/3] SED-3921: object overlapper for project settings (draft) --- .../step/core/objectenricher/ObjectHook.java | 4 ++ .../objectenricher/ObjectHookRegistry.java | 9 ++++ .../core/objectenricher/ObjectOverlapper.java | 31 +++++++++++ .../ObjectOverlapperComposer.java | 54 +++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java create mode 100644 step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java index ef964d23..6eca6b12 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java @@ -31,6 +31,10 @@ public interface ObjectHook { ObjectEnricher getObjectEnricher(AbstractContext context); + default ObjectOverlapper getObjectOverlapper(AbstractContext context) { + return null; + } + /** * Rebuilds an {@link AbstractContext} based on an object that has been * previously enriched with an {@link ObjectEnricher} provided by this class diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java index 874752f2..c0767f3b 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java @@ -48,6 +48,15 @@ public ObjectEnricher getObjectEnricher(AbstractContext context) { .compose(stream().map(hook -> hook.getObjectEnricher(context)).collect(Collectors.toList())); } + /** + * @param context + * @return the composed {@link ObjectOverlapper} based on all the registered hooks + */ + public ObjectOverlapper getObjectOverlapper(AbstractContext context) { + return ObjectOverlapperComposer + .compose(stream().map(hook -> hook.getObjectOverlapper(context)).collect(Collectors.toList())); + } + /** * Rebuilds an {@link AbstractContext} based on an object that has been * previously enriched with the composed {@link ObjectEnricher} of this registry diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java new file mode 100644 index 00000000..f753f4bd --- /dev/null +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java @@ -0,0 +1,31 @@ +/* + * ****************************************************************************** + * * Copyright (C) 2020, exense GmbH + * * + * * This file is part of STEP + * * + * * STEP is free software: you can redistribute it and/or modify + * * it under the terms of the GNU Affero General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * STEP is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU Affero General Public License for more details. + * * + * * You should have received a copy of the GNU Affero General Public License + * * along with STEP. If not, see . + * ***************************************************************************** + */ +package step.core.objectenricher; + +import java.util.List; + +public interface ObjectOverlapper { + + void onBeforeSave(EnricheableObject obj); + + List overlapObjects(List objects); + +} diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java new file mode 100644 index 00000000..fd732460 --- /dev/null +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (C) 2020, exense GmbH + * + * This file is part of STEP + * + * STEP is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * STEP is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with STEP. If not, see . + ******************************************************************************/ +package step.core.objectenricher; + +import java.util.*; +import java.util.stream.Stream; + +public class ObjectOverlapperComposer { + + public static ObjectOverlapper compose(List list) { + return new ObjectOverlapper() { + + @Override + public void onBeforeSave(EnricheableObject obj) { + nonNullList(list).forEach(overlapper -> overlapper.onBeforeSave(obj)); + } + + @Override + public List overlapObjects(List objects) { + if (objects == null) { + return null; + } + List result = new ArrayList<>(objects); + Iterator iterator = nonNullList(list).iterator(); + while (iterator.hasNext()) { + ObjectOverlapper next = iterator.next(); + result = next.overlapObjects(result); + } + return result; + } + + + private Stream nonNullList(List list) { + return list.stream().filter(Objects::nonNull); + } + }; + } +} From 0f67b41b46ff427d9f7ff1c510ee2d9417463dc7 Mon Sep 17 00:00:00 2001 From: Igor Egorov Date: Wed, 21 May 2025 08:20:02 +0300 Subject: [PATCH 2/3] SED-3921: object validator for project settings --- .../step/core/objectenricher/ObjectHook.java | 2 +- .../objectenricher/ObjectHookRegistry.java | 11 +++----- ...ctOverlapper.java => ObjectValidator.java} | 8 ++---- ...oser.java => ObjectValidatorComposer.java} | 27 +++++-------------- 4 files changed, 13 insertions(+), 35 deletions(-) rename step-framework-collections/src/main/java/step/core/objectenricher/{ObjectOverlapper.java => ObjectValidator.java} (84%) rename step-framework-collections/src/main/java/step/core/objectenricher/{ObjectOverlapperComposer.java => ObjectValidatorComposer.java} (56%) diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java index 6eca6b12..048fcb2b 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java @@ -31,7 +31,7 @@ public interface ObjectHook { ObjectEnricher getObjectEnricher(AbstractContext context); - default ObjectOverlapper getObjectOverlapper(AbstractContext context) { + default ObjectValidator getObjectValidator(AbstractContext context) { return null; } diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java index c0767f3b..286fc976 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java @@ -19,13 +19,10 @@ package step.core.objectenricher; import step.core.AbstractContext; -import step.core.collections.Filter; import step.core.collections.PojoFilter; -import step.core.collections.PojoFilters; import step.core.ql.OQLFilterBuilder; import java.util.ArrayList; -import java.util.Objects; import java.util.stream.Collectors; public class ObjectHookRegistry extends ArrayList { @@ -50,11 +47,11 @@ public ObjectEnricher getObjectEnricher(AbstractContext context) { /** * @param context - * @return the composed {@link ObjectOverlapper} based on all the registered hooks + * @return the composed {@link ObjectValidator} based on all the registered hooks */ - public ObjectOverlapper getObjectOverlapper(AbstractContext context) { - return ObjectOverlapperComposer - .compose(stream().map(hook -> hook.getObjectOverlapper(context)).collect(Collectors.toList())); + public ObjectValidator getObjectValidator(AbstractContext context) { + return ObjectValidatorComposer + .compose(stream().map(hook -> hook.getObjectValidator(context)).collect(Collectors.toList())); } /** diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectValidator.java similarity index 84% rename from step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java rename to step-framework-collections/src/main/java/step/core/objectenricher/ObjectValidator.java index f753f4bd..12b4374a 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapper.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectValidator.java @@ -20,12 +20,8 @@ */ package step.core.objectenricher; -import java.util.List; +public interface ObjectValidator { -public interface ObjectOverlapper { - - void onBeforeSave(EnricheableObject obj); - - List overlapObjects(List objects); + void validateOnSave(EnricheableObject obj); } diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectValidatorComposer.java similarity index 56% rename from step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java rename to step-framework-collections/src/main/java/step/core/objectenricher/ObjectValidatorComposer.java index fd732460..f8eb3b93 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectOverlapperComposer.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectValidatorComposer.java @@ -21,32 +21,17 @@ import java.util.*; import java.util.stream.Stream; -public class ObjectOverlapperComposer { +public class ObjectValidatorComposer { - public static ObjectOverlapper compose(List list) { - return new ObjectOverlapper() { + public static ObjectValidator compose(List list) { + return new ObjectValidator() { @Override - public void onBeforeSave(EnricheableObject obj) { - nonNullList(list).forEach(overlapper -> overlapper.onBeforeSave(obj)); + public void validateOnSave(EnricheableObject obj) { + nonNullList(list).forEach(overlapper -> overlapper.validateOnSave(obj)); } - @Override - public List overlapObjects(List objects) { - if (objects == null) { - return null; - } - List result = new ArrayList<>(objects); - Iterator iterator = nonNullList(list).iterator(); - while (iterator.hasNext()) { - ObjectOverlapper next = iterator.next(); - result = next.overlapObjects(result); - } - return result; - } - - - private Stream nonNullList(List list) { + private Stream nonNullList(List list) { return list.stream().filter(Objects::nonNull); } }; From af97900099b303da75c307a4246b1b4027bacd3d Mon Sep 17 00:00:00 2001 From: Igor Egorov Date: Tue, 24 Jun 2025 21:20:07 +0300 Subject: [PATCH 3/3] SED-3921: extend validation of unique entities --- .../java/step/core/objectenricher/ObjectHook.java | 4 +++- .../step/core/objectenricher/ObjectHookRegistry.java | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java index 048fcb2b..676f55bf 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHook.java @@ -20,6 +20,8 @@ import step.core.AbstractContext; +import java.util.Map; + /** * An {@link ObjectHook} is a factory for * {@link ObjectFilter} and {@link ObjectEnricher} @@ -31,7 +33,7 @@ public interface ObjectHook { ObjectEnricher getObjectEnricher(AbstractContext context); - default ObjectValidator getObjectValidator(AbstractContext context) { + default ObjectValidator getObjectValidator(AbstractContext context, Map config) { return null; } diff --git a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java index 286fc976..2c3946c7 100644 --- a/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java +++ b/step-framework-collections/src/main/java/step/core/objectenricher/ObjectHookRegistry.java @@ -23,10 +23,15 @@ import step.core.ql.OQLFilterBuilder; import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; public class ObjectHookRegistry extends ArrayList { + private final Map validatorConfiguration = new ConcurrentHashMap<>(); + /** * @param context * @return the composed {@link ObjectFilter} based on all the registered hooks @@ -51,7 +56,11 @@ public ObjectEnricher getObjectEnricher(AbstractContext context) { */ public ObjectValidator getObjectValidator(AbstractContext context) { return ObjectValidatorComposer - .compose(stream().map(hook -> hook.getObjectValidator(context)).collect(Collectors.toList())); + .compose(stream().map(hook -> hook.getObjectValidator(context, Collections.unmodifiableMap(this.validatorConfiguration))).collect(Collectors.toList())); + } + + public Map getValidatorConfiguration(){ + return this.validatorConfiguration; } /**