This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch TURNDP-184 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit e1169095990807d41c7be77e973554a34cdc936c Author: Dan Haywood <[email protected]> AuthorDate: Wed Mar 11 12:00:03 2026 +0100 adds in support for update only (annot, unit tests, change to listener impl) --- .../causeway/applib/annotation/Publishing.java | 23 +++ .../CommandPublishingFacetForActionAnnotation.java | 1 + ...ommandPublishingFacetForPropertyAnnotation.java | 1 + ...xecutionPublishingFacetForActionAnnotation.java | 1 + ...cutionPublishingFacetForPropertyAnnotation.java | 1 + ...gePublishingFacetForDomainObjectAnnotation.java | 10 +- ...FacetForDomainObjectAnnotationAsConfigured.java | 2 +- ...tityChangePublishingFacetFromConfiguration.java | 2 +- .../entitychange/EntityChangePublishingFacet.java | 53 +++++- .../EntityChangePublishingFacetAbstract.java | 14 +- .../EntityPropertyChangePublishingPolicyFacet.java | 6 +- ...PublishingPolicyFacetForPropertyAnnotation.java | 5 +- .../metamodel/facets/FacetFactoryTestAbstract.java | 3 +- .../DomainObjectAnnotationFacetFactoryTest.java | 177 +++++++++++++-------- .../changetracking/EntityChangeTrackerDefault.java | 11 +- 15 files changed, 222 insertions(+), 88 deletions(-) diff --git a/api/applib/src/main/java/org/apache/causeway/applib/annotation/Publishing.java b/api/applib/src/main/java/org/apache/causeway/applib/annotation/Publishing.java index b0fcc085537..95f6de2f085 100644 --- a/api/applib/src/main/java/org/apache/causeway/applib/annotation/Publishing.java +++ b/api/applib/src/main/java/org/apache/causeway/applib/annotation/Publishing.java @@ -55,6 +55,29 @@ public enum Publishing { */ ENABLED, + /** + * Applies only to {@link EntityPropertyChangeSubscriber}, whereby events are published for modifications to the + * object, but no events are published for the initial creation of an object. + * + * <p> + * In the case of audit trail extension, + * this effectively suppresses all of the "[NEW] -> value" entries that are created for every property of the + * entity when it is being created, and also all of the "value -> [DELETED]" entries that are created for every property of the + * entity when it is being deleted. + * </p> + * + * <p> + * This variant is intended only where the application code has enough traceability built into the domain + * (perhaps to provide visibility to the end-users) that the technical auditing is overkill. It will also + * of course reduce the volume of auditing, so improves performance (likely both response times and throughput). + * </p> + * + * <p> + * For other subscribers, behaviour is the same as {@link #ENABLED}. + * </p> + */ + ENABLED_FOR_UPDATES_ONLY, + /** * Do <b>not</b> publish data triggered by interaction with this object * (even if otherwise configured to enable publishing). diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java index 8f4dd4a4d15..cf6690083e8 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java @@ -93,6 +93,7 @@ public static Optional<CommandPublishingFacet> create( case DISABLED: return new CommandPublishingFacetForActionAnnotation.Disabled(processor, holder, servicesInjector); case ENABLED: + case ENABLED_FOR_UPDATES_ONLY: return new CommandPublishingFacetForActionAnnotation.Enabled(processor, holder, servicesInjector); default: throw new IllegalStateException(String.format("@Action#commandPublishing '%s' not recognised", publishing)); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java index 6a5a8196c38..1dcf9b314be 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java @@ -92,6 +92,7 @@ public static CommandPublishingFacet create( case DISABLED: return new CommandPublishingFacetForPropertyAnnotation.Disabled(processor, holder, servicesInjector); case ENABLED: + case ENABLED_FOR_UPDATES_ONLY: return new CommandPublishingFacetForPropertyAnnotation.Enabled(processor, holder, servicesInjector); default: throw new IllegalStateException(String.format("@Property#commandPublishing '%s' not recognised", publishing)); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForActionAnnotation.java index a4fa9d55538..362d9c7f817 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForActionAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForActionAnnotation.java @@ -83,6 +83,7 @@ public static Optional<ExecutionPublishingFacet> create( case DISABLED: return new ExecutionPublishingFacetForActionAnnotation.Disabled(holder); case ENABLED: + case ENABLED_FOR_UPDATES_ONLY: return new ExecutionPublishingFacetForActionAnnotation.Enabled(holder); default: throw new IllegalStateException(String.format("@Action#executionPublishing '%s' not recognised", publishing)); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForPropertyAnnotation.java index 7b95449fb09..7508fccf894 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForPropertyAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/publish/execution/ExecutionPublishingFacetForPropertyAnnotation.java @@ -83,6 +83,7 @@ public static ExecutionPublishingFacet create( case DISABLED: return new ExecutionPublishingFacetForPropertyAnnotation.Disabled(holder); case ENABLED: + case ENABLED_FOR_UPDATES_ONLY: return new ExecutionPublishingFacetForPropertyAnnotation.Enabled(holder); default: throw new IllegalStateException(String.format("@Property#executionPublishing '%s' not recognised", publishing)); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java index a5d5ef82091..cbae5f96212 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java @@ -57,17 +57,19 @@ public static Optional<EntityChangePublishingFacet> create( : new EntityChangePublishingFacetFromConfiguration(holder, true)); } case DISABLED: - return Optional.of(new EntityChangePublishingFacetForDomainObjectAnnotation(holder, false)); + return Optional.of(new EntityChangePublishingFacetForDomainObjectAnnotation(holder, false, false, false, false)); case ENABLED: - return Optional.of(new EntityChangePublishingFacetForDomainObjectAnnotation(holder, true)); + return Optional.of(new EntityChangePublishingFacetForDomainObjectAnnotation(holder, true, true, true, true)); + case ENABLED_FOR_UPDATES_ONLY: + return Optional.of(new EntityChangePublishingFacetForDomainObjectAnnotation(holder, true, false, true, false)); default: throw _Exceptions.unmatchedCase(publish); } } - protected EntityChangePublishingFacetForDomainObjectAnnotation(final FacetHolder holder, boolean enabled) { - super(holder, enabled); + protected EntityChangePublishingFacetForDomainObjectAnnotation(final FacetHolder holder, boolean enabled, boolean enabledForCreate, boolean enabledForUpdate, boolean enabledForDelete) { + super(holder, enabled, enabledForCreate, enabledForUpdate, enabledForDelete); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured.java index 1221b4b7a4f..d272222c8b6 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured.java @@ -25,7 +25,7 @@ public class EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured extends EntityChangePublishingFacetForDomainObjectAnnotation { public EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured(final FacetHolder facetHolder, final boolean enabled) { - super(facetHolder, enabled); + super(facetHolder, enabled, enabled, enabled, enabled); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetFromConfiguration.java index 0a1ef173341..133bed5c6a4 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetFromConfiguration.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetFromConfiguration.java @@ -32,7 +32,7 @@ public class EntityChangePublishingFacetFromConfiguration extends EntityChangePublishingFacetAbstract { public EntityChangePublishingFacetFromConfiguration(final FacetHolder facetHolder, final boolean enabled) { - super(facetHolder, enabled); + super(facetHolder, enabled, enabled, enabled, enabled); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacet.java index fba7a8388ef..76ce2cdeb07 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacet.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacet.java @@ -34,7 +34,7 @@ */ public interface EntityChangePublishingFacet extends Facet { - public static boolean isPublishingEnabled(final FacetHolder facetHolder) { + static boolean isPublishingEnabled(final FacetHolder facetHolder) { if(facetHolder==null) { return false; } @@ -50,6 +50,57 @@ public static boolean isPublishingEnabled(final FacetHolder facetHolder) { && entityChangePublishingFacet.isEnabled(); } + static boolean isPublishingEnabledForCreate(final FacetHolder facetHolder) { + if(facetHolder==null) { + return false; + } + + if(facetHolder instanceof ObjectSpecification) { + if(!((ObjectSpecification)facetHolder).isEntity()) { + return false; + } + } + + val entityChangePublishingFacet = facetHolder.getFacet(EntityChangePublishingFacet.class); + return entityChangePublishingFacet != null + && entityChangePublishingFacet.isEnabledForCreate(); + } + + static boolean isPublishingEnabledForUpdate(final FacetHolder facetHolder) { + if(facetHolder==null) { + return false; + } + + if(facetHolder instanceof ObjectSpecification) { + if(!((ObjectSpecification)facetHolder).isEntity()) { + return false; + } + } + + val entityChangePublishingFacet = facetHolder.getFacet(EntityChangePublishingFacet.class); + return entityChangePublishingFacet != null + && entityChangePublishingFacet.isEnabledForUpdate(); + } + + static boolean isPublishingEnabledForDelete(final FacetHolder facetHolder) { + if(facetHolder==null) { + return false; + } + + if(facetHolder instanceof ObjectSpecification) { + if(!((ObjectSpecification)facetHolder).isEntity()) { + return false; + } + } + + val entityChangePublishingFacet = facetHolder.getFacet(EntityChangePublishingFacet.class); + return entityChangePublishingFacet != null + && entityChangePublishingFacet.isEnabledForDelete(); + } + boolean isEnabled(); + boolean isEnabledForCreate(); + boolean isEnabledForUpdate(); + boolean isEnabledForDelete(); } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java index af60b3f0544..13cd84b84e5 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/publish/entitychange/EntityChangePublishingFacetAbstract.java @@ -35,9 +35,21 @@ private static final Class<? extends Facet> type() { @Getter private final boolean enabled; - public EntityChangePublishingFacetAbstract(final FacetHolder facetHolder, boolean enabled) { + @Getter + private final boolean enabledForCreate; + + @Getter + private final boolean enabledForUpdate; + + @Getter + private final boolean enabledForDelete; + + public EntityChangePublishingFacetAbstract(final FacetHolder facetHolder, boolean enabled, boolean enabledForCreate, boolean enabledForUpdate, boolean enabledForDelete) { super(EntityChangePublishingFacetAbstract.type(), facetHolder); this.enabled = enabled; + this.enabledForCreate = enabledForCreate; + this.enabledForUpdate = enabledForUpdate; + this.enabledForDelete = enabledForDelete; } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacet.java index 5156fb936e2..bd35418b1fe 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacet.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacet.java @@ -34,7 +34,7 @@ public interface EntityPropertyChangePublishingPolicyFacet extends Facet { /** - * Must be one of Publishing.ENABLED or Publishing.DISABLED. + * Must be one of {@link Publishing#ENABLED}, {@link Publishing#ENABLED_FOR_UPDATES_ONLY} or {@link Publishing#DISABLED}. */ @NonNull Publishing getEntityChangePublishing(); @@ -43,7 +43,7 @@ default boolean isPublishingVetoed() { } default boolean isPublishingAllowed() { - return getEntityChangePublishing() == Publishing.ENABLED; + return getEntityChangePublishing() == Publishing.ENABLED || getEntityChangePublishing() == Publishing.ENABLED_FOR_UPDATES_ONLY; } static boolean isExcludedFromPublishing(final @NonNull OneToOneAssociation property) { @@ -59,7 +59,7 @@ static boolean isExcludedFromPublishing(final @NonNull OneToOneAssociation prope .map(EntityPropertyChangePublishingPolicyFacet::isPublishingAllowed) .orElse(false); - //XXX CAUSEWAY-1488, exclude Bob/Clob from property change publishing unless explicitly allowed + //XXX CAUSEWAY-1488, exclude Blob/Clob from property change publishing unless explicitly allowed return !isExplictlyAllowed; } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacetForPropertyAnnotation.java index dbf4cc19abc..cd51e46cd04 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacetForPropertyAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/entitychangepublishing/EntityPropertyChangePublishingPolicyFacetForPropertyAnnotation.java @@ -35,8 +35,9 @@ public static Optional<EntityPropertyChangePublishingPolicyFacet> create( .map(Property::entityChangePublishing) // only install facet if policy is explicit ('enabled' or 'disabled') .filter(entityChangePublishing -> - entityChangePublishing == Publishing.ENABLED - || entityChangePublishing == Publishing.DISABLED) + entityChangePublishing == Publishing.ENABLED || + entityChangePublishing == Publishing.ENABLED_FOR_UPDATES_ONLY || + entityChangePublishing == Publishing.DISABLED) .map(entityChangePublishing -> new EntityPropertyChangePublishingPolicyFacetForPropertyAnnotation(entityChangePublishing, holder)); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java index 2985f0a3fe6..400bf2d3dae 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java @@ -124,8 +124,7 @@ public static CollectionScenarioBuilder builder(final Class<?> declaringClass, f // -- - @Getter(onMethod_ = {@Override}) - private MetaModelContext metaModelContext; + @Getter(onMethod_ = {@Override}) protected MetaModelContext metaModelContext; private MethodRemover_forTesting methodRemover; diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java index 879d70ca2d7..6448a0b53a7 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java @@ -22,8 +22,11 @@ import javax.inject.Named; +import org.apache.causeway.applib.annotation.Publishing; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.is; @@ -78,7 +81,7 @@ protected void tearDown() throws Exception { facetFactory = null; } - class Customer { + static class Customer { } class SomeHasInteractionId implements HasInteractionId { @@ -108,7 +111,8 @@ protected void ignoringConfiguration() { } - public static class EntityChangePublishing extends DomainObjectAnnotationFacetFactoryTest { + @Nested + public class EntityChangePublishing { @DomainObject(entityChangePublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED) class CustomerWithDomainObjectAndAuditingSetToAsConfigured { @@ -122,8 +126,13 @@ class CustomerWithDomainObjectAndAuditingSetToDisabled { class CustomerWithDomainObjectAndAuditingSetToEnabled { } + @DomainObject(entityChangePublishing = Publishing.ENABLED_FOR_UPDATES_ONLY) + class CustomerWithDomainObjectAndEntityChangePublishingSetToEnabledForUpdatesOnly { + } + - public static class WhenNotAnnotatedAndDefaultsFromConfiguration extends EntityChangePublishing { + @Nested + public class WhenNotAnnotatedAndDefaultsFromConfiguration { @Test void configured_value_set_to_all() { @@ -157,7 +166,8 @@ void configured_value_set_to_none() { } - public static class WithDomainObjectAnnotationWithAuditingSetToAsConfigured extends EntityChangePublishing { + @Nested + public class WithDomainObjectAnnotationWithAuditingSetToAsConfigured { @Test public void configured_value_set_to_all() { @@ -190,7 +200,8 @@ public void configured_value_set_to_none() { } - public static class WithDomainObjectAnnotationWithAuditingSetToEnabled extends EntityChangePublishing { + @Nested + public class WithDomainObjectAnnotationWithAuditingSetToEnabled { @Test public void irrespective_of_configured_value() { @@ -208,7 +219,31 @@ public void irrespective_of_configured_value() { } - public static class WithDomainObjectAnnotationWithAuditingSetToDisabled extends EntityChangePublishing { + @Nested + public class WithDomainObjectAnnotationWithEntityChangePublishingSetToEnabledForUpdatesOnly { + + @Test + public void irrespective_of_configured_value() { + allowingEntityChangePublishingToReturn(null); + objectScenario(CustomerWithDomainObjectAndEntityChangePublishingSetToEnabledForUpdatesOnly.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); + + final Facet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof EntityChangePublishingFacetForDomainObjectAnnotation); + + assertFalse(EntityChangePublishingFacet.isPublishingEnabledForCreate(facetHolder)); + assertTrue(EntityChangePublishingFacet.isPublishingEnabledForUpdate(facetHolder)); + assertFalse(EntityChangePublishingFacet.isPublishingEnabledForDelete(facetHolder)); + + assertNoMethodsRemoved(); + }); + } + + } + + @Nested + public class WithDomainObjectAnnotationWithAuditingSetToDisabled { @Test public void irrespective_of_configured_value() { @@ -226,7 +261,8 @@ public void irrespective_of_configured_value() { } - public static class AutoComplete extends DomainObjectAnnotationFacetFactoryTest { + @Nested + public class AutoComplete { class CustomerRepository { public String lookup(final String x) { return null; } @@ -317,7 +353,8 @@ public void whenNoDomainObjectAnnotation() { } - public static class Bounded extends DomainObjectAnnotationFacetFactoryTest { + @Nested + public class Bounded { @DomainObject(bounding = Bounding.BOUNDED) class CustomerWithDomainObjectAndBoundedSetToTrue { @@ -331,10 +368,8 @@ class CustomerWithDomainObjectAndBoundedSetToFalse { class CustomerWithDomainObjectButNoBounded { } - @Override @BeforeEach public void setUp() throws Exception { - super.setUp(); ignoringConfiguration(); } @@ -382,25 +417,23 @@ public void whenNoDomainObjectAnnotation() { } - public static class Editing extends DomainObjectAnnotationFacetFactoryTest { - - class CustomerWithImmutableAnnotation { - } - - @DomainObject(editing = org.apache.causeway.applib.annotation.Editing.AS_CONFIGURED) - class CustomerWithDomainObjectAndEditingSetToAsConfigured { - } + @DomainObject(editing = org.apache.causeway.applib.annotation.Editing.AS_CONFIGURED) + static class CustomerWithDomainObjectAndEditingSetToAsConfigured { + } - @DomainObject(editing = org.apache.causeway.applib.annotation.Editing.DISABLED) - class CustomerWithDomainObjectAndEditingSetToDisabled { - } + @DomainObject(editing = org.apache.causeway.applib.annotation.Editing.DISABLED) + static class CustomerWithDomainObjectAndEditingSetToDisabled { + } - @DomainObject(editing = org.apache.causeway.applib.annotation.Editing.ENABLED) - class CustomerWithDomainObjectAndEditingSetToEnabled { - } + @DomainObject(editing = org.apache.causeway.applib.annotation.Editing.ENABLED) + static class CustomerWithDomainObjectAndEditingSetToEnabled { + } + @Nested + public class Editing { - public static class WhenNotAnnotatedAndDefaultsFromConfiguration extends Editing { + @Nested + public class WhenNotAnnotatedAndDefaultsFromConfiguration { @Test public void configured_value_set_to_true() { @@ -448,8 +481,8 @@ public void configured_value_set_to_defaults() { } } - - public static class WithDomainObjectAnnotationWithEditingSetToAsConfigured extends Editing { + @Nested + public class WithDomainObjectAnnotationWithEditingSetToAsConfigured { @Test public void configured_value_set_to_true() { @@ -493,7 +526,8 @@ public void configured_value_set_to_defaults() { } } - public static class WithDomainObjectAnnotationWithEditingSetToEnabled extends Editing { + @Nested + public class WithDomainObjectAnnotationWithEditingSetToEnabled { @Test public void irrespective_of_configured_value() { @@ -509,7 +543,8 @@ public void irrespective_of_configured_value() { } } - public static class WithDomainObjectAnnotationWithEditingSetToDisabled extends Editing { + @Nested + public class WithDomainObjectAnnotationWithEditingSetToDisabled { @Test public void irrespective_of_configured_value() { @@ -527,27 +562,27 @@ public void irrespective_of_configured_value() { } } - public static class LogicalTypeName extends DomainObjectAnnotationFacetFactoryTest { + @Named("CUS") + @DomainObject + static class LogicalTypeNameCustomerWithDomainObjectAndObjectTypeSet { + } - @Named("CUS") - @DomainObject - class CustomerWithDomainObjectAndObjectTypeSet { - } + @DomainObject + static class LogicalTypeNameCustomerWithDomainObjectButNoObjectType { + } - @DomainObject - class CustomerWithDomainObjectButNoObjectType { - } - @Override + @Nested + public class LogicalTypeName { + @BeforeEach public void setUp() throws Exception { - super.setUp(); ignoringConfiguration(); } @Test public void whenDomainObjectAndObjectTypeSetToTrue() { - assertThat(LogicalType.infer(CustomerWithDomainObjectAndObjectTypeSet.class).logicalName(), + assertThat(LogicalType.infer(LogicalTypeNameCustomerWithDomainObjectAndObjectTypeSet.class).logicalName(), is("CUS")); assertNoMethodsRemoved(); } @@ -555,7 +590,7 @@ public void whenDomainObjectAndObjectTypeSetToTrue() { @Test public void whenDomainObjectAndObjectTypeNotSet() { - objectScenario(CustomerWithDomainObjectButNoObjectType.class, (processClassContext, facetHolder)->{ + objectScenario(LogicalTypeNameCustomerWithDomainObjectButNoObjectType.class, (processClassContext, facetHolder)->{ facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(AliasedFacet.class); @@ -580,28 +615,28 @@ public void whenNoDomainObjectAnnotation() { } - public static class Nature extends DomainObjectAnnotationFacetFactoryTest { - @DomainObject(nature = org.apache.causeway.applib.annotation.Nature.ENTITY) - class CustomerWithDomainObjectAndNatureSetToJdoEntity { - } + @DomainObject(nature = org.apache.causeway.applib.annotation.Nature.ENTITY) + static class CustomerWithDomainObjectAndNatureSetToJdoEntity { + } - @DomainObject(nature = org.apache.causeway.applib.annotation.Nature.NOT_SPECIFIED) - class CustomerWithDomainObjectAndNatureSetToNotSpecified { - } + @DomainObject(nature = org.apache.causeway.applib.annotation.Nature.NOT_SPECIFIED) + static class CustomerWithDomainObjectAndNatureSetToNotSpecified { + } - @DomainObject(nature = org.apache.causeway.applib.annotation.Nature.VIEW_MODEL) - class CustomerWithDomainObjectAndNatureSetToViewModel { - } + @DomainObject(nature = org.apache.causeway.applib.annotation.Nature.VIEW_MODEL) + static class CustomerWithDomainObjectAndNatureSetToViewModel { + } - @DomainObject - class CustomerWithDomainObjectButNoNature { - } + @DomainObject + static class CustomerWithDomainObjectButNoNature { + } + + @Nested + public class Nature { - @Override @BeforeEach public void setUp() throws Exception { - super.setUp(); ignoringConfiguration(); } @@ -663,18 +698,20 @@ public void whenNoDomainObjectAnnotation() { } - public static class Alias extends AbstractTestWithMetaModelContext { - DomainObjectAnnotationFacetFactory facetFactory; + @Named("object.name") + @DomainObject(aliased = {"object.name", "object.alias"}) + static class AliasDomainObjectWithAliases { + } - @Named("object.name") - @DomainObject(aliased = {"object.name", "object.alias"}) - class DomainObjectWithAliases { - } + @Named("service.name") + @DomainService(aliased = {"service.name", "service.alias"}) + static class AliasDomainServiceWithAliases { + } - @Named("service.name") - @DomainService(aliased = {"service.name", "service.alias"}) - class DomainServiceWithAliases { - } + + @Nested + public class Alias { + DomainObjectAnnotationFacetFactory facetFactory; @Test public void testValidationDomainObjectWithAliasesConfigured() { @@ -685,7 +722,7 @@ public void testValidationDomainObjectWithAliasesConfigured() { facetFactory = new DomainObjectAnnotationFacetFactory(getMetaModelContext()); ((MetaModelContext_forTesting) getMetaModelContext()).getProgrammingModel();//kicks off the programming model factory - getMetaModelContext().getSpecificationLoader().loadSpecification(DomainObjectWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); + getMetaModelContext().getSpecificationLoader().loadSpecification(AliasDomainObjectWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); ValidationFailures validationFailures = getMetaModelContext().getSpecificationLoader().getOrAssessValidationResult(); assertFalse(validationFailures.hasFailures()); } @@ -699,7 +736,7 @@ public void testValidationDomainServiceWithAliasesConfigured() { facetFactory = new DomainObjectAnnotationFacetFactory(getMetaModelContext()); ((MetaModelContext_forTesting) getMetaModelContext()).getProgrammingModel();//kicks off the programming model factory - getMetaModelContext().getSpecificationLoader().loadSpecification(DomainServiceWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); + getMetaModelContext().getSpecificationLoader().loadSpecification(AliasDomainServiceWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); ValidationFailures validationFailures = getMetaModelContext().getSpecificationLoader().getOrAssessValidationResult(); assertFalse(validationFailures.hasFailures()); } @@ -711,7 +748,7 @@ public void testValidationDomainObjectWithAliasesDefault() { facetFactory = new DomainObjectAnnotationFacetFactory(getMetaModelContext()); ((MetaModelContext_forTesting) getMetaModelContext()).getProgrammingModel();//kicks off the programming model factory - getMetaModelContext().getSpecificationLoader().loadSpecification(DomainObjectWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); + getMetaModelContext().getSpecificationLoader().loadSpecification(AliasDomainObjectWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); ValidationFailures validationFailures = getMetaModelContext().getSpecificationLoader().getOrAssessValidationResult(); assertTrue(validationFailures.hasFailures()); } @@ -724,7 +761,7 @@ public void testValidationDomainServiceWithAliasesDefault() { facetFactory = new DomainObjectAnnotationFacetFactory(getMetaModelContext()); ((MetaModelContext_forTesting) getMetaModelContext()).getProgrammingModel();//kicks off the programming model factory - getMetaModelContext().getSpecificationLoader().loadSpecification(DomainServiceWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); + getMetaModelContext().getSpecificationLoader().loadSpecification(AliasDomainServiceWithAliases.class, IntrospectionState.FULLY_INTROSPECTED); ValidationFailures validationFailures = getMetaModelContext().getSpecificationLoader().getOrAssessValidationResult(); assertTrue(validationFailures.hasFailures()); } diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java index 997e1e54515..9e5878f2ebb 100644 --- a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java +++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java @@ -536,7 +536,8 @@ public void enlistCreated(final ManagedObject entity) { _Xray.enlistCreated(entity, interactionProviderProvider); - if (isEntityExcludedForChangePublishing(entity)) { + if ( isEntityExcludedForChangePublishing(entity) || + !EntityChangePublishingFacet.isPublishingEnabledForCreate(entity.objSpec())) { return; } @@ -558,7 +559,8 @@ public void enlistUpdating( _Xray.enlistUpdating(entity, interactionProviderProvider); - if (isEntityExcludedForChangePublishing(entity)) { + if ( isEntityExcludedForChangePublishing(entity) || + !EntityChangePublishingFacet.isPublishingEnabledForUpdate(entity.objSpec())) { return; } @@ -596,7 +598,10 @@ public void enlistDeleting(final ManagedObject entity) { _Xray.enlistDeleting(entity, interactionProviderProvider); - if (isEntityExcludedForChangePublishing(entity)) return; + if ( isEntityExcludedForChangePublishing(entity) || + !EntityChangePublishingFacet.isPublishingEnabledForDelete(entity.objSpec())) { + return; + } suppressAutoFlushIfRequired(() -> { final boolean enlisted = enlistForChangeKindPublishing(entity, EntityChangeKind.DELETE);
