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/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 8c1bbbc264 CAUSEWAY-3810: InteractionInitiatedBy.PASS_THROUGH fixes
8c1bbbc264 is described below

commit 8c1bbbc264c365e29c3543a0965a600d7c80f419
Author: Andi Huber <[email protected]>
AuthorDate: Fri Sep 20 10:44:55 2024 +0200

    CAUSEWAY-3810: InteractionInitiatedBy.PASS_THROUGH fixes
    
    - skip event advisory when in PASS_THROUGH mode
    - excel exporter run in USER mode unless specified otherwise (e.g. for
    testing)
---
 .../_testing/MetaModelContext_forTesting.java      | 13 +++++----
 .../metamodel/interactions/InteractionUtils.java   | 12 +++++++-
 .../tabular/simple/CollectionContentsExporter.java | 33 ++++++++++++++++++++--
 .../CollectionContentsAsExcelExporter.java         |  9 ++++--
 .../tabular/excel/exporter/ExcelExporter.java      | 14 ++++++++-
 5 files changed, 69 insertions(+), 12 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
index 4174afa7ea..6934ff6f7b 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
@@ -139,6 +139,9 @@ extends MetaModelContext {
     private MetamodelEventService metamodelEventService =
         MetamodelEventService
         .builder()
+        .publisher(event->{
+            System.out.printf("MetaModelContext_forTesting (logs event to 
console): %s%n", event);
+        })
         .build();
 
     @Builder.Default
@@ -163,11 +166,11 @@ extends MetaModelContext {
 
     @Builder.Default
     Can<Function<MetaModelContext, MetaModelRefiner>> refiners = Can.empty();
-    
+
     @Builder.Default
-    private BiFunction<MetaModelContext, Can<MetaModelRefiner>, 
ProgrammingModel> programmingModelFactory = 
+    private BiFunction<MetaModelContext, Can<MetaModelRefiner>, 
ProgrammingModel> programmingModelFactory =
         (mmc, refiners)->new ProgrammingModelFacetsJava11(mmc, refiners);
-    
+
     private InteractionService interactionService;
 
     private TranslationService translationService;
@@ -363,8 +366,8 @@ extends MetaModelContext {
     }
     private final ProgrammingModel initProgrammingModel() {
         var metamodelRefiners = refiners.map(factory->factory.apply(this));
-        val programmingModel = programmingModelFactory.apply(this, 
metamodelRefiners); 
-                 
+        val programmingModel = programmingModelFactory.apply(this, 
metamodelRefiners);
+
         ((ProgrammingModelAbstract)programmingModel).init(new 
ProgrammingModelInitFilterDefault());
         return programmingModel;
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
index 4d1dff1f2a..f1963479c2 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionUtils.java
@@ -32,6 +32,7 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionResult;
 import org.apache.causeway.core.metamodel.consent.InteractionResultSet;
 import org.apache.causeway.core.metamodel.consent.VetoUtil;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
+import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract;
 import 
org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 
@@ -168,13 +169,22 @@ public final class InteractionUtils {
         return reason;
     }
 
-    private boolean compatible(final InteractionAdvisor advisor, final 
InteractionContext ic) {
+    private static boolean compatible(final InteractionAdvisor advisor, final 
InteractionContext ic) {
+        if(ic.getInitiatedBy().isPassThrough()
+                && isDomainEventAdvisor(advisor)) {
+            //[CAUSEWAY-3810] when pass-through, then don't trigger any domain 
events
+            return false;
+        }
         if(advisor instanceof ActionDomainEventFacet) {
             return ic instanceof ActionInteractionContext;
         }
         return true;
     }
 
+    private static boolean isDomainEventAdvisor(final InteractionAdvisor 
advisor) {
+        return advisor instanceof DomainEventFacetAbstract;
+    }
+
     private CausewayConfiguration.Prototyping.IfHiddenPolicy 
determineIfHiddenPolicyFrom(final ManagedObject ownerAdapter) {
         DeploymentType deploymentType = 
ownerAdapter.getSystemEnvironment().getDeploymentType();
         switch (deploymentType) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/CollectionContentsExporter.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/CollectionContentsExporter.java
index 5dfe49da85..c9343b1213 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/CollectionContentsExporter.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/tabular/simple/CollectionContentsExporter.java
@@ -35,6 +35,25 @@ import lombok.SneakyThrows;
  */
 public interface CollectionContentsExporter {
 
+    public enum AccessMode {
+        /**
+         * must be authorized, with transactions, with publishing, with domain 
events
+         */
+        USER,
+        /**
+         * always authorized, no transactions, no publishing, no domain events;
+         */
+        PASS_THROUGH;
+        /**
+         * @see #USER
+         */
+        public boolean isUser() { return this==USER; }
+        /**
+         * @see #PASS_THROUGH
+         */
+        public boolean isPassThrough() { return this==PASS_THROUGH; }
+    }
+
     /**
      * Implementing exporters need to write given tabular data from
      * {@link DataTable} into the {@link File tempFile},
@@ -43,17 +62,25 @@ public interface CollectionContentsExporter {
      * @param dataTable data model for the table
      * @param tempFile destination, this exporter writes its data to
      */
-    void createExport(DataTable dataTable, File tempFile);
+    default void createExport(final DataTable dataTable, final File tempFile) {
+        createExport(dataTable, tempFile, AccessMode.USER);
+    }
+
+    void createExport(DataTable dataTable, File tempFile, AccessMode 
interactionInitiatedBy);
 
     /**
      * Writes given tabular data into a {@link Blob} of given name.
      *
      */
-    @SneakyThrows
     default Blob exportToBlob(final DataTable dataTable, final String name) {
+        return exportToBlob(dataTable, name, AccessMode.USER);
+    }
+
+    @SneakyThrows
+    default Blob exportToBlob(final DataTable dataTable, final String name, 
final AccessMode interactionInitiatedBy) {
         var tempFile = File.createTempFile(this.getClass().getCanonicalName(), 
name);
         try {
-            createExport(dataTable, tempFile);
+            createExport(dataTable, tempFile, interactionInitiatedBy);
             return Blob.of(name, getMimeType(), 
DataSource.ofFile(tempFile).bytes());
         } finally {
             Files.deleteIfExists(tempFile.toPath()); // cleanup
diff --git 
a/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/CollectionContentsAsExcelExporter.java
 
b/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/CollectionContentsAsExcelExporter.java
index 0512083414..64992246b3 100644
--- 
a/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/CollectionContentsAsExcelExporter.java
+++ 
b/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/CollectionContentsAsExcelExporter.java
@@ -20,6 +20,7 @@ package org.apache.causeway.extensions.tabular.excel.exporter;
 
 import java.io.File;
 
+import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
@@ -31,8 +32,12 @@ public class CollectionContentsAsExcelExporter
 implements CollectionContentsExporter {
 
     @Override
-    public void createExport(final DataTable dataTable, final File tempFile) {
-        new ExcelExporter().accept(dataTable, tempFile);
+    public void createExport(final DataTable dataTable, final File tempFile,
+            final @Nullable CollectionContentsExporter.AccessMode accessMode) {
+        ExcelExporter.of(accessMode!=null
+                ? accessMode
+                : CollectionContentsExporter.AccessMode.USER)
+            .accept(dataTable, tempFile);
     }
 
     @Override
diff --git 
a/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/ExcelExporter.java
 
b/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/ExcelExporter.java
index ddd8aa14c0..429dc06746 100644
--- 
a/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/ExcelExporter.java
+++ 
b/extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/ExcelExporter.java
@@ -44,6 +44,7 @@ import org.apache.causeway.commons.internal.base._Reduction;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import 
org.apache.causeway.core.metamodel.tabular.simple.CollectionContentsExporter;
 import org.apache.causeway.core.metamodel.tabular.simple.DataTable;
 
 import lombok.RequiredArgsConstructor;
@@ -68,6 +69,17 @@ class ExcelExporter implements BiConsumer<DataTable, File> {
         }
     }
 
+    final InteractionInitiatedBy interactionInitiatedBy;
+
+    static ExcelExporter of(final CollectionContentsExporter.AccessMode 
accessMode) {
+        switch(accessMode) {
+            case USER: return new ExcelExporter(InteractionInitiatedBy.USER);
+            case PASS_THROUGH: return new 
ExcelExporter(InteractionInitiatedBy.PASS_THROUGH);
+            default:
+                throw new IllegalArgumentException("Unexpected value: " + 
accessMode);
+        }
+    }
+
     @Override @SneakyThrows
     public void accept(final DataTable table, final File tempFile) {
         try(final Workbook wb = new XSSFWorkbook()) {
@@ -116,7 +128,7 @@ class ExcelExporter implements BiConsumer<DataTable, File> {
                 maxLinesInRow = _Reduction.of(1, Math::max); // row auto-size 
calculation
                 for(val column : dataColumns) {
                     final Cell cell = row.createCell((short) i++);
-                    val cellElements = dataRow.getCellElements(column, 
InteractionInitiatedBy.PASS_THROUGH)
+                    val cellElements = dataRow.getCellElements(column, 
interactionInitiatedBy)
                             
.filter(managedObject->managedObject.getPojo()!=null);
                     final int linesWritten = setCellValue(cellElements,
                             cell,

Reply via email to