You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2024/01/03 23:33:16 UTC

(causeway) branch CAUSEWAY-3390 created (now 83cf906202)

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a change to branch CAUSEWAY-3390
in repository https://gitbox.apache.org/repos/asf/causeway.git


      at 83cf906202 CAUSEWAY-3390: makes design of AuditTrailEntryRepository consistent with ...

This branch includes the following new commits:

     new 83cf906202 CAUSEWAY-3390: makes design of AuditTrailEntryRepository consistent with ...

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(causeway) 01/01: CAUSEWAY-3390: makes design of AuditTrailEntryRepository consistent with ...

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch CAUSEWAY-3390
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit 83cf9062026ac1319f3dc7973a7e7be9f304985e
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 3 23:32:27 2024 +0000

    CAUSEWAY-3390: makes design of AuditTrailEntryRepository consistent with ...
    
    ... secman's ApplicationUserRepository
---
 .../audittrail/applib/app/AuditTrailMenu.java      |   4 +-
 .../HasInteractionId_auditTrailEntries.java        |   5 +-
 .../Object_recentAuditTrailEntries.java            |   5 +-
 .../applib/dom/AuditTrailEntryRepository.java      | 224 ++-------------------
 ...java => AuditTrailEntryRepositoryAbstract.java} |  80 +++++---
 ...ntityPropertyChangeSubscriberForAuditTrail.java |   4 +-
 .../integtests/AuditTrail_IntegTestAbstract.java   |   5 +-
 .../jdo/dom/AuditTrailEntryRepository.java         |   4 +-
 .../jpa/dom/AuditTrailEntryRepository.java         |   3 +-
 .../dom/ApplicationUserRepositoryAbstract.java     |   2 +
 10 files changed, 89 insertions(+), 247 deletions(-)

diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
index 3c655e0aa6..f1f7727f1c 100644
--- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
+++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
@@ -41,7 +41,7 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.clock.ClockService;
 import org.apache.causeway.extensions.audittrail.applib.CausewayModuleExtAuditTrailApplib;
 import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntry;
-import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository;
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
 
 import lombok.RequiredArgsConstructor;
 
@@ -68,7 +68,7 @@ public class AuditTrailMenu {
             extends CausewayModuleExtAuditTrailApplib.ActionDomainEvent<T> { }
 
 
-    final AuditTrailEntryRepository<? extends AuditTrailEntry> auditTrailEntryRepository;
+    final AuditTrailEntryRepositoryAbstract<? extends AuditTrailEntry> auditTrailEntryRepository;
     final ClockService clockService;
 
 
diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/HasInteractionId_auditTrailEntries.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/HasInteractionId_auditTrailEntries.java
index 0b7a141fcc..8f967e748b 100644
--- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/HasInteractionId_auditTrailEntries.java
+++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/HasInteractionId_auditTrailEntries.java
@@ -28,7 +28,7 @@ import org.apache.causeway.applib.annotation.MemberSupport;
 import org.apache.causeway.applib.mixins.system.HasInteractionId;
 import org.apache.causeway.extensions.audittrail.applib.CausewayModuleExtAuditTrailApplib;
 import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntry;
-import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository;
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
 
 import lombok.RequiredArgsConstructor;
 
@@ -51,6 +51,7 @@ public class HasInteractionId_auditTrailEntries {
         return auditTrailEntryRepository.findByInteractionId(hasInteractionId.getInteractionId());
     }
 
-    @Inject AuditTrailEntryRepository<? extends AuditTrailEntry> auditTrailEntryRepository;
+    @Inject
+    AuditTrailEntryRepositoryAbstract<? extends AuditTrailEntry> auditTrailEntryRepository;
 
 }
diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/Object_recentAuditTrailEntries.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/Object_recentAuditTrailEntries.java
index ff5e899297..57bf241a2a 100644
--- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/Object_recentAuditTrailEntries.java
+++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/contributions/Object_recentAuditTrailEntries.java
@@ -38,7 +38,7 @@ import org.apache.causeway.applib.services.metamodel.BeanSort;
 import org.apache.causeway.applib.services.metamodel.MetaModelService;
 import org.apache.causeway.extensions.audittrail.applib.CausewayModuleExtAuditTrailApplib;
 import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntry;
-import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository;
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -93,6 +93,7 @@ public class Object_recentAuditTrailEntries {
 
     @Inject MetaModelService metaModelService;
     @Inject ApplicationFeatureRepository applicationFeatureRepository;
-    @Inject AuditTrailEntryRepository<? extends AuditTrailEntry> auditTrailEntryRepository;
+    @Inject
+    AuditTrailEntryRepositoryAbstract<? extends AuditTrailEntry> auditTrailEntryRepository;
     @Inject BookmarkService bookmarkService;
 }
diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java
index a1bd645a5a..b1cb1e62af 100644
--- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java
+++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java
@@ -44,240 +44,56 @@ import lombok.val;
  *
  * @since 2.0 {@index}
  */
-@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
+public interface AuditTrailEntryRepository {
 
 
-    private final Class<E> auditTrailEntryClass;
+    AuditTrailEntry createFor(final EntityPropertyChange change);
 
-    @Inject RepositoryService repositoryService;
-    @Inject FactoryService factoryService;
-    @Inject CausewaySystemEnvironment causewaySystemEnvironment;
+    Optional<AuditTrailEntry> findFirstByTarget(final Bookmark target);
 
-    public Class<E> getEntityClass() {
-        return auditTrailEntryClass;
-    }
+    List<AuditTrailEntry> findRecentByTarget(final Bookmark target);
 
-    public AuditTrailEntry createFor(final EntityPropertyChange change) {
-        E entry = factoryService.detachedEntity(auditTrailEntryClass);
-        entry.init(change);
-        return repositoryService.persistAndFlush(entry);
-    }
-
-    public Optional<E> findFirstByTarget(final Bookmark target) {
-        return repositoryService.firstMatch(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_FIRST_BY_TARGET)
-                        .withParameter("target", target)
-                        .withLimit(2)
-        );
-    }
-
-    public List<E> findRecentByTarget(final Bookmark target) {
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_TARGET)
-                        .withParameter("target", target)
-                        .withLimit(100)
-        );
-    }
-
-    public List<E> findRecentByTargetAndPropertyId(
+    List<AuditTrailEntry> findRecentByTargetAndPropertyId(
             final Bookmark target,
-            final String propertyId) {
-        final String targetStr = target.toString();
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_TARGET_AND_PROPERTY_ID)
-                        .withParameter("target", target)
-                        .withParameter("propertyId", propertyId)
-                        .withLimit(30)
-        );
-    }
+            final String propertyId);
 
-    public List<E> findByInteractionId(final UUID interactionId) {
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_INTERACTION_ID)
-                        .withParameter("interactionId", interactionId)
-        );
-    }
+    List<AuditTrailEntry> findByInteractionId(final UUID interactionId);
 
-    public List<E> findByTargetAndFromAndTo(
+    List<AuditTrailEntry> findByTargetAndFromAndTo(
             final Bookmark target,
             final LocalDate from,
-            final LocalDate to) {
-        val fromTs = toTimestampStartOfDayWithOffset(from, 0);
-        val toTs = toTimestampStartOfDayWithOffset(to, 1);
+            final LocalDate to);
 
-        final Query<E> query;
-        if(from != null) {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_BETWEEN)
-                        .withParameter("target", target)
-                        .withParameter("from", fromTs)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_AFTER)
-                        .withParameter("target", target)
-                        .withParameter("from", fromTs);
-            }
-        } else {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_BEFORE)
-                        .withParameter("target", target)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TARGET)
-                        .withParameter("target", target)
-                ;
-            }
-        }
-        return repositoryService.allMatches(query);
-    }
-
-    public List<E> findByFromAndTo(
+    List<AuditTrailEntry> findByFromAndTo(
             final LocalDate from,
-            final LocalDate to) {
-        val fromTs = toTimestampStartOfDayWithOffset(from, 0);
-        val toTs = toTimestampStartOfDayWithOffset(to, 1);
-
-        final Query<E> query;
-        if(from != null) {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN)
-                        .withParameter("from", fromTs)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TIMESTAMP_AFTER)
-                        .withParameter("from", fromTs);
-            }
-        } else {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TIMESTAMP_BEFORE)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND);
-            }
-        }
-        return repositoryService.allMatches(query);
-    }
-
-    private static Timestamp toTimestampStartOfDayWithOffset(final LocalDate dt, final int daysOffset) {
-        return dt!=null
-                ? Timestamp.valueOf(dt.atStartOfDay().plusDays(daysOffset))
-                :null;
-    }
+            final LocalDate to);
 
+    List<AuditTrailEntry> findMostRecent();
 
-    public List<E> findMostRecent() {
-        return findMostRecent(100);
-    }
+    List<AuditTrailEntry> findMostRecent(final int limit);
 
-    public List<E> findMostRecent(final int limit) {
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_MOST_RECENT).withLimit(limit));
-    }
-
-    public List<E> findByUsernameAndFromAndTo(
+    List<AuditTrailEntry> findByUsernameAndFromAndTo(
             final String username,
             final LocalDate from,
-            final LocalDate to) {
-        val fromTs = toTimestampStartOfDayWithOffset(from, 0);
-        val toTs = toTimestampStartOfDayWithOffset(to, 1);
-
-        final Query<E> query;
-        if(from != null) {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN)
-                        .withParameter("username", username)
-                        .withParameter("from", fromTs)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER)
-                        .withParameter("username", username)
-                        .withParameter("from", fromTs);
-            }
-        } else {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE)
-                        .withParameter("username", username)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME)
-                        .withParameter("username", username)
-                ;
-            }
-        }
-        return repositoryService.allMatches(query);
-    }
+            final LocalDate to);
 
-    public List<E> findByUsernameAndTargetAndFromAndTo(
+    List<AuditTrailEntry> findByUsernameAndTargetAndFromAndTo(
             final String username,
             final Bookmark target,
             final LocalDate from,
-            final LocalDate to) {
-        val fromTs = toTimestampStartOfDayWithOffset(from, 0);
-        val toTs = toTimestampStartOfDayWithOffset(to, 1);
-
-        final Query<E> query;
-        if(from != null) {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BETWEEN)
-                        .withParameter("username", username)
-                        .withParameter("target", target)
-                        .withParameter("from", fromTs)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_AFTER)
-                        .withParameter("username", username)
-                        .withParameter("target", target)
-                        .withParameter("from", fromTs);
-            }
-        } else {
-            if(to != null) {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BEFORE)
-                        .withParameter("username", username)
-                        .withParameter("target", target)
-                        .withParameter("to", toTs);
-            } else {
-                query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET)
-                        .withParameter("username", username)
-                        .withParameter("target", target)
-                ;
-            }
-        }
-        return repositoryService.allMatches(query);
-    }
-
-
-    public List<E> findRecentByUsername(final String username) {
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_USERNAME)
-                        .withParameter("username", username)
-                        .withLimit(100)
-        );
-    }
+            final LocalDate to);
 
+    List<AuditTrailEntry> findRecentByUsername(final String username);
 
 
     /**
      * intended for testing only
      */
-    public List<? extends AuditTrailEntry> findAll() {
-        if (causewaySystemEnvironment.getDeploymentType().isProduction()) {
-            throw new IllegalStateException("Cannot call 'findAll' in production systems");
-        }
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND)
-        );
-    }
+    List<AuditTrailEntry> findAll();
 
     /**
      * intended for testing only
      */
-    public void removeAll() {
-        if (causewaySystemEnvironment.getDeploymentType().isProduction()) {
-            throw new IllegalStateException("Cannot call 'removeAll' in production systems");
-        }
-        repositoryService.removeAll(auditTrailEntryClass);
-    }
-
+    void removeAll();
 
 }
diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepositoryAbstract.java
similarity index 80%
copy from extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java
copy to extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepositoryAbstract.java
index a1bd645a5a..f95edbf615 100644
--- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java
+++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepositoryAbstract.java
@@ -33,6 +33,7 @@ import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.factory.FactoryService;
 import org.apache.causeway.applib.services.publishing.spi.EntityPropertyChange;
 import org.apache.causeway.applib.services.repository.RepositoryService;
+import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
 
 import lombok.AccessLevel;
@@ -44,16 +45,19 @@ import lombok.val;
  *
  * @since 2.0 {@index}
  */
-@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
-
-
-    private final Class<E> auditTrailEntryClass;
+public abstract class AuditTrailEntryRepositoryAbstract<E extends AuditTrailEntry>
+        implements AuditTrailEntryRepository  {
 
     @Inject RepositoryService repositoryService;
     @Inject FactoryService factoryService;
     @Inject CausewaySystemEnvironment causewaySystemEnvironment;
 
+    private final Class<E> auditTrailEntryClass;
+
+    protected AuditTrailEntryRepositoryAbstract(Class<E> auditTrailEntryClass) {
+        this.auditTrailEntryClass = auditTrailEntryClass;
+    }
+
     public Class<E> getEntityClass() {
         return auditTrailEntryClass;
     }
@@ -64,42 +68,49 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
         return repositoryService.persistAndFlush(entry);
     }
 
-    public Optional<E> findFirstByTarget(final Bookmark target) {
-        return repositoryService.firstMatch(
+    public Optional<AuditTrailEntry> findFirstByTarget(final Bookmark target) {
+        return _Casts.uncheckedCast(
+                repositoryService.firstMatch(
                 Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_FIRST_BY_TARGET)
                         .withParameter("target", target)
                         .withLimit(2)
+                )
         );
     }
 
-    public List<E> findRecentByTarget(final Bookmark target) {
-        return repositoryService.allMatches(
+    public List<AuditTrailEntry> findRecentByTarget(final Bookmark target) {
+        return _Casts.uncheckedCast(
+                repositoryService.allMatches(
                 Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_TARGET)
                         .withParameter("target", target)
                         .withLimit(100)
+                )
         );
     }
 
-    public List<E> findRecentByTargetAndPropertyId(
+    public List<AuditTrailEntry> findRecentByTargetAndPropertyId(
             final Bookmark target,
             final String propertyId) {
-        final String targetStr = target.toString();
-        return repositoryService.allMatches(
+        return _Casts.uncheckedCast(
+                repositoryService.allMatches(
                 Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_TARGET_AND_PROPERTY_ID)
                         .withParameter("target", target)
                         .withParameter("propertyId", propertyId)
                         .withLimit(30)
+                )
         );
     }
 
-    public List<E> findByInteractionId(final UUID interactionId) {
-        return repositoryService.allMatches(
+    public List<AuditTrailEntry> findByInteractionId(final UUID interactionId) {
+        return _Casts.uncheckedCast(
+                repositoryService.allMatches(
                 Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_INTERACTION_ID)
                         .withParameter("interactionId", interactionId)
+                )
         );
     }
 
-    public List<E> findByTargetAndFromAndTo(
+    public List<AuditTrailEntry> findByTargetAndFromAndTo(
             final Bookmark target,
             final LocalDate from,
             final LocalDate to) {
@@ -129,10 +140,10 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
                 ;
             }
         }
-        return repositoryService.allMatches(query);
+        return _Casts.uncheckedCast(repositoryService.allMatches(query));
     }
 
-    public List<E> findByFromAndTo(
+    public List<AuditTrailEntry> findByFromAndTo(
             final LocalDate from,
             final LocalDate to) {
         val fromTs = toTimestampStartOfDayWithOffset(from, 0);
@@ -156,7 +167,7 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
                 query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND);
             }
         }
-        return repositoryService.allMatches(query);
+        return _Casts.uncheckedCast(repositoryService.allMatches(query));
     }
 
     private static Timestamp toTimestampStartOfDayWithOffset(final LocalDate dt, final int daysOffset) {
@@ -166,16 +177,19 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
     }
 
 
-    public List<E> findMostRecent() {
+    public List<AuditTrailEntry> findMostRecent() {
         return findMostRecent(100);
     }
 
-    public List<E> findMostRecent(final int limit) {
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_MOST_RECENT).withLimit(limit));
+    public List<AuditTrailEntry> findMostRecent(final int limit) {
+        return _Casts.uncheckedCast(
+                repositoryService.allMatches(
+                    Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_MOST_RECENT).withLimit(limit)
+                )
+        );
     }
 
-    public List<E> findByUsernameAndFromAndTo(
+    public List<AuditTrailEntry> findByUsernameAndFromAndTo(
             final String username,
             final LocalDate from,
             final LocalDate to) {
@@ -205,10 +219,10 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
                 ;
             }
         }
-        return repositoryService.allMatches(query);
+        return _Casts.uncheckedCast(repositoryService.allMatches(query));
     }
 
-    public List<E> findByUsernameAndTargetAndFromAndTo(
+    public List<AuditTrailEntry> findByUsernameAndTargetAndFromAndTo(
             final String username,
             final Bookmark target,
             final LocalDate from,
@@ -243,15 +257,17 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
                 ;
             }
         }
-        return repositoryService.allMatches(query);
+        return _Casts.uncheckedCast(repositoryService.allMatches(query));
     }
 
 
-    public List<E> findRecentByUsername(final String username) {
-        return repositoryService.allMatches(
+    public List<AuditTrailEntry> findRecentByUsername(final String username) {
+        return _Casts.uncheckedCast(
+                repositoryService.allMatches(
                 Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_USERNAME)
                         .withParameter("username", username)
                         .withLimit(100)
+                )
         );
     }
 
@@ -260,12 +276,14 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> {
     /**
      * intended for testing only
      */
-    public List<? extends AuditTrailEntry> findAll() {
+    public List<AuditTrailEntry> findAll() {
         if (causewaySystemEnvironment.getDeploymentType().isProduction()) {
             throw new IllegalStateException("Cannot call 'findAll' in production systems");
         }
-        return repositoryService.allMatches(
-                Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND)
+        return _Casts.uncheckedCast(
+                repositoryService.allMatches(
+                    Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND)
+                )
         );
     }
 
diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/spiimpl/EntityPropertyChangeSubscriberForAuditTrail.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/spiimpl/EntityPropertyChangeSubscriberForAuditTrail.java
index 58a22da9e5..5840283afa 100644
--- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/spiimpl/EntityPropertyChangeSubscriberForAuditTrail.java
+++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/spiimpl/EntityPropertyChangeSubscriberForAuditTrail.java
@@ -34,7 +34,7 @@ import org.apache.causeway.applib.services.publishing.spi.EntityPropertyChangeSu
 import org.apache.causeway.applib.services.xactn.TransactionService;
 import org.apache.causeway.extensions.audittrail.applib.CausewayModuleExtAuditTrailApplib;
 import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntry;
-import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository;
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
@@ -57,7 +57,7 @@ public class EntityPropertyChangeSubscriberForAuditTrail implements EntityProper
     static final String LOGICAL_TYPE_NAME = CausewayModuleExtAuditTrailApplib.NAMESPACE + ".EntityPropertyChangeSubscriberForAuditTrail";
 
     final TransactionService transactionService;
-    final AuditTrailEntryRepository<? extends AuditTrailEntry> auditTrailEntryRepository;
+    final AuditTrailEntryRepositoryAbstract<? extends AuditTrailEntry> auditTrailEntryRepository;
     final CausewayConfiguration causewayConfiguration;
 
     @Override
diff --git a/extensions/security/audittrail/applib/src/test/java/org/apache/causeway/extensions/audittrail/applib/integtests/AuditTrail_IntegTestAbstract.java b/extensions/security/audittrail/applib/src/test/java/org/apache/causeway/extensions/audittrail/applib/integtests/AuditTrail_IntegTestAbstract.java
index 3db1d3830d..f537b88698 100644
--- a/extensions/security/audittrail/applib/src/test/java/org/apache/causeway/extensions/audittrail/applib/integtests/AuditTrail_IntegTestAbstract.java
+++ b/extensions/security/audittrail/applib/src/test/java/org/apache/causeway/extensions/audittrail/applib/integtests/AuditTrail_IntegTestAbstract.java
@@ -34,7 +34,7 @@ import org.apache.causeway.applib.services.iactnlayer.InteractionService;
 import org.apache.causeway.applib.services.wrapper.WrapperFactory;
 import org.apache.causeway.core.config.presets.CausewayPresets;
 import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntry;
-import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository;
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
 import org.apache.causeway.extensions.audittrail.applib.integtests.model.Counter;
 import org.apache.causeway.extensions.audittrail.applib.integtests.model.CounterRepository;
 import org.apache.causeway.extensions.audittrail.applib.integtests.model.Counter_bumpUsingMixin;
@@ -203,7 +203,8 @@ public abstract class AuditTrail_IntegTestAbstract extends CausewayIntegrationTe
     @Inject CounterRepository<? extends Counter> counterRepository;
     @Inject WrapperFactory wrapperFactory;
     @Inject BookmarkService bookmarkService;
-    @Inject AuditTrailEntryRepository<? extends AuditTrailEntry> auditTrailEntryRepository;
+    @Inject
+    AuditTrailEntryRepositoryAbstract<? extends AuditTrailEntry> auditTrailEntryRepository;
 
 
 }
diff --git a/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntryRepository.java b/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntryRepository.java
index 3832c95e6c..dfe3a15c11 100644
--- a/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntryRepository.java
+++ b/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntryRepository.java
@@ -19,10 +19,12 @@
  */
 package org.apache.causeway.extensions.audittrail.jdo.dom;
 
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
+
 import org.springframework.stereotype.Service;
 
 @Service
-public class AuditTrailEntryRepository extends org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository<AuditTrailEntry> {
+public class AuditTrailEntryRepository extends AuditTrailEntryRepositoryAbstract<AuditTrailEntry> {
 
     public AuditTrailEntryRepository() {
         super(AuditTrailEntry.class);
diff --git a/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntryRepository.java b/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntryRepository.java
index 644d630ba6..c24310990a 100644
--- a/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntryRepository.java
+++ b/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntryRepository.java
@@ -19,10 +19,11 @@
  */
 package org.apache.causeway.extensions.audittrail.jpa.dom;
 
+import org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepositoryAbstract;
 import org.springframework.stereotype.Service;
 
 @Service
-public class AuditTrailEntryRepository extends org.apache.causeway.extensions.audittrail.applib.dom.AuditTrailEntryRepository<AuditTrailEntry> {
+public class AuditTrailEntryRepository extends AuditTrailEntryRepositoryAbstract<AuditTrailEntry> {
 
     public AuditTrailEntryRepository() {
         super(AuditTrailEntry.class);
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java
index d653a7c38a..ed988696dc 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java
@@ -55,6 +55,7 @@ import lombok.val;
  *
  * @since 2.0 {@index}
  */
+@SuppressWarnings("CdiManagedBeanInconsistencyInspection")
 public class ApplicationUserRepositoryAbstract<U extends ApplicationUser>
 implements ApplicationUserRepository {
 
@@ -66,6 +67,7 @@ implements ApplicationUserRepository {
     @Inject private Provider<QueryResultsCache> queryResultsCacheProvider;
 
     // empty if no candidate is available
+    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
     @Autowired(required = false) @Qualifier("Secman") PasswordEncoder passwordEncoder;