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/05 19:17:07 UTC

[isis] branch master updated: ISIS-2567: fixes commands not getting published

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 98495fa  ISIS-2567: fixes commands not getting published
98495fa is described below

commit 98495fab24f6ce6885eba3d5b062297076d4f168
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Mar 5 20:16:11 2021 +0100

    ISIS-2567: fixes commands not getting published
    
    with member execution, consider CommandPublishingFacet only in case
    Command and ObjectMember have a matching member-id
---
 .../isis/applib/services/command/Command.java      |  7 +++++--
 .../publish/command/CommandPublishingFacet.java    | 22 ++++++++++++++++++++++
 .../executor/MemberExecutorServiceDefault.java     | 10 +++++-----
 .../publish/CommandPublisherDefault.java           |  8 ++++++--
 4 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index 857e9c1..69dc5a8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -23,6 +23,7 @@ import java.util.UUID;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
+import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.commanddto.HasCommandDto;
@@ -32,7 +33,6 @@ import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.wrapper.control.AsyncControl;
 import org.apache.isis.commons.functional.Result;
-import org.apache.isis.applib.mixins.security.HasUsername;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
 import lombok.Getter;
@@ -141,6 +141,7 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
      * Derived from {@link #getCommandDto()}, is the {@link Bookmark} of
      * the target object (entity or service) on which this action/edit was performed.
      */
+    @ToString.Include(name = "target")
     public Bookmark getTarget() {
         return commandDto != null
                 ? Bookmark.from(commandDto.getTargets().getOid().get(0))
@@ -151,6 +152,7 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
      * Derived from {@link #getCommandDto()}, holds a string
      * representation of the invoked action, or the edited property.
      */
+    @ToString.Include(name = "memberId")
     public String getLogicalMemberIdentifier() {
         return commandDto != null
                     ? commandDto.getMember().getLogicalMemberIdentifier()
@@ -251,7 +253,8 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
      */
     @Getter
     private boolean publishingEnabled;
-
+    
+    @ToString.Exclude
     private final Updater UPDATER = new Updater();
 
     public class Updater implements CommandOutcomeHandler {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacet.java
index 504b9af..94748e4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacet.java
@@ -19,12 +19,15 @@
 
 package org.apache.isis.core.metamodel.facets.members.publish.command;
 
+import java.util.Objects;
+
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
 import org.apache.isis.applib.services.publishing.spi.CommandSubscriber;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.services.publishing.CommandPublisher;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 
 import lombok.NonNull;
 import lombok.val;
@@ -52,4 +55,23 @@ public interface CommandPublishingFacet extends Facet {
         }
         return false;
     }
+
+    /**
+     * Will only run the runnable, if command and objectMember have a matching member-id
+     * and if the facetHoler has a CommandPublishingFacet.
+     */
+    public static void ifPublishingEnabledForCommand(
+            final @NonNull Command command, 
+            final @NonNull ObjectMember objectMember,
+            final @NonNull FacetHolder facetHolder,
+            final @NonNull Runnable runnable) {
+
+        val memberId1 = objectMember.getIdentifier().getLogicalIdentityString("#");
+        val memberId2 = command.getLogicalMemberIdentifier();
+        
+        if(Objects.equals(memberId1, memberId2)
+                && isPublishingEnabled(facetHolder)) {
+            runnable.run();
+        }
+    }
 }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index 209948c..456c9ee 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -116,9 +116,9 @@ implements MemberExecutorService {
 
         val interaction = getInteractionElseFail();
         val command = interaction.getCommand();
-
-        command.updater().setPublishingEnabled(
-                CommandPublishingFacet.isPublishingEnabled(facetHolder));
+        
+        CommandPublishingFacet.ifPublishingEnabledForCommand(
+                command, owningAction, facetHolder, ()->command.updater().setPublishingEnabled(true));
 
         val actionId = owningAction.getIdentifier().getFullIdentityString();
         log.debug("about to invoke action {}", actionId);
@@ -196,8 +196,8 @@ implements MemberExecutorService {
             return head.getTarget();
         }
 
-        command.updater().setPublishingEnabled(
-                CommandPublishingFacet.isPublishingEnabled(facetHolder));
+        CommandPublishingFacet.ifPublishingEnabledForCommand(
+                command, owningProperty, facetHolder, ()->command.updater().setPublishingEnabled(true));
 
         val propertyId = owningProperty.getIdentifier().getMemberName();
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java
index 5db82b1..71a51fc 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/CommandPublisherDefault.java
@@ -38,6 +38,7 @@ import org.apache.isis.core.metamodel.services.publishing.CommandPublisher;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named("isis.runtimeservices.CommandPublisherDefault")
@@ -45,7 +46,7 @@ import lombok.RequiredArgsConstructor;
 @Primary
 @Qualifier("Internal")
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
-//@Log4j2
+@Log4j2
 public class CommandPublisherDefault implements CommandPublisher {
     
     private final List<CommandSubscriber> subscribers;
@@ -68,12 +69,15 @@ public class CommandPublisherDefault implements CommandPublisher {
         if(!command.isPublishingEnabled()) {
             return;
         }
+        
         if(command.getLogicalMemberIdentifier() == null) {
             // eg if seed fixtures
             return;
         }
+        
+        log.debug("PUSH command: %s to %s", command, enabledSubscribers);
 
-        subscribers.forEach(subscriber -> subscriber.onCompleted(command));
+        enabledSubscribers.forEach(subscriber -> subscriber.onCompleted(command));
     }
     
     // -- HELPER