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 2021/04/02 14:31:46 UTC

[isis] branch master updated: ISIS-2573: xray: prepare to have a closer look into change enlisting

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


The following commit(s) were added to refs/heads/master by this push:
     new d1a7ac6  ISIS-2573: xray: prepare to have a closer look into change enlisting
d1a7ac6 is described below

commit d1a7ac64bcf3ad4052bdc005c71956827ddcd6fc
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Apr 2 16:31:33 2021 +0200

    ISIS-2573: xray: prepare to have a closer look into change enlisting
---
 .../changetracking/EntityChangeTrackerDefault.java | 26 ++++++++++++----------
 .../core/transaction/changetracking/_Xray.java     | 13 ++++++++++-
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java
index 9c392bf..ace47ef 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java
@@ -106,12 +106,13 @@ implements
     
 
     /**
-     * Used for publishing: this contains the pre- values of every property of every object enlisted.
+     * Contains initial change records having set the pre-values of every property of every object that was enlisted.
      */
     private final Set<_PropertyChangeRecord> entityPropertyChangeRecords = _Sets.newLinkedHashSet();
 
     /**
-     * Used for publishing; contains the pre- and post- values of every property of every object that actually changed.
+     * Contains pre- and post- values of every property of every object that actually changed. A lazy snapshot,
+     * triggered by internal call to {@link #snapshotPropertyChangeRecords()}.
      */
     private final _Lazy<Set<_PropertyChangeRecord>> entityPropertyChangeRecordsForPublishing 
         = _Lazy.threadSafe(this::capturePostValuesAndDrain);
@@ -130,7 +131,7 @@ implements
             return;
         }
         enlistForChangeKindPublishing(adapter, EntityChangeKind.CREATE);
-        enlistForPreAndPostValueAuditing(adapter, record->record.setPreValue(IsisTransactionPlaceholder.NEW));
+        enlistForPreAndPostValuePublishing(adapter, record->record.setPreValue(IsisTransactionPlaceholder.NEW));
     }
 
     private void enlistUpdatingInternal(final @NonNull ManagedObject adapter) {
@@ -138,7 +139,7 @@ implements
             return;
         }
         enlistForChangeKindPublishing(adapter, EntityChangeKind.UPDATE);
-        enlistForPreAndPostValueAuditing(adapter, _PropertyChangeRecord::updatePreValue);
+        enlistForPreAndPostValuePublishing(adapter, _PropertyChangeRecord::updatePreValue);
     }
 
     private void enlistDeletingInternal(final @NonNull ManagedObject adapter) {
@@ -147,11 +148,11 @@ implements
         }
         final boolean enlisted = enlistForChangeKindPublishing(adapter, EntityChangeKind.DELETE);
         if(enlisted) {
-            enlistForPreAndPostValueAuditing(adapter, _PropertyChangeRecord::updatePreValue);            
+            enlistForPreAndPostValuePublishing(adapter, _PropertyChangeRecord::updatePreValue);            
         }
     }
 
-    private Set<_PropertyChangeRecord> getPropertyChangeRecords() {
+    private Set<_PropertyChangeRecord> snapshotPropertyChangeRecords() {
         // this code path has side-effects, it locks the result for this transaction,
         // such that cannot enlist on top of it
         return entityPropertyChangeRecordsForPublishing.get();
@@ -181,7 +182,6 @@ implements
     @EventListener(value = TransactionBeforeCompletionEvent.class)
     public void onTransactionCompleting(TransactionBeforeCompletionEvent event) {
         try {
-            _Xray.publish(interactionContextProvider, authenticationContextProvider);
             doPublish();
         } finally {
             postPublishing();    
@@ -189,6 +189,8 @@ implements
     }
     
     private void doPublish() {
+        _Xray.publish(this, interactionContextProvider, authenticationContextProvider);
+        
         log.debug("about to publish entity changes");
         entityPropertyChangePublisher.publishChangedProperties(this);
         entityChangesPublisher.publishChangingEntities(this);
@@ -264,7 +266,7 @@ implements
         return previousChangeKind == null;
     }
 
-    private void enlistForPreAndPostValueAuditing(
+    private void enlistForPreAndPostValuePublishing(
             final ManagedObject entity,
             final Consumer<_PropertyChangeRecord> fun) {
 
@@ -286,14 +288,14 @@ implements
      */
     private Set<_PropertyChangeRecord> capturePostValuesAndDrain() {
 
-        val postValues = entityPropertyChangeRecords.stream()
+        val records = entityPropertyChangeRecords.stream()
                 .peek(managedProperty->managedProperty.updatePostValue()) // set post values, which have been left empty up to now
                 .filter(managedProperty->managedProperty.getPreAndPostValue().shouldPublish())
                 .collect(_Sets.toUnmodifiable());
 
         entityPropertyChangeRecords.clear();
 
-        return postValues;
+        return records;
 
     }
 
@@ -310,7 +312,7 @@ implements
     }
 
     int propertyChangeRecordCount() {
-        return getPropertyChangeRecords().size();
+        return snapshotPropertyChangeRecords().size();
     }
 
     // -- ENTITY CHANGE TRACKING
@@ -407,7 +409,7 @@ implements
             final String userName,
             final TransactionId txId) {
 
-        return getPropertyChangeRecords().stream()
+        return snapshotPropertyChangeRecords().stream()
                 .map(propertyChangeRecord->_EntityPropertyChangeFactory
                         .createEntityPropertyChange(timestamp, userName, txId, propertyChangeRecord))
                 .collect(Can.toCan());
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_Xray.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_Xray.java
index 0748cbf..596d74d 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_Xray.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_Xray.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.core.transaction.changetracking;
 
+import java.awt.Color;
+
 import javax.inject.Provider;
 
 import org.apache.isis.applib.services.iactn.InteractionContext;
@@ -32,6 +34,7 @@ import lombok.val;
 final class _Xray {
 
     public static void publish(
+            final EntityChangeTrackerDefault entityChangeTrackerDefault, 
             final Provider<InteractionContext> iaContextProvider,
             final Provider<AuthenticationContext> authContextProvider) {
         
@@ -39,7 +42,10 @@ final class _Xray {
             return;
         }
         
-        val enteringLabel = String.format("do publish");
+        final int propertyChangeRecordCount = entityChangeTrackerDefault.propertyChangeRecordCount();
+        
+        val enteringLabel = String.format("do publish %d entity change records",
+                propertyChangeRecordCount);
         
         XrayUtil.createSequenceHandle(iaContextProvider.get(), authContextProvider.get(), "ec-tracker")
         .ifPresent(handle->{
@@ -48,6 +54,11 @@ final class _Xray {
                 
                 sequenceData.alias("ec-tracker", "EntityChange-\nTracker-\n(Default)");
                 
+                if(propertyChangeRecordCount==0) {
+                    sequenceData.setConnectionArrowColor(Color.GRAY);
+                    sequenceData.setConnectionLabelColor(Color.GRAY);
+                }
+                
                 val callee = handle.getCallees().getFirstOrFail();
                 sequenceData.enter(handle.getCaller(), callee, enteringLabel);
                 //sequenceData.activate(callee);