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 2022/08/29 14:51:20 UTC

[isis-app-simpleapp] branch ISIS-3193 created (now 75482d7)

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

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


      at 75482d7  ISIS-3193: uses new @Action(dependentDefaultsPolicy setting

This branch includes the following new commits:

     new f3512ed  ISIS-3193 : experiments with dependent args
     new 75482d7  ISIS-3193: uses new @Action(dependentDefaultsPolicy setting

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



[isis-app-simpleapp] 02/02: ISIS-3193: uses new @Action(dependentDefaultsPolicy setting

Posted by da...@apache.org.
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 75482d7f8ddb4f5fac1023973c77ce3297e02644
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Aug 29 15:51:09 2022 +0100

    ISIS-3193: uses new @Action(dependentDefaultsPolicy setting
---
 .../src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java | 6 +++++-
 webapp/src/main/resources/application.yml                           | 1 +
 2 files changed, 6 insertions(+), 1 deletion(-)

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 dcf7fc6..eda17ab 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,6 +20,7 @@ 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.DependentDefaultsPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberSupport;
@@ -132,7 +133,10 @@ public class SimpleObject implements Comparable<SimpleObject> {
     private String notes;
 
 
-    @Action(semantics = IDEMPOTENT, commandPublishing = Publishing.ENABLED, executionPublishing = Publishing.ENABLED)
+    @Action(
+            semantics = IDEMPOTENT, commandPublishing = Publishing.ENABLED, executionPublishing = Publishing.ENABLED,
+            dependentDefaultsPolicy = DependentDefaultsPolicy.PRESERVE_CHANGES
+    )
     @ActionLayout(
             associateWith = "givenName", promptStyle = PromptStyle.INLINE,
             describedAs = "Updates the name of this object, certain characters (" + PROHIBITED_CHARACTERS + ") are not allowed.")
diff --git a/webapp/src/main/resources/application.yml b/webapp/src/main/resources/application.yml
index 38a09a9..9bdb297 100644
--- a/webapp/src/main/resources/application.yml
+++ b/webapp/src/main/resources/application.yml
@@ -11,6 +11,7 @@ isis:
         explicit: true
         command-publishing: ignore_safe
         execution-publishing: all
+        dependent-defaults-policy: update_dependent
       action-layout:
         css-class:
           patterns:


[isis-app-simpleapp] 01/02: ISIS-3193 : experiments with dependent args

Posted by da...@apache.org.
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 <da...@haywood-associates.co.uk>
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>