You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/05/05 06:30:22 UTC

[isis] branch ISIS-2619 updated (6764fae -> 0fb0060)

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

danhaywood pushed a change to branch ISIS-2619
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 6764fae  ISIS-2614 and ISIS-2609: removes Application.getName ; moves mixin domain events down from API to model
     new 6d9c111  ISIS-2644: removes Persistable_datanucleusIdLong
     new 5a3a2e2  ISIS-2619: reconciled annotations vs layouts for ApplicationUser
     new 0fb0060  ISIS-2619: use meta-annotations in ApplicationUser ...

The 3 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.


Summary of changes:
 .../ApplicationPermission.layout.fallback.xml      |   1 -
 .../secman/api/user/ApplicationUser.java           | 327 ++++++++++++++-------
 .../user/ApplicationUser_updateEmailAddress.java   |   3 +-
 .../dom/user/ApplicationUser_updateFaxNumber.java  |   3 +-
 .../model/dom/user/ApplicationUser_updateName.java |   7 +-
 .../user/ApplicationUser_updatePhoneNumber.java    |   3 +-
 .../dom/user/ApplicationUser_updateUsername.java   |   3 +-
 .../ApplicationPermission.layout.fallback.xml      |   1 -
 .../dom/role/ApplicationRole.layout.fallback.xml   |   1 -
 .../tenancy/ApplicationTenancy.layout.fallback.xml |   1 -
 .../secman/jdo/dom/user/ApplicationUser.java       | 163 ++--------
 .../dom/user/ApplicationUser.layout.fallback.xml   | 166 +++++------
 .../ApplicationUserManager_newDelegateUser.java    |   2 +-
 .../user/ApplicationUserManager_newLocalUser.java  |   2 +-
 .../ApplicationPermission.layout.fallback.xml      |   1 -
 .../dom/role/ApplicationRole.layout.fallback.xml   |   1 -
 .../tenancy/ApplicationTenancy.layout.fallback.xml |   1 -
 .../secman/jpa/dom/user/ApplicationUser.java       | 185 +++---------
 .../dom/user/ApplicationUser.layout.fallback.xml   | 137 +++++----
 .../ApplicationUserManager_newDelegateUser.java    |   2 +-
 .../user/ApplicationUserManager_newLocalUser.java  |   2 +-
 .../isis/client/kroviz/core/model/ExposerTest.kt   |   4 -
 .../jdo/datanucleus/IsisModuleJdoDatanucleus.java  |  34 +--
 .../mixins/Persistable_datanucleusIdLong.java      |  75 -----
 .../mixins/Persistable_datanucleusVersionLong.java |   4 +-
 .../Persistable_datanucleusVersionTimestamp.java   |   4 +-
 .../domainmodel/jdo/DomainModelTest_jdoMixins.java |  26 +-
 .../todomodule/dom/ExcelDemoToDoItem.layout.xml    |   1 -
 subdomains/excel/integtests/translations.pot       |   8 -
 testing/fakedata/integtests/translations.pot       |   8 -
 30 files changed, 486 insertions(+), 690 deletions(-)
 delete mode 100644 persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java

[isis] 02/03: ISIS-2619: reconciled annotations vs layouts for ApplicationUser

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

danhaywood pushed a commit to branch ISIS-2619
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 5a3a2e2ffccb528e20dabaff32628a820a6e47d3
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed May 5 06:57:58 2021 +0100

    ISIS-2619: reconciled annotations vs layouts for ApplicationUser
---
 .../secman/api/user/ApplicationUser.java           | 134 ++++++++++-------
 .../secman/jdo/dom/user/ApplicationUser.java       | 129 +++++++++-------
 .../dom/user/ApplicationUser.layout.fallback.xml   | 165 +++++++++------------
 .../secman/jpa/dom/user/ApplicationUser.java       | 123 ++++++++-------
 .../dom/user/ApplicationUser.layout.fallback.xml   | 134 +++++++++--------
 5 files changed, 374 insertions(+), 311 deletions(-)

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 3e95d2c..d29fd62 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
@@ -95,14 +95,63 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
             maxLength = MAX_LENGTH_USERNAME
     )
     @PropertyLayout(
-            hidden=Where.PARENTED_TABLES,
             fieldSetId="identity",
-            sequence = "1")
+            sequence = "1"
+    )
     @Override
     String getUsername();
     void setUsername(String username);
 
 
+    // -- accountType (property)
+
+    class AccountTypeDomainEvent extends PropertyDomainEvent<AccountType> {}
+
+    @Property(
+            domainEvent = AccountTypeDomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "1"
+    )
+    AccountType getAccountType();
+    void setAccountType(AccountType accountType);
+
+
+    // -- status (property)
+
+    class StatusDomainEvent extends PropertyDomainEvent<ApplicationUserStatus> {}
+
+    @Property(
+            domainEvent = StatusDomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "2"
+    )
+    ApplicationUserStatus getStatus();
+    void setStatus(ApplicationUserStatus disabled);
+
+
+    // -- atPath (property)
+
+    class AtPathDomainEvent extends PropertyDomainEvent<String> {}
+
+    @Property(
+            domainEvent = AtPathDomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = MAX_LENGTH_AT_PATH
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "3"
+    )
+    @Override
+    String getAtPath();
+    void setAtPath(String atPath);
+
     // -- familyName (property)
 
     class FamilyNameDomainEvent extends PropertyDomainEvent<String> {}
@@ -114,8 +163,9 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.1")
+            fieldSetId="name",
+            sequence = "1"
+    )
     String getFamilyName();
     void setFamilyName(String familyName);
 
@@ -131,8 +181,9 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.2")
+            fieldSetId="name",
+            sequence = "2"
+    )
     String getGivenName();
     void setGivenName(String givenName);
 
@@ -148,8 +199,9 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.3")
+            fieldSetId="name",
+            sequence = "3"
+    )
     String getKnownAs();
     void setKnownAs(String knownAs);
 
@@ -163,7 +215,10 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
             editing = Editing.DISABLED,
             maxLength = MAX_LENGTH_EMAIL_ADDRESS
     )
-    @PropertyLayout(fieldSetId="Contact Details", sequence = "3.1")
+    @PropertyLayout(
+            fieldSetId="contactDetails",
+            sequence = "1"
+    )
     String getEmailAddress();
     void setEmailAddress(String emailAddress);
 
@@ -177,7 +232,11 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
             editing = Editing.DISABLED,
             maxLength = MAX_LENGTH_PHONE_NUMBER
     )
-    @PropertyLayout(fieldSetId="Contact Details", sequence = "3.2")
+    @PropertyLayout(
+            hidden = Where.PARENTED_TABLES,
+            fieldSetId="contactDetails",
+            sequence = "2"
+    )
     String getPhoneNumber();
     void setPhoneNumber(String phoneNumber);
 
@@ -192,53 +251,14 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
             maxLength = MAX_LENGTH_PHONE_NUMBER
     )
     @PropertyLayout(
-            hidden=Where.PARENTED_TABLES,
-            fieldSetId="Contact Details",
-            sequence = "3.3")
+            hidden=Where.ALL_TABLES,
+            fieldSetId="contactDetails",
+            sequence = "3"
+    )
     String getFaxNumber();
     void setFaxNumber(String faxNumber);
 
 
-    // -- atPath (property)
-
-    class AtPathDomainEvent extends PropertyDomainEvent<String> {}
-
-    @Property(
-            domainEvent = AtPathDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_AT_PATH
-    )
-    @PropertyLayout(fieldSetId="atPath", sequence = "3.4")
-    @Override
-    String getAtPath();
-    void setAtPath(String atPath);
-
-    // -- accountType (property)
-
-    class AccountTypeDomainEvent extends PropertyDomainEvent<AccountType> {}
-
-    @Property(
-            domainEvent = AccountTypeDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "3")
-    AccountType getAccountType();
-    void setAccountType(AccountType accountType);
-
-
-    // -- status (property)
-
-    class StatusDomainEvent extends PropertyDomainEvent<ApplicationUserStatus> {}
-
-    @Property(
-            domainEvent = StatusDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "4")
-    ApplicationUserStatus getStatus();
-    void setStatus(ApplicationUserStatus disabled);
-
-
     // -- encryptedPassword (hidden property)
 
     @PropertyLayout(hidden=Where.EVERYWHERE)
@@ -255,7 +275,10 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
             domainEvent = HasPasswordDomainEvent.class,
             editing = Editing.DISABLED
     )
-    @PropertyLayout(fieldSetId="Status", sequence = "4")
+    @PropertyLayout(
+            fieldSetId="password",
+            sequence = "1"
+    )
     default boolean isHasPassword() {
         return _Strings.isNotEmpty(getEncryptedPassword());
     }
@@ -292,7 +315,8 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
     )
     @CollectionLayout(
             defaultView="table",
-            sequence = "20")
+            sequence = "20"
+    )
     Set<? extends ApplicationRole> getRoles();
 
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
index 4ea2885..d7acfae 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
@@ -142,14 +142,60 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             maxLength = MAX_LENGTH_USERNAME
     )
     @PropertyLayout(
-            hidden=Where.PARENTED_TABLES,
-            fieldSetId="Id",
-            sequence = "1")
+            fieldSetId="identity",
+            sequence = "1"
+    )
     @javax.jdo.annotations.Column(allowsNull="false", length = MAX_LENGTH_USERNAME)
     @Getter @Setter
     private String username;
 
 
+    // -- accountType (property)
+
+    @Property(
+            domainEvent = AccountTypeDomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "1"
+    )
+    @javax.jdo.annotations.Column(allowsNull="false")
+    @Getter @Setter
+    private AccountType accountType;
+
+
+    // -- status (property)
+
+    @Property(
+            domainEvent = StatusDomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "2"
+    )
+    @javax.jdo.annotations.Column(allowsNull="false")
+    @Getter @Setter
+    private ApplicationUserStatus status;
+
+
+    // -- atPath (property)
+
+    @Property(
+            domainEvent = AtPathDomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = MAX_LENGTH_AT_PATH
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "3"
+    )
+    @javax.jdo.annotations.Column(name = "atPath", allowsNull="true", length = MAX_LENGTH_AT_PATH)
+    @Getter @Setter
+    private String atPath;
+
+
     // -- familyName (property)
 
     @Property(
@@ -159,8 +205,9 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.1")
+            fieldSetId="name",
+            sequence = "1"
+    )
     @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_FAMILY_NAME)
     @Getter @Setter
     private String familyName;
@@ -175,8 +222,9 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.2")
+            fieldSetId="name",
+            sequence = "2"
+    )
     @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_GIVEN_NAME)
     @Getter @Setter
     private String givenName;
@@ -191,8 +239,9 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.3")
+            fieldSetId="name",
+            sequence = "3"
+    )
     @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_KNOWN_AS)
     @Getter @Setter
     private String knownAs;
@@ -205,7 +254,10 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             editing = Editing.DISABLED,
             maxLength = MAX_LENGTH_EMAIL_ADDRESS
     )
-    @PropertyLayout(fieldSetId="Contact Details", sequence = "3.1")
+    @PropertyLayout(
+            fieldSetId="contactDetails",
+            sequence = "1"
+    )
     @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_EMAIL_ADDRESS)
     @Getter @Setter
     private String emailAddress;
@@ -218,7 +270,11 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             editing = Editing.DISABLED,
             maxLength = MAX_LENGTH_PHONE_NUMBER
     )
-    @PropertyLayout(fieldSetId="Contact Details", sequence = "3.2")
+    @PropertyLayout(
+            hidden = Where.PARENTED_TABLES,
+            fieldSetId="contactDetails",
+            sequence = "2"
+    )
     @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_PHONE_NUMBER)
     @Getter @Setter
     private String phoneNumber;
@@ -232,50 +288,15 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             maxLength = MAX_LENGTH_PHONE_NUMBER
     )
     @PropertyLayout(
-            hidden=Where.PARENTED_TABLES,
-            fieldSetId="Contact Details",
-            sequence = "3.3")
+            hidden=Where.ALL_TABLES,
+            fieldSetId="contactDetails",
+            sequence = "3"
+    )
     @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_PHONE_NUMBER)
     @Getter @Setter
     private String faxNumber;
 
 
-    // -- atPath (property)
-
-    @Property(
-            domainEvent = AtPathDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_AT_PATH
-    )
-    @PropertyLayout(fieldSetId="atPath", sequence = "3.4")
-    @javax.jdo.annotations.Column(name = "atPath", allowsNull="true", length = MAX_LENGTH_AT_PATH)
-    @Getter @Setter
-    private String atPath;
-
-    // -- accountType (property)
-
-    @Property(
-            domainEvent = AccountTypeDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "3")
-    @javax.jdo.annotations.Column(allowsNull="false")
-    @Getter @Setter
-    private AccountType accountType;
-
-
-    // -- status (property)
-
-    @Property(
-            domainEvent = StatusDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "4")
-    @javax.jdo.annotations.Column(allowsNull="false")
-    @Getter @Setter
-    private ApplicationUserStatus status;
-
-
     // -- encryptedPassword (hidden property)
 
     @PropertyLayout(hidden=Where.EVERYWHERE)
@@ -291,7 +312,10 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             domainEvent = HasPasswordDomainEvent.class,
             editing = Editing.DISABLED
     )
-    @PropertyLayout(fieldSetId="Status", sequence = "4")
+    @PropertyLayout(
+            fieldSetId="password",
+            sequence = "1"
+    )
     @Override
     public boolean isHasPassword() {
         return org.apache.isis.extensions.secman.api.user.ApplicationUser.super.isHasPassword();
@@ -305,7 +329,8 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @CollectionLayout(
             defaultView="table",
-            sequence = "20")
+            sequence = "20"
+    )
     @javax.jdo.annotations.Persistent(table="ApplicationUserRoles")
     @javax.jdo.annotations.Join(column="userId")
     @javax.jdo.annotations.Element(column="roleId")
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml
index 59f3058..ad58077 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml
@@ -27,101 +27,80 @@ under the License.
     </bs3:row>
     <bs3:row>
         <bs3:col span="3">
-			<bs3:row>
-				<bs3:col span="12">
-					<bs3:tabGroup>
-						<bs3:tab name="Identity">
-							<bs3:row>
-								<bs3:col span="12">
-									<cpt:fieldSet name="Identity" id="identity"/>
-								</bs3:col>
-							</bs3:row>
-						</bs3:tab>
-						<bs3:tab name="Other">
-							<bs3:row>
-								<bs3:col span="12">
-									<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-								</bs3:col>
-							</bs3:row>
-						</bs3:tab>
-						<bs3:tab name="Metadata">
-							<bs3:row>
-								<bs3:col span="12">
-									<cpt:fieldSet name="Metadata" id="metadata">
-										<cpt:property id="objectType"/>
-										<cpt:property id="objectIdentifier"/>
-										<cpt:property id="datanucleusVersionLong"/>
-										<cpt:property id="datanucleusVersionTimestamp"/>
-									</cpt:fieldSet>
-								</bs3:col>
-							</bs3:row>
-						</bs3:tab>
-					</bs3:tabGroup>
-				</bs3:col>
-			</bs3:row>
-            <cpt:fieldSet name="Status" id="status">
-                <cpt:property id="accountType"/>
-                <cpt:property id="status"/>
-                <cpt:property id="atPath"/>
-            </cpt:fieldSet>
+            <bs3:row>
+                <bs3:col span="12">
+                    <bs3:tabGroup>
+                        <bs3:tab name="Identity">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Identity" id="identity"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Other">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Metadata">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Metadata" id="metadata"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                    </bs3:tabGroup>
+                </bs3:col>
+            </bs3:row>
+            <cpt:fieldSet name="Status" id="status"/>
+        </bs3:col>
+        <bs3:col span="3">
+            <bs3:tabGroup>
+                <bs3:tab name="Name">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:fieldSet name="Name" id="name"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+                <bs3:tab name="Contact Details">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:fieldSet name="Contact Details" id="contactDetails"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+            </bs3:tabGroup>
+            <cpt:fieldSet name="Password" id="password"/>
         </bs3:col>
-		<bs3:col span="3">
-			<bs3:tabGroup>
-				<bs3:tab name="Name">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Name" id="name">
-								<cpt:property id="familyName">
-									<cpt:action id="updateName"/>
-								</cpt:property>
-								<cpt:property id="givenName"/>
-								<cpt:property id="knownAs"/>
-							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
-				</bs3:tab>
-				<bs3:tab name="Contact Details">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Contact Details" id="contactDetails">
-								<cpt:property id="emailAddress"/>
-								<cpt:property id="phoneNumber"/>
-								<cpt:property id="faxNumber"/>
-							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
-				</bs3:tab>
-			</bs3:tabGroup>
-			<cpt:fieldSet name="Password" id="password">
-                <cpt:property id="hasPassword"/>
-			</cpt:fieldSet>
-		</bs3:col>
         <bs3:col span="6">
-        	<bs3:row>
-        		<bs3:col span="12">
-        			<bs3:tabGroup>
-		        		<bs3:tab name="Roles">
-		        			<bs3:row>
-		        				<bs3:col span="12">
-						            <cpt:collection id="roles"/>
-		        				</bs3:col>
-		        			</bs3:row>
-		        		</bs3:tab>
-		        		<bs3:tab name="Permissions">
-		        			<bs3:row>
-		        				<bs3:col span="12">
-		        					<cpt:collection id="permissions"/>
-		        				</bs3:col>
-		        			</bs3:row>
-		        		</bs3:tab>
-        			</bs3:tabGroup>
-        		</bs3:col>
-        	</bs3:row>
+            <bs3:row>
+                <bs3:col span="12">
+                    <bs3:tabGroup>
+                        <bs3:tab name="Roles">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:collection id="roles"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Permissions">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:collection id="permissions"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                    </bs3:tabGroup>
+                </bs3:col>
+            </bs3:row>
+        </bs3:col>
+    </bs3:row>
+    <bs3:row>
+        <bs3:col span="12">
+            <bs3:tabGroup unreferencedCollections="true"/>
         </bs3:col>
     </bs3:row>
-	<bs3:row>
-		<bs3:col span="12">
-			<bs3:tabGroup unreferencedCollections="true"/>
-		</bs3:col>
-	</bs3:row>
 </bs3:grid>
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
index b14455d..a0a570e 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
@@ -133,6 +133,7 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     @Inject private transient PermissionsEvaluationService permissionsEvaluationService;
     @Inject private transient SecmanConfiguration configBean;
 
+
     @Id
     @GeneratedValue
     private Long id;
@@ -149,14 +150,62 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             maxLength = MAX_LENGTH_USERNAME
     )
     @PropertyLayout(
-            hidden=Where.PARENTED_TABLES,
-            fieldSetId="Id",
-            sequence = "1")
+            fieldSetId="identity",
+            sequence = "1"
+    )
     @Column(nullable=false, length=MAX_LENGTH_USERNAME)
     @Getter @Setter
     private String username;
 
 
+    // -- accountType (property)
+
+    @Property(
+            domainEvent = AccountTypeDomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "1"
+    )
+    @Column(nullable=false)
+    @Enumerated(EnumType.STRING)
+    @Getter @Setter
+    private AccountType accountType;
+
+
+    // -- status (property)
+
+    @Property(
+            domainEvent = StatusDomainEvent.class,
+            editing = Editing.DISABLED
+    )
+    @PropertyLayout(
+            fieldSetId="status",
+            sequence = "2"
+    )
+    @Column(nullable=false)
+    @Enumerated(EnumType.STRING)
+    @Getter @Setter
+    private ApplicationUserStatus status;
+
+
+    // -- atPath (property)
+
+    @Property(
+            domainEvent = AtPathDomainEvent.class,
+            editing = Editing.DISABLED,
+            maxLength = MAX_LENGTH_AT_PATH
+    )
+    @PropertyLayout(
+            fieldSetId="atPath",
+            sequence = "3"
+    )
+    @Column(name="atPath", nullable=true, length = MAX_LENGTH_AT_PATH)
+    @Getter @Setter
+    private String atPath;
+
+
     // -- familyName (property)
 
     @Property(
@@ -166,8 +215,9 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.1")
+            fieldSetId="name",
+            sequence = "1"
+    )
     @Column(nullable=true, length=MAX_LENGTH_FAMILY_NAME)
     @Getter @Setter
     private String familyName;
@@ -182,8 +232,9 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.2")
+            fieldSetId="name",
+            sequence = "2"
+    )
     @Column(nullable=true, length=MAX_LENGTH_GIVEN_NAME)
     @Getter @Setter
     private String givenName;
@@ -198,8 +249,9 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
-            fieldSetId="Name",
-            sequence = "2.3")
+            fieldSetId="name",
+            sequence = "3"
+    )
     @Column(nullable=true, length=MAX_LENGTH_KNOWN_AS)
     @Getter @Setter
     private String knownAs;
@@ -212,7 +264,10 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             editing = Editing.DISABLED,
             maxLength = MAX_LENGTH_EMAIL_ADDRESS
     )
-    @PropertyLayout(fieldSetId="Contact Details", sequence = "3.1")
+    @PropertyLayout(
+            fieldSetId="contactDetails",
+            sequence = "1"
+    )
     @Column(nullable=true, length=MAX_LENGTH_EMAIL_ADDRESS)
     @Getter @Setter
     private String emailAddress;
@@ -225,7 +280,10 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
             editing = Editing.DISABLED,
             maxLength = MAX_LENGTH_PHONE_NUMBER
     )
-    @PropertyLayout(fieldSetId="Contact Details", sequence = "3.2")
+    @PropertyLayout(
+            fieldSetId="contactDetails",
+            sequence = "2"
+    )
     @Column(nullable=true, length=MAX_LENGTH_PHONE_NUMBER)
     @Getter @Setter
     private String phoneNumber;
@@ -240,51 +298,14 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     )
     @PropertyLayout(
             hidden=Where.PARENTED_TABLES,
-            fieldSetId="Contact Details",
-            sequence = "3.3")
+            fieldSetId="contactDetails",
+            sequence = "3"
+    )
     @Column(nullable=true, length=MAX_LENGTH_PHONE_NUMBER)
     @Getter @Setter
     private String faxNumber;
 
 
-    // -- atPath (property)
-
-    @Property(
-            domainEvent = AtPathDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_AT_PATH
-    )
-    @PropertyLayout(fieldSetId="atPath", sequence = "3.4")
-    @Column(name="atPath", nullable=true, length = MAX_LENGTH_AT_PATH)
-    @Getter @Setter
-    private String atPath;
-
-    // -- accountType (property)
-
-    @Property(
-            domainEvent = AccountTypeDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "3")
-    @Column(nullable=false)
-    @Enumerated(EnumType.STRING)
-    @Getter @Setter
-    private AccountType accountType;
-
-
-    // -- status (property)
-
-    @Property(
-            domainEvent = StatusDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "4")
-    @Column(nullable=false)
-    @Enumerated(EnumType.STRING)
-    @Getter @Setter
-    private ApplicationUserStatus status;
-
-
     // -- encryptedPassword (hidden property)
 
     @PropertyLayout(hidden=Where.EVERYWHERE)
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml
index 9a6256d..ad58077 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml
@@ -26,67 +26,81 @@ under the License.
         </bs3:col>
     </bs3:row>
     <bs3:row>
-        <bs3:col span="4">
-            <cpt:fieldSet name="Id" id="id" unreferencedProperties="true">
-                <cpt:property id="name"/>
-                <cpt:property id="username"/>
-                <cpt:property id="encryptedPassword"/>
-            </cpt:fieldSet>
-            <cpt:fieldSet name="Status" id="status">
-                <cpt:property id="accountType"/>
-                <cpt:property id="hasPassword"/>
-                <cpt:property id="status"/>
-                <cpt:property id="atPath"/>
-            </cpt:fieldSet>
-            <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusVersionLong"/>
-                <cpt:property id="datanucleusVersionTimestamp"/>
-            </cpt:fieldSet>
+        <bs3:col span="3">
+            <bs3:row>
+                <bs3:col span="12">
+                    <bs3:tabGroup>
+                        <bs3:tab name="Identity">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Identity" id="identity"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Other">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Metadata">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Metadata" id="metadata"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                    </bs3:tabGroup>
+                </bs3:col>
+            </bs3:row>
+            <cpt:fieldSet name="Status" id="status"/>
         </bs3:col>
-        <bs3:col span="8">
-        	<bs3:row>
-        		<bs3:col span="12">
-        			<bs3:tabGroup>
-        				<bs3:tab name="Name and Contact Details">
-        					<bs3:row>
-        						<bs3:col span="6">
-						            <cpt:fieldSet name="Contact Details" id="contactDetails">
-						                <cpt:property id="emailAddress"/>
-						                <cpt:property id="phoneNumber"/>
-						                <cpt:property id="faxNumber"/>
-						            </cpt:fieldSet>
-        						</bs3:col>
-        						<bs3:col span="6">
-						            <cpt:fieldSet name="Name" id="name">
-						                <cpt:property id="familyName"/>
-						                <cpt:property id="givenName"/>
-						                <cpt:property id="knownAs"/>
-						            </cpt:fieldSet>
-        						</bs3:col>
-        					</bs3:row>
-        				</bs3:tab>
-		        		<bs3:tab name="Roles">
-		        			<bs3:row>
-		        				<bs3:col span="12">
-						            <cpt:collection id="roles"/>
-		        				</bs3:col>
-		        			</bs3:row>
-		        		</bs3:tab>
-		        		<bs3:tab name="Permissions">
-		        			<bs3:row>
-		        				<bs3:col span="12">
-		        					<cpt:collection id="permissions"/>
-		        				</bs3:col>
-		        			</bs3:row>
-		        		</bs3:tab>
-		        		<bs3:tab name="Other">
-		        			<bs3:row>
-		        				<bs3:col span="12" unreferencedCollections="true" />
-		        			</bs3:row>
-		        		</bs3:tab>
-        			</bs3:tabGroup>
-        		</bs3:col>
-        	</bs3:row>
+        <bs3:col span="3">
+            <bs3:tabGroup>
+                <bs3:tab name="Name">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:fieldSet name="Name" id="name"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+                <bs3:tab name="Contact Details">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <cpt:fieldSet name="Contact Details" id="contactDetails"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+            </bs3:tabGroup>
+            <cpt:fieldSet name="Password" id="password"/>
+        </bs3:col>
+        <bs3:col span="6">
+            <bs3:row>
+                <bs3:col span="12">
+                    <bs3:tabGroup>
+                        <bs3:tab name="Roles">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:collection id="roles"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Permissions">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:collection id="permissions"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                    </bs3:tabGroup>
+                </bs3:col>
+            </bs3:row>
+        </bs3:col>
+    </bs3:row>
+    <bs3:row>
+        <bs3:col span="12">
+            <bs3:tabGroup unreferencedCollections="true"/>
         </bs3:col>
     </bs3:row>
 </bs3:grid>

[isis] 03/03: ISIS-2619: use meta-annotations in ApplicationUser ...

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

danhaywood pushed a commit to branch ISIS-2619
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 0fb0060b3a31f5c1634865775ab75f8d0cb6acfa
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed May 5 07:30:03 2021 +0100

    ISIS-2619: use meta-annotations in ApplicationUser ...
    
    ... to reduce boilerplate
---
 .../secman/api/user/ApplicationUser.java           | 221 +++++++++++++++------
 .../user/ApplicationUser_updateEmailAddress.java   |   3 +-
 .../dom/user/ApplicationUser_updateFaxNumber.java  |   3 +-
 .../model/dom/user/ApplicationUser_updateName.java |   7 +-
 .../user/ApplicationUser_updatePhoneNumber.java    |   3 +-
 .../dom/user/ApplicationUser_updateUsername.java   |   3 +-
 .../secman/jdo/dom/user/ApplicationUser.java       | 170 ++--------------
 .../ApplicationUserManager_newDelegateUser.java    |   2 +-
 .../user/ApplicationUserManager_newLocalUser.java  |   2 +-
 .../secman/jpa/dom/user/ApplicationUser.java       | 180 +++--------------
 .../ApplicationUserManager_newDelegateUser.java    |   2 +-
 .../user/ApplicationUserManager_newLocalUser.java  |   2 +-
 12 files changed, 219 insertions(+), 379 deletions(-)

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 d29fd62..0c13545 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
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.extensions.secman.api.user;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.util.Set;
 
 import javax.inject.Inject;
@@ -28,6 +32,7 @@ import org.springframework.stereotype.Component;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
@@ -46,16 +51,6 @@ import lombok.RequiredArgsConstructor;
  */
 public interface ApplicationUser extends HasUsername, HasAtPath {
 
-    // -- CONSTANTS
-
-    int MAX_LENGTH_USERNAME = 120;
-    int MAX_LENGTH_FAMILY_NAME = 120;
-    int MAX_LENGTH_GIVEN_NAME = 120;
-    int MAX_LENGTH_KNOWN_AS = 120;
-    int MAX_LENGTH_EMAIL_ADDRESS = 120;
-    int MAX_LENGTH_PHONE_NUMBER = 120;
-    int MAX_LENGTH_AT_PATH = 254;
-
     // -- DOMAIN EVENTS
 
     abstract class PropertyDomainEvent<T> extends IsisModuleExtSecmanApi.PropertyDomainEvent<ApplicationUser, T> {}
@@ -87,17 +82,26 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
 
     // -- username (property)
 
-    class UsernameDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = UsernameDomainEvent.class,
+            domainEvent = Username.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_USERNAME
+            maxLength = Username.MAX_LENGTH
     )
     @PropertyLayout(
             fieldSetId="identity",
             sequence = "1"
     )
+    @Parameter(
+            maxLength = Username.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Username {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @Username
     @Override
     String getUsername();
     void setUsername(String username);
@@ -105,163 +109,248 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
 
     // -- accountType (property)
 
-    class AccountTypeDomainEvent extends PropertyDomainEvent<AccountType> {}
-
     @Property(
-            domainEvent = AccountTypeDomainEvent.class,
+            domainEvent = AccountType.DomainEvent.class,
             editing = Editing.DISABLED
     )
     @PropertyLayout(
             fieldSetId="status",
             sequence = "1"
     )
-    AccountType getAccountType();
-    void setAccountType(AccountType accountType);
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface AccountType {
+        class DomainEvent extends PropertyDomainEvent<AccountType> {}
+    }
 
+    @AccountType
+    org.apache.isis.extensions.secman.api.user.AccountType getAccountType();
+    void setAccountType(org.apache.isis.extensions.secman.api.user.AccountType accountType);
 
-    // -- status (property)
 
-    class StatusDomainEvent extends PropertyDomainEvent<ApplicationUserStatus> {}
+    // -- status (property)
 
     @Property(
-            domainEvent = StatusDomainEvent.class,
+            domainEvent = Status.DomainEvent.class,
             editing = Editing.DISABLED
     )
     @PropertyLayout(
             fieldSetId="status",
             sequence = "2"
     )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Status {
+        class DomainEvent extends PropertyDomainEvent<ApplicationUserStatus> {}
+    }
+
+    @Status
     ApplicationUserStatus getStatus();
     void setStatus(ApplicationUserStatus disabled);
 
 
     // -- atPath (property)
 
-    class AtPathDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = AtPathDomainEvent.class,
+            domainEvent = AtPath.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_AT_PATH
+            maxLength = AtPath.MAX_LENGTH
     )
     @PropertyLayout(
             fieldSetId="status",
             sequence = "3"
     )
+    @Parameter(
+            maxLength = AtPath.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface AtPath {
+        int MAX_LENGTH = 254;
+
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @AtPath
     @Override
     String getAtPath();
     void setAtPath(String atPath);
 
-    // -- familyName (property)
 
-    class FamilyNameDomainEvent extends PropertyDomainEvent<String> {}
+    // -- familyName (property)
 
     @Property(
-            domainEvent = FamilyNameDomainEvent.class,
+            domainEvent = FamilyName.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_FAMILY_NAME
+            maxLength = FamilyName.MAX_LENGTH
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
             fieldSetId="name",
             sequence = "1"
     )
+    @Parameter(
+            maxLength = FamilyName.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface FamilyName {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @FamilyName
     String getFamilyName();
     void setFamilyName(String familyName);
 
 
     // -- givenName (property)
 
-    class GivenNameDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = GivenNameDomainEvent.class,
+            domainEvent = GivenName.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_KNOWN_AS
+            maxLength = GivenName.MAX_LENGTH
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
             fieldSetId="name",
             sequence = "2"
     )
+    @Parameter(
+            maxLength = GivenName.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface GivenName {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @GivenName
     String getGivenName();
     void setGivenName(String givenName);
 
 
     // -- knownAs (property)
 
-    class KnownAsDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = KnownAsDomainEvent.class,
+            domainEvent = KnownAs.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_KNOWN_AS
+            maxLength = KnownAs.MAX_LENGTH
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
             fieldSetId="name",
             sequence = "3"
     )
+    @Parameter(
+            maxLength = KnownAs.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface KnownAs {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @KnownAs
     String getKnownAs();
     void setKnownAs(String knownAs);
 
 
     // -- emailAddress (property)
 
-    class EmailAddressDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = EmailAddressDomainEvent.class,
+            domainEvent = EmailAddress.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_EMAIL_ADDRESS
+            maxLength = EmailAddress.MAX_LENGTH
     )
     @PropertyLayout(
             fieldSetId="contactDetails",
             sequence = "1"
     )
+    @Parameter(
+            maxLength = EmailAddress.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface EmailAddress {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @EmailAddress
     String getEmailAddress();
     void setEmailAddress(String emailAddress);
 
 
     // -- phoneNumber (property)
 
-    class PhoneNumberDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = PhoneNumberDomainEvent.class,
+            domainEvent = PhoneNumber.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_PHONE_NUMBER
+            maxLength = PhoneNumber.MAX_LENGTH
     )
     @PropertyLayout(
             hidden = Where.PARENTED_TABLES,
             fieldSetId="contactDetails",
             sequence = "2"
     )
+    @Parameter(
+            maxLength = PhoneNumber.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface PhoneNumber {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @PhoneNumber
     String getPhoneNumber();
     void setPhoneNumber(String phoneNumber);
 
 
     // -- faxNumber (property)
 
-    class FaxNumberDomainEvent extends PropertyDomainEvent<String> {}
-
     @Property(
-            domainEvent = FaxNumberDomainEvent.class,
+            domainEvent = FaxNumber.DomainEvent.class,
             editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_PHONE_NUMBER
+            maxLength = FaxNumber.MAX_LENGTH
     )
     @PropertyLayout(
             hidden=Where.ALL_TABLES,
             fieldSetId="contactDetails",
             sequence = "3"
     )
+    @Parameter(
+            maxLength = FaxNumber.MAX_LENGTH
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface FaxNumber {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<String> {}
+    }
+
+    @FaxNumber
     String getFaxNumber();
     void setFaxNumber(String faxNumber);
 
 
     // -- encryptedPassword (hidden property)
 
-    @PropertyLayout(hidden=Where.EVERYWHERE)
+    @PropertyLayout(
+            hidden=Where.EVERYWHERE,
+            fieldSetId="password",
+            sequence = "2"
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface EncryptedPassword {
+    }
+
+    @EncryptedPassword
     String getEncryptedPassword();
     void setEncryptedPassword(String encryptedPassword);
 
@@ -269,28 +358,34 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
 
     // -- hasPassword (derived property)
 
-    class HasPasswordDomainEvent extends PropertyDomainEvent<Boolean> {}
-
     @Property(
-            domainEvent = HasPasswordDomainEvent.class,
+            domainEvent = HasPassword.DomainEvent.class,
             editing = Editing.DISABLED
     )
     @PropertyLayout(
             fieldSetId="password",
             sequence = "1"
     )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface HasPassword {
+        class DomainEvent extends PropertyDomainEvent<Boolean> {}
+    }
+
+    @HasPassword
     default boolean isHasPassword() {
         return _Strings.isNotEmpty(getEncryptedPassword());
     }
 
+
     @Component
     @RequiredArgsConstructor(onConstructor_ = {@Inject})
     class HasPasswordAdvisor {
 
         final org.apache.isis.extensions.secman.api.user.ApplicationUserRepository<?> applicationUserRepository;
 
-        @EventListener(org.apache.isis.extensions.secman.api.user.ApplicationUser.HasPasswordDomainEvent.class)
-        public void advise(org.apache.isis.extensions.secman.api.user.ApplicationUser.HasPasswordDomainEvent ev) {
+        @EventListener(HasPassword.DomainEvent.class)
+        public void advise(HasPassword.DomainEvent ev) {
             switch(ev.getEventPhase()) {
                 case HIDE:
                     if(! applicationUserRepository.isPasswordFeatureEnabled(ev.getSource())) {
@@ -307,16 +402,20 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
 
     // -- roles (collection)
 
-
-    class RolesDomainEvent extends CollectionDomainEvent<ApplicationRole> {}
-
     @Collection(
-            domainEvent = RolesDomainEvent.class
+            domainEvent = Roles.DomainEvent.class
     )
     @CollectionLayout(
             defaultView="table",
             sequence = "20"
     )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Roles {
+        class DomainEvent extends CollectionDomainEvent<ApplicationRole> {}
+    }
+
+    @Roles
     Set<? extends ApplicationRole> getRoles();
 
 
@@ -334,7 +433,7 @@ public interface ApplicationUser extends HasUsername, HasAtPath {
 
     @Programmatic
     default boolean isLocalAccount() {
-        return getAccountType() == AccountType.LOCAL;
+        return getAccountType() == org.apache.isis.extensions.secman.api.user.AccountType.LOCAL;
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java
index ddc6272..ac305df 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java
@@ -26,7 +26,6 @@ import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
-import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_updateEmailAddress.ActionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
@@ -43,7 +42,7 @@ public class ApplicationUser_updateEmailAddress {
 
     @MemberSupport
     public ApplicationUser act(
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_EMAIL_ADDRESS)
+            @Parameter(maxLength = ApplicationUser.EmailAddress.MAX_LENGTH)
             @ParameterLayout(named="Email")
             final String emailAddress) {
         target.setEmailAddress(emailAddress);
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateFaxNumber.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateFaxNumber.java
index a6963f5..2cc60ff 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateFaxNumber.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateFaxNumber.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
-import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_updateFaxNumber.ActionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
@@ -44,7 +43,7 @@ public class ApplicationUser_updateFaxNumber {
 
     @MemberSupport
     public ApplicationUser act(
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_PHONE_NUMBER, optionality = Optionality.OPTIONAL)
+            @Parameter(maxLength = ApplicationUser.PhoneNumber.MAX_LENGTH, optionality = Optionality.OPTIONAL)
             @ParameterLayout(named="Fax")
             final String faxNumber) {
         holder.setFaxNumber(faxNumber);
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java
index ffb51c9..3c2e473 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java
@@ -26,7 +26,6 @@ import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
-import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_updateName.ActionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
@@ -43,13 +42,13 @@ public class ApplicationUser_updateName {
 
     @MemberSupport
     public ApplicationUser act(
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_FAMILY_NAME, optionality = Optionality.OPTIONAL)
+            @Parameter(maxLength = ApplicationUser.FamilyName.MAX_LENGTH, optionality = Optionality.OPTIONAL)
             @ParameterLayout(named="Family Name")
             final String familyName,
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_GIVEN_NAME, optionality = Optionality.OPTIONAL)
+            @Parameter(maxLength = ApplicationUser.GivenName.MAX_LENGTH, optionality = Optionality.OPTIONAL)
             @ParameterLayout(named="Given Name")
             final String givenName,
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_KNOWN_AS, optionality = Optionality.OPTIONAL)
+            @Parameter(maxLength = ApplicationUser.KnownAs.MAX_LENGTH, optionality = Optionality.OPTIONAL)
             @ParameterLayout(named="Known As")
             final String knownAs
             ) {
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java
index 48e49f1..7297f34 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
-import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_updatePhoneNumber.ActionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
@@ -45,7 +44,7 @@ public class ApplicationUser_updatePhoneNumber {
     @MemberSupport
     public ApplicationUser act(
             @ParameterLayout(named="Phone")
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_PHONE_NUMBER, optionality = Optionality.OPTIONAL)
+            @Parameter(maxLength = ApplicationUser.PhoneNumber.MAX_LENGTH, optionality = Optionality.OPTIONAL)
             final String phoneNumber) {
         target.setPhoneNumber(phoneNumber);
         return target;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java
index 11ae78f..49b991e 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
-import org.apache.isis.extensions.secman.model.dom.user.ApplicationUser_updateUsername.ActionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
@@ -42,7 +41,7 @@ public class ApplicationUser_updateUsername {
 
     @MemberSupport
     public ApplicationUser act(
-            @Parameter(maxLength = ApplicationUser.MAX_LENGTH_USERNAME)
+            @Parameter(maxLength = ApplicationUser.Username.MAX_LENGTH)
             @ParameterLayout(named="Username")
             final String username) {
         target.setUsername(username);
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
index d7acfae..c059da5 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
@@ -45,13 +45,11 @@ import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
-import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecmanConfiguration;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
 import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
-import org.apache.isis.extensions.secman.api.user.AccountType;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
 import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermissionRepository;
@@ -134,203 +132,79 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
 
 
 
-    // -- username (property)
-
-    @Property(
-            domainEvent = UsernameDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_USERNAME
-    )
-    @PropertyLayout(
-            fieldSetId="identity",
-            sequence = "1"
-    )
-    @javax.jdo.annotations.Column(allowsNull="false", length = MAX_LENGTH_USERNAME)
+    @Username
+    @javax.jdo.annotations.Column(allowsNull="false", length = Username.MAX_LENGTH)
     @Getter @Setter
     private String username;
 
 
-    // -- accountType (property)
-
-    @Property(
-            domainEvent = AccountTypeDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            fieldSetId="status",
-            sequence = "1"
-    )
+    @AccountType
     @javax.jdo.annotations.Column(allowsNull="false")
     @Getter @Setter
-    private AccountType accountType;
+    private org.apache.isis.extensions.secman.api.user.AccountType accountType;
 
 
-    // -- status (property)
-
-    @Property(
-            domainEvent = StatusDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            fieldSetId="status",
-            sequence = "2"
-    )
-    @javax.jdo.annotations.Column(allowsNull="false")
+    @Status
     @Getter @Setter
     private ApplicationUserStatus status;
 
 
-    // -- atPath (property)
-
-    @Property(
-            domainEvent = AtPathDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_AT_PATH
-    )
-    @PropertyLayout(
-            fieldSetId="status",
-            sequence = "3"
-    )
-    @javax.jdo.annotations.Column(name = "atPath", allowsNull="true", length = MAX_LENGTH_AT_PATH)
+    @AtPath
+    @javax.jdo.annotations.Column(name = "atPath", allowsNull="true", length = AtPath.MAX_LENGTH)
     @Getter @Setter
     private String atPath;
 
 
-    // -- familyName (property)
-
-    @Property(
-            domainEvent = FamilyNameDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_FAMILY_NAME
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="name",
-            sequence = "1"
-    )
-    @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_FAMILY_NAME)
+    @FamilyName
+    @javax.jdo.annotations.Column(allowsNull="true", length = FamilyName.MAX_LENGTH)
     @Getter @Setter
     private String familyName;
 
 
-    // -- givenName (property)
-
-    @Property(
-            domainEvent = GivenNameDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_KNOWN_AS
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="name",
-            sequence = "2"
-    )
-    @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_GIVEN_NAME)
+    @GivenName
+    @javax.jdo.annotations.Column(allowsNull="true", length = GivenName.MAX_LENGTH)
     @Getter @Setter
     private String givenName;
 
 
-    // -- knownAs (property)
-
-    @Property(
-            domainEvent = KnownAsDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_KNOWN_AS
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="name",
-            sequence = "3"
-    )
-    @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_KNOWN_AS)
+    @KnownAs
+    @javax.jdo.annotations.Column(allowsNull="true", length = KnownAs.MAX_LENGTH)
     @Getter @Setter
     private String knownAs;
 
 
-    // -- emailAddress (property)
-
-    @Property(
-            domainEvent = EmailAddressDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_EMAIL_ADDRESS
-    )
-    @PropertyLayout(
-            fieldSetId="contactDetails",
-            sequence = "1"
-    )
-    @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_EMAIL_ADDRESS)
+    @EmailAddress
+    @javax.jdo.annotations.Column(allowsNull="true", length = EmailAddress.MAX_LENGTH)
     @Getter @Setter
     private String emailAddress;
 
 
-    // -- phoneNumber (property)
-
-    @Property(
-            domainEvent = PhoneNumberDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_PHONE_NUMBER
-    )
-    @PropertyLayout(
-            hidden = Where.PARENTED_TABLES,
-            fieldSetId="contactDetails",
-            sequence = "2"
-    )
-    @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_PHONE_NUMBER)
+    @PhoneNumber
+    @javax.jdo.annotations.Column(allowsNull="true", length = PhoneNumber.MAX_LENGTH)
     @Getter @Setter
     private String phoneNumber;
 
 
-    // -- faxNumber (property)
-
-    @Property(
-            domainEvent = FaxNumberDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_PHONE_NUMBER
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="contactDetails",
-            sequence = "3"
-    )
-    @javax.jdo.annotations.Column(allowsNull="true", length = MAX_LENGTH_PHONE_NUMBER)
+    @FaxNumber
+    @javax.jdo.annotations.Column(allowsNull="true", length = FaxNumber.MAX_LENGTH)
     @Getter @Setter
     private String faxNumber;
 
 
-    // -- encryptedPassword (hidden property)
-
-    @PropertyLayout(hidden=Where.EVERYWHERE)
+    @EncryptedPassword
     @javax.jdo.annotations.Column(allowsNull="true")
     @Getter @Setter
     private String encryptedPassword;
 
 
-
-    // -- hasPassword (derived property)
-
-    @Property(
-            domainEvent = HasPasswordDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            fieldSetId="password",
-            sequence = "1"
-    )
+    @HasPassword
     @Override
     public boolean isHasPassword() {
         return org.apache.isis.extensions.secman.api.user.ApplicationUser.super.isHasPassword();
     }
 
 
-    // -- roles (collection)
-
-    @Collection(
-            domainEvent = RolesDomainEvent.class
-    )
-    @CollectionLayout(
-            defaultView="table",
-            sequence = "20"
-    )
+    @Roles
     @javax.jdo.annotations.Persistent(table="ApplicationUserRoles")
     @javax.jdo.annotations.Join(column="userId")
     @javax.jdo.annotations.Element(column="roleId")
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newDelegateUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newDelegateUser.java
index 55a5b44..f9e075d 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newDelegateUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newDelegateUser.java
@@ -42,7 +42,7 @@ extends org.apache.isis.extensions.secman.model.dom.user.ApplicationUserManager_
     @MemberSupport
     public ApplicationUserManager act(
 
-          @Parameter(maxLength = ApplicationUser.MAX_LENGTH_USERNAME)
+          @Parameter(maxLength = ApplicationUser.Username.MAX_LENGTH)
           @ParameterLayout(named = "Name")
           final String username,
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newLocalUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newLocalUser.java
index 97dc218..ce4cd44 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newLocalUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserManager_newLocalUser.java
@@ -42,7 +42,7 @@ extends org.apache.isis.extensions.secman.model.dom.user.ApplicationUserManager_
 
     @MemberSupport
     public ApplicationUserManager act(
-          @Parameter(maxLength = ApplicationUser.MAX_LENGTH_USERNAME)
+          @Parameter(maxLength = ApplicationUser.Username.MAX_LENGTH)
           @ParameterLayout(named = "Name")
           final String username,
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
index a0a570e..13909ee 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
@@ -30,8 +30,6 @@ import javax.persistence.Entity;
 import javax.persistence.EntityListeners;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
@@ -39,31 +37,22 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
-import javax.persistence.Version;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.annotation.Collection;
-import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
-import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.applib.annotation.PropertyLayout;
-import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.user.RoleMemento;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
-import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecmanConfiguration;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
 import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
-import org.apache.isis.extensions.secman.api.user.AccountType;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
 import org.apache.isis.extensions.secman.jpa.dom.constants.NamedQueryNames;
 import org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission;
@@ -124,6 +113,7 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
 
     @Inject private transient ApplicationPermissionRepository applicationPermissionRepository;
     @Inject private transient UserService userService;
+
     /**
      * Optional service, if configured then is used to evaluate permissions within
      * {@link org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet#evaluate(ApplicationFeatureId, ApplicationPermissionMode)}
@@ -134,208 +124,90 @@ org.apache.isis.extensions.secman.api.user.ApplicationUser {
     @Inject private transient SecmanConfiguration configBean;
 
 
-    @Id
-    @GeneratedValue
+    @javax.persistence.Id
+    @javax.persistence.GeneratedValue
     private Long id;
 
-    @Version
+    @javax.persistence.Version
     private Long version;
 
 
-    // -- username (property)
-
-    @Property(
-            domainEvent = UsernameDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_USERNAME
-    )
-    @PropertyLayout(
-            fieldSetId="identity",
-            sequence = "1"
-    )
-    @Column(nullable=false, length=MAX_LENGTH_USERNAME)
+    @Username
+    @Column(nullable=false, length= Username.MAX_LENGTH)
     @Getter @Setter
     private String username;
 
 
-    // -- accountType (property)
-
-    @Property(
-            domainEvent = AccountTypeDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            fieldSetId="status",
-            sequence = "1"
-    )
+    @AccountType
     @Column(nullable=false)
     @Enumerated(EnumType.STRING)
     @Getter @Setter
-    private AccountType accountType;
-
+    private org.apache.isis.extensions.secman.api.user.AccountType accountType;
 
-    // -- status (property)
 
-    @Property(
-            domainEvent = StatusDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(
-            fieldSetId="status",
-            sequence = "2"
-    )
+    @Status
     @Column(nullable=false)
     @Enumerated(EnumType.STRING)
     @Getter @Setter
     private ApplicationUserStatus status;
 
 
-    // -- atPath (property)
-
-    @Property(
-            domainEvent = AtPathDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_AT_PATH
-    )
-    @PropertyLayout(
-            fieldSetId="atPath",
-            sequence = "3"
-    )
-    @Column(name="atPath", nullable=true, length = MAX_LENGTH_AT_PATH)
+    @AtPath
+    @Column(name="atPath", nullable=true, length = AtPath.MAX_LENGTH)
     @Getter @Setter
     private String atPath;
 
 
-    // -- familyName (property)
-
-    @Property(
-            domainEvent = FamilyNameDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_FAMILY_NAME
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="name",
-            sequence = "1"
-    )
-    @Column(nullable=true, length=MAX_LENGTH_FAMILY_NAME)
+    @FamilyName
+    @Column(nullable=true, length= FamilyName.MAX_LENGTH)
     @Getter @Setter
     private String familyName;
 
 
-    // -- givenName (property)
-
-    @Property(
-            domainEvent = GivenNameDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_KNOWN_AS
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="name",
-            sequence = "2"
-    )
-    @Column(nullable=true, length=MAX_LENGTH_GIVEN_NAME)
+    @GivenName
+    @Column(nullable=true, length= GivenName.MAX_LENGTH)
     @Getter @Setter
     private String givenName;
 
 
-    // -- knownAs (property)
-
-    @Property(
-            domainEvent = KnownAsDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_KNOWN_AS
-    )
-    @PropertyLayout(
-            hidden=Where.ALL_TABLES,
-            fieldSetId="name",
-            sequence = "3"
-    )
-    @Column(nullable=true, length=MAX_LENGTH_KNOWN_AS)
+    @KnownAs
+    @Column(nullable=true, length= KnownAs.MAX_LENGTH)
     @Getter @Setter
     private String knownAs;
 
 
-    // -- emailAddress (property)
-
-    @Property(
-            domainEvent = EmailAddressDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_EMAIL_ADDRESS
-    )
-    @PropertyLayout(
-            fieldSetId="contactDetails",
-            sequence = "1"
-    )
-    @Column(nullable=true, length=MAX_LENGTH_EMAIL_ADDRESS)
+    @EmailAddress
+    @Column(nullable=true, length= EmailAddress.MAX_LENGTH)
     @Getter @Setter
     private String emailAddress;
 
 
-    // -- phoneNumber (property)
-
-    @Property(
-            domainEvent = PhoneNumberDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_PHONE_NUMBER
-    )
-    @PropertyLayout(
-            fieldSetId="contactDetails",
-            sequence = "2"
-    )
-    @Column(nullable=true, length=MAX_LENGTH_PHONE_NUMBER)
+    @PhoneNumber
+    @Column(nullable=true, length= PhoneNumber.MAX_LENGTH)
     @Getter @Setter
     private String phoneNumber;
 
 
-    // -- faxNumber (property)
-
-    @Property(
-            domainEvent = FaxNumberDomainEvent.class,
-            editing = Editing.DISABLED,
-            maxLength = MAX_LENGTH_PHONE_NUMBER
-    )
-    @PropertyLayout(
-            hidden=Where.PARENTED_TABLES,
-            fieldSetId="contactDetails",
-            sequence = "3"
-    )
-    @Column(nullable=true, length=MAX_LENGTH_PHONE_NUMBER)
+    @FaxNumber
+    @Column(nullable=true, length= FaxNumber.MAX_LENGTH)
     @Getter @Setter
     private String faxNumber;
 
 
-    // -- encryptedPassword (hidden property)
-
-    @PropertyLayout(hidden=Where.EVERYWHERE)
+    @EncryptedPassword
     @Column(nullable=true)
     @Getter @Setter
     private String encryptedPassword;
 
 
-
-    // -- hasPassword (derived property)
-
-    @Property(
-            domainEvent = HasPasswordDomainEvent.class,
-            editing = Editing.DISABLED
-    )
-    @PropertyLayout(fieldSetId="Status", sequence = "4")
+    @HasPassword
     @Override
     public boolean isHasPassword() {
         return org.apache.isis.extensions.secman.api.user.ApplicationUser.super.isHasPassword();
     }
 
 
-    // -- roles (collection)
-
-    @Collection(
-            domainEvent = RolesDomainEvent.class
-    )
-    @CollectionLayout(
-            defaultView="table",
-            sequence = "20")
+    @Roles
     @ManyToMany(mappedBy = "users", cascade = CascadeType.ALL)
     @JoinTable(
             name = "ApplicationUserRoles",
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newDelegateUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newDelegateUser.java
index 9cc2d74..c9ca413 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newDelegateUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newDelegateUser.java
@@ -42,7 +42,7 @@ extends org.apache.isis.extensions.secman.model.dom.user.ApplicationUserManager_
     @MemberSupport
     public ApplicationUserManager act(
 
-          @Parameter(maxLength = ApplicationUser.MAX_LENGTH_USERNAME)
+          @Parameter(maxLength = ApplicationUser.Username.MAX_LENGTH)
           @ParameterLayout(named = "Name")
           final String username,
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newLocalUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newLocalUser.java
index ab9365a..23d85c4 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newLocalUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUserManager_newLocalUser.java
@@ -42,7 +42,7 @@ extends org.apache.isis.extensions.secman.model.dom.user.ApplicationUserManager_
 
     @MemberSupport
     public ApplicationUserManager act(
-          @Parameter(maxLength = ApplicationUser.MAX_LENGTH_USERNAME)
+          @Parameter(maxLength = ApplicationUser.Username.MAX_LENGTH)
           @ParameterLayout(named = "Name")
           final String username,
 

[isis] 01/03: ISIS-2644: removes Persistable_datanucleusIdLong

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

danhaywood pushed a commit to branch ISIS-2619
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 6d9c111ceb40d29c30a57bacdb334e708add6d36
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed May 5 06:30:11 2021 +0100

    ISIS-2644: removes Persistable_datanucleusIdLong
---
 .../ApplicationPermission.layout.fallback.xml      |  1 -
 .../ApplicationPermission.layout.fallback.xml      |  1 -
 .../dom/role/ApplicationRole.layout.fallback.xml   |  1 -
 .../tenancy/ApplicationTenancy.layout.fallback.xml |  1 -
 .../dom/user/ApplicationUser.layout.fallback.xml   |  1 -
 .../ApplicationPermission.layout.fallback.xml      |  1 -
 .../dom/role/ApplicationRole.layout.fallback.xml   |  1 -
 .../tenancy/ApplicationTenancy.layout.fallback.xml |  1 -
 .../dom/user/ApplicationUser.layout.fallback.xml   |  5 +-
 .../isis/client/kroviz/core/model/ExposerTest.kt   |  4 --
 .../jdo/datanucleus/IsisModuleJdoDatanucleus.java  | 34 +++++-----
 .../mixins/Persistable_datanucleusIdLong.java      | 75 ----------------------
 .../mixins/Persistable_datanucleusVersionLong.java |  4 +-
 .../Persistable_datanucleusVersionTimestamp.java   |  4 +-
 .../domainmodel/jdo/DomainModelTest_jdoMixins.java | 26 ++++----
 .../todomodule/dom/ExcelDemoToDoItem.layout.xml    |  1 -
 subdomains/excel/integtests/translations.pot       |  8 ---
 testing/fakedata/integtests/translations.pot       |  8 ---
 18 files changed, 35 insertions(+), 142 deletions(-)

diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.layout.fallback.xml b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.layout.fallback.xml
index edf5db3..f6a3d4b 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.layout.fallback.xml
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.layout.fallback.xml
@@ -34,7 +34,6 @@ under the License.
                 <cpt:property id="role"/>
             </cpt:fieldSet>
             <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.layout.fallback.xml b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.layout.fallback.xml
index a99e4fd..ffcece9 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.layout.fallback.xml
@@ -34,7 +34,6 @@ under the License.
                 <cpt:property id="role"/>
             </cpt:fieldSet>
             <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.layout.fallback.xml b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.layout.fallback.xml
index f01c08e..783fdc1 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.layout.fallback.xml
@@ -34,7 +34,6 @@ under the License.
             <cpt:fieldSet name="General" id="general" unreferencedProperties="true">
                 <cpt:property id="name"/>
                 <cpt:property id="description"/>
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.layout.fallback.xml b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.layout.fallback.xml
index 7e8470e..37385d6 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.layout.fallback.xml
@@ -36,7 +36,6 @@ under the License.
                 <cpt:property id="path"/>
             </cpt:fieldSet>
             <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml
index 0d84208..59f3058 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.layout.fallback.xml
@@ -50,7 +50,6 @@ under the License.
 									<cpt:fieldSet name="Metadata" id="metadata">
 										<cpt:property id="objectType"/>
 										<cpt:property id="objectIdentifier"/>
-										<cpt:property id="datanucleusIdLong" hidden="EVERYWHERE"/>
 										<cpt:property id="datanucleusVersionLong"/>
 										<cpt:property id="datanucleusVersionTimestamp"/>
 									</cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.layout.fallback.xml b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.layout.fallback.xml
index a99e4fd..ffcece9 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.layout.fallback.xml
@@ -34,7 +34,6 @@ under the License.
                 <cpt:property id="role"/>
             </cpt:fieldSet>
             <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.layout.fallback.xml b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.layout.fallback.xml
index f01c08e..783fdc1 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/role/ApplicationRole.layout.fallback.xml
@@ -34,7 +34,6 @@ under the License.
             <cpt:fieldSet name="General" id="general" unreferencedProperties="true">
                 <cpt:property id="name"/>
                 <cpt:property id="description"/>
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.layout.fallback.xml b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.layout.fallback.xml
index 7e8470e..37385d6 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/tenancy/ApplicationTenancy.layout.fallback.xml
@@ -36,7 +36,6 @@ under the License.
                 <cpt:property id="path"/>
             </cpt:fieldSet>
             <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml
index 4b43b4c..9a6256d 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.layout.fallback.xml
@@ -39,7 +39,6 @@ under the License.
                 <cpt:property id="atPath"/>
             </cpt:fieldSet>
             <cpt:fieldSet name="Metadata" id="metadata">
-                <cpt:property id="datanucleusIdLong"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
             </cpt:fieldSet>
@@ -62,7 +61,7 @@ under the License.
 						                <cpt:property id="familyName"/>
 						                <cpt:property id="givenName"/>
 						                <cpt:property id="knownAs"/>
-						            </cpt:fieldSet>						            
+						            </cpt:fieldSet>
         						</bs3:col>
         					</bs3:row>
         				</bs3:tab>
@@ -90,4 +89,4 @@ under the License.
         	</bs3:row>
         </bs3:col>
     </bs3:row>
-</bs3:grid>
\ No newline at end of file
+</bs3:grid>
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/ExposerTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/ExposerTest.kt
index e121cfa..4f64052 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/ExposerTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/ExposerTest.kt
@@ -52,10 +52,6 @@ class ExposerTest {
         val to = TObjectHandler().parse(jsonStr) as TObject
         val exposer = Exposer(to)
 
-        //TODO datanucleus may be gone with Apache Isis 2.0.x
-        val actualDnId = exposer.get("datanucleusIdLong") as Value
-        assertEquals(0, actualDnId.content as Long)
-
         val actualDnvers = exposer.get("datanucleusVersionTimestamp") as Value
         assertEquals(1514897074953L, actualDnvers.content as Long)
 
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModuleJdoDatanucleus.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModuleJdoDatanucleus.java
index effd540..53a5a4b 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModuleJdoDatanucleus.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModuleJdoDatanucleus.java
@@ -48,7 +48,6 @@ import org.apache.isis.persistence.jdo.datanucleus.dialect.DnJdoDialect;
 import org.apache.isis.persistence.jdo.datanucleus.entities.DnEntityStateProvider;
 import org.apache.isis.persistence.jdo.datanucleus.jdosupport.JdoSupportServiceDefault;
 import org.apache.isis.persistence.jdo.datanucleus.metamodel.JdoDataNucleusProgrammingModel;
-import org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_datanucleusIdLong;
 import org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_datanucleusVersionLong;
 import org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_datanucleusVersionTimestamp;
 import org.apache.isis.persistence.jdo.datanucleus.mixins.Persistable_downloadJdoMetadata;
@@ -76,7 +75,6 @@ import lombok.extern.log4j.Log4j2;
     JdoDataNucleusProgrammingModel.class,
 
     // @Mixin's
-    Persistable_datanucleusIdLong.class,
     Persistable_datanucleusVersionLong.class,
     Persistable_datanucleusVersionTimestamp.class,
     Persistable_downloadJdoMetadata.class,
@@ -88,7 +86,7 @@ import lombok.extern.log4j.Log4j2;
 @EnableConfigurationProperties(DnSettings.class)
 @Log4j2
 public class IsisModuleJdoDatanucleus {
-    
+
     /**
      * Conveniently registers this dialect as a {@link PersistenceExceptionTranslator} with <i>Spring</i>.
      * @see PersistenceExceptionTranslator
@@ -99,9 +97,9 @@ public class IsisModuleJdoDatanucleus {
     public DnJdoDialect getDnJdoDialect(final DataSource dataSource) {
         return new DnJdoDialect(dataSource);
     }
-    
+
     @Qualifier("local-pmf-proxy")
-    @Bean 
+    @Bean
     public LocalPersistenceManagerFactoryBean getLocalPersistenceManagerFactoryBean(
             final IsisConfiguration isisConfiguration,
             final DataSource dataSource,
@@ -110,9 +108,9 @@ public class IsisModuleJdoDatanucleus {
             final Provider<EntityChangeTracker> entityChangeTrackerProvider,
             final IsisBeanTypeRegistry beanTypeRegistry,
             final DnSettings dnSettings) {
-        
+
         _Assert.assertNotNull(dataSource, "a datasource is required");
-        
+
         autoCreateSchemas(dataSource, isisConfiguration);
 
         val lpmfBean = new LocalPersistenceManagerFactoryBean() {
@@ -135,9 +133,9 @@ public class IsisModuleJdoDatanucleus {
         lpmfBean.setJdoPropertyMap(dnSettings.getAsProperties());
         return lpmfBean;
     }
-    
+
     @Qualifier("transaction-aware-pmf-proxy")
-    @Bean @Primary 
+    @Bean @Primary
     public TransactionAwarePersistenceManagerFactoryProxy getTransactionAwarePersistenceManagerFactoryProxy(
             final @Qualifier("local-pmf-proxy") LocalPersistenceManagerFactoryBean localPmfBean) {
 
@@ -180,16 +178,16 @@ public class IsisModuleJdoDatanucleus {
                         if(jdoDialect instanceof PersistenceExceptionTranslator) {
                             val translatedEx = ((PersistenceExceptionTranslator)jdoDialect)
                                     .translateExceptionIfPossible((RuntimeException)ex);
-                            
+
                             if(translatedEx!=null) {
                                 throw translatedEx;
                             }
-                            
+
                         }
-                        
+
                         if(ex instanceof JDOException) {
                             val translatedEx = jdoDialect.translateException((JDOException)ex);
-                            
+
                             if(translatedEx!=null) {
                                 throw translatedEx;
                             }
@@ -199,7 +197,7 @@ public class IsisModuleJdoDatanucleus {
             }
         };
     }
-    
+
     // -- HELPER
 
     /**
@@ -214,7 +212,7 @@ public class IsisModuleJdoDatanucleus {
 
         if(!persistenceSchemaConf.getAutoCreateSchemas().isEmpty()) {
 
-            log.info("About to create db schema(s) {} with template '{}'", 
+            log.info("About to create db schema(s) {} with template '{}'",
                     persistenceSchemaConf.getAutoCreateSchemas(),
                     persistenceSchemaConf.getCreateSchemaSqlTemplate());
 
@@ -233,7 +231,7 @@ public class IsisModuleJdoDatanucleus {
 
         return dataSource;
     }
-    
+
     private static PersistenceUnitMetaData createDefaultPersistenceUnit (
             final IsisBeanTypeRegistry beanTypeRegistry) {
         val pumd = new PersistenceUnitMetaData(
@@ -244,7 +242,7 @@ public class IsisModuleJdoDatanucleus {
         .forEach(pumd::addClassName);
         return pumd;
     }
-    
+
     private static void integrateWithApplicationLayer(
             final MetaModelContext metaModelContext,
             final EventBusService eventBusService,
@@ -253,7 +251,7 @@ public class IsisModuleJdoDatanucleus {
 
         // install JDO specific entity change listeners ...
 
-        val jdoLifecycleListener = 
+        val jdoLifecycleListener =
                 new JdoLifecycleListener(metaModelContext, eventBusService, entityChangeTrackerProvider);
         pmf.addInstanceLifecycleListener(jdoLifecycleListener, (Class[]) null);
 
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java
deleted file mode 100644
index 58d7b06..0000000
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusIdLong.java
+++ /dev/null
@@ -1,75 +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.persistence.jdo.datanucleus.mixins;
-
-import javax.jdo.JDOHelper;
-
-import org.datanucleus.enhancement.Persistable;
-import org.datanucleus.identity.DatastoreId;
-
-import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.applib.annotation.PropertyLayout;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
-
-import lombok.RequiredArgsConstructor;
-
-/**
- * Contributes the value of the id (introduced by enhancing) as a property.
- *
- * <p>
- * Only visible if the id can be cast to a long.
- * </p>
- *
- * @see Persistable_datanucleusVersionLong
- * @see Persistable_datanucleusVersionTimestamp
- *
- * @since 2.0 {@index}
- */
-@Property(
-        domainEvent = Persistable_datanucleusIdLong.PropertyDomainEvent.class)
-@PropertyLayout(
-        named = "Id",
-        fieldSetId = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, sequence = "800.1",
-        hidden = Where.ALL_TABLES
-        )
-@RequiredArgsConstructor
-public class Persistable_datanucleusIdLong {
-
-    private final Persistable persistable;
-
-    public static class PropertyDomainEvent
-    extends org.apache.isis.applib.IsisModuleApplib.PropertyDomainEvent
-    <Persistable_datanucleusIdLong, Long> {}
-
-    public Long prop() {
-        final Object objectId = JDOHelper.getObjectId(persistable);
-        if(objectId instanceof DatastoreId) {
-            final DatastoreId datastoreId = (DatastoreId) objectId;
-            final Object id = datastoreId.getKeyAsObject();
-            return id != null && id instanceof Long ? (Long) id : null;
-        }
-        return null;
-    }
-
-    public boolean hideProp() {
-        return prop() == null;
-    }
-
-}
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java
index ec56d7f..47bd4aa 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.java
@@ -37,7 +37,7 @@ import lombok.RequiredArgsConstructor;
  * Only visible if the version can be cast to a long.
  * </p>
  *
- * @see Persistable_datanucleusIdLong
+ * @see org.apache.isis.applib.mixins.metamodel.Object_objectIdentifier
  * @see Persistable_datanucleusVersionTimestamp
  *
  * @since 2.0 {@index}
@@ -47,7 +47,7 @@ import lombok.RequiredArgsConstructor;
 @PropertyLayout(
         named = "Version",
         hidden = Where.ALL_TABLES,
-        fieldSetId = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, 
+        fieldSetId = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME,
         sequence = "800.2"
         )
 @RequiredArgsConstructor
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java
index 9b83b34..5f3d097 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.java
@@ -37,7 +37,7 @@ import lombok.RequiredArgsConstructor;
  * Only visible if the version can be cast to a {@link java.sql.Timestamp}.
  * </p>
  *
- * @see Persistable_datanucleusIdLong
+ * @see org.apache.isis.applib.mixins.metamodel.Object_objectIdentifier
  * @see Persistable_datanucleusVersionLong
  *
  * @since 2.0 {@index}
@@ -47,7 +47,7 @@ import lombok.RequiredArgsConstructor;
 @PropertyLayout(
         named = "Version",
         hidden = Where.ALL_TABLES,
-        fieldSetId = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME, 
+        fieldSetId = LayoutMixinConstants.METADATA_LAYOUT_GROUPNAME,
         sequence = "800.2"
         )
 @RequiredArgsConstructor
diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/domainmodel/jdo/DomainModelTest_jdoMixins.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/domainmodel/jdo/DomainModelTest_jdoMixins.java
index 55670f6..5f359df 100644
--- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/domainmodel/jdo/DomainModelTest_jdoMixins.java
+++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/domainmodel/jdo/DomainModelTest_jdoMixins.java
@@ -38,11 +38,11 @@ import org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValid
 import lombok.val;
 
 @SpringBootTest(
-        classes = { 
+        classes = {
                 Configuration_usingJdo.class,
                 Configuration_usingValidDomain.class,
-                
-        }, 
+
+        },
         properties = {
                 "isis.core.meta-model.introspector.mode=FULL",
                 "isis.applib.annotation.domain-object.editing=TRUE",
@@ -54,28 +54,28 @@ import lombok.val;
     IsisPresets.SilenceProgrammingModel
 })
 class DomainModelTest_jdoMixins {
-    
+
     @Inject private ServiceRegistry serviceRegistry;
     @Inject private SpecificationLoader specificationLoader;
-   
+
     @Test
     void goodDomain_shouldPassValidation() {
         //debug();
         assertFalse(specificationLoader.snapshotSpecifications().isEmpty());
-        
+
         val validateDomainModel = new DomainModelValidator(serviceRegistry);
         validateDomainModel.throwIfInvalid(); // should not throw
     }
-    
+
     @Test
     void pluginProvidedMixins_shouldBePickedUp() {
-        
+
         val holderSpec = specificationLoader.loadSpecification(JdoProduct.class);
-        
-        val mx_datanucleusIdLong = holderSpec.getAssociationElseFail("datanucleusIdLong"); // plugged in mixin
-        assertNotNull(mx_datanucleusIdLong);
-        
+
+        val mx_datanucleusVersionLong = holderSpec.getAssociationElseFail("datanucleusVersionLong"); // plugged in mixin
+        assertNotNull(mx_datanucleusVersionLong);
+
     }
-    
+
 
 }
diff --git a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml
index 3619994..c0979df 100644
--- a/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml
+++ b/subdomains/excel/fixture/src/main/java/org/apache/isis/subdomains/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml
@@ -51,7 +51,6 @@ under the License.
                 <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN"/>
                 <cpt:property id="datanucleusVersionLong"/>
                 <cpt:property id="datanucleusVersionTimestamp"/>
-                <cpt:property id="datanucleusIdLong"/>
             </cpt:fieldSet>
 
         </bs3:col>
diff --git a/subdomains/excel/integtests/translations.pot b/subdomains/excel/integtests/translations.pot
index a973b91..9519090 100644
--- a/subdomains/excel/integtests/translations.pot
+++ b/subdomains/excel/integtests/translations.pot
@@ -849,14 +849,6 @@ msgid "Yaml"
 msgstr ""
 
 
-#: org.apache.isis.applib.services.layout.Object_downloadLayoutXml
-#: org.apache.isis.applib.services.layout.Object_openRestApi
-#: org.apache.isis.applib.services.layout.Object_rebuildMetamodel
-#: org.apache.isis.core.metamodel.services.jdosupport.Persistable_downloadJdoMetadata
-msgid "datanucleusIdLong"
-msgstr ""
-
-
 #: org.apache.isis.extensions.excel.fixtures.demoapp.todomodule.dom.ExcelDemoToDoItem
 msgid "location"
 msgstr ""
diff --git a/testing/fakedata/integtests/translations.pot b/testing/fakedata/integtests/translations.pot
index 00e6db2..928cde5 100644
--- a/testing/fakedata/integtests/translations.pot
+++ b/testing/fakedata/integtests/translations.pot
@@ -816,14 +816,6 @@ msgid "Yaml"
 msgstr ""
 
 
-#: org.apache.isis.applib.services.layout.Object_downloadLayoutXml
-#: org.apache.isis.applib.services.layout.Object_openRestApi
-#: org.apache.isis.applib.services.layout.Object_rebuildMetamodel
-#: org.apache.isis.core.metamodel.services.jdosupport.Persistable_downloadJdoMetadata
-msgid "datanucleusIdLong"
-msgstr ""
-
-
 #: org.isisaddons.module.fakedata.fixture.demoapp.demomodule.dom.FakeDataDemoObjectWithAll#someInt
 msgid "description of some int"
 msgstr ""