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/03/26 15:03:25 UTC

[isis] 02/02: ISIS-2573: refactor HasEnlistedEntityChanges to not return a nullable

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 2091f581abfdf48fcc17e2377781911d0c403568
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Mar 26 16:03:08 2021 +0100

    ISIS-2573: refactor HasEnlistedEntityChanges to not return a nullable
---
 .../publish/EntityChangesPublisherDefault.java     | 36 ++++++++++++----------
 .../isis/core/runtimeservices/publish/_Xray.java   | 23 ++++++++++++++
 .../changetracking/ChangingEntitiesFactory.java    | 17 +++++-----
 .../changetracking/EntityChangeTrackerDefault.java |  3 +-
 .../changetracking/HasEnlistedEntityChanges.java   |  5 ++-
 5 files changed, 53 insertions(+), 31 deletions(-)

diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java
index dd988ed..6deaed3 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/EntityChangesPublisherDefault.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.runtimeservices.publish;
 
 import java.util.List;
+import java.util.Optional;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
@@ -31,10 +32,12 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.having.HasEnabling;
+import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.transaction.changetracking.EntityChangesPublisher;
 import org.apache.isis.core.transaction.changetracking.HasEnlistedEntityChanges;
 
@@ -53,8 +56,9 @@ public class EntityChangesPublisherDefault implements EntityChangesPublisher {
     private final List<EntityChangesSubscriber> subscribers;
     private final ClockService clockService;
     private final UserService userService;
+    private final InteractionTracker iaTracker;
     
-    private Can<EntityChangesSubscriber> enabledSubscribers;
+    private Can<EntityChangesSubscriber> enabledSubscribers = Can.empty();
     
     @PostConstruct
     public void init() {
@@ -64,28 +68,26 @@ public class EntityChangesPublisherDefault implements EntityChangesPublisher {
 
     public void publishChangingEntities(HasEnlistedEntityChanges hasEnlistedEntityChanges) {
 
-        if(!canPublish()) {
-            return;
-        }
+        val payload = getPayload(hasEnlistedEntityChanges);
+        val handle = _Xray.enterEntityChangesPublishing(iaTracker, payload, enabledSubscribers);
         
-        val currentTime = clockService.getClock().javaSqlTimestamp();
-        val currentUser = userService.currentUserNameElseNobody();
+        payload.ifPresent(entityChanges->{
+            for (val subscriber : enabledSubscribers) {
+                subscriber.onChanging(entityChanges);
+            }
+        });
         
-        val entityChanges = hasEnlistedEntityChanges.getEntityChanges(currentTime, currentUser);
-        
-        if(entityChanges == null) {
-            return;
-        }
-        
-        for (val subscriber : enabledSubscribers) {
-            subscriber.onChanging(entityChanges);
-        }
+        _Xray.exitPublishing(handle);
     }
     
     // -- HELPER
     
-    private boolean canPublish() {
-        return enabledSubscribers.isNotEmpty();
+    private Optional<EntityChanges> getPayload(HasEnlistedEntityChanges hasEnlistedEntityChanges) {
+        return enabledSubscribers.isEmpty()
+                ? Optional.empty()
+                : hasEnlistedEntityChanges.getEntityChanges(
+                        clockService.getClock().javaSqlTimestamp(), // current time 
+                        userService.currentUserNameElseNobody()); // current user
     }
 
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java
index 6899c55..e035a37 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/_Xray.java
@@ -18,11 +18,16 @@
  */
 package org.apache.isis.core.runtimeservices.publish;
 
+import java.util.Optional;
+
 import javax.annotation.Nullable;
 
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
+import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
+import org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber;
 import org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
@@ -103,6 +108,24 @@ final class _Xray {
         
     }
     
+    // -- ENTITY CHANGES
+    
+    public static SequenceHandle enterEntityChangesPublishing(
+            final @NonNull InteractionTracker iaTracker,
+            final @NonNull Optional<EntityChanges> payload,
+            final @NonNull Can<EntityChangesSubscriber> enabledSubscribers) {
+        return null;
+    }
+    
+    // -- ENTITY PROPERTY CHANGES
+    
+    public static SequenceHandle enterEntityPropertyChangePublishing(
+            final @NonNull InteractionTracker iaTracker,
+            final boolean canPublish,
+            final @NonNull Can<EntityPropertyChangeSubscriber> enabledSubscribers) {
+        return null;
+    }
+    
     // -- EXIT
     
     public static void exitPublishing(final @Nullable SequenceHandle handle) {
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
index 4cce664..12c0110 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/ChangingEntitiesFactory.java
@@ -21,10 +21,9 @@ package org.apache.isis.core.transaction.changetracking;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.apache.isis.applib.annotation.EntityChangeKind;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
 import org.apache.isis.applib.services.iactn.Interaction;
@@ -46,23 +45,21 @@ import lombok.experimental.UtilityClass;
 @UtilityClass
 class ChangingEntitiesFactory {
 
-    @Nullable
-    public static EntityChanges createChangingEntities(
+    public static Optional<EntityChanges> createChangingEntities(
             final java.sql.Timestamp completedAt,
             final String userName,
             final EntityChangeTrackerDefault entityChangeTracker) {
 
+        if(entityChangeTracker.getChangeKindByEnlistedAdapter().isEmpty()) {
+            return Optional.empty();
+        }
+        
         // 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 changeKindByEnlistedAdapter = new HashMap<>(
                 entityChangeTracker.getChangeKindByEnlistedAdapter());
 
-        if(changeKindByEnlistedAdapter.isEmpty()) {
-            return null;
-        }
-
         val changingEntities = newChangingEntities(
                 completedAt,
                 userName,
@@ -71,7 +68,7 @@ class ChangingEntitiesFactory {
                 entityChangeTracker.numberAuditedEntityPropertiesModified(),
                 changeKindByEnlistedAdapter);
 
-        return changingEntities;
+        return Optional.of(changingEntities);
     }
 
     // -- HELPER
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 3a49411..86a22c0 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
@@ -19,6 +19,7 @@
 package org.apache.isis.core.transaction.changetracking;
 
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.LongAdder;
@@ -207,7 +208,7 @@ implements
     }
 
     @Override
-    public EntityChanges getEntityChanges(
+    public Optional<EntityChanges> getEntityChanges(
             final java.sql.Timestamp timestamp,
             final String userName) {
         return ChangingEntitiesFactory.createChangingEntities(timestamp, userName, this);
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/HasEnlistedEntityChanges.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/HasEnlistedEntityChanges.java
index 1d6aec3..6cb6ebd 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/HasEnlistedEntityChanges.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/HasEnlistedEntityChanges.java
@@ -18,13 +18,12 @@
  */
 package org.apache.isis.core.transaction.changetracking;
 
-import javax.annotation.Nullable;
+import java.util.Optional;
 
 import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 
 public interface HasEnlistedEntityChanges {
 
-    @Nullable
-    EntityChanges getEntityChanges(java.sql.Timestamp timestamp, String userName);
+    Optional<EntityChanges> getEntityChanges(java.sql.Timestamp timestamp, String userName);
     
 }