CAUSEWAY-3688: makes audit trail robust when fail to read current value for all scenarios (new, update, delete)
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
index a22cd85..6c74c48 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/objectlifecycle/PropertyChangeRecord.java
@@ -83,15 +83,7 @@
return target.getLogicalTypeName() + "#" + propertyId;
}
- public PropertyChangeRecord withPreValueSetToNew() {
- return withPreValueSetTo(PropertyValuePlaceholder.NEW);
- }
-
- public PropertyChangeRecord withPreValueSetToCurrent() {
- return withPreValueSetTo(getPropertyValue());
- }
-
- private PropertyChangeRecord withPreValueSetToCurrentElseUnknown() {
+ public PropertyChangeRecord withPreValueSetToCurrentElseUnknown() {
try {
return withPreValueSetToCurrent();
} catch (Exception ex) {
@@ -99,21 +91,41 @@
}
}
+ private PropertyChangeRecord withPreValueSetToCurrent() {
+ return withPreValueSetTo(getPropertyValue());
+ }
+
private PropertyChangeRecord withPreValueSetToUnknown() {
return withPreValueSetTo(PropertyValuePlaceholder.UNKNOWN);
}
- public PropertyChangeRecord withPostValueSetToCurrent() {
- return withPostValueSetTo(getPropertyValue());
+ private PropertyChangeRecord withPreValueSetToNew() {
+ return withPreValueSetTo(PropertyValuePlaceholder.NEW);
+ }
+
+ private PropertyChangeRecord withPreValueSetTo(Object preValue) {
+ this.preAndPostValue = PreAndPostValue.pre(preValue);
+ return this;
+ }
+
+ public PropertyChangeRecord withPostValueSetToCurrentElseUnknown() {
+ try {
+ return withPostValueSetToCurrent();
+ } catch (Exception ex) {
+ return withPostValueSetToUnknown();
+ }
}
public PropertyChangeRecord withPostValueSetToDeleted() {
return withPostValueSetTo(PropertyValuePlaceholder.DELETED);
}
- private PropertyChangeRecord withPreValueSetTo(Object preValue) {
- this.preAndPostValue = PreAndPostValue.pre(preValue);
- return this;
+ private PropertyChangeRecord withPostValueSetToCurrent() {
+ return withPostValueSetTo(getPropertyValue());
+ }
+
+ private PropertyChangeRecord withPostValueSetToUnknown() {
+ return withPostValueSetTo(PropertyValuePlaceholder.UNKNOWN);
}
private PropertyChangeRecord withPostValueSetTo(Object postValue) {
diff --git a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java
index 88a5cd4..8f8a065 100644
--- a/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java
+++ b/persistence/commons/src/main/java/org/apache/causeway/persistence/commons/integration/changetracking/EntityChangeTrackerDefault.java
@@ -186,7 +186,7 @@
if(MmEntityUtils.getEntityState(rec.getEntity()).isTransientOrRemoved()) {
rec.withPostValueSetToDeleted();
} else {
- rec.withPostValueSetToCurrent();
+ rec.withPostValueSetToCurrentElseUnknown();
}
})
.filter(managedProperty-> shouldPublish(managedProperty.getPreAndPostValue()))
@@ -375,7 +375,7 @@
.filter(pcrId -> ! enlistedPropertyChangeRecordsById.containsKey(pcrId)) // only if not previously seen
.map(pcrId -> enlistedPropertyChangeRecordsById.put(pcrId, PropertyChangeRecord.ofCurrent(pcrId)))
.filter(Objects::nonNull) // shouldn't happen, just keeping compiler happy
- .forEach(PropertyChangeRecord::withPreValueSetToCurrent);
+ .forEach(PropertyChangeRecord::withPreValueSetToCurrentElseUnknown);
}
});
}