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


The following commit(s) were added to refs/heads/master by this push:
     new e99fd45  ISIS-2464: semantic renaming audit/dispatch -> publishing (2)
e99fd45 is described below

commit e99fd45de9e3c1e21ba92236607fbbe65245e767
Author: Andi Huber <[email protected]>
AuthorDate: Fri Nov 20 08:06:31 2020 +0100

    ISIS-2464: semantic renaming audit/dispatch -> publishing (2)
---
 .../org/apache/isis/applib/IsisModuleApplib.java   |  8 +--
 .../isis/applib/annotation/DomainObject.java       |  6 +--
 .../isis/applib/services/DomainChangeRecord.java   |  2 +
 .../RepresentsInteractionMemberExecution.java      |  1 +
 .../audit/AuditEntryPropertyValueType.java         | 33 ------------
 .../audit/spi/ChangingEntitiesListener.java        |  9 ----
 .../services/audit/spi/EntityAuditListener.java    | 55 --------------------
 .../isis/applib/services/command/Command.java      |  4 +-
 .../isis/applib/services/iactn/Interaction.java    |  2 +-
 .../logging/EntityChangesLogging.java}             | 21 ++++----
 .../logging/EntityPropertyChangeLogging.java}      | 33 +++---------
 .../{audit => publishing}/package-info.java        |  4 +-
 .../spi/EntityChanges.java}                        |  8 +--
 .../spi/EntityChangesSubscriber.java}              | 24 ++++-----
 .../publishing/spi/EntityPropertyChange.java       | 59 ++++++++++++++++++++++
 .../spi/EntityPropertyChangeSubscriber.java}       | 21 ++++----
 .../services/session/SessionLoggingService.java    |  5 +-
 .../isis/applib/services/xactn/TransactionId.java  |  2 +-
 .../isis/applib/types/MemberIdentifierType.java    |  2 +-
 .../apache/isis/applib/types/TargetActionType.java |  2 +-
 .../apache/isis/applib/types/TargetClassType.java  |  2 +-
 .../apache/isis/commons/having/HasEnabling.java    | 17 +++----
 .../apache/isis/commons/having}/HasUniqueId.java   |  2 +-
 .../apache/isis/commons/having}/HasUsername.java   |  2 +-
 .../apache/isis/core/config/IsisConfiguration.java | 10 ++--
 .../action/ActionAnnotationFacetFactory.java       |  2 +-
 .../DomainObjectAnnotationFacetFactory.java        |  2 +-
 .../property/PropertyAnnotationFacetFactory.java   |  2 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |  2 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  2 +-
 .../isis/core/runtime/IsisModuleCoreRuntime.java   |  4 +-
 .../changetracking/ChangingEntitiesFactory.java    |  6 +--
 .../changetracking/EntityChangeTrackerDefault.java |  6 +--
 ...her.java => EntityPropertyChangePublisher.java} | 31 +++++++-----
 .../HasEnlistedChangingEntities.java               |  4 +-
 .../changetracking/SimpleChangingEntities.java     |  4 +-
 .../publish/ChangingEntitiesDispatcherDefault.java | 10 ++--
 ...ChangesSubscriberToCaptureChangesInMemory.java} | 10 ++--
 .../_changes/ExposeCapturedChanges_changes.java    |  4 +-
 .../_changes/ExposeCapturedChanges_clear.java      |  4 +-
 .../impl/mixins/HasUniqueId_command.java           |  5 +-
 .../mixins/HasUsername_recentCommandsByUser.java   |  2 +-
 .../impl/mixins/Object_recentCommands.java         |  2 +-
 .../secman/api/user/ApplicationUser.java           |  2 +-
 .../secman/model/dom/user/HasUsername_open.java    |  2 +-
 .../auditing/EntityPrePostValueAuditingTest.java   |  4 +-
 ...figuration_usingEntityPrePostValueAuditing.java |  2 +-
 ... EntityPropertyChangeSubscriberForTesting.java} | 21 ++++----
 .../ChangingEntitiesListenerForTesting.java        | 24 ++++-----
 .../commons/InteractionTestAbstract.java           | 18 +++----
 .../entitychangetracking/ChangedObjectsTest.java   |  4 +-
 51 files changed, 224 insertions(+), 289 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java 
b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
index b13439c..10d1fa2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
@@ -29,8 +29,6 @@ import 
org.apache.isis.applib.mixins.layout.Object_rebuildMetamodel;
 import org.apache.isis.applib.mixins.metamodel.Object_downloadMetamodelXml;
 import org.apache.isis.applib.mixins.metamodel.Object_objectIdentifier;
 import org.apache.isis.applib.mixins.metamodel.Object_objectType;
-import org.apache.isis.applib.services.audit.ChangingEntitiesLogging;
-import org.apache.isis.applib.services.audit.EntityAuditLogging;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder_lookup;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder_object;
 import org.apache.isis.applib.services.clock.ClockService;
@@ -42,6 +40,8 @@ import 
org.apache.isis.applib.services.confview.ConfigurationMenu;
 import org.apache.isis.applib.services.iactn.spi.ExecutionLogging;
 import org.apache.isis.applib.services.layout.LayoutServiceMenu;
 import org.apache.isis.applib.services.metamodel.MetaModelServiceMenu;
+import org.apache.isis.applib.services.publishing.logging.EntityChangesLogging;
+import 
org.apache.isis.applib.services.publishing.logging.EntityPropertyChangeLogging;
 import org.apache.isis.applib.services.session.SessionLoggingServiceLogging;
 import org.apache.isis.schema.IsisModuleSchema;
 
@@ -68,14 +68,14 @@ import org.apache.isis.schema.IsisModuleSchema;
         MetaModelServiceMenu.class,
 
         // @Service's
-        EntityAuditLogging.class,
         ClockService.class,
         CommandDtoProcessorServiceIdentity.class,
         CommandListener.Null.class,
         ContentMappingServiceForCommandDto.class,
         ContentMappingServiceForCommandsDto.class,
+        EntityChangesLogging.class,
+        EntityPropertyChangeLogging.class,
         ExecutionLogging.class,
-        ChangingEntitiesLogging.class,
         SessionLoggingServiceLogging.class,
 
 })
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java 
b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index f8a8814..c3f8ab3 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -64,9 +64,9 @@ public @interface DomainObject {
     // end::refguide-domain-events[]
     /**
      * Whether entity changes should be dispatched to 
-     * {@link org.apache.isis.applib.services.audit.spi.EntityAuditListener}s
-     * and whether entity changes, captured as {@link 
org.apache.isis.applib.services.audit.spi.ChangingEntities}, 
-     * should be dispatched to {@link 
org.apache.isis.applib.services.audit.spi.ChangingEntitiesListener}s.
+     * {@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber}s
+     * and whether entity changes, captured as {@link 
org.apache.isis.applib.services.publishing.spi.EntityChanges}, 
+     * should be dispatched to {@link 
org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber}s.
      * @apiNote does only apply to entity objects
      */
     // tag::refguide[]
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java
index 7cfc48d..af23836 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/DomainChangeRecord.java
@@ -37,6 +37,8 @@ import 
org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
+import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.commons.having.HasUsername;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
index f9d27bc..4834752 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/RepresentsInteractionMemberExecution.java
@@ -19,6 +19,7 @@
 package org.apache.isis.applib.services;
 
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 
 /**
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditEntryPropertyValueType.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditEntryPropertyValueType.java
deleted file mode 100644
index 613b0c2..0000000
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditEntryPropertyValueType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.services.audit;
-
-public class AuditEntryPropertyValueType {
-
-    private AuditEntryPropertyValueType() {}
-
-    public static class Meta {
-
-        public static final int MAX_LEN = 255;
-
-        private Meta() {}
-
-    }
-
-}
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/ChangingEntitiesListener.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/ChangingEntitiesListener.java
deleted file mode 100644
index 4603a2b..0000000
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/ChangingEntitiesListener.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.isis.applib.services.audit.spi;
-
-public interface ChangingEntitiesListener {
-
-    /**
-     * Publish all changed entities at end of the transaction (during 
pre-commit phase).
-     */
-    void onEntitiesChanging(ChangingEntities changingEntities);      // <.>
-}
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/EntityAuditListener.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/EntityAuditListener.java
deleted file mode 100644
index bae640c..0000000
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/EntityAuditListener.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.services.audit.spi;
-
-import java.sql.Timestamp;
-import java.util.UUID;
-
-import org.apache.isis.applib.services.audit.EntityAuditLogging;
-import org.apache.isis.applib.services.bookmark.Bookmark;
-
-/**
- * Will be called whenever an auditable entity has changed its state.
- *
- * <p>
- * Typically entities are marked as auditable using the {@link 
org.apache.isis.applib.annotation.Audited}
- * annotation.
- *
- * <p> 
- * see also {@link EntityAuditLogging}.
- *
- * <p>
- * To use either service, must include on the classpath and also register the 
service (eg in <tt>application.properties</tt>).
- */
-// tag::refguide[]
-public interface EntityAuditListener {
-
-    boolean isEnabled();                                            // <.>
-
-    void audit(
-            final UUID interactionId, final int sequence,           // <.>
-            final String targetClassName,
-            final Bookmark target,                                  // <.>
-            final String memberIdentifier,
-            final String propertyName,                              // <.>
-            final String preValue, final String postValue,          // <.>
-            final String user, final Timestamp timestamp);          // <.>
-
-}
-// end::refguide[]
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java 
b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index f0e261b..d6e741c 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -23,13 +23,13 @@ import java.util.UUID;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
-import org.apache.isis.applib.services.HasUniqueId;
-import org.apache.isis.applib.services.HasUsername;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.commanddto.HasCommandDto;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.wrapper.control.AsyncControl;
+import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.commons.having.HasUsername;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
 import lombok.Getter;
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
index 7a6b15e..5e0f9c7 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/iactn/Interaction.java
@@ -31,13 +31,13 @@ import 
org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
-import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.metrics.MetricsService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.util.schema.MemberExecutionDtoUtils;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.schema.common.v2.DifferenceDto;
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/ChangingEntitiesLogging.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/logging/EntityChangesLogging.java
similarity index 75%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/audit/ChangingEntitiesLogging.java
rename to 
api/applib/src/main/java/org/apache/isis/applib/services/publishing/logging/EntityChangesLogging.java
index 7b967d4..407bb0e 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/ChangingEntitiesLogging.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/logging/EntityChangesLogging.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services.audit;
+package org.apache.isis.applib.services.publishing.logging;
 
 import javax.inject.Named;
 
@@ -26,27 +26,28 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
-import org.apache.isis.applib.services.audit.spi.ChangingEntitiesListener;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
+import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
 import org.apache.isis.applib.util.schema.ChangesDtoUtils;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
 import lombok.extern.log4j.Log4j2;
 
 @Service
-@Named("isisApplib.ChangingEntitiesLogging")
+@Named("isisApplib.EntityChangesLogging")
 @Order(OrderPrecedence.LATE)
 @Primary
 @Qualifier("Logging")
 @Log4j2
-public class ChangingEntitiesLogging implements ChangingEntitiesListener {
+public class EntityChangesLogging implements EntityChangesSubscriber {
 
     @Override
-    public void onEntitiesChanging(final ChangingEntities changingEntities) {
-
-        if(!log.isDebugEnabled()) {
-            return;
-        }
+    public boolean isEnabled() {
+        return log.isDebugEnabled();
+    }
+    
+    @Override
+    public void onChanging(final EntityChanges changingEntities) {
 
         final ChangesDto changesDto = changingEntities.getDto();
 
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/EntityAuditLogging.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/logging/EntityPropertyChangeLogging.java
similarity index 56%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/audit/EntityAuditLogging.java
rename to 
api/applib/src/main/java/org/apache/isis/applib/services/publishing/logging/EntityPropertyChangeLogging.java
index 7eb6c33..4e63bcb 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/EntityAuditLogging.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/logging/EntityPropertyChangeLogging.java
@@ -16,12 +16,8 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services.audit;
+package org.apache.isis.applib.services.publishing.logging;
 
-import java.sql.Timestamp;
-import java.util.UUID;
-
-import javax.annotation.PostConstruct;
 import javax.inject.Named;
 
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -30,22 +26,18 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.audit.spi.EntityAuditListener;
-import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.publishing.spi.EntityPropertyChange;
+import 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber;
 
 import lombok.extern.log4j.Log4j2;
 
 @Service
-@Named("isisApplib.EntityAuditLogging")
+@Named("isisApplib.EntityPropertyChangeLogging")
 @Order(OrderPrecedence.LATE)
 @Primary
 @Qualifier("logging")
 @Log4j2
-public class EntityAuditLogging implements EntityAuditListener {
-
-    @PostConstruct
-    public void init() {
-    }
+public class EntityPropertyChangeLogging implements 
EntityPropertyChangeSubscriber {
 
     @Override
     public boolean isEnabled() {
@@ -53,19 +45,8 @@ public class EntityAuditLogging implements 
EntityAuditListener {
     }
 
     @Override
-    public void audit(
-            final UUID interactionId, int sequence,
-            final String targetClassName, final Bookmark target,
-            final String memberId, final String propertyName,
-            final String preValue, final String postValue,
-            final String user, final Timestamp timestamp) {
-
-        if(log.isDebugEnabled()) {
-            String auditMessage =
-                    interactionId + "," + sequence + ": " +
-                            target.toString() + " by " + user + ", " + 
propertyName + ": " + preValue + " -> " + postValue;
-            log.debug(auditMessage);
-        }
+    public void onChanging(final EntityPropertyChange entityPropertyChange) {
+        log.debug(entityPropertyChange.toString());
     }
 
 }
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/package-info.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/package-info.java
similarity index 83%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/audit/package-info.java
rename to 
api/applib/src/main/java/org/apache/isis/applib/services/publishing/package-info.java
index b4ab557..246e465 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/package-info.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/package-info.java
@@ -18,9 +18,9 @@
  */
 
 /**
- * The {@link org.apache.isis.applib.services.audit.spi.EntityAuditListener} 
auditing service provides a simple mechanism to
+ * The {@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber} 
auditing service provides a simple mechanism to
  * capture changes to data. It is called for each property that has changed on 
any domain object, as a set of pre- and post-values.
  *
  *
  */
-package org.apache.isis.applib.services.audit;
\ No newline at end of file
+package org.apache.isis.applib.services.publishing;
\ No newline at end of file
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/ChangingEntities.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
similarity index 87%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/ChangingEntities.java
rename to 
api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
index 4b83342..a2e343d 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/spi/ChangingEntities.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChanges.java
@@ -16,16 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services.audit.spi;
+package org.apache.isis.applib.services.publishing.spi;
 
 import java.sql.Timestamp;
 
-import org.apache.isis.applib.services.HasUniqueId;
-import org.apache.isis.applib.services.HasUsername;
+import org.apache.isis.commons.having.HasUniqueId;
+import org.apache.isis.commons.having.HasUsername;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
 // tag::refguide[]
-public interface ChangingEntities
+public interface EntityChanges
         extends HasUniqueId,            // <.>
                 HasUsername {           // <.>
 
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChangesSubscriber.java
similarity index 60%
copy from 
api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
copy to 
api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChangesSubscriber.java
index 57245db..2c275a6 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityChangesSubscriber.java
@@ -16,25 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
-
-import java.util.UUID;
+package org.apache.isis.applib.services.publishing.spi;
 
+import org.apache.isis.commons.having.HasEnabling;
 
 /**
- * Mix-in interface for objects (usually created by service implementations) 
that are be persistable,
- * and so can be associated together using a unique identifier.
- *
+ * Part of the <i>Publishing SPI</i>. A component to receive the entire set of 
entities 
+ * (with publishing enabled) that are about to change, serializable as 
ChangesDto.
+ *  
+ * @since 2.0
  */
-// tag::refguide[]
-public interface HasUniqueId {
+public interface EntityChangesSubscriber extends HasEnabling {
 
-    // end::refguide[]
     /**
-     * The unique identifier (a GUID) of the request/interaction/transaction.
+     * Receives all changing entities (with publishing enabled) at then end of 
the a 
+     * transaction during the pre-commit phase.
      */
-    // tag::refguide[]
-    UUID getUniqueId();
-
+    void onChanging(EntityChanges entityChanges);      // <.>
 }
-// end::refguide[]
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityPropertyChange.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityPropertyChange.java
new file mode 100644
index 0000000..490b9da
--- /dev/null
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityPropertyChange.java
@@ -0,0 +1,59 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.services.publishing.spi;
+
+import java.sql.Timestamp;
+import java.util.UUID;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+
+import lombok.Value;
+
+/**
+ * Immutable data record for {@link EntityPropertyChangeSubscriber}s. 
+ * 
+ * @since 2.0
+ */
+@Value(staticConstructor = "of")
+public class EntityPropertyChange {
+
+    private final UUID interactionId; 
+    private final int sequence;
+    private final String targetClassName;
+    private final Bookmark target;                           
+    private final String memberIdentifier;
+    private final String propertyName;                             
+    private final String preValue; 
+    private final String postValue;          
+    private final String user; 
+    private final Timestamp timestamp;    
+    
+    @Override
+    public String toString() {
+        return String.format("%s,%d: %s by %s, %s: %s -> %s",
+        getInteractionId(), 
+        getSequence(), 
+        getTarget().toString(), 
+        getUser(), 
+        getPropertyName(), 
+        getPreValue(), 
+        getPostValue());
+    }
+    
+}
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityPropertyChangeSubscriber.java
similarity index 61%
copy from 
api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
copy to 
api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityPropertyChangeSubscriber.java
index 57245db..340e077 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/publishing/spi/EntityPropertyChangeSubscriber.java
@@ -16,25 +16,24 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
-
-import java.util.UUID;
+package org.apache.isis.applib.services.publishing.spi;
 
+import org.apache.isis.commons.having.HasEnabling;
 
 /**
- * Mix-in interface for objects (usually created by service implementations) 
that are be persistable,
- * and so can be associated together using a unique identifier.
- *
+ * Part of the <i>Publishing SPI</i>. A component to receive pre-post property 
values 
+ * for each changed entity (with publishing enabled).
+ *  
+ * @since 2.0
  */
 // tag::refguide[]
-public interface HasUniqueId {
+public interface EntityPropertyChangeSubscriber extends HasEnabling {
 
-    // end::refguide[]
     /**
-     * The unique identifier (a GUID) of the request/interaction/transaction.
+     * Receives all pre-post property values for entities (with publishing 
enabled) 
+     * at then end of the transaction during the pre-commit phase.
      */
-    // tag::refguide[]
-    UUID getUniqueId();
+    void onChanging(EntityPropertyChange entityPropertyChange);     // <.>
 
 }
 // end::refguide[]
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java
index 296ed1e..9ae9797 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java
@@ -20,10 +20,9 @@ package org.apache.isis.applib.services.session;
 
 import java.util.Date;
 
-import org.apache.isis.applib.annotation.Programmatic;
-
 /**
- * Similar to the {@link 
org.apache.isis.applib.services.audit.spi.EntityAuditListener}, this defines an 
API to track
+ * Similar to the {@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber}, 
+ * this defines an API to track
  * the status of the current sessions (&quot;users logged on&quot;) on the 
system.
  */
 // tag::refguide[]
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
index 08f15fd..93a52ba 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/xactn/TransactionId.java
@@ -20,7 +20,7 @@ package org.apache.isis.applib.services.xactn;
 
 import java.util.UUID;
 
-import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.commons.having.HasUniqueId;
 
 import lombok.Data;
 
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
 
b/api/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
index 974dfb4..dbbc2d5 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/types/MemberIdentifierType.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.services.command.Command;
 import lombok.experimental.UtilityClass;
 
 /**
- * As per {@link Command#getMemberIdentifier()} and {@link 
org.apache.isis.applib.services.audit.spi.EntityAuditListener#audit(UUID, int, 
String, Bookmark, String, String, String, String, String, Timestamp)}.
+ * As per {@link Command#getMemberIdentifier()} and {@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber#audit(UUID,
 int, String, Bookmark, String, String, String, String, String, Timestamp)}.
  */
 public class MemberIdentifierType {
 
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java 
b/api/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java
index cf44d26..6349c5b 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/types/TargetActionType.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.services.command.Command;
 import lombok.experimental.UtilityClass;
 
 /**
- * A user-friendly name of an action, as per {@link 
Command#getTargetAction()}, {@link 
org.apache.isis.applib.services.audit.spi.EntityAuditListener#audit(UUID, int, 
String, Bookmark, String, String, String, String, String, Timestamp)}.
+ * A user-friendly name of an action, as per {@link 
Command#getTargetAction()}, {@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber#audit(UUID,
 int, String, Bookmark, String, String, String, String, String, Timestamp)}.
  */
 @UtilityClass
 public class TargetActionType {
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java 
b/api/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java
index a85a71d..e453c1d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/types/TargetClassType.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.services.command.Command;
 import lombok.experimental.UtilityClass;
 
 /**
- * A user-friendly name of a class, as per {@link Command#getTargetClass()}, 
{@link 
org.apache.isis.applib.services.audit.spi.EntityAuditListener#audit(UUID, int, 
String, Bookmark, String, String, String, String, String, Timestamp)}.
+ * A user-friendly name of a class, as per {@link Command#getTargetClass()}, 
{@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber#audit(UUID,
 int, String, Bookmark, String, String, String, String, String, Timestamp)}.
  */
 @UtilityClass
 public class TargetClassType {
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditEntryPropertyIdType.java
 b/commons/src/main/java/org/apache/isis/commons/having/HasEnabling.java
similarity index 77%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditEntryPropertyIdType.java
rename to commons/src/main/java/org/apache/isis/commons/having/HasEnabling.java
index 5a7af43..b3c5806 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditEntryPropertyIdType.java
+++ b/commons/src/main/java/org/apache/isis/commons/having/HasEnabling.java
@@ -16,18 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services.audit;
+package org.apache.isis.commons.having;
 
-public class AuditEntryPropertyIdType {
-
-    private AuditEntryPropertyIdType() {}
-
-    public static class Meta {
-
-        public static final int MAX_LEN = 50;
-
-        private Meta() {}
+public interface HasEnabling {
 
+    default boolean isEnabled() {
+        // enabled by default
+        return true;
     }
-
+    
 }
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java 
b/commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
similarity index 96%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
rename to commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
index 57245db..72f52a7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/HasUniqueId.java
+++ b/commons/src/main/java/org/apache/isis/commons/having/HasUniqueId.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
+package org.apache.isis.commons.having;
 
 import java.util.UUID;
 
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/HasUsername.java 
b/commons/src/main/java/org/apache/isis/commons/having/HasUsername.java
similarity index 97%
rename from 
api/applib/src/main/java/org/apache/isis/applib/services/HasUsername.java
rename to commons/src/main/java/org/apache/isis/commons/having/HasUsername.java
index 4860b92..dc5c4c8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/HasUsername.java
+++ b/commons/src/main/java/org/apache/isis/commons/having/HasUsername.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.services;
+package org.apache.isis.commons.having;
 
 /**
  * Mix-in interface for objects (usually created by service implementations) 
that are be persistable,
diff --git 
a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java 
b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index ae254cd..713424b 100644
--- 
a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ 
b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -58,10 +58,10 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
-import org.apache.isis.applib.services.audit.spi.EntityAuditListener;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
+import 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
 import org.apache.isis.applib.services.userreg.UserRegistrationService;
 import org.apache.isis.commons.internal.context._Context;
@@ -161,7 +161,7 @@ public class IsisConfiguration {
 
                 /**
                  * The default for whether <i>domain entities</i> should be 
audited or not (meaning that any changes are
-                 * sent through to the {@link EntityAuditListener}.
+                 * sent through to the {@link EntityPropertyChangeSubscriber}.
                  *
                  * <p>
                  * This setting can be overridden on a case-by-case basis 
using {@link org.apache.isis.applib.annotation.DomainObject#auditing()} 
DomainObject#getAuditing()}
@@ -188,8 +188,8 @@ public class IsisConfiguration {
                  * {@link 
org.apache.isis.applib.services.iactn.spi.ExecutionListener} for publishing.
                  *
                  * <p>
-                 *     The service's {@link 
org.apache.isis.applib.services.iactn.spi.ExecutionListener#publish(ChangingEntities)
 publish}
-                 *     method is called only once per transaction, with {@link 
ChangingEntities} collecting details of
+                 *     The service's {@link 
org.apache.isis.applib.services.iactn.spi.ExecutionListener#publish(EntityChanges)
 publish}
+                 *     method is called only once per transaction, with {@link 
EntityChanges} collecting details of
                  *     all changed domain objects.
                  * </p>
                  *
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index c0daee1..ffb1467 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -23,7 +23,7 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index fc0459d..0172951 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -37,7 +37,7 @@ import 
org.apache.isis.applib.events.lifecycle.ObjectPersistingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectRemovingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatedEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
-import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index 8d67e26..9607833 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.annotation.Contributed;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index a0e15b3..3327868 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -27,7 +27,7 @@ import org.jmock.auto.Mock;
 import org.junit.After;
 import org.junit.Before;
 
-import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.commons.having.HasUniqueId;
 import 
org.apache.isis.core.config.metamodel.facets.PublishActionsConfiguration;
 import 
org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import 
org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation;
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index a40b49a..dce8cd3 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -33,7 +33,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.metamodel.facets.AuditObjectsConfiguration;
 import 
org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
index b726b5b..820331f 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/IsisModuleCoreRuntime.java
@@ -27,7 +27,7 @@ import org.apache.isis.core.metamodel.IsisModuleCoreMetamodel;
 import org.apache.isis.core.runtime.events.RuntimeEventService;
 import org.apache.isis.core.runtime.events.persistence.TimestampService;
 import 
org.apache.isis.core.runtime.iactn.scope.IsisInteractionScopeBeanFactoryPostProcessor;
-import 
org.apache.isis.core.runtime.persistence.changetracking.EntityAuditDispatcher;
+import 
org.apache.isis.core.runtime.persistence.changetracking.EntityPropertyChangePublisher;
 import 
org.apache.isis.core.runtime.persistence.changetracking.EntityChangeTrackerDefault;
 
 @Configuration
@@ -38,7 +38,7 @@ import 
org.apache.isis.core.runtime.persistence.changetracking.EntityChangeTrack
         // @Service's
         RuntimeEventService.class,
         TimestampService.class,
-        EntityAuditDispatcher.class,
+        EntityPropertyChangePublisher.class,
         EntityChangeTrackerDefault.class,
 
         // @Configuration's
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
index 8f3b8f6..3178a6c 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangingEntitiesFactory.java
@@ -27,9 +27,9 @@ import javax.annotation.Nullable;
 
 import org.apache.isis.applib.annotation.EntityChangeKind;
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -51,7 +51,7 @@ class ChangingEntitiesFactory {
     private final UserService userService;
 
     @Nullable
-    public ChangingEntities createChangingEntities(
+    public EntityChanges createChangingEntities(
             final EntityChangeTrackerDefault entityChangeTracker) {
         
         // take a copy of enlisted adapters ... the JDO implementation of the 
PublishingService
@@ -76,7 +76,7 @@ class ChangingEntitiesFactory {
     
     // -- HELPER
     
-    private ChangingEntities newChangingEntities(
+    private EntityChanges newChangingEntities(
             final Interaction interaction,
             final int numberEntitiesLoaded,
             final int numberEntityPropertiesModified,
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
index 93d3b12..b199121 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTrackerDefault.java
@@ -37,12 +37,12 @@ import 
org.apache.isis.applib.annotation.IsisInteractionScope;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.events.lifecycle.AbstractLifecycleEvent;
 import org.apache.isis.applib.services.TransactionScopeListener;
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.metrics.MetricsService;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -94,7 +94,7 @@ implements
 
     // end::refguide[]
     
-    @Inject private EntityAuditDispatcher entityAuditDispatcher;
+    @Inject private EntityPropertyChangePublisher entityAuditDispatcher;
     @Inject private ChangingEntitiesDispatcher changingEntitiesDispatcher;
     @Inject private EventBusService eventBusService;
     @Inject private Provider<InteractionContext> interactionContextProvider;
@@ -208,7 +208,7 @@ implements
     }
 
     @Override
-    public ChangingEntities getChangingEntities(ClockService clockService, 
UserService userService) {
+    public EntityChanges getChangingEntities(ClockService clockService, 
UserService userService) {
         return ChangingEntitiesFactory.of(clockService, 
userService).createChangingEntities(this);
     }
     
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityPropertyChangePublisher.java
similarity index 76%
rename from 
core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java
rename to 
core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityPropertyChangePublisher.java
index af9c597..967f51c 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityAuditDispatcher.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityPropertyChangePublisher.java
@@ -31,9 +31,10 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.audit.spi.EntityAuditListener;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.publishing.spi.EntityPropertyChange;
+import 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.collections.Can;
@@ -44,28 +45,28 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 /**
- * Wrapper around {@link 
org.apache.isis.applib.services.audit.spi.EntityAuditListener}.
+ * Notifies {@link 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber}s.
  */
 @Service
-@Named("isisRuntime.EntityAuditDispatcher")
+@Named("isisRuntime.EntityPropertyChangePublisher")
 @Order(OrderPrecedence.EARLY)
 @Primary
 @Qualifier("Default")
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 @Log4j2
-public class EntityAuditDispatcher {
+public class EntityPropertyChangePublisher {
     
-    private final List<EntityAuditListener> auditerServices;
+    private final List<EntityPropertyChangeSubscriber> subscribers;
     private final UserService userService;
     private final ClockService clockService;
     private final TransactionService transactionService;
     
-    private Can<EntityAuditListener> enabledAuditListeners;
+    private Can<EntityPropertyChangeSubscriber> enabledSubscribers;
     
     @PostConstruct
     public void init() {
-        enabledAuditListeners = Can.ofCollection(auditerServices)
-                .filter(EntityAuditListener::isEnabled);
+        enabledSubscribers = Can.ofCollection(subscribers)
+                .filter(EntityPropertyChangeSubscriber::isEnabled);
     }
 
     public void dispatchEntityAudits(final HasEnlistedEntityAudits 
hasEnlistedForAuditing) {
@@ -80,17 +81,17 @@ public class EntityAuditDispatcher {
         log.debug("about to process {} audits", ()->auditEntries.size());
         
         for (val auditEntry : auditEntries) {
-            auditChangedProperty(currentTime, currentUser, auditEntry);
+            publishChangedProperty(currentTime, currentUser, auditEntry);
         }
     }
 
     // -- HELPER
     
     private boolean canDispatch() {
-        return enabledAuditListeners.isNotEmpty();
+        return enabledSubscribers.isNotEmpty();
     }
     
-    private void auditChangedProperty(
+    private void publishChangedProperty(
             final java.sql.Timestamp timestamp,
             final String user,
             final AuditEntry auditEntry) {
@@ -113,9 +114,11 @@ public class EntityAuditDispatcher {
         final UUID transactionId = txId.getUniqueId();
         final int sequence = txId.getSequence();
 
-        for (val auditListener : enabledAuditListeners) {
-            auditListener
-            .audit(transactionId, sequence, targetClass, target, memberId, 
propertyId, preValue, postValue, user, timestamp);
+        for (val subscriber : enabledSubscribers) {
+            subscriber.onChanging(
+                    EntityPropertyChange
+                        .of(transactionId, sequence, targetClass, target, 
+                                memberId, propertyId, preValue, postValue, 
user, timestamp));
         }
     }
 
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
index 231ce67..c3d1ae0 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedChangingEntities.java
@@ -18,12 +18,12 @@
  */
 package org.apache.isis.core.runtime.persistence.changetracking;
 
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
 import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.applib.services.user.UserService;
 
 public interface HasEnlistedChangingEntities {
 
-    ChangingEntities getChangingEntities(ClockService clockService, 
UserService userService);
+    EntityChanges getChangingEntities(ClockService clockService, UserService 
userService);
     
 }
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
index ba27404..04be96d 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/SimpleChangingEntities.java
@@ -24,7 +24,7 @@ import java.util.UUID;
 import java.util.function.Supplier;
 
 import org.apache.isis.applib.services.RepresentsInteractionMemberExecution;
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
 import lombok.NonNull;
@@ -34,7 +34,7 @@ import lombok.ToString;
  * Captures which objects were created, updated or deleted in the course of a 
transaction.
  */
 @ToString
-class SimpleChangingEntities implements ChangingEntities, 
RepresentsInteractionMemberExecution {
+class SimpleChangingEntities implements EntityChanges, 
RepresentsInteractionMemberExecution {
 
     private UUID transactionUuid;
     private final int sequence;
diff --git 
a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
index d162c4d..46842a2 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/publish/ChangingEntitiesDispatcherDefault.java
@@ -30,8 +30,8 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.audit.spi.ChangingEntitiesListener;
 import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.commons.collections.Can;
 import 
org.apache.isis.core.runtime.persistence.changetracking.ChangingEntitiesDispatcher;
@@ -41,7 +41,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
- * Wrapper around {@link 
org.apache.isis.applib.services.audit.spi.ChangingEntitiesListener}.
+ * Wrapper around {@link 
org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber}.
  */
 @Service
 @Named("isisRuntime.ChangingEntitiesDispatcher")
@@ -52,11 +52,11 @@ import lombok.val;
 //@Log4j2
 public class ChangingEntitiesDispatcherDefault implements 
ChangingEntitiesDispatcher {
     
-    private final List<ChangingEntitiesListener> 
changingEntitiesListenersNullable;
+    private final List<EntityChangesSubscriber> 
changingEntitiesListenersNullable;
     private final ClockService clockService;
     private final UserService userService;
     
-    private Can<ChangingEntitiesListener> changingEntitiesListeners;
+    private Can<EntityChangesSubscriber> changingEntitiesListeners;
     
     @PostConstruct
     public void init() {
@@ -76,7 +76,7 @@ public class ChangingEntitiesDispatcherDefault implements 
ChangingEntitiesDispat
         }
         
         for (val changingEntitiesListener : changingEntitiesListeners) {
-            changingEntitiesListener.onEntitiesChanging(changingEntities);
+            changingEntitiesListener.onChanging(changingEntities);
         }
     }
     
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ChangingEntitiesListenerToCaptureChangesInMemory.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/EntityChangesSubscriberToCaptureChangesInMemory.java
similarity index 82%
rename from 
examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ChangingEntitiesListenerToCaptureChangesInMemory.java
rename to 
examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/EntityChangesSubscriberToCaptureChangesInMemory.java
index fba562a..91a8f78 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ChangingEntitiesListenerToCaptureChangesInMemory.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/EntityChangesSubscriberToCaptureChangesInMemory.java
@@ -24,21 +24,21 @@ import java.util.stream.Stream;
 
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
-import org.apache.isis.applib.services.audit.spi.ChangingEntitiesListener;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
+import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
 import lombok.val;
 
 //tag::class[]
 @Service
-public class ChangingEntitiesListenerToCaptureChangesInMemory implements 
ChangingEntitiesListener {
+public class EntityChangesSubscriberToCaptureChangesInMemory implements 
EntityChangesSubscriber {
 
     private final List<ChangesDto> changedEntities = new ArrayList<>();
 
     @Override
-    public void onEntitiesChanging(
-            ChangingEntities changingEntities       // <.>
+    public void onChanging(
+            EntityChanges changingEntities       // <.>
     ) {
         val dto = changingEntities.getDto();
         this.changedEntities.add(dto);
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_changes.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_changes.java
index 0410d88..edadfda 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_changes.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_changes.java
@@ -41,13 +41,13 @@ public class ExposeCapturedChanges_changes {
 //tag::class[]
     public List<ChangesDto> coll() {
         val list = new LinkedList<ChangesDto>();
-        changingEntitiesListenerToCaptureChangesInMemory
+        entityChangesSubscriberToCaptureChangesInMemory
                 .streamChangedEntities()
                 .forEach(list::push);   // reverse order
         return list;
     }
 
     @Inject
-    ChangingEntitiesListenerToCaptureChangesInMemory 
changingEntitiesListenerToCaptureChangesInMemory;
+    EntityChangesSubscriberToCaptureChangesInMemory 
entityChangesSubscriberToCaptureChangesInMemory;
 }
 //end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_clear.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_clear.java
index 3ce39f5..624c030 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_clear.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/_changes/ExposeCapturedChanges_clear.java
@@ -43,11 +43,11 @@ public class ExposeCapturedChanges_clear {
 
     //tag::class[]
     public DomainObjectAuditingVm act() {
-        changingEntitiesListenerToCaptureChangesInMemory.clear();
+        entityChangesSubscriberToCaptureChangesInMemory.clear();
         return domainObjectAuditingVm;
     }
 
     @Inject
-    ChangingEntitiesListenerToCaptureChangesInMemory 
changingEntitiesListenerToCaptureChangesInMemory;
+    EntityChangesSubscriberToCaptureChangesInMemory 
entityChangesSubscriberToCaptureChangesInMemory;;
 }
 //end::class[]
diff --git 
a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
 
b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
index 2da3594..1725f81 100644
--- 
a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
+++ 
b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUniqueId_command.java
@@ -25,9 +25,8 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.command.Command;
-
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
@@ -35,7 +34,7 @@ import 
org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
 
 /**
  * This mixin contributes a <tt>command</tt> action to any (non-command) 
implementation of
- * {@link org.apache.isis.applib.services.HasUniqueId}; that is: audit 
entries, and published events.  Thus, it
+ * {@link org.apache.isis.commons.having.HasUniqueId}; that is: audit entries, 
and published events.  Thus, it
  * is possible to navigate from the effect back to the cause.
  */
 @Action(
diff --git 
a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
 
b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
index 89460fd..8c5fbc4 100644
--- 
a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
+++ 
b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/HasUsername_recentCommandsByUser.java
@@ -26,7 +26,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.services.HasUsername;
+import org.apache.isis.commons.having.HasUsername;
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
diff --git 
a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
 
b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
index eeeb9c3..f85b7ba 100644
--- 
a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
+++ 
b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/mixins/Object_recentCommands.java
@@ -28,9 +28,9 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.extensions.commandlog.impl.IsisModuleExtCommandLogImpl;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdo;
 import org.apache.isis.extensions.commandlog.impl.jdo.CommandJdoRepository;
diff --git 
a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
 
b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
index c27a06a..d783b74 100644
--- 
a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
+++ 
b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUser.java
@@ -20,7 +20,7 @@ package org.apache.isis.extensions.secman.api.user;
 
 import java.util.SortedSet;
 
-import org.apache.isis.applib.services.HasUsername;
+import org.apache.isis.commons.having.HasUsername;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import 
org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
diff --git 
a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
 
b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
index 4d4919e..25f8c0c 100644
--- 
a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
+++ 
b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
@@ -26,8 +26,8 @@ import org.apache.isis.applib.annotation.Contributed;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.HasUsername;
 import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.commons.having.HasUsername;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserRepository;
diff --git 
a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/auditing/EntityPrePostValueAuditingTest.java
 
b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/auditing/EntityPrePostValueAuditingTest.java
index 690c16c..c424a8e 100644
--- 
a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/auditing/EntityPrePostValueAuditingTest.java
+++ 
b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/applayer/auditing/EntityPrePostValueAuditingTest.java
@@ -65,7 +65,7 @@ class EntityPrePostValueAuditingTest extends 
IsisIntegrationTestAbstract {
     }
 
     private void given() {
-        EntityAuditListenerForTesting.clearAuditEntries(kvStore);
+        EntityPropertyChangeSubscriberForTesting.clearAuditEntries(kvStore);
     }
 
     private void verify(VerificationStage verificationStage) {
@@ -86,7 +86,7 @@ class EntityPrePostValueAuditingTest extends 
IsisIntegrationTestAbstract {
     // -- HELPER
 
     private void assertHasAuditEntries(Can<String> expectedAuditEntries) {
-        val actualAuditEntries = 
EntityAuditListenerForTesting.getAuditEntries(kvStore);
+        val actualAuditEntries = 
EntityPropertyChangeSubscriberForTesting.getAuditEntries(kvStore);
         CollectionAssertions.assertComponentWiseEquals(expectedAuditEntries, 
actualAuditEntries);
     }
 
diff --git 
a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/Configuration_usingEntityPrePostValueAuditing.java
 
b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/Configuration_usingEntityPrePostValueAuditing.java
index 9ec9a17..981322a 100644
--- 
a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/Configuration_usingEntityPrePostValueAuditing.java
+++ 
b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/Configuration_usingEntityPrePostValueAuditing.java
@@ -23,7 +23,7 @@ import org.springframework.context.annotation.Import;
 
 @Configuration
 @Import({
-    EntityAuditListenerForTesting.class
+    EntityPropertyChangeSubscriberForTesting.class
 })
 public class Configuration_usingEntityPrePostValueAuditing {
 
diff --git 
a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/EntityAuditListenerForTesting.java
 
b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/EntityPropertyChangeSubscriberForTesting.java
similarity index 72%
rename from 
regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/EntityAuditListenerForTesting.java
rename to 
regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/EntityPropertyChangeSubscriberForTesting.java
index 8196468..a6e1468 100644
--- 
a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/EntityAuditListenerForTesting.java
+++ 
b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/auditing/EntityPropertyChangeSubscriberForTesting.java
@@ -18,18 +18,16 @@
  */
 package org.apache.isis.testdomain.applayer.auditing;
 
-import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.UUID;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.services.audit.spi.EntityAuditListener;
-import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.publishing.spi.EntityPropertyChange;
+import 
org.apache.isis.applib.services.publishing.spi.EntityPropertyChangeSubscriber;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
 
@@ -37,7 +35,7 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Service @Log4j2
-public class EntityAuditListenerForTesting implements EntityAuditListener {
+public class EntityPropertyChangeSubscriberForTesting implements 
EntityPropertyChangeSubscriber {
 
     @Inject private KVStoreForTesting kvStore;
     
@@ -52,12 +50,9 @@ public class EntityAuditListenerForTesting implements 
EntityAuditListener {
     }
 
     @Override
-    public void audit(UUID interactionId, int sequence, String 
targetClassName, Bookmark target,
-            String memberIdentifier, String propertyName, String preValue, 
String postValue, String user,
-            Timestamp timestamp) {
+    public void onChanging(final EntityPropertyChange entityPropertyChange) {
 
-        val auditEntry = String.format("%s/%s: '%s' -> '%s'", 
-                targetClassName, propertyName, preValue, postValue);
+        val auditEntry = entityPropertyChange.toString();
 
         @SuppressWarnings("unchecked")
         val auditEntries = (List<String>) kvStore.get(this, 
"audit").orElseGet(ArrayList::new);
@@ -73,12 +68,14 @@ public class EntityAuditListenerForTesting implements 
EntityAuditListener {
     @SuppressWarnings("unchecked")
     public static Can<String> getAuditEntries(KVStoreForTesting kvStore) {
         return Can.ofCollection(
-                (List<String>) 
kvStore.get(EntityAuditListenerForTesting.class, "audit")
+                (List<String>) 
kvStore.get(EntityPropertyChangeSubscriberForTesting.class, "audit")
                 .orElse(null));
     }
     
     public static void clearAuditEntries(KVStoreForTesting kvStore) {
-        kvStore.clear(EntityAuditListenerForTesting.class);
+        kvStore.clear(EntityPropertyChangeSubscriberForTesting.class);
     }
 
+   
+
 }
\ No newline at end of file
diff --git 
a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/publishing/ChangingEntitiesListenerForTesting.java
 
b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/publishing/ChangingEntitiesListenerForTesting.java
index 987c49d..9aa61db 100644
--- 
a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/publishing/ChangingEntitiesListenerForTesting.java
+++ 
b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/publishing/ChangingEntitiesListenerForTesting.java
@@ -26,10 +26,10 @@ import javax.inject.Inject;
 
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.services.audit.spi.ChangingEntities;
-import org.apache.isis.applib.services.audit.spi.ChangingEntitiesListener;
 import org.apache.isis.applib.services.iactn.Interaction.Execution;
 import org.apache.isis.applib.services.iactn.spi.ExecutionListener;
+import org.apache.isis.applib.services.publishing.spi.EntityChanges;
+import org.apache.isis.applib.services.publishing.spi.EntityChangesSubscriber;
 import org.apache.isis.applib.util.schema.ChangesDtoUtils;
 import org.apache.isis.applib.util.schema.MemberExecutionDtoUtils;
 import org.apache.isis.commons.collections.Can;
@@ -43,7 +43,7 @@ import lombok.extern.log4j.Log4j2;
 public class ChangingEntitiesListenerForTesting 
 implements 
     ExecutionListener,
-    ChangingEntitiesListener {
+    EntityChangesSubscriber {
 
     @Inject private KVStoreForTesting kvStore;
 
@@ -66,11 +66,11 @@ implements
     }
 
     @Override
-    public void onEntitiesChanging(ChangingEntities publishedObjects) {
+    public void onChanging(EntityChanges publishedObjects) {
 
         @SuppressWarnings("unchecked")
         val publishedEntries = 
-        (List<ChangingEntities>) kvStore.get(this, 
"publishedObjects").orElseGet(ArrayList::new);
+        (List<EntityChanges>) kvStore.get(this, 
"publishedObjects").orElseGet(ArrayList::new);
 
         publishedEntries.add(publishedObjects);
 
@@ -82,9 +82,9 @@ implements
     // -- UTILITIES
 
     @SuppressWarnings("unchecked")
-    public static Can<ChangingEntities> getPublishedObjects(KVStoreForTesting 
kvStore) {
+    public static Can<EntityChanges> getPublishedObjects(KVStoreForTesting 
kvStore) {
         return Can.ofCollection(
-                (List<ChangingEntities>) 
kvStore.get(ChangingEntitiesListenerForTesting.class, "publishedObjects")
+                (List<EntityChanges>) 
kvStore.get(ChangingEntitiesListenerForTesting.class, "publishedObjects")
                 .orElse(null));
     }
 
@@ -101,27 +101,27 @@ implements
 
     public static int getCreated(KVStoreForTesting kvStore) {
         val publishedObjects = getPublishedObjects(kvStore);
-        return 
publishedObjects.stream().mapToInt(ChangingEntities::getNumberCreated).sum();
+        return 
publishedObjects.stream().mapToInt(EntityChanges::getNumberCreated).sum();
     }
 
     public static int getDeleted(KVStoreForTesting kvStore) {
         val publishedObjects = getPublishedObjects(kvStore);
-        return 
publishedObjects.stream().mapToInt(ChangingEntities::getNumberDeleted).sum();
+        return 
publishedObjects.stream().mapToInt(EntityChanges::getNumberDeleted).sum();
     }
 
     public static int getLoaded(KVStoreForTesting kvStore) {
         val publishedObjects = getPublishedObjects(kvStore);
-        return 
publishedObjects.stream().mapToInt(ChangingEntities::getNumberLoaded).sum();
+        return 
publishedObjects.stream().mapToInt(EntityChanges::getNumberLoaded).sum();
     }
 
     public static int getUpdated(KVStoreForTesting kvStore) {
         val publishedObjects = getPublishedObjects(kvStore);
-        return 
publishedObjects.stream().mapToInt(ChangingEntities::getNumberUpdated).sum();
+        return 
publishedObjects.stream().mapToInt(EntityChanges::getNumberUpdated).sum();
     }
 
     public static int getModified(KVStoreForTesting kvStore) {
         val publishedObjects = getPublishedObjects(kvStore);
-        return 
publishedObjects.stream().mapToInt(ChangingEntities::getNumberPropertiesModified).sum();
+        return 
publishedObjects.stream().mapToInt(EntityChanges::getNumberPropertiesModified).sum();
     }
 
 
diff --git 
a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
 
b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
index 5a3edfd..2fb0590 100644
--- 
a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
+++ 
b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
@@ -43,7 +43,7 @@ import 
org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
 import 
org.apache.isis.core.runtime.persistence.changetracking.EntityChangeTrackerDefault;
-import 
org.apache.isis.testdomain.applayer.auditing.EntityAuditListenerForTesting;
+import 
org.apache.isis.testdomain.applayer.auditing.EntityPropertyChangeSubscriberForTesting;
 import org.apache.isis.testdomain.util.CollectionAssertions;
 import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
 import 
org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract;
@@ -164,7 +164,7 @@ public abstract class InteractionTestAbstract extends 
IsisIntegrationTestAbstrac
     // -- ASSERTIONS (AUDITING)
     
     protected void assertEmptyAudits() {
-        val audits = 
EntityAuditListenerForTesting.getAuditEntries(kvStoreForTesting);
+        val audits = 
EntityPropertyChangeSubscriberForTesting.getAuditEntries(kvStoreForTesting);
         assertTrue(audits.isEmpty());
     }
 
@@ -186,13 +186,13 @@ public abstract class InteractionTestAbstract extends 
IsisIntegrationTestAbstrac
                 "Jdo Book/name: '[NEW]' -> 'Sample Book'",
                 "Jdo Inventory/name: '[NEW]' -> 'Sample Inventory'");
 
-        val actualAudits = 
EntityAuditListenerForTesting.getAuditEntries(kvStoreForTesting)
+        val actualAudits = 
EntityPropertyChangeSubscriberForTesting.getAuditEntries(kvStoreForTesting)
                 .stream()
                 .collect(Collectors.toCollection(TreeSet::new));
 
         assertEquals(expectedAudits, actualAudits);
 
-        EntityAuditListenerForTesting.clearAuditEntries(kvStoreForTesting);
+        
EntityPropertyChangeSubscriberForTesting.clearAuditEntries(kvStoreForTesting);
 
     }
 
@@ -207,13 +207,13 @@ public abstract class InteractionTestAbstract extends 
IsisIntegrationTestAbstrac
                 "Jdo Book/publisher: 'Sample Publisher' -> '[DELETED]'",
                 "Jdo Inventory/name: 'Sample Inventory' -> '[DELETED]'");
 
-        val actualAudits = 
EntityAuditListenerForTesting.getAuditEntries(kvStoreForTesting)
+        val actualAudits = 
EntityPropertyChangeSubscriberForTesting.getAuditEntries(kvStoreForTesting)
                 .stream()
                 .collect(Collectors.toCollection(TreeSet::new));
 
         assertEquals(expectedAudits, actualAudits);
 
-        EntityAuditListenerForTesting.clearAuditEntries(kvStoreForTesting);
+        
EntityPropertyChangeSubscriberForTesting.clearAuditEntries(kvStoreForTesting);
 
     }
 
@@ -222,19 +222,19 @@ public abstract class InteractionTestAbstract extends 
IsisIntegrationTestAbstrac
         val expectedAudits = _Sets.ofSorted(
                 "Jdo Book/price: '99.0' -> '12.0'");
 
-        val actualAudits = 
EntityAuditListenerForTesting.getAuditEntries(kvStoreForTesting)
+        val actualAudits = 
EntityPropertyChangeSubscriberForTesting.getAuditEntries(kvStoreForTesting)
                 .stream()
                 .collect(Collectors.toCollection(TreeSet::new));
 
         assertEquals(expectedAudits, actualAudits);
 
-        EntityAuditListenerForTesting.clearAuditEntries(kvStoreForTesting);
+        
EntityPropertyChangeSubscriberForTesting.clearAuditEntries(kvStoreForTesting);
     }
 
     // -- UTILTITIES 
     
     protected void dumpAudits() {
-        val audits = 
EntityAuditListenerForTesting.getAuditEntries(kvStoreForTesting);
+        val audits = 
EntityPropertyChangeSubscriberForTesting.getAuditEntries(kvStoreForTesting);
         System.err.println("==AUDITS==");
         audits.forEach(System.err::println);
         System.err.println("==========");
diff --git 
a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangetracking/ChangedObjectsTest.java
 
b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangetracking/ChangedObjectsTest.java
index 0905cc0..88c4053 100644
--- 
a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangetracking/ChangedObjectsTest.java
+++ 
b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangetracking/ChangedObjectsTest.java
@@ -30,7 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.config.presets.IsisPresets;
-import 
org.apache.isis.testdomain.applayer.auditing.EntityAuditListenerForTesting;
+import 
org.apache.isis.testdomain.applayer.auditing.EntityPropertyChangeSubscriberForTesting;
 import 
org.apache.isis.testdomain.applayer.auditing.Configuration_usingEntityPrePostValueAuditing;
 import 
org.apache.isis.testdomain.applayer.publishing.Configuration_usingEntityChangeKindAuditing;
 import org.apache.isis.testdomain.commons.InteractionBoundaryProbe;
@@ -68,7 +68,7 @@ class ChangedObjectsTest extends InteractionTestAbstract {
         System.err.println("===BEFORE SETUP");
 
         // cleanup
-        EntityAuditListenerForTesting.clearAuditEntries(kvStoreForTesting);
+        
EntityPropertyChangeSubscriberForTesting.clearAuditEntries(kvStoreForTesting);
 
         // given
         fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);

Reply via email to