You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/11/19 17:51:06 UTC
[isis] branch master updated (6ef38c9 -> 1ab36ad)
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.
from 6ef38c9 ISIS-2464: ChangedObjectsService: don't even enlist for auditing if auditing is disabled
new f0b5704 ISIS-2464: simplify contract between ChangedObjectsService and ChangingEntitiesDispatcher
new 1ab36ad ISIS-2464: correctly count entity property change metrics even when auditing is disabled
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
...ishingChangeKind.java => EntityChangeKind.java} | 2 +-
.../isis/applib/services/iactn/Interaction.java | 4 +-
.../applib/services/metrics/MetricsService.java | 8 +-
.../facets/object/audit/AuditableFacet.java | 4 +-
.../publishedobject/PublishedObjectFacet.java | 11 +++
.../isis/core/runtime/IsisModuleCoreRuntime.java | 4 +-
.../changetracking/AdapterAndProperty.java | 19 ++++-
.../persistence/changetracking/AuditEntry.java | 4 +-
.../changetracking/ChangingEntitiesFactory.java | 93 +++++++++++++++++++++
.../changetracking/EntityAuditDispatcher.java | 1 -
.../changetracking/EntityChangeTracker.java | 6 --
...ervice.java => EntityChangeTrackerDefault.java} | 94 ++++++++++++----------
.../HasEnlistedChangingEntities.java | 21 +----
.../changetracking/HasEnlistedEntityAudits.java | 1 -
.../changetracking/PreAndPostValues.java | 4 +-
.../changetracking}/SimpleChangingEntities.java | 55 ++++++-------
.../publish/ChangingEntitiesDispatcherDefault.java | 59 +-------------
.../testdomain/conf/Configuration_headless.java | 14 +++-
.../commons/InteractionTestAbstract.java | 6 +-
19 files changed, 233 insertions(+), 177 deletions(-)
rename api/applib/src/main/java/org/apache/isis/applib/annotation/{PublishingChangeKind.java => EntityChangeKind.java} (96%)
create mode 100644 core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
rename core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/{ChangedObjectsService.java => EntityChangeTrackerDefault.java} (84%)
rename core/{runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish => runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking}/SimpleChangingEntities.java (75%)
[isis] 01/02: ISIS-2464: simplify contract between
ChangedObjectsService and ChangingEntitiesDispatcher
Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit f0b5704f266cee313db3bc786b21adc2d8c66c04
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 19 17:49:36 2020 +0100
ISIS-2464: simplify contract between ChangedObjectsService and
ChangingEntitiesDispatcher
also rename ChangedObjectsService -> EntityChangeTrackerDefault
---
...ishingChangeKind.java => EntityChangeKind.java} | 2 +-
.../facets/object/audit/AuditableFacet.java | 4 +-
.../publishedobject/PublishedObjectFacet.java | 11 +++
.../isis/core/runtime/IsisModuleCoreRuntime.java | 4 +-
.../changetracking/ChangingEntitiesFactory.java} | 88 +++++-----------------
.../changetracking/EntityAuditDispatcher.java | 1 -
.../changetracking/EntityChangeTracker.java | 6 --
...ervice.java => EntityChangeTrackerDefault.java} | 69 +++++++++--------
.../HasEnlistedChangingEntities.java | 21 +-----
.../changetracking/PreAndPostValues.java | 4 +-
.../changetracking}/SimpleChangingEntities.java | 39 +++++-----
.../publish/ChangingEntitiesDispatcherDefault.java | 59 +--------------
.../commons/InteractionTestAbstract.java | 6 +-
13 files changed, 101 insertions(+), 213 deletions(-)
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/PublishingChangeKind.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/EntityChangeKind.java
similarity index 96%
rename from api/applib/src/main/java/org/apache/isis/applib/annotation/PublishingChangeKind.java
rename to api/applib/src/main/java/org/apache/isis/applib/annotation/EntityChangeKind.java
index 48eba88..c5853eb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/PublishingChangeKind.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/EntityChangeKind.java
@@ -19,7 +19,7 @@
package org.apache.isis.applib.annotation;
// tag::refguide[]
-public enum PublishingChangeKind {
+public enum EntityChangeKind {
CREATE,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java
index 71c9193..805126e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/audit/AuditableFacet.java
@@ -26,7 +26,7 @@ import lombok.val;
/**
- * Corresponds to annotating the class with the {@link Auditable} annotation.
+ * Corresponds to annotating the class with the {@Code @DomainObject(auditing=ENABLED)} annotation.
*/
public interface AuditableFacet extends Facet {
@@ -40,7 +40,7 @@ public interface AuditableFacet extends Facet {
*/
public boolean isDisabled();
- public static boolean isEnabled(final FacetHolder facetHolder) {
+ public static boolean isAuditingEnabled(final FacetHolder facetHolder) {
if(facetHolder==null) {
return false;
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publishedobject/PublishedObjectFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publishedobject/PublishedObjectFacet.java
index d919c54..5bfb953 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publishedobject/PublishedObjectFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/publishedobject/PublishedObjectFacet.java
@@ -20,6 +20,9 @@
package org.apache.isis.core.metamodel.facets.object.publishedobject;
import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+import lombok.val;
/**
* Indicates that changes to an object's properties are to be published has, specifying the means by which
@@ -27,4 +30,12 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
*/
public interface PublishedObjectFacet extends Facet {
+ public static boolean isChangingEntitiesDispatchingEnabled(final FacetHolder facetHolder) {
+ if(facetHolder==null) {
+ return false;
+ }
+ val publishedObjectFacet = facetHolder.getFacet(PublishedObjectFacet.class);
+ return publishedObjectFacet!=null;
+ }
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
index 093f144..b726b5b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
@@ -28,7 +28,7 @@ import org.apache.isis.core.runtime.events.RuntimeEventService;
import org.apache.isis.core.runtime.events.persistence.TimestampService;
import org.apache.isis.core.runtime.iactn.scope.IsisInteractionScopeBeanFactoryPostProcessor;
import org.apache.isis.core.runtime.persistence.changetracking.EntityAuditDispatcher;
-import org.apache.isis.core.runtime.persistence.changetracking.ChangedObjectsService;
+import org.apache.isis.core.runtime.persistence.changetracking.EntityChangeTrackerDefault;
@Configuration
@Import({
@@ -39,7 +39,7 @@ import org.apache.isis.core.runtime.persistence.changetracking.ChangedObjectsSer
RuntimeEventService.class,
TimestampService.class,
EntityAuditDispatcher.class,
- ChangedObjectsService.class,
+ EntityChangeTrackerDefault.class,
// @Configuration's
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
similarity index 51%
copy from core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
copy to core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
index 5603814..ea6330e 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
@@ -16,119 +16,67 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.isis.core.runtimeservices.publish;
+package org.apache.isis.core.runtime.persistence.changetracking;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.annotation.PublishingChangeKind;
+import org.apache.isis.applib.annotation.EntityChangeKind;
import org.apache.isis.applib.services.clock.ClockService;
import org.apache.isis.applib.services.iactn.Interaction;
import org.apache.isis.applib.services.publish.ChangingEntities;
-import org.apache.isis.applib.services.publish.ChangingEntitiesListener;
import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.commons.collections.Can;
import org.apache.isis.commons.internal.collections._Maps;
import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.runtime.persistence.changetracking.ChangingEntitiesDispatcher;
-import org.apache.isis.core.runtime.persistence.changetracking.HasEnlistedChangingEntities;
import lombok.RequiredArgsConstructor;
import lombok.val;
-/**
- * Wrapper around {@link org.apache.isis.applib.services.audit.EntityAuditListener}.
- */
-@Service
-@Named("isisRuntime.ChangingEntitiesDispatcher")
-@Order(OrderPrecedence.EARLY)
-@Primary
-@Qualifier("Default")
-@RequiredArgsConstructor(onConstructor_ = {@Inject})
-//@Log4j2
-public class ChangingEntitiesDispatcherDefault implements ChangingEntitiesDispatcher {
+@RequiredArgsConstructor(staticName = "of")
+class ChangingEntitiesFactory {
- private final List<ChangingEntitiesListener> changingEntitiesListenersNullable;
private final ClockService clockService;
private final UserService userService;
-
- private Can<ChangingEntitiesListener> changingEntitiesListeners;
-
- @PostConstruct
- public void init() {
- changingEntitiesListeners = Can.ofCollection(changingEntitiesListenersNullable);
- }
-
- public void dispatchChangingEntities(HasEnlistedChangingEntities hasEnlistedChangingEntities) {
- if(!canDispatch()) {
- return;
- }
+ public ChangingEntities createChangingEntities(
+ final EntityChangeTrackerDefault entityChangeTracker) {
- hasEnlistedChangingEntities.preparePublishing();
-
// take a copy of enlisted adapters ... the JDO implementation of the PublishingService
// creates further entities which would be enlisted;
// taking copy of the map avoids ConcurrentModificationException
val changeKindByPublishedAdapter =
_Maps.filterKeys(
- hasEnlistedChangingEntities.getChangeKindByEnlistedAdapter(),
+ entityChangeTracker.getChangeKindByEnlistedAdapter(),
this::isPublishingEnabled,
HashMap::new);
if(changeKindByPublishedAdapter.isEmpty()) {
- return;
+ return null;
}
val changingEntities = newChangingEntities(
- hasEnlistedChangingEntities.currentInteraction(),
- hasEnlistedChangingEntities.numberObjectsLoaded(),
- hasEnlistedChangingEntities.numberObjectPropertiesModified(),
+ entityChangeTracker.currentInteraction(),
+ entityChangeTracker.numberObjectsLoaded(),
+ entityChangeTracker.numberObjectPropertiesModified(),
changeKindByPublishedAdapter);
-
- if(changingEntities == null) {
- return;
- }
- for (val changingEntitiesListener : changingEntitiesListeners) {
- changingEntitiesListener.onEntitiesChanging(changingEntities);
- }
+
+ return changingEntities;
}
// -- HELPER
- private boolean canDispatch() {
- return changingEntitiesListeners.isNotEmpty();
- }
-
private ChangingEntities newChangingEntities(
final Interaction interaction,
final int numberLoaded,
final int numberObjectPropertiesModified,
- final Map<ManagedObject, PublishingChangeKind> changeKindByPublishedAdapter) {
+ final Map<ManagedObject, EntityChangeKind> changeKindByPublishedAdapter) {
val uniqueId = interaction.getUniqueId();
-
- if(uniqueId == null) {
- // there was no interaction... eg fixture scripts
- return null;
- }
-
- final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
val userName = userService.getUser().getName();
val timestamp = clockService.nowAsJavaSqlTimestamp();
+ final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
return new SimpleChangingEntities(
uniqueId, nextEventSequence,
@@ -137,9 +85,7 @@ public class ChangingEntitiesDispatcherDefault implements ChangingEntitiesDispat
}
private boolean isPublishingEnabled(ManagedObject objectAdapter) {
- val publishedObjectFacet = objectAdapter.getSpecification().getFacet(PublishedObjectFacet.class);
- return publishedObjectFacet != null;
+ return PublishedObjectFacet.isChangingEntitiesDispatchingEnabled(objectAdapter.getSpecification());
}
-
-
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java
index c0e5824..2b425dc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.services.user.UserService;
import org.apache.isis.applib.services.xactn.TransactionService;
import org.apache.isis.commons.collections.Can;
import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
-import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
import lombok.RequiredArgsConstructor;
import lombok.val;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java
index 114299f..b1f4841 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java
@@ -23,12 +23,6 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
public interface EntityChangeTracker {
/**
- * @param adapter
- * @return whether given {@code entity} has already been enlisted.
- */
- boolean isEnlisted(ManagedObject entity);
-
- /**
* Auditing and publishing support: for object stores to enlist an object that has just been created,
* capturing a dummy value <tt>'[NEW]'</tt> for the pre-modification value.
* <p>
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
similarity index 88%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
index c6e3c49..a6a8df8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
@@ -32,15 +32,18 @@ import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
+import org.apache.isis.applib.annotation.EntityChangeKind;
import org.apache.isis.applib.annotation.IsisInteractionScope;
import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.annotation.PublishingChangeKind;
import org.apache.isis.applib.events.lifecycle.AbstractLifecycleEvent;
import org.apache.isis.applib.services.TransactionScopeListener;
+import org.apache.isis.applib.services.clock.ClockService;
import org.apache.isis.applib.services.eventbus.EventBusService;
import org.apache.isis.applib.services.iactn.Interaction;
import org.apache.isis.applib.services.iactn.InteractionContext;
import org.apache.isis.applib.services.metrics.MetricsService;
+import org.apache.isis.applib.services.publish.ChangingEntities;
+import org.apache.isis.applib.services.user.UserService;
import org.apache.isis.commons.internal.base._Lazy;
import org.apache.isis.commons.internal.collections._Maps;
import org.apache.isis.commons.internal.collections._Sets;
@@ -67,6 +70,7 @@ import org.apache.isis.core.metamodel.spec.feature.Contributed;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
import org.apache.isis.core.runtime.persistence.transaction.IsisTransactionPlaceholder;
+import lombok.AccessLevel;
import lombok.Getter;
import lombok.NonNull;
import lombok.val;
@@ -74,13 +78,13 @@ import lombok.extern.log4j.Log4j2;
// tag::refguide[]
@Service
-@Named("isisRuntime.ChangedObjectsService")
+@Named("isisRuntime.EntityChangeTrackerDefault")
@Order(OrderPrecedence.EARLY)
@Primary
@Qualifier("Default")
@IsisInteractionScope
@Log4j2
-public class ChangedObjectsService
+public class EntityChangeTrackerDefault
implements
TransactionScopeListener,
MetricsService,
@@ -111,13 +115,10 @@ implements
*/
private final _Lazy<Set<AuditEntry>> changedObjectPropertiesRef = _Lazy.threadSafe(this::capturePostValuesAndDrain);
+ @Getter(AccessLevel.PACKAGE)
+ private final Map<ManagedObject, EntityChangeKind> changeKindByEnlistedAdapter = _Maps.newLinkedHashMap();
- // used for publishing
- @Getter(onMethod_ = {@Override})
- private final Map<ManagedObject, PublishingChangeKind> changeKindByEnlistedAdapter = _Maps.newLinkedHashMap();
-
- @Override
- public boolean isEnlisted(final @NonNull ManagedObject adapter) {
+ private boolean isEnlisted(final @NonNull ManagedObject adapter) {
return changeKindByEnlistedAdapter.containsKey(adapter);
}
@@ -125,7 +126,7 @@ implements
if(shouldIgnore(adapter)) {
return;
}
- enlistForPublishing(adapter, PublishingChangeKind.CREATE);
+ enlistForPublishing(adapter, EntityChangeKind.CREATE);
enlistForAuditing(adapter, aap->PreAndPostValues.pre(IsisTransactionPlaceholder.NEW));
}
@@ -133,7 +134,7 @@ implements
if(shouldIgnore(adapter)) {
return;
}
- enlistForPublishing(adapter, PublishingChangeKind.UPDATE);
+ enlistForPublishing(adapter, EntityChangeKind.UPDATE);
enlistForAuditing(adapter, aap->PreAndPostValues.pre(aap.getPropertyValue()));
}
@@ -141,7 +142,7 @@ implements
if(shouldIgnore(adapter)) {
return;
}
- final boolean enlisted = enlistForPublishing(adapter, PublishingChangeKind.DELETE);
+ final boolean enlisted = enlistForPublishing(adapter, EntityChangeKind.DELETE);
if(!enlisted) {
return;
}
@@ -156,12 +157,11 @@ implements
return changedObjectPropertiesRef.get();
}
- @Override
- public int numberObjectPropertiesModified() {
+ int numberObjectPropertiesModified() {
return getEntityAuditEntries().size();
}
- protected boolean shouldIgnore(final @NonNull ManagedObject adapter) {
+ private boolean shouldIgnore(final @NonNull ManagedObject adapter) {
val spec = adapter.getSpecification();
return !spec.isEntity();
}
@@ -176,6 +176,7 @@ implements
switch (preCommitPhase) {
case AUDITING:
log.debug("about to dispatch audit entries and entity changes");
+ prepareAuditing();
entityAuditDispatcher.dispatchEntityAudits(this);
changingEntitiesDispatcher.dispatchChangingEntities(this);
break;
@@ -190,16 +191,15 @@ implements
}
}
- @Override
- public void preparePublishing() {
+ private void prepareAuditing() {
val command = currentInteraction().getCommand();
command.updater().setSystemStateChanged(
command.isSystemStateChanged()
|| numberObjectsDirtied() > 0);
}
- @Override
- public Interaction currentInteraction() {
+
+ Interaction currentInteraction() {
return interactionContextProvider.get().getInteractionElseFail();
}
@@ -213,27 +213,28 @@ implements
* @return <code>true</code> if successfully enlisted, <code>false</code> if was already enlisted
*/
private boolean enlistForPublishing(
- final @NonNull ManagedObject adapter,
- final @NonNull PublishingChangeKind current) {
- final PublishingChangeKind previous = changeKindByEnlistedAdapter.get(adapter);
- if(previous == null) {
- changeKindByEnlistedAdapter.put(adapter, current);
+ final @NonNull ManagedObject entity,
+ final @NonNull EntityChangeKind changeKind) {
+
+ val previousChangeKind = changeKindByEnlistedAdapter.get(entity);
+ if(previousChangeKind == null) {
+ changeKindByEnlistedAdapter.put(entity, changeKind);
return true;
}
- switch (previous) {
+ switch (previousChangeKind) {
case CREATE:
- switch (current) {
+ switch (changeKind) {
case DELETE:
- changeKindByEnlistedAdapter.remove(adapter);
+ changeKindByEnlistedAdapter.remove(entity);
case CREATE:
case UPDATE:
return false;
}
break;
case UPDATE:
- switch (current) {
+ switch (changeKind) {
case DELETE:
- changeKindByEnlistedAdapter.put(adapter, current);
+ changeKindByEnlistedAdapter.put(entity, changeKind);
return true;
case CREATE:
case UPDATE:
@@ -243,14 +244,14 @@ implements
case DELETE:
return false;
}
- return previous == null;
+ return previousChangeKind == null;
}
private void enlistForAuditing(
final ManagedObject entity,
final Function<AdapterAndProperty, PreAndPostValues> pre) {
- if(!AuditableFacet.isEnabled(entity.getSpecification())){
+ if(!AuditableFacet.isAuditingEnabled(entity.getSpecification())){
return; // don't enlist if entity auditing is disabled
}
@@ -399,7 +400,9 @@ implements
}
}
-
-
+ @Override
+ public ChangingEntities getChangingEntities(ClockService clockService, UserService userService) {
+ return ChangingEntitiesFactory.of(clockService, userService).createChangingEntities(this);
+ }
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
index 498d2a4..730b812 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
@@ -18,25 +18,12 @@
*/
package org.apache.isis.core.runtime.persistence.changetracking;
-import java.util.Map;
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.publish.ChangingEntities;
+import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.applib.annotation.PublishingChangeKind;
-import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-//TODO[ISIS-2441] intermediate for refactoring, keep?
public interface HasEnlistedChangingEntities {
- Map<ManagedObject, PublishingChangeKind> getChangeKindByEnlistedAdapter();
-
- int numberObjectsLoaded();
- int numberObjectPropertiesModified();
+ ChangingEntities getChangingEntities(ClockService clockService, UserService userService);
- Interaction currentInteraction();
-
- /**
- * prepare commands for publishing
- */
- void preparePublishing();
-
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/PreAndPostValues.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/PreAndPostValues.java
index 8154c48..34345e9 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/PreAndPostValues.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/PreAndPostValues.java
@@ -51,7 +51,7 @@ final class PreAndPostValues {
private PreAndPostValues(Object pre, Object post) {
this.pre = pre;
this.post = post;
- this.preString = ChangedObjectsService.asString(pre);
+ this.preString = EntityChangeTrackerDefault.asString(pre);
}
/**
@@ -79,7 +79,7 @@ final class PreAndPostValues {
public void setPost(Object post) {
this.post = post;
- this.postString = ChangedObjectsService.asString(post);
+ this.postString = EntityChangeTrackerDefault.asString(post);
}
@Override
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/SimpleChangingEntities.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
similarity index 80%
rename from core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/SimpleChangingEntities.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
index d8719e5..fc971ce 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/SimpleChangingEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
@@ -17,15 +17,15 @@
* under the License.
*/
-package org.apache.isis.core.runtimeservices.publish;
+package org.apache.isis.core.runtime.persistence.changetracking;
import java.sql.Timestamp;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
+import org.apache.isis.applib.annotation.EntityChangeKind;
import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.PublishingChangeKind;
import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
import org.apache.isis.applib.services.RepresentsInteractionMemberExecution;
import org.apache.isis.applib.services.publish.ChangingEntities;
@@ -40,6 +40,7 @@ import org.apache.isis.schema.chg.v2.ChangesDto;
import org.apache.isis.schema.chg.v2.ObjectsDto;
import org.apache.isis.schema.common.v2.OidsDto;
+import lombok.NonNull;
import lombok.ToString;
import lombok.val;
@@ -47,7 +48,7 @@ import lombok.val;
* Captures which objects were created, updated or deleted in the course of a transaction.
*/
@ToString
-public class SimpleChangingEntities implements ChangingEntities, RepresentsInteractionMemberExecution {
+class SimpleChangingEntities implements ChangingEntities, RepresentsInteractionMemberExecution {
// -- constructor, fields
private UUID transactionUuid;
@@ -56,16 +57,16 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
private final Timestamp completedAt;
private final int numberLoaded;
private final int numberObjectPropertiesModified;
- private final Map<ManagedObject, PublishingChangeKind> changesByAdapter;
+ private final Map<ManagedObject, EntityChangeKind> changesByAdapter;
public SimpleChangingEntities(
- final @lombok.NonNull UUID transactionUuid,
+ final @NonNull UUID transactionUuid,
final int sequence,
- final @lombok.NonNull String userName,
- final @lombok.NonNull Timestamp completedAt,
+ final @NonNull String userName,
+ final @NonNull Timestamp completedAt,
final int numberLoaded,
final int numberObjectPropertiesModified,
- final @lombok.NonNull Map<ManagedObject, PublishingChangeKind> changesByAdapter) {
+ final @NonNull Map<ManagedObject, EntityChangeKind> changesByAdapter) {
this.transactionUuid = transactionUuid;
this.sequence = sequence;
@@ -129,17 +130,17 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
@Override
public int getNumberCreated() {
- return numAdaptersOfKind(PublishingChangeKind.CREATE);
+ return numAdaptersOfKind(EntityChangeKind.CREATE);
}
@Override
public int getNumberUpdated() {
- return numAdaptersOfKind(PublishingChangeKind.UPDATE);
+ return numAdaptersOfKind(EntityChangeKind.UPDATE);
}
@Override
public int getNumberDeleted() {
- return numAdaptersOfKind(PublishingChangeKind.DELETE);
+ return numAdaptersOfKind(EntityChangeKind.DELETE);
}
@Override
@@ -147,7 +148,7 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
return numberObjectPropertiesModified;
}
- private int numAdaptersOfKind(final PublishingChangeKind kind) {
+ private int numAdaptersOfKind(final EntityChangeKind kind) {
return _NullSafe.size(adaptersByChange.get().get(kind));
}
@@ -155,10 +156,10 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
/**
* Lazily calculate the inverse of 'changesByAdapter'
*/
- private _Lazy<ListMultimap<PublishingChangeKind, ManagedObject>> adaptersByChange =
+ private _Lazy<ListMultimap<EntityChangeKind, ManagedObject>> adaptersByChange =
_Lazy.of(this::initAdaptersByChange);
- private ListMultimap<PublishingChangeKind, ManagedObject> initAdaptersByChange(){
+ private ListMultimap<EntityChangeKind, ManagedObject> initAdaptersByChange(){
return _Maps.invertToListMultimap(changesByAdapter);
}
@@ -173,9 +174,9 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
final ObjectsDto objectsDto = new ObjectsDto();
- objectsDto.setCreated(oidsDtoFor(PublishingChangeKind.CREATE));
- objectsDto.setUpdated(oidsDtoFor(PublishingChangeKind.UPDATE));
- objectsDto.setDeleted(oidsDtoFor(PublishingChangeKind.DELETE));
+ objectsDto.setCreated(oidsDtoFor(EntityChangeKind.CREATE));
+ objectsDto.setUpdated(oidsDtoFor(EntityChangeKind.UPDATE));
+ objectsDto.setDeleted(oidsDtoFor(EntityChangeKind.DELETE));
objectsDto.setLoaded(getNumberLoaded());
objectsDto.setPropertiesModified(getNumberPropertiesModified());
@@ -183,7 +184,7 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
return objectsDto;
}
- private OidsDto oidsDtoFor(final PublishingChangeKind kind) {
+ private OidsDto oidsDtoFor(final EntityChangeKind kind) {
val oidsDto = new OidsDto();
_NullSafe.stream(adaptersByChange.get().get(kind))
@@ -199,7 +200,7 @@ public class SimpleChangingEntities implements ChangingEntities, RepresentsInter
}
protected ChangesDto newChangesDto(final ObjectsDto objectsDto) {
- final ChangesDto changesDto = new ChangesDto();
+ val changesDto = new ChangesDto();
changesDto.setMajorVersion("2");
changesDto.setMinorVersion("0");
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
index 5603814..f63e161 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
@@ -18,9 +18,7 @@
*/
package org.apache.isis.core.runtimeservices.publish;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
@@ -32,16 +30,10 @@ import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.annotation.PublishingChangeKind;
import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.applib.services.publish.ChangingEntities;
import org.apache.isis.applib.services.publish.ChangingEntitiesListener;
import org.apache.isis.applib.services.user.UserService;
import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
import org.apache.isis.core.runtime.persistence.changetracking.ChangingEntitiesDispatcher;
import org.apache.isis.core.runtime.persistence.changetracking.HasEnlistedChangingEntities;
@@ -77,31 +69,12 @@ public class ChangingEntitiesDispatcherDefault implements ChangingEntitiesDispat
return;
}
- hasEnlistedChangingEntities.preparePublishing();
-
- // take a copy of enlisted adapters ... the JDO implementation of the PublishingService
- // creates further entities which would be enlisted;
- // taking copy of the map avoids ConcurrentModificationException
-
- val changeKindByPublishedAdapter =
- _Maps.filterKeys(
- hasEnlistedChangingEntities.getChangeKindByEnlistedAdapter(),
- this::isPublishingEnabled,
- HashMap::new);
-
- if(changeKindByPublishedAdapter.isEmpty()) {
- return;
- }
-
- val changingEntities = newChangingEntities(
- hasEnlistedChangingEntities.currentInteraction(),
- hasEnlistedChangingEntities.numberObjectsLoaded(),
- hasEnlistedChangingEntities.numberObjectPropertiesModified(),
- changeKindByPublishedAdapter);
-
+ val changingEntities = hasEnlistedChangingEntities.getChangingEntities(clockService, userService);
+
if(changingEntities == null) {
return;
}
+
for (val changingEntitiesListener : changingEntitiesListeners) {
changingEntitiesListener.onEntitiesChanging(changingEntities);
}
@@ -113,33 +86,7 @@ public class ChangingEntitiesDispatcherDefault implements ChangingEntitiesDispat
return changingEntitiesListeners.isNotEmpty();
}
- private ChangingEntities newChangingEntities(
- final Interaction interaction,
- final int numberLoaded,
- final int numberObjectPropertiesModified,
- final Map<ManagedObject, PublishingChangeKind> changeKindByPublishedAdapter) {
-
- val uniqueId = interaction.getUniqueId();
-
- if(uniqueId == null) {
- // there was no interaction... eg fixture scripts
- return null;
- }
-
- final int nextEventSequence = interaction.next(Interaction.Sequence.INTERACTION.id());
- val userName = userService.getUser().getName();
- val timestamp = clockService.nowAsJavaSqlTimestamp();
-
- return new SimpleChangingEntities(
- uniqueId, nextEventSequence,
- userName, timestamp,
- numberLoaded, numberObjectPropertiesModified, changeKindByPublishedAdapter);
- }
- private boolean isPublishingEnabled(ManagedObject objectAdapter) {
- val publishedObjectFacet = objectAdapter.getSpecification().getFacet(PublishedObjectFacet.class);
- return publishedObjectFacet != null;
- }
}
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
index dec573d..5a3edfd 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
@@ -42,7 +42,7 @@ import org.apache.isis.core.metamodel.interactions.managed.CollectionInteraction
import org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction;
import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
-import org.apache.isis.core.runtime.persistence.changetracking.ChangedObjectsService;
+import org.apache.isis.core.runtime.persistence.changetracking.EntityChangeTrackerDefault;
import org.apache.isis.testdomain.applayer.auditing.EntityAuditListenerForTesting;
import org.apache.isis.testdomain.util.CollectionAssertions;
import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
@@ -56,9 +56,9 @@ public abstract class InteractionTestAbstract extends IsisIntegrationTestAbstrac
@Inject protected IsisInteractionFactory interactionFactory;
@Inject protected WrapperFactory wrapper;
@Inject protected KVStoreForTesting kvStoreForTesting;
- @Inject private javax.inject.Provider<ChangedObjectsService> changedObjectsServiceProvider;
+ @Inject private javax.inject.Provider<EntityChangeTrackerDefault> changedObjectsServiceProvider;
- protected ChangedObjectsService getChangedObjectsService() {
+ protected EntityChangeTrackerDefault getChangedObjectsService() {
return changedObjectsServiceProvider.get();
}
[isis] 02/02: ISIS-2464: correctly count entity property change
metrics even when auditing is disabled
Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 1ab36adc9f3d7c16943712b842959b22991d0c28
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 19 18:50:52 2020 +0100
ISIS-2464: correctly count entity property change metrics even when
auditing is disabled
---
.../isis/applib/services/iactn/Interaction.java | 4 +--
.../applib/services/metrics/MetricsService.java | 8 +++--
.../changetracking/AdapterAndProperty.java | 19 +++++++---
.../persistence/changetracking/AuditEntry.java | 4 +--
.../changetracking/ChangingEntitiesFactory.java | 12 ++++---
.../changetracking/EntityChangeTrackerDefault.java | 41 ++++++++++++----------
.../changetracking/HasEnlistedEntityAudits.java | 1 -
.../changetracking/SimpleChangingEntities.java | 16 ++++-----
.../testdomain/conf/Configuration_headless.java | 14 +++++---
9 files changed, 71 insertions(+), 48 deletions(-)
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index ce9d4ca..7a6b15e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -698,8 +698,8 @@ public class Interaction implements HasUniqueId {
final Timestamp timestamp,
final MetricsService metricsService) {
- final int numberObjectsLoaded = metricsService.numberObjectsLoaded();
- final int numberObjectsDirtied = metricsService.numberObjectsDirtied();
+ final int numberObjectsLoaded = metricsService.numberEntitiesLoaded();
+ final int numberObjectsDirtied = metricsService.numberEntitiesDirtied();
when.syncMetrics(this, timestamp, numberObjectsLoaded, numberObjectsDirtied);
}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java b/api/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
index 4c1f7b8..a81a02e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/metrics/MetricsService.java
@@ -26,14 +26,14 @@ public interface MetricsService {
// end::refguide[]
/**
- * The number of objects that have, so far in this request, been loaded from the database.
+ * The number of entities that have, so far in this request, been loaded from the database.
* <p>
* Corresponds to the number of times that <code>javax.jdo.listener.LoadLifecycleListener#postLoad(InstanceLifecycleEvent)</code> (or equivalent) is fired.
* <p>
* Is captured within {@link MemberExecutionDto#getMetrics()} (accessible from {@link InteractionContext#getInteractionIfAny()}).
*/
// tag::refguide[]
- int numberObjectsLoaded(); // <.>
+ int numberEntitiesLoaded(); // <.>
// end::refguide[]
/**
@@ -45,7 +45,9 @@ public interface MetricsService {
* Is captured within {@link MemberExecutionDto#getMetrics()} (accessible from {@link InteractionContext#getInteractionIfAny()}).
*/
// tag::refguide[]
- int numberObjectsDirtied(); // <.>
+ int numberEntitiesDirtied(); // <.>
+
+ int numberEntityPropertiesModified();
}
// end::refguide[]
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AdapterAndProperty.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AdapterAndProperty.java
index bd2de16..a1feab0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AdapterAndProperty.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AdapterAndProperty.java
@@ -18,6 +18,8 @@
*/
package org.apache.isis.core.runtime.persistence.changetracking;
+import java.util.Map;
+
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -40,18 +42,22 @@ final class AdapterAndProperty {
@Getter private final ObjectAssociation property;
@Getter private final Bookmark bookmark;
@Getter private final String propertyId;
+ @Getter private final boolean auditDispatchEnabled;
+
private final String bookmarkStr;
public static AdapterAndProperty of(
- @NonNull final ManagedObject adapter,
- @NonNull final ObjectAssociation property) {
- return new AdapterAndProperty(adapter, property);
+ final @NonNull ManagedObject adapter,
+ final @NonNull ObjectAssociation property,
+ final boolean auditDispatchEnabled) {
+ return new AdapterAndProperty(adapter, property, auditDispatchEnabled);
}
- private AdapterAndProperty(ManagedObject adapter, ObjectAssociation property) {
+ private AdapterAndProperty(ManagedObject adapter, ObjectAssociation property, boolean auditDispatchEnabled) {
this.adapter = adapter;
this.property = property;
+ this.auditDispatchEnabled = auditDispatchEnabled;
this.propertyId = property.getId();
this.bookmark = ManagedObjects.bookmarkElseFail(adapter);
@@ -68,4 +74,9 @@ final class AdapterAndProperty {
return referencedAdapter == null ? null : referencedAdapter.getPojo();
}
+ public static boolean isAuditDispatchEnabled(final Map.Entry<AdapterAndProperty, ?> enlistedEntry) {
+ val adapterAndProperty = enlistedEntry.getKey();
+ return adapterAndProperty.isAuditDispatchEnabled();
+ }
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AuditEntry.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AuditEntry.java
index b9af9d7..6fdbd31 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AuditEntry.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/AuditEntry.java
@@ -26,7 +26,7 @@ import lombok.experimental.PackagePrivate;
@PackagePrivate
final class AuditEntry {
- @NonNull private final AdapterAndProperty adapterAndProperty;
- @NonNull private final PreAndPostValues preAndPostValues;
+ private final @NonNull AdapterAndProperty adapterAndProperty;
+ private final @NonNull PreAndPostValues preAndPostValues;
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
index ea6330e..0ee6a5b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
@@ -58,8 +58,8 @@ class ChangingEntitiesFactory {
val changingEntities = newChangingEntities(
entityChangeTracker.currentInteraction(),
- entityChangeTracker.numberObjectsLoaded(),
- entityChangeTracker.numberObjectPropertiesModified(),
+ entityChangeTracker.numberEntitiesLoaded(),
+ entityChangeTracker.numberEntityPropertiesModified(),
changeKindByPublishedAdapter);
return changingEntities;
@@ -69,8 +69,8 @@ class ChangingEntitiesFactory {
private ChangingEntities newChangingEntities(
final Interaction interaction,
- final int numberLoaded,
- final int numberObjectPropertiesModified,
+ final int numberEntitiesLoaded,
+ final int numberEntityPropertiesModified,
final Map<ManagedObject, EntityChangeKind> changeKindByPublishedAdapter) {
val uniqueId = interaction.getUniqueId();
@@ -81,7 +81,9 @@ class ChangingEntitiesFactory {
return new SimpleChangingEntities(
uniqueId, nextEventSequence,
userName, timestamp,
- numberLoaded, numberObjectPropertiesModified, changeKindByPublishedAdapter);
+ numberEntitiesLoaded,
+ numberEntityPropertiesModified,
+ changeKindByPublishedAdapter);
}
private boolean isPublishingEnabled(ManagedObject objectAdapter) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
index a6a8df8..d6d8e99 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
@@ -157,10 +157,6 @@ implements
return changedObjectPropertiesRef.get();
}
- int numberObjectPropertiesModified() {
- return getEntityAuditEntries().size();
- }
-
private boolean shouldIgnore(final @NonNull ManagedObject adapter) {
val spec = adapter.getSpecification();
return !spec.isEntity();
@@ -195,9 +191,13 @@ implements
val command = currentInteraction().getCommand();
command.updater().setSystemStateChanged(
command.isSystemStateChanged()
- || numberObjectsDirtied() > 0);
+ || numberEntitiesDirtied() > 0);
}
+ @Override
+ public ChangingEntities getChangingEntities(ClockService clockService, UserService userService) {
+ return ChangingEntitiesFactory.of(clockService, userService).createChangingEntities(this);
+ }
Interaction currentInteraction() {
return interactionContextProvider.get().getInteractionElseFail();
@@ -251,14 +251,12 @@ implements
final ManagedObject entity,
final Function<AdapterAndProperty, PreAndPostValues> pre) {
- if(!AuditableFacet.isAuditingEnabled(entity.getSpecification())){
- return; // don't enlist if entity auditing is disabled
- }
-
if(changedObjectPropertiesRef.isMemoized()) {
throw _Exceptions.illegalState("Cannot enlist additional changes for auditing, "
+ "since changedObjectPropertiesRef was already prepared (memoized) for auditing.");
}
+
+ val auditDispatchEnabled = AuditableFacet.isAuditingEnabled(entity.getSpecification());
log.debug("enlist entity's property changes for auditing {}", entity);
@@ -266,10 +264,11 @@ implements
.streamAssociations(Contributed.EXCLUDED)
.filter(ObjectAssociation.Predicates.PROPERTIES)
.filter(property->!property.isNotPersisted())
- .map(property->AdapterAndProperty.of(entity, property))
+ .map(property->AdapterAndProperty.of(entity, property, auditDispatchEnabled))
.filter(aap->!enlistedEntityPropertiesForAuditing.containsKey(aap)) // already enlisted, so ignore
.forEach(aap->{
enlistedEntityPropertiesForAuditing.put(aap, pre.apply(aap));
+ numberEntityPropertiesModified.increment();
});
}
@@ -281,6 +280,7 @@ implements
val postValues = enlistedEntityPropertiesForAuditing.entrySet().stream()
.peek(this::updatePostOn) // set post values of audits, which have been left empty up to now
+ .filter(AdapterAndProperty::isAuditDispatchEnabled)
.filter(PreAndPostValues::shouldAudit)
.map(entry->AuditEntry.of(entry.getKey(), entry.getValue()))
.collect(_Sets.toUnmodifiable());
@@ -307,14 +307,19 @@ implements
// -- METRICS SERVICE
@Override
- public int numberObjectsLoaded() {
- return Math.toIntExact(numberLoaded.longValue());
+ public int numberEntitiesLoaded() {
+ return Math.toIntExact(numberEntitiesLoaded.longValue());
}
@Override
- public int numberObjectsDirtied() {
+ public int numberEntitiesDirtied() {
return changeKindByEnlistedAdapter.size();
}
+
+ @Override
+ public int numberEntityPropertiesModified() {
+ return Math.toIntExact(numberEntityPropertiesModified.longValue());
+ }
// -- ENTITY CHANGE TRACKING
@@ -368,11 +373,12 @@ implements
postLifecycleEventIfRequired(entity, UpdatedLifecycleEventFacet.class);
}
- private final LongAdder numberLoaded = new LongAdder();
+ private final LongAdder numberEntitiesLoaded = new LongAdder();
+ private final LongAdder numberEntityPropertiesModified = new LongAdder();
@Override
public void incrementLoaded() {
- numberLoaded.increment();
+ numberEntitiesLoaded.increment();
}
// -- HELPER
@@ -400,9 +406,6 @@ implements
}
}
- @Override
- public ChangingEntities getChangingEntities(ClockService clockService, UserService userService) {
- return ChangingEntitiesFactory.of(clockService, userService).createChangingEntities(this);
- }
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedEntityAudits.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedEntityAudits.java
index 3932078..317ea051 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedEntityAudits.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedEntityAudits.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.runtime.persistence.changetracking;
import java.util.Set;
-//TODO[ISIS-2441] intermediate for refactoring keep?
public interface HasEnlistedEntityAudits {
Set<AuditEntry> getEntityAuditEntries();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
index fc971ce..547d863 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
@@ -55,8 +55,8 @@ class SimpleChangingEntities implements ChangingEntities, RepresentsInteractionM
private final int sequence;
private final String userName;
private final Timestamp completedAt;
- private final int numberLoaded;
- private final int numberObjectPropertiesModified;
+ private final int numberEntitiesLoaded;
+ private final int numberEntityPropertiesModified;
private final Map<ManagedObject, EntityChangeKind> changesByAdapter;
public SimpleChangingEntities(
@@ -64,16 +64,16 @@ class SimpleChangingEntities implements ChangingEntities, RepresentsInteractionM
final int sequence,
final @NonNull String userName,
final @NonNull Timestamp completedAt,
- final int numberLoaded,
- final int numberObjectPropertiesModified,
+ final int numberEntitiesLoaded,
+ final int numberEntityPropertiesModified,
final @NonNull Map<ManagedObject, EntityChangeKind> changesByAdapter) {
this.transactionUuid = transactionUuid;
this.sequence = sequence;
this.userName = userName;
this.completedAt = completedAt;
- this.numberLoaded = numberLoaded;
- this.numberObjectPropertiesModified = numberObjectPropertiesModified;
+ this.numberEntitiesLoaded = numberEntitiesLoaded;
+ this.numberEntityPropertiesModified = numberEntityPropertiesModified;
this.changesByAdapter = changesByAdapter;
}
@@ -125,7 +125,7 @@ class SimpleChangingEntities implements ChangingEntities, RepresentsInteractionM
@Override
public int getNumberLoaded() {
- return numberLoaded;
+ return numberEntitiesLoaded;
}
@Override
@@ -145,7 +145,7 @@ class SimpleChangingEntities implements ChangingEntities, RepresentsInteractionM
@Override
public int getNumberPropertiesModified() {
- return numberObjectPropertiesModified;
+ return numberEntityPropertiesModified;
}
private int numAdaptersOfKind(final EntityChangeKind kind) {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java
index 2e8c802..cca59a4 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/conf/Configuration_headless.java
@@ -160,16 +160,22 @@ public class Configuration_headless {
@Bean @Singleton
public MetricsService metricsService() {
return new MetricsService() {
-
+
@Override
- public int numberObjectsLoaded() {
+ public int numberEntitiesLoaded() {
return 0;
}
-
+
@Override
- public int numberObjectsDirtied() {
+ public int numberEntitiesDirtied() {
return 0;
}
+
+ @Override
+ public int numberEntityPropertiesModified() {
+ return 0;
+ }
+
};
}