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,