Details
-
Improvement
-
Status: Open
-
Minor
-
Resolution: Unresolved
-
None
Description
This is somewhat similar to ISIS-1656, which is to flush audit/publishing etc at the end of the ACTION phase, rather than the RENDER phase.
More broadly stated: RENDERing shouldn't have any side-effects.
~~~
Looking at the code today, we can see that in OneToOneAssociationMixedIn there's a hack:
@Override public ManagedObject get( final ManagedObject mixedInAdapter, final InteractionInitiatedBy interactionInitiatedBy) { val mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter); return getPublishingServiceInternal().withPublishingSuppressed( () -> mixinAction.executeInternal( mixinAdapter, mixedInAdapter, Can.empty(), interactionInitiatedBy) ); }
which prevents the action invocation in the render phase from publishing anything.
However, inspection of the internal data structures does currently show that the Interaction executionGraph (push, pop) gets populated, there is no corresponding hack... see attached screenshot, that shows a number of executions for all of the contributed properties of a SimpleObject. This isn't harmful per se, but it is odd that we spend all this effort to create the execution graph for it to be consumed by no-one at all.
The bottom line is that actions don't know which phase they are being executed in, and so they do all this extra work.
Perhaps the solution might be to include the phase in the InteractionContext, so we can therefore avoid this unnecessary work populating the executionGraph.