Browse Source

PersonImage Forms

Andrew Grant 1 month ago
parent
commit
c473d89b7a

+ 2 - 0
src/main/java/scot/carricksoftware/grants/constants/ValidationConstants.java

@@ -54,6 +54,7 @@ public class ValidationConstants {
     public static final String GROOM_FATHER_AND_UNTRACKED_FATHER = "One and only one groom father and untracked groom father may be specified.";
     public static final String GROOM_USUAL_RESIDENCE_AND_UNTRACKED_USUAL_RESIDENCE = "One and only one groom residence and untracked groom residence may be specified.";
     public static final String IMAGE_DATA_IS_NULL = "The file to upload cannot be null.";
+    public static final String IMAGE_IS_NULL = "The image cannot be null.";
     public static final String INFORMANT_QUALIFICATION_IS_NULL = "The informant qualification cannot be null.";
     public static final String INFORMANT_AND_UNTRACKED_INFORMANT = "One and only one informant and untracked informant may be specified.";
     public static final String MOTHER_AND_UNTRACKED_MOTHER = "One and only one mother and untracked mother may be specified.";
@@ -73,6 +74,7 @@ public class ValidationConstants {
     public static final String PLACE_IS_NULL = "Place must exist.";
     public static final String LEVEL_IS_NULL = "Level must exist.";
     public static final String LEVEL_IS_INVALID = "Level must be an integer.";
+    public static final String LEVEL_IS_NEGATIVE = "The level must be non-negative.";
     public static final String LEVEL_IS_OUTSIDE_LIMITS = "Level must be between -2 and 5.";
     public static final String REGION_IS_NULL = "Region must exist.";
     public static final String REGISTERED_DATE_IS_NULL = "The registered date cannot be null.";

+ 6 - 5
src/main/java/scot/carricksoftware/grants/controllers/images/personImages/PersonImageFormControllerImpl.java

@@ -23,7 +23,7 @@ import scot.carricksoftware.grants.converters.images.personimage.PersonImageConv
 import scot.carricksoftware.grants.services.images.image.ImageService;
 import scot.carricksoftware.grants.services.images.personimage.PersonImageService;
 import scot.carricksoftware.grants.services.people.PersonService;
-import scot.carricksoftware.grants.validators.images.PersonImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.PersonImageCommandValidatorImpl;
 
 @SuppressWarnings("LoggingSimilarMessage")
 @Controller
@@ -34,7 +34,7 @@ public class PersonImageFormControllerImpl implements PersonImageFormController
     @SuppressWarnings({"FieldCanBeLocal", "unused"})
     private final PersonImageCommandConverterImpl personImageCommandConverter;
     private final PersonImageConverterImpl personImageConverter;
-    private final PersonImageCommandValidator personImageCommandValidator;
+    private final PersonImageCommandValidatorImpl personImageCommandValidatorImpl;
     private final PersonService personService;
     private final ImageService imageService;
 
@@ -42,13 +42,13 @@ public class PersonImageFormControllerImpl implements PersonImageFormController
     public PersonImageFormControllerImpl(PersonImageService personImageService,
                                          PersonImageCommandConverterImpl personImageCommandConverter,
                                          PersonImageConverterImpl personImageConverter,
-                                         PersonImageCommandValidator personImageCommandValidator, PersonService personService, ImageService imageService) {
+                                         PersonImageCommandValidatorImpl personImageCommandValidatorImpl, PersonService personService, ImageService imageService) {
         this.personImageService = personImageService;
         this.personImageCommandConverter = personImageCommandConverter;
 
 
         this.personImageConverter = personImageConverter;
-        this.personImageCommandValidator = personImageCommandValidator;
+        this.personImageCommandValidatorImpl = personImageCommandValidatorImpl;
         this.personService = personService;
         this.imageService = imageService;
     }
@@ -79,11 +79,12 @@ public class PersonImageFormControllerImpl implements PersonImageFormController
     public String saveOrUpdate(@Valid @ModelAttribute PersonImageCommand personImageCommand, BindingResult bindingResult, Model model) {
         logger.debug("PersonImageFormControllerImpl::saveOrUpdate");
 
-        personImageCommandValidator.validate(personImageCommand, bindingResult);
+        personImageCommandValidatorImpl.validate(personImageCommand, bindingResult);
 
         if (bindingResult.hasErrors()) {
             bindingResult.getAllErrors().forEach(error -> logger.debug(error.getDefaultMessage()));
             model.addAttribute(AttributeConstants.PEOPLE, personService.findAll());
+            model.addAttribute(AttributeConstants.IMAGES, imageService.findAll());
             return ViewConstants.PERSON_IMAGE_FORM;
         }
 

+ 3 - 0
src/main/java/scot/carricksoftware/grants/validators/helpers/ValidateTypes.java

@@ -6,6 +6,7 @@
 package scot.carricksoftware.grants.validators.helpers;
 
 import org.springframework.validation.BindingResult;
+import scot.carricksoftware.grants.domains.images.Image;
 import scot.carricksoftware.grants.domains.people.Person;
 import scot.carricksoftware.grants.domains.places.Organisation;
 import scot.carricksoftware.grants.enums.general.Sex;
@@ -15,6 +16,8 @@ public interface ValidateTypes {
 
     void validatePerson(Person person, String field, String message, BindingResult bindingResult);
 
+    void validateImage(Image image, String fieldName, String message, BindingResult bindingResult);
+
     void validateOrganisation(Organisation organisation, String field, String message, BindingResult bindingResult);
 
     void validateCertificateType(CertificateType certificateType, String field, String message, BindingResult bindingResult);

+ 8 - 0
src/main/java/scot/carricksoftware/grants/validators/helpers/ValidateTypesImpl.java

@@ -8,6 +8,7 @@ package scot.carricksoftware.grants.validators.helpers;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.BindingResult;
 import scot.carricksoftware.grants.constants.ApplicationConstants;
+import scot.carricksoftware.grants.domains.images.Image;
 import scot.carricksoftware.grants.domains.people.Person;
 import scot.carricksoftware.grants.domains.places.Organisation;
 import scot.carricksoftware.grants.enums.general.Sex;
@@ -26,6 +27,13 @@ public class ValidateTypesImpl implements ValidateTypes {
         }
     }
 
+    @Override
+    public void validateImage(Image image, String fieldName, String message, BindingResult bindingResult) {
+        if (image == null) {
+            bindingResult.rejectValue(fieldName, ApplicationConstants.EMPTY_STRING, null, message);
+        }
+    }
+
     @Override
     public void validateOrganisation(Organisation organisation, String fieldName, String message, BindingResult bindingResult) {
         if (organisation == null) {

+ 4 - 22
src/main/java/scot/carricksoftware/grants/validators/images/PersonImageCommandValidator.java

@@ -1,33 +1,15 @@
 /*
- * Copyright (c) Andrew Grant of Carrick Software 19/03/2025, 09:50. All rights reserved.
+ * Copyright (c) 2025.  Andrew Grant Carrick Software. All rights reserved
  *
  */
 
 package scot.carricksoftware.grants.validators.images;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.stereotype.Component;
 import org.springframework.validation.BindingResult;
 import scot.carricksoftware.grants.commands.images.PersonImageCommand;
-import scot.carricksoftware.grants.constants.ApplicationConstants;
-import scot.carricksoftware.grants.constants.ValidationConstants;
-
-@SuppressWarnings("unused")
-@Component
-public class PersonImageCommandValidator {
-
-    private static final Logger logger = LogManager.getLogger(PersonImageCommandValidator.class);
-
-    public void validate(PersonImageCommand imageCommand, BindingResult bindingResult) {
-      logger.debug("PersonImageCommandValidator::validate");
-        if (imageCommand.getPerson() == null) {
-            bindingResult.rejectValue("person", ApplicationConstants.EMPTY_STRING,
-                    null,
-                    ValidationConstants.PERSON_IS_NULL);
-        }
-    }
 
+public interface PersonImageCommandValidator {
 
+    @SuppressWarnings("unused")
+    void validate(PersonImageCommand imageCommand, BindingResult bindingResult);
 }
-

+ 69 - 0
src/main/java/scot/carricksoftware/grants/validators/images/PersonImageCommandValidatorImpl.java

@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) Andrew Grant of Carrick Software 19/03/2025, 09:50. All rights reserved.
+ *
+ */
+
+package scot.carricksoftware.grants.validators.images;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import scot.carricksoftware.grants.commands.images.PersonImageCommand;
+import scot.carricksoftware.grants.constants.ValidationConstants;
+import scot.carricksoftware.grants.validators.helpers.ValidateTypes;
+
+@SuppressWarnings("unused")
+@Component
+public class PersonImageCommandValidatorImpl implements PersonImageCommandValidator {
+
+    private static final Logger logger = LogManager.getLogger(PersonImageCommandValidatorImpl.class);
+
+    private final ValidateTypes validateTypes;
+
+    public PersonImageCommandValidatorImpl(ValidateTypes validateTypes) {
+        this.validateTypes = validateTypes;
+    }
+
+    @Override
+    public void validate(PersonImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validate");
+        validatePerson(imageCommand, bindingResult);
+        validateImage(imageCommand, bindingResult);
+        validateOrder(imageCommand, bindingResult);
+        validateLevel(imageCommand, bindingResult);
+    }
+
+    private void validateOrder(PersonImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateOrder");
+        validateTypes.validateNonNegativeInteger(imageCommand.getOrder(), "order",
+                ValidationConstants.ORDER_IS_NULL,
+                ValidationConstants.ORDER_IS_INVALID,
+                ValidationConstants.ORDER_IS_NEGATIVE,
+                bindingResult);
+    }
+
+    private void validateLevel(PersonImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateLevel");
+        validateTypes.validateNonNegativeInteger(imageCommand.getLevel(), "level",
+                ValidationConstants.LEVEL_IS_NULL,
+                ValidationConstants.LEVEL_IS_INVALID,
+                ValidationConstants.LEVEL_IS_NEGATIVE,
+                bindingResult);
+    }
+
+    private void validatePerson(PersonImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateName");
+        validateTypes.validatePerson(imageCommand.getPerson(), "person", ValidationConstants.PERSON_IS_NULL, bindingResult);
+    }
+
+    private void validateImage(PersonImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateImage");
+        validateTypes.validateImage(imageCommand.getImage(), "image", ValidationConstants.IMAGE_IS_NULL, bindingResult);
+    }
+
+
+
+
+}
+

+ 8 - 4
src/main/resources/templates/images/personImage/form.html

@@ -42,7 +42,7 @@
                     <label for="person">Person :&nbsp;</label>
                 </td>
                 <td style="text-align: left;">
-                    <select id="person" style="width: 300px;" name="person :&nbsp;" th:field="*{person}">
+                    <select id="person" style="width: 300px;" name="person" th:field="*{person}">
                         <option th:value="${''}" th:text="${''}"></option>
                         <option th:each="person : ${people}"
                                 th:value="${person.id}" th:text="${person.toString()}"></option>
@@ -58,13 +58,17 @@
                 <td style="text-align: right;">
                     <label for="image">Image : &nbsp;</label>
                 </td>
-                <td>
-                    <select id="image" name="image" th:field="*{image}"
-                            class="form-control" th:errorclass="has-error">
+                <td style="text-align: left;">
+                    <select id="image" name="image" th:field="*{image}">
                         <option th:value="${''}" th:text="${''}"></option>
                         <option th:each="image : ${images}"
                                 th:value="${image.id}" th:text="${image.name}"></option>
                     </select>
+                    <div th:if="${#fields.hasErrors('image')}">
+                        <ul class="text-danger">
+                            <li th:each="err : ${#fields.errors('image')}" th:text="${err}"/>
+                        </ul>
+                    </div>
                 </td>
             </tr>
             <tr>

+ 3 - 3
src/test/java/scot/carricksoftware/grants/controllers/images/personimages/PersonImageFormControllerSaveOrUpdateTest.java

@@ -20,7 +20,7 @@ import scot.carricksoftware.grants.converters.images.personimage.PersonImageConv
 import scot.carricksoftware.grants.services.images.image.ImageService;
 import scot.carricksoftware.grants.services.images.personimage.PersonImageService;
 import scot.carricksoftware.grants.services.people.PersonService;
-import scot.carricksoftware.grants.validators.images.PersonImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.PersonImageCommandValidatorImpl;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -55,7 +55,7 @@ public class PersonImageFormControllerSaveOrUpdateTest {
     BindingResult bindingResultMock;
 
     @Mock
-    private PersonImageCommandValidator personImageCommandValidatorMock;
+    private PersonImageCommandValidatorImpl personImageCommandValidatorImplMock;
 
     private PersonImageCommand personImageCommand;
 
@@ -65,7 +65,7 @@ public class PersonImageFormControllerSaveOrUpdateTest {
         personImageController = new PersonImageFormControllerImpl(personImageServiceMock,
                 personImageCommandConverterMock,
                 personImageConverterMock,
-                personImageCommandValidatorMock,
+                personImageCommandValidatorImplMock,
                 personServiceMock,
                 imageServiceMock);
         personImageCommand = new PersonImageCommandImpl();

+ 3 - 3
src/test/java/scot/carricksoftware/grants/controllers/images/personimages/PersonImageFormControllerTest.java

@@ -22,7 +22,7 @@ import scot.carricksoftware.grants.domains.images.PersonImage;
 import scot.carricksoftware.grants.services.images.image.ImageService;
 import scot.carricksoftware.grants.services.images.personimage.PersonImageService;
 import scot.carricksoftware.grants.services.people.PersonService;
-import scot.carricksoftware.grants.validators.images.PersonImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.PersonImageCommandValidatorImpl;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -50,7 +50,7 @@ public class PersonImageFormControllerTest {
     private Model modelMock;
 
     @Mock
-    private PersonImageCommandValidator personImageCommandValidatorMock;
+    private PersonImageCommandValidatorImpl personImageCommandValidatorImplMock;
 
     @Mock
     private PersonService personServiceMock;
@@ -64,7 +64,7 @@ public class PersonImageFormControllerTest {
         personImageController = new PersonImageFormControllerImpl(personImageServiceMock,
                 personImageCommandConverterMock,
                 personImageConverterMock,
-                personImageCommandValidatorMock,
+                personImageCommandValidatorImplMock,
                 personServiceMock,
                 imageServiceMock);
     }

+ 4 - 4
src/test/java/scot/carricksoftware/grants/controllers/images/personimages/PersonImageFormControllerValidationTest.java

@@ -20,7 +20,7 @@ import scot.carricksoftware.grants.converters.images.personimage.PersonImageConv
 import scot.carricksoftware.grants.services.images.image.ImageService;
 import scot.carricksoftware.grants.services.images.personimage.PersonImageService;
 import scot.carricksoftware.grants.services.people.PersonService;
-import scot.carricksoftware.grants.validators.images.PersonImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.PersonImageCommandValidatorImpl;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
@@ -56,7 +56,7 @@ public class PersonImageFormControllerValidationTest {
     private ImageService imageServiceMocK;
 
     @Mock
-    private PersonImageCommandValidator personImageCommandValidatorMock;
+    private PersonImageCommandValidatorImpl personImageCommandValidatorImplMock;
 
     @Mock
     Model modelMock;
@@ -67,7 +67,7 @@ public class PersonImageFormControllerValidationTest {
         personImageController = new PersonImageFormControllerImpl(personImageServiceMock,
                 personImageCommandConverterMock,
                 personImageConverterMock,
-                personImageCommandValidatorMock,
+                personImageCommandValidatorImplMock,
                 personServiceMocK,
                 imageServiceMocK);
     }
@@ -77,7 +77,7 @@ public class PersonImageFormControllerValidationTest {
     public void saveOrUpdateValidationTest() {
         when(personImageServiceMock.savePersonImageCommand(any())).thenReturn(personImageCommandMock);
         personImageController.saveOrUpdate(personImageCommandMock, bindingResultMock, modelMock);
-        verify(personImageCommandValidatorMock).validate(personImageCommandMock, bindingResultMock);
+        verify(personImageCommandValidatorImplMock).validate(personImageCommandMock, bindingResultMock);
     }
 
 

+ 0 - 60
src/test/java/scot/carricksoftware/grants/validators/images/PersonImageCommandValidatorImplTest.java

@@ -1,60 +0,0 @@
-/*
- * Copyright (c) Andrew Grant of Carrick Software 30/03/2025, 14:31. All rights reserved.
- *
- */
-
-package scot.carricksoftware.grants.validators.images;
-
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.validation.BindingResult;
-import scot.carricksoftware.grants.commands.images.PersonImageCommand;
-import scot.carricksoftware.grants.commands.images.PersonImageCommandImpl;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.verify;
-
-@ExtendWith(MockitoExtension.class)
-class PersonImageCommandValidatorImplTest {
-
-    private PersonImageCommandValidator validator;
-
-    private PersonImageCommand personImageCommand;
-
-    private ArgumentCaptor<String> stringArgumentCaptor;
-    private ArgumentCaptor<String> stringArgumentCaptor2;
-    private ArgumentCaptor<String> stringArgumentCaptor3;
-    private ArgumentCaptor<Object[]> objectArgumentCaptor;
-
-    @Mock
-    private BindingResult bindingResultMock;
-
-    @BeforeEach
-    void setUp() {
-        validator = new PersonImageCommandValidator();
-        personImageCommand = new PersonImageCommandImpl();
-
-        stringArgumentCaptor = ArgumentCaptor.forClass(String.class);
-        stringArgumentCaptor2 = ArgumentCaptor.forClass(String.class);
-        stringArgumentCaptor3 = ArgumentCaptor.forClass(String.class);
-        objectArgumentCaptor = ArgumentCaptor.forClass(Object[].class);
-    }
-
-    @Test
-    void validateNullPerson() {
-        validator.validate(personImageCommand, bindingResultMock);
-
-        verify(bindingResultMock).rejectValue(stringArgumentCaptor.capture(),
-                stringArgumentCaptor2.capture(),
-                objectArgumentCaptor.capture(),
-                stringArgumentCaptor3.capture());
-
-        assertEquals("person", stringArgumentCaptor.getValue());
-        assertEquals("The person cannot be null.", stringArgumentCaptor3.getValue());
-    }
-}