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>
