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

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

commit f3512edb79ad06020c131534447fd6fc3f7ef99b
Author: Dan Haywood <[email protected]>
AuthorDate: Mon Aug 29 13:27:57 2022 +0100

    ISIS-3193 : experiments with dependent args
---
 .../modules/simple/dom/so/SimpleObject_Test.java   | 10 ++--
 .../modules/simple/dom/so/SimpleObjects_Test.java  |  4 +-
 .../integtests/tests/SimpleObject_IntegTest.java   | 12 ++---
 .../integtests/tests/SimpleObjects_IntegTest.java  |  2 +
 .../simple/dom/so/SimpleObject.columnOrder.txt     |  3 +-
 .../modules/simple/dom/so/SimpleObject.java        | 58 +++++++++++++++++-----
 .../simple/dom/so/SimpleObjectRepository.java      |  4 +-
 .../modules/simple/dom/so/SimpleObjects.java       | 18 +++----
 .../simple/fixture/SimpleObject_persona.java       |  2 +-
 .../domainapp/modules/simple/types/FamilyName.java | 24 +++++++++
 .../modules/simple/types/MiddleInitial.java        | 24 +++++++++
 .../webapp/integtests/smoke/Smoke_IntegTest.java   |  6 +--
 webapp/src/main/resources/menubars.layout.xml      |  2 +-
 13 files changed, 125 insertions(+), 44 deletions(-)

diff --git 
a/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java
 
b/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java
index 922b077..b01385f 100644
--- 
a/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java
+++ 
b/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java
@@ -26,7 +26,7 @@ class SimpleObject_Test {
 
     @BeforeEach
     public void setUp() throws Exception {
-        object = SimpleObject.withName("Foo");
+        object = SimpleObject.withName("Foo", null);
         object.titleService = mockTitleService;
         object.messageService = mockMessageService;
         object.repositoryService = mockRepositoryService;
@@ -38,13 +38,13 @@ class SimpleObject_Test {
         @Test
         void happy_case() {
             // given
-            assertThat(object.getName()).isEqualTo("Foo");
+            assertThat(object.getGivenName()).isEqualTo("Foo");
 
             // when
-            object.updateName("Bar");
+            object.updateName("Bar", null, null);
 
             // then
-            assertThat(object.getName()).isEqualTo("Bar");
+            assertThat(object.getGivenName()).isEqualTo("Bar");
         }
 
     }
@@ -68,4 +68,4 @@ class SimpleObject_Test {
             verify(mockRepositoryService).removeAndFlush(object);
         }
     }
-}
\ No newline at end of file
+}
diff --git 
a/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java
 
b/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java
index 88eaeb0..3431fa2 100644
--- 
a/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java
+++ 
b/module-simple-tests/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java
@@ -45,7 +45,7 @@ class SimpleObjects_Test {
 
             // expect
             when(mockRepositoryService.persist(
-                    argThat((ArgumentMatcher<SimpleObject>) simpleObject -> 
Objects.equals(simpleObject.getName(), someName)))
+                    argThat((ArgumentMatcher<SimpleObject>) simpleObject -> 
Objects.equals(simpleObject.getGivenName(), someName)))
             ).then((Answer<SimpleObject>) invocation -> 
invocation.getArgument(0));
 
             // when
@@ -53,7 +53,7 @@ class SimpleObjects_Test {
 
             // then
             assertThat(obj).isNotNull();
-            assertThat(obj.getName()).isEqualTo(someName);
+            assertThat(obj.getGivenName()).isEqualTo(someName);
         }
     }
 
diff --git 
a/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
 
b/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
index 761bb86..4233ce1 100644
--- 
a/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
+++ 
b/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
@@ -33,10 +33,10 @@ public class SimpleObject_IntegTest extends 
SimpleModuleIntegTestAbstract {
         @Test
         public void accessible() {
             // when
-            final String name = wrap(simpleObject).getName();
+            final String name = wrap(simpleObject).getGivenName();
 
             // then
-            assertThat(name).isEqualTo(simpleObject.getName());
+            assertThat(name).isEqualTo(simpleObject.getGivenName());
         }
 
         @Test
@@ -46,7 +46,7 @@ public class SimpleObject_IntegTest extends 
SimpleModuleIntegTestAbstract {
             assertThrows(DisabledException.class, ()->{
 
                 // when
-                wrap(simpleObject).setName("new name");
+                wrap(simpleObject).setGivenName("new name");
             });
         }
 
@@ -60,11 +60,11 @@ public class SimpleObject_IntegTest extends 
SimpleModuleIntegTestAbstract {
         public void can_be_updated_directly() {
 
             // when
-            wrap(simpleObject).updateName("new name");
+            wrap(simpleObject).updateName("new name", null, null);
             transactionService.flushTransaction();
 
             // then
-            assertThat(wrap(simpleObject).getName()).isEqualTo("new name");
+            assertThat(wrap(simpleObject).getGivenName()).isEqualTo("new 
name");
         }
 
         @Test
@@ -74,7 +74,7 @@ public class SimpleObject_IntegTest extends 
SimpleModuleIntegTestAbstract {
             InvalidException cause = assertThrows(InvalidException.class, ()->{
 
                 // when
-                wrap(simpleObject).updateName("new name!");
+                wrap(simpleObject).updateName("new name!", null, null);
             });
 
             // then
diff --git 
a/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
 
b/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
index bad136d..f0df69a 100644
--- 
a/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
+++ 
b/module-simple-tests/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
@@ -94,6 +94,8 @@ public class SimpleObjects_IntegTest extends 
SimpleModuleIntegTestAbstract {
                     // when
                     wrap(menu).create("Fizz");
                     transactionService.flushTransaction();
+
+                    List<SimpleObject> simpleObjects = 
repositoryService.allInstances(SimpleObject.class);
                 });
 
                 // also expect
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.columnOrder.txt
 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.columnOrder.txt
index dbf267a..2babaa8 100644
--- 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.columnOrder.txt
+++ 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.columnOrder.txt
@@ -1,2 +1,3 @@
 name
-#version
\ No newline at end of file
+familyName
+#version
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java
index 098a63d..dcf7fc6 100644
--- 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java
+++ 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java
@@ -20,7 +20,6 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.Domain;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberSupport;
@@ -47,6 +46,8 @@ import lombok.ToString;
 import lombok.val;
 
 import domainapp.modules.simple.SimpleModule;
+import domainapp.modules.simple.types.FamilyName;
+import domainapp.modules.simple.types.MiddleInitial;
 import domainapp.modules.simple.types.Name;
 import domainapp.modules.simple.types.Notes;
 
@@ -55,7 +56,7 @@ import domainapp.modules.simple.types.Notes;
 @Table(
     schema= SimpleModule.SCHEMA,
     uniqueConstraints = {
-        @UniqueConstraint(name = "SimpleObject__name__UNQ", columnNames = 
{"name"})
+        @UniqueConstraint(name = "SimpleObject__givenName__UNQ", columnNames = 
{"givenName"})
     }
 )
 @NamedQueries({
@@ -63,7 +64,8 @@ import domainapp.modules.simple.types.Notes;
                 name = SimpleObject.NAMED_QUERY__FIND_BY_NAME_LIKE,
                 query = "SELECT so " +
                         "FROM SimpleObject so " +
-                        "WHERE so.name LIKE :name"
+                        "WHERE so.givenName LIKE :name " +
+                        "   OR so.familyName LIKE :name "
         )
 })
 @EntityListeners(IsisEntityListener.class)
@@ -88,9 +90,10 @@ public class SimpleObject implements 
Comparable<SimpleObject> {
     @Getter @Setter
     private long version;
 
-    public static SimpleObject withName(String name) {
+    public static SimpleObject withName(String givenName, String familyName) {
         val simpleObject = new SimpleObject();
-        simpleObject.setName(name);
+        simpleObject.setGivenName(givenName);
+        simpleObject.setFamilyName(familyName);
         return simpleObject;
     }
 
@@ -100,12 +103,26 @@ public class SimpleObject implements 
Comparable<SimpleObject> {
 
 
 
-    @Title
+    @Title(sequence = "1")
     @Name
-    @Column(length = Name.MAX_LEN, nullable = false, name = "name")
+    @Column(length = Name.MAX_LEN, nullable = false, name = "givenName")
     @Getter @Setter @ToString.Include
     @PropertyLayout(fieldSetId = LayoutConstants.FieldSetId.IDENTITY, sequence 
= "1")
-    private String name;
+    private String givenName;
+
+    @Title(sequence = "3", append = ".")
+    @FamilyName
+    @Column(length = FamilyName.MAX_LEN, nullable = true, name = "familyName")
+    @Getter @Setter @ToString.Include
+    @PropertyLayout(fieldSetId = LayoutConstants.FieldSetId.IDENTITY, sequence 
= "2")
+    private String familyName;
+
+    @Title(sequence = "2")
+    @MiddleInitial
+    @Column(length = MiddleInitial.MAX_LEN, nullable = true, name = 
"middleInitial")
+    @Getter @Setter @ToString.Include
+    @PropertyLayout(fieldSetId = LayoutConstants.FieldSetId.IDENTITY, sequence 
= "3")
+    private String middleInitial;
 
     @Notes
     @Column(length = Notes.MAX_LEN, nullable = true)
@@ -117,15 +134,22 @@ public class SimpleObject implements 
Comparable<SimpleObject> {
 
     @Action(semantics = IDEMPOTENT, commandPublishing = Publishing.ENABLED, 
executionPublishing = Publishing.ENABLED)
     @ActionLayout(
-            associateWith = "name", promptStyle = PromptStyle.INLINE,
+            associateWith = "givenName", promptStyle = PromptStyle.INLINE,
             describedAs = "Updates the name of this object, certain characters 
(" + PROHIBITED_CHARACTERS + ") are not allowed.")
     public SimpleObject updateName(
-            @Name final String name) {
-        setName(name);
+            @Name final String name,
+            @FamilyName String familyName,
+            @MiddleInitial String middleInitial) {
+        setGivenName(name);
+        setFamilyName(familyName);
+        setMiddleInitial(middleInitial);
         return this;
     }
     @MemberSupport public String default0UpdateName() {
-        return getName();
+        return getGivenName();
+    }
+    @MemberSupport public String default1UpdateName(String givenName) {
+        return getFamilyName() != null ? getFamilyName() : givenName != null ? 
givenName.toUpperCase() : null;
     }
     @MemberSupport public String validate0UpdateName(String newName) {
         for (char prohibitedCharacter : PROHIBITED_CHARACTERS.toCharArray()) {
@@ -135,6 +159,14 @@ public class SimpleObject implements 
Comparable<SimpleObject> {
         }
         return null;
     }
+    @MemberSupport public String validate1UpdateName(String newName) {
+        for (char prohibitedCharacter : PROHIBITED_CHARACTERS.toCharArray()) {
+            if( newName != null && newName.contains(""+prohibitedCharacter)) {
+                return "Character '" + prohibitedCharacter + "' is not 
allowed.";
+            }
+        }
+        return null;
+    }
     static final String PROHIBITED_CHARACTERS = "&%$!";
 
 
@@ -153,7 +185,7 @@ public class SimpleObject implements 
Comparable<SimpleObject> {
 
 
     private final static Comparator<SimpleObject> comparator =
-            Comparator.comparing(SimpleObject::getName);
+            Comparator.comparing(SimpleObject::getGivenName);
 
     @Override
     public int compareTo(final SimpleObject other) {
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjectRepository.java
 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjectRepository.java
index 77d34a1..8037a43 100644
--- 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjectRepository.java
+++ 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjectRepository.java
@@ -6,8 +6,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
 
 public interface SimpleObjectRepository extends JpaRepository<SimpleObject, 
Long> {
 
-    List<SimpleObject> findByNameContaining(final String name);
+    List<SimpleObject> findByGivenNameContaining(final String givenName);
 
-    SimpleObject findByName(final String name);
+    SimpleObject findByGivenName(final String givenName);
 
 }
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
index d161c0e..e4db3d7 100644
--- 
a/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
+++ 
b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
@@ -5,7 +5,6 @@ import java.util.List;
 import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 
 import org.apache.isis.applib.annotation.Action;
@@ -19,7 +18,6 @@ import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.commons.functional.Try;
 import org.apache.isis.persistence.jpa.applib.services.JpaSupportService;
 
 import lombok.RequiredArgsConstructor;
@@ -42,7 +40,7 @@ public class SimpleObjects {
     @ActionLayout(promptStyle = PromptStyle.DIALOG_SIDEBAR)
     public SimpleObject create(
             @Name final String name) {
-        return repositoryService.persist(SimpleObject.withName(name));
+        return repositoryService.persist(SimpleObject.withName(name, null));
     }
 
 
@@ -58,15 +56,15 @@ public class SimpleObjects {
 
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT, promptStyle = 
PromptStyle.DIALOG_SIDEBAR)
-    public List<SimpleObject> findByName(
-            @Name final String name
+    public List<SimpleObject> findByGivenName(
+            @Name final String givenName
             ) {
-        return simpleObjectRepository.findByNameContaining(name);
+        return simpleObjectRepository.findByGivenNameContaining(givenName);
     }
 
 
-    public SimpleObject findByNameExact(final String name) {
-        return simpleObjectRepository.findByName(name);
+    public SimpleObject findByGivenNameExact(final String givenName) {
+        return simpleObjectRepository.findByGivenName(givenName);
     }
 
 
@@ -79,11 +77,11 @@ public class SimpleObjects {
 
 
 
-    public void ping() {
+    @Programmatic public void ping() {
         jpaSupportService.getEntityManager(SimpleObject.class)
             .mapSuccess(entityManager -> {
                 final TypedQuery<SimpleObject> q = entityManager.createQuery(
-                        "SELECT p FROM SimpleObject p ORDER BY p.name",
+                        "SELECT p FROM SimpleObject p ORDER BY p.givenName",
                         SimpleObject.class)
                     .setMaxResults(1);
                 return q.getResultList();
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
 
b/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
index fc79e2f..23ffb16 100644
--- 
a/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
+++ 
b/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
@@ -34,7 +34,7 @@ implements Persona<SimpleObject, SimpleObjectBuilder> {
     @Override
     public SimpleObject findUsing(final ServiceRegistry serviceRegistry) {
         SimpleObjects simpleObjects = 
serviceRegistry.lookupService(SimpleObjects.class).orElse(null);
-        return simpleObjects.findByNameExact(name);
+        return simpleObjects.findByGivenNameExact(name);
     }
 
     public static class PersistAll
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/types/FamilyName.java 
b/module-simple/src/main/java/domainapp/modules/simple/types/FamilyName.java
new file mode 100644
index 0000000..31a0d25
--- /dev/null
+++ b/module-simple/src/main/java/domainapp/modules/simple/types/FamilyName.java
@@ -0,0 +1,24 @@
+package domainapp.modules.simple.types;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+
+@Name
+@Property(optionality = Optionality.OPTIONAL)
+@Parameter(optionality = Optionality.OPTIONAL)
+@PropertyLayout(named = "Family name")
+@ParameterLayout(named = "Family name")
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, 
ElementType.ANNOTATION_TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FamilyName {
+
+    int MAX_LEN = Name.MAX_LEN;
+}
diff --git 
a/module-simple/src/main/java/domainapp/modules/simple/types/MiddleInitial.java 
b/module-simple/src/main/java/domainapp/modules/simple/types/MiddleInitial.java
new file mode 100644
index 0000000..bb9a2a3
--- /dev/null
+++ 
b/module-simple/src/main/java/domainapp/modules/simple/types/MiddleInitial.java
@@ -0,0 +1,24 @@
+package domainapp.modules.simple.types;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+
+@Name
+@Property(optionality = Optionality.OPTIONAL, maxLength = 
MiddleInitial.MAX_LEN)
+@Parameter(optionality = Optionality.OPTIONAL, maxLength = 
MiddleInitial.MAX_LEN)
+@PropertyLayout(named = "Middle initial")
+@ParameterLayout(named = "Middle initial")
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, 
ElementType.ANNOTATION_TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MiddleInitial {
+
+    int MAX_LEN = 1;
+}
diff --git 
a/webapp-tests/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
 
b/webapp-tests/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
index f8c5b56..4ec30ae 100644
--- 
a/webapp-tests/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
+++ 
b/webapp-tests/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
@@ -54,11 +54,11 @@ class Smoke_IntegTest extends WebAppIntegTestAbstract {
 
 
         // when
-        wrap(fred).updateName("Freddy");
+        wrap(fred).updateName("Freddy", null, null);
         transactionService.flushTransaction();
 
         // then
-        assertThat(wrap(fred).getName()).isEqualTo("Freddy");
+        assertThat(wrap(fred).getGivenName()).isEqualTo("Freddy");
 
 
         // when
@@ -71,7 +71,7 @@ class Smoke_IntegTest extends WebAppIntegTestAbstract {
 
         // when
         Assertions.assertThrows(InvalidException.class, () -> {
-            wrap(fred).updateName("New name !!!");
+            wrap(fred).updateName("New name !!!", null, null);
             transactionService.flushTransaction();
         }, "Exclamation mark is not allowed");
 
diff --git a/webapp/src/main/resources/menubars.layout.xml 
b/webapp/src/main/resources/menubars.layout.xml
index a7ac932..94bf3bd 100644
--- a/webapp/src/main/resources/menubars.layout.xml
+++ b/webapp/src/main/resources/menubars.layout.xml
@@ -5,7 +5,7 @@
             <mb3:named>Simple Objects</mb3:named>
             <mb3:section>
                 <mb3:serviceAction objectType="simple.SimpleObjects" 
id="create"/>
-                <mb3:serviceAction objectType="simple.SimpleObjects" 
id="findByName"/>
+                <mb3:serviceAction objectType="simple.SimpleObjects" 
id="findByGivenName"/>
                 <mb3:serviceAction objectType="simple.SimpleObjects" 
id="findByNameLike"/>
                 <mb3:serviceAction objectType="simple.SimpleObjects" 
id="listAll"/>
             </mb3:section>

Reply via email to