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

ahuber pushed a commit to branch 3959-static.weaving
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit fd80f11a80fa31be7b87a5aaa9b0c5e7bd26fdb7
Author: andi-huber <[email protected]>
AuthorDate: Wed Jan 28 17:12:52 2026 +0100

    CAUSEWAY-3959: converts abstract ApplicationRole to an interface
    
    Task-Url: https://issues.apache.org/jira/browse/CAUSEWAY-3959
---
 .../secman/applib/role/dom/ApplicationRole.java    | 59 +++++-----------------
 .../secman/jpa/role/dom/ApplicationRole.java       | 37 ++++++++++++--
 2 files changed, 44 insertions(+), 52 deletions(-)

diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/dom/ApplicationRole.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/dom/ApplicationRole.java
index 3577bb3fe16..53131cef71b 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/dom/ApplicationRole.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/dom/ApplicationRole.java
@@ -26,13 +26,8 @@
 import java.util.List;
 import java.util.Set;
 
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-
 import org.apache.causeway.applib.annotation.Collection;
 import org.apache.causeway.applib.annotation.CollectionLayout;
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.DomainObjectLayout;
 import org.apache.causeway.applib.annotation.Editing;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.Optionality;
@@ -46,38 +41,23 @@
 import org.apache.causeway.applib.util.ToString;
 import 
org.apache.causeway.extensions.secman.applib.CausewayModuleExtSecmanApplib;
 import 
org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermission;
-import 
org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermissionRepository;
 import org.apache.causeway.extensions.secman.applib.user.dom.ApplicationUser;
 
-import lombok.experimental.UtilityClass;
-
 /**
  * @since 2.0 {@index}
  */
-@Named(ApplicationRole.LOGICAL_TYPE_NAME)
-@DomainObject(
-        autoCompleteRepository = ApplicationRoleRepository.class,
-        autoCompleteMethod = "findMatching"
-        )
-@DomainObjectLayout(
-        titleUiEvent = ApplicationRole.TitleUiEvent.class,
-        iconUiEvent = ApplicationRole.IconUiEvent.class,
-        cssClassUiEvent = ApplicationRole.CssClassUiEvent.class,
-        layoutUiEvent = ApplicationRole.LayoutUiEvent.class
-)
-public abstract class ApplicationRole implements Comparable<ApplicationRole> {
+public interface ApplicationRole extends Comparable<ApplicationRole> {
 
     public static final String LOGICAL_TYPE_NAME = 
CausewayModuleExtSecmanApplib.NAMESPACE + ".ApplicationRole";
     public static final String SCHEMA = CausewayModuleExtSecmanApplib.SCHEMA;
     public static final String TABLE = "ApplicationRole";
 
-    @UtilityClass
-    public static class Nq {
+    public static final class Nq {
         public static final String FIND_BY_NAME = LOGICAL_TYPE_NAME + 
".findByName";
         public static final String FIND_BY_NAME_CONTAINING = LOGICAL_TYPE_NAME 
+ ".findByNameContaining";
     }
 
-    @Inject transient private ApplicationPermissionRepository 
applicationPermissionRepository;
+    
org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermissionRepository
 applicationPermissionRepository();
 
     // -- UI & DOMAIN EVENTS
 
@@ -91,7 +71,7 @@ public static abstract class CollectionDomainEvent<T> extends 
CausewayModuleExtS
 
     // -- MODEL
 
-    @ObjectSupport public String title() {
+    @ObjectSupport public default String title() {
         return getName();
     }
 
@@ -199,42 +179,27 @@ class DomainEvent extends 
CollectionDomainEvent<ApplicationPermission> {}
     // -- PERMISSIONS
 
     @Permissions
-    public 
List<org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermission>
 getPermissions() {
-        return applicationPermissionRepository.findByRole(this);
+    public default 
List<org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermission>
 getPermissions() {
+        return applicationPermissionRepository().findByRole(this);
     }
 
     // -- equals, hashCode, compareTo, toString
 
-    private static final Comparator<ApplicationRole> comparator =
+    static final Comparator<ApplicationRole> COMPARATOR =
             Comparator.comparing(ApplicationRole::getName);
 
-    private static final Equality<ApplicationRole> equality =
+    static final Equality<ApplicationRole> EQUALITY =
             ObjectContracts.checkEquals(ApplicationRole::getName);
 
-    private static final Hashing<ApplicationRole> hashing =
+    static final Hashing<ApplicationRole> HASHING =
             ObjectContracts.hashing(ApplicationRole::getName);
 
-    private static final ToString<ApplicationRole> toString =
+    static final ToString<ApplicationRole> TOSTRING =
             ObjectContracts.toString("name", ApplicationRole::getName);
 
     @Override
-    public int compareTo(final 
org.apache.causeway.extensions.secman.applib.role.dom.ApplicationRole other) {
-        return comparator.compare(this, other);
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return equality.equals(this, obj);
-    }
-
-    @Override
-    public int hashCode() {
-        return hashing.hashCode(this);
-    }
-
-    @Override
-    public String toString() {
-        return toString.toString(this);
+    public default int compareTo(final 
org.apache.causeway.extensions.secman.applib.role.dom.ApplicationRole other) {
+        return COMPARATOR.compare(this, other);
     }
 
 }
diff --git 
a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/causeway/extensions/secman/jpa/role/dom/ApplicationRole.java
 
b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/causeway/extensions/secman/jpa/role/dom/ApplicationRole.java
index c6f9b017e24..0121d401453 100644
--- 
a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/causeway/extensions/secman/jpa/role/dom/ApplicationRole.java
+++ 
b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/causeway/extensions/secman/jpa/role/dom/ApplicationRole.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import jakarta.inject.Inject;
 import jakarta.inject.Named;
 import jakarta.persistence.CascadeType;
 import jakarta.persistence.Column;
@@ -40,14 +41,18 @@
 import org.apache.causeway.applib.annotation.Bounding;
 import org.apache.causeway.applib.annotation.DomainObject;
 import org.apache.causeway.applib.annotation.DomainObjectLayout;
+import org.apache.causeway.applib.annotation.Programmatic;
 import org.apache.causeway.applib.jaxb.PersistentEntityAdapter;
 import org.apache.causeway.commons.internal.base._Casts;
+import 
org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPermissionRepository;
 import 
org.apache.causeway.extensions.secman.applib.role.dom.ApplicationRole.Nq;
+import 
org.apache.causeway.extensions.secman.applib.role.dom.ApplicationRoleRepository;
 import org.apache.causeway.extensions.secman.jpa.user.dom.ApplicationUser;
 import 
org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 @Entity
 @Table(
@@ -74,13 +79,20 @@
 @DomainObject(
         bounding = Bounding.BOUNDED,
         autoCompleteRepository = ApplicationRoleRepository.class,
-        autoCompleteMethod = "findMatching"
-        )
+        autoCompleteMethod = "findMatching")
 @DomainObjectLayout(
-        bookmarking = BookmarkPolicy.AS_ROOT
-        )
+        bookmarking = BookmarkPolicy.AS_ROOT,
+        titleUiEvent = ApplicationRole.TitleUiEvent.class,
+        iconUiEvent = ApplicationRole.IconUiEvent.class,
+        cssClassUiEvent = ApplicationRole.CssClassUiEvent.class,
+        layoutUiEvent = ApplicationRole.LayoutUiEvent.class)
 public class ApplicationRole
-    extends 
org.apache.causeway.extensions.secman.applib.role.dom.ApplicationRole {
+    implements 
org.apache.causeway.extensions.secman.applib.role.dom.ApplicationRole {
+
+    @Inject
+    @Programmatic
+    @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+    transient private ApplicationPermissionRepository 
applicationPermissionRepository;
 
     @Id
     @GeneratedValue
@@ -113,4 +125,19 @@ public void addToUsers(final ApplicationUser 
applicationUser) {
         getUsers().add(applicationUser);
     }
 
+    @Override
+    public boolean equals(final Object obj) {
+        return EQUALITY.equals(this, obj);
+    }
+
+    @Override
+    public int hashCode() {
+        return HASHING.hashCode(this);
+    }
+
+    @Override
+    public String toString() {
+        return TOSTRING.toString(this);
+    }
+
 }

Reply via email to