[
https://issues.apache.org/jira/browse/CAUSEWAY-3688?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Keir Haywood resolved CAUSEWAY-3688.
-------------------------------------------
Resolution: Fixed
> Audit trail should gracefully _attempt_ to capture values, but not fail fast.
> -----------------------------------------------------------------------------
>
> Key: CAUSEWAY-3688
> URL: https://issues.apache.org/jira/browse/CAUSEWAY-3688
> Project: Causeway
> Issue Type: Improvement
> Components: Ext Sec AuditTrail
> Affects Versions: 2.0.0-RC4
> Reporter: Daniel Keir Haywood
> Assignee: Daniel Keir Haywood
> Priority: Major
> Fix For: 2.0.0-RC5
>
>
> In Estatio, we have:
> `LeaseContractFra` -> `LeaseContractFraCustomData`. On the former:
> {code:java}
> @Programmatic
> public CustomContractDataFra getCustomContractDataFra() {
> if (leaseContractRepository == null) return null; // for unit testing
> return
> leaseContractRepository.findCustomContractFraData(this).orElse(null);
> } {code}
> There's also a derived property 'getConditionPrecedentComment' on the
> LeaseContractFra which exposes one of the properties of the associated
> LeaseContractFraCustomData:
>
> {code:java}
> @PropertyLayout(multiLine = 5)
> public String getConditionPrecedentComment() {
> return getCustomContractDataFra().getConditionPrecedentComment();
> } {code}
>
> Now the `LeaseContractFra` is the aggregate root ... when it is deleted it
> cascades the delete of the `LeaseContractFraCustomData` first, and then
> itself:
> {code:java}
> @Action(semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE, domainEvent =
> RemoveEvent.class)
> public void remove() {
> if (getCustomContractDataFra() != null) {
> repositoryService.removeAndFlush(getCustomContractDataFra());
> }
> // ...
> repositoryService.removeAndFlush(this);
> } {code}
>
> # n the the audit trail component is called via the JDO "preDelete" callback
> of `LeaseContractFra`, it iterates over all of the properties of said object,
> including the derived `getConditionPrecedentComment`, and then NPEs.
> Options:
> # put the burden of responsibility with the developer, either by
> ## exclude this derived property from the audit trail using
> `@Property(entityChangePublishing = DISABLED), or
> ## adding a null guard in the body of the derived property
> # change the audit trail to automatically ignore derived properties on the
> basis that they are after all derived and the audit trail will have captured
> the values of the underlying data that they are based upon. (This is true in
> theory, but in practice figuring out the value of that derived property could
> be non-trivial; if nothing else, it makes the audit trail less valuable).
> # change the audit trail into a "best effort", ie it _attempts_ to read the
> value of the property, but if it fails then it just continues. In other
> words, this is a soft failure, similar to how if a `title()` method fails,
> then we render "Failed Title" but otherwise continue.
> Recommendation: let's go with option #3
--
This message was sent by Atlassian Jira
(v8.20.10#820010)