Browse Source

ImageCommandValidator

Andrew Grant 2 months ago
parent
commit
06e405fdba
16 changed files with 111 additions and 43 deletions
  1. 3 0
      src/main/java/scot/carricksoftware/grants/constants/ValidationConstants.java
  2. 5 5
      src/main/java/scot/carricksoftware/grants/controllers/images/images/ImageFormControllerImpl.java
  3. 1 1
      src/main/java/scot/carricksoftware/grants/controllers/images/images/ImageListControllerImpl.java
  4. 6 0
      src/main/java/scot/carricksoftware/grants/validators/helpers/ValidateTypes.java
  5. 18 0
      src/main/java/scot/carricksoftware/grants/validators/helpers/ValidateTypesImpl.java
  6. 3 16
      src/main/java/scot/carricksoftware/grants/validators/images/ImageCommandValidator.java
  7. 54 0
      src/main/java/scot/carricksoftware/grants/validators/images/ImageCommandValidatorImpl.java
  8. 1 1
      src/main/resources/templates/images/image/form.html
  9. 3 3
      src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageFormControllerImageDataTest.java
  10. 3 3
      src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageFormControllerSaveOrUpdateTest.java
  11. 3 3
      src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageFormControllerTest.java
  12. 4 4
      src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageFormControllerValidationTest.java
  13. 3 3
      src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageFormShowByIdTest.java
  14. 2 2
      src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageListControllerTest.java
  15. 1 1
      src/test/java/scot/carricksoftware/grants/validators/images/PersonImageCommandValidatorImplTest.java
  16. 1 1
      src/test/java/scot/carricksoftware/grants/validators/images/PlaceImageCommandValidatorImplTest.java

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

@@ -53,11 +53,13 @@ public class ValidationConstants {
     public static final String GROOM_CONDITION_IS_NULL = "The groom condition cannot be null.";
     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 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.";
     public static final String MOTHER_IS_NULL = "The mother cannot be null.";
     public static final String MOTHER_USUAL_RESIDENCE_AND_UNTRACKED_MOTHER_USUAL_RESIDENCE = "Only one usual residence and untracked usual residence may be specified.";
+    public static final String NAME_IS_NULL = "The name cannot be null.";
     public static final String NAME_IS_TOO_LONG = "Name must be no more than " + ApplicationConstants.MAXIMUM_NAME_LENGTH + " characters long.";
     public static final String NAME_IS_TOO_SHORT = "Name must be at least " + ApplicationConstants.MINIMUM_NAME_LENGTH + " characters long.";
     public static final String NEWBORN_IS_NULL = "The New Born cannot be null.";
@@ -86,6 +88,7 @@ public class ValidationConstants {
     public static final String SPOUSE_AND_UNTRACKED_SPOUSE = "One and only one spouse and untracked spouse may be specified.";
     public static final String TOTAL_ROOMS_AND_INHABITED_ROOMS_CANNOT_COEXIST =  "Total Rooms and Inhabited Rooms cannot coexist.";
     public static final String TOTAL_ROOMS_AND_ROOMS_WITH_WINDOWS_CANNOT_COEXIST =  "Total Rooms and Rooms With Windows cannot coexist.";
+    public static final String UNSUPPORTED_FILE_TYPE = "The file type is not supported.";
     public static final String USUAL_RESIDENCE_AND_UNTRACKED_USUAL_RESIDENCE = "Only one usual residence and untracked usual residence may be specified.";
     public static final String WHEN_BORN_INCORRECT_FORMAT = "The format should be dd/MM/yyyy hh:mm.";
     public static final String WHEN_BORN_IS_NULL = "When born cannot be null.";

+ 5 - 5
src/main/java/scot/carricksoftware/grants/controllers/images/images/ImageFormControllerImpl.java

@@ -24,7 +24,7 @@ import scot.carricksoftware.grants.converters.images.ConvertToBase64;
 import scot.carricksoftware.grants.converters.images.image.ImageCommandConverterImpl;
 import scot.carricksoftware.grants.converters.images.image.ImageConverterImpl;
 import scot.carricksoftware.grants.services.images.image.ImageService;
-import scot.carricksoftware.grants.validators.images.ImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.ImageCommandValidatorImpl;
 
 import java.io.IOException;
 
@@ -37,20 +37,20 @@ public class ImageFormControllerImpl implements ImageFormController {
     @SuppressWarnings({"FieldCanBeLocal", "unused"})
     private final ImageCommandConverterImpl imageCommandConverter;
     private final ImageConverterImpl imageConverter;
-    private final ImageCommandValidator imageCommandValidator;
+    private final ImageCommandValidatorImpl imageCommandValidatorImpl;
     private final ConvertToBase64 convertToBase64;
 
 
     public ImageFormControllerImpl(ImageService imageService,
                                    ImageCommandConverterImpl imageCommandConverter,
                                    ImageConverterImpl imageConverter,
-                                   ImageCommandValidator imageCommandValidator, ConvertToBase64 convertToBase64) {
+                                   ImageCommandValidatorImpl imageCommandValidatorImpl, ConvertToBase64 convertToBase64) {
         this.imageService = imageService;
         this.imageCommandConverter = imageCommandConverter;
 
 
         this.imageConverter = imageConverter;
-        this.imageCommandValidator = imageCommandValidator;
+        this.imageCommandValidatorImpl = imageCommandValidatorImpl;
         this.convertToBase64 = convertToBase64;
     }
 
@@ -83,7 +83,7 @@ public class ImageFormControllerImpl implements ImageFormController {
             imageCommand.setImageData(convertToBase64.convert(file.getBytes()));
         }
 
-        imageCommandValidator.validate(imageCommand, bindingResult);
+        imageCommandValidatorImpl.validate(imageCommand, bindingResult);
 
         if (bindingResult.hasErrors()) {
             bindingResult.getAllErrors().forEach(error -> logger.debug(error.getDefaultMessage()));

+ 1 - 1
src/main/java/scot/carricksoftware/grants/controllers/images/images/ImageListControllerImpl.java

@@ -92,7 +92,7 @@ public class ImageListControllerImpl implements ImageListController {
     public final String imageDelete(@PathVariable final String id) {
         logger.debug("ImageListControllerImpl::imageDelete");
         imageService.deleteById(Long.valueOf(id));
-        return MappingConstants.REDIRECT + MappingConstants.COUNTRIES;
+        return MappingConstants.REDIRECT + ImageMappingConstants.IMAGE_LIST;
     }
 
     @Override

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

@@ -32,4 +32,10 @@ public interface ValidateTypes {
                               String nullMessage, String formatMessage, String rangeMessage,
                               BindingResult bindingResult);
 
+    void validateFileType(String fileName,
+                          String fieldName,
+                          String[] allowedFileExtensions,
+                          String message,
+                          BindingResult bindingResult);
+
 }

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

@@ -13,6 +13,8 @@ import scot.carricksoftware.grants.domains.places.Organisation;
 import scot.carricksoftware.grants.enums.general.Sex;
 import scot.carricksoftware.grants.enums.certificates.CertificateType;
 
+import java.util.Locale;
+
 @Component
 public class ValidateTypesImpl implements ValidateTypes {
 
@@ -87,5 +89,21 @@ public class ValidateTypesImpl implements ValidateTypes {
         }
     }
 
+    @Override
+    public void validateFileType(String fileName, String fieldName, String[] allowedFileExtensions, String message, BindingResult bindingResult) {
+        String extension = fileName.substring(fileName.lastIndexOf('.') + 1).toUpperCase(Locale.ROOT);
+        boolean validExtension = false;
+        for (String allowedFileExtension : allowedFileExtensions) {
+            if (allowedFileExtension.equals(extension)) {
+                validExtension = true;
+                break;
+            }
+        }
+        if (!validExtension){
+            bindingResult.rejectValue(fieldName, ApplicationConstants.EMPTY_STRING, null, message);
+        }
+
+    }
+
 
 }

+ 3 - 16
src/main/java/scot/carricksoftware/grants/validators/images/ImageCommandValidator.java

@@ -1,26 +1,13 @@
 /*
- * 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.ImageCommand;
 
-@SuppressWarnings("unused")
-@Component
-public class ImageCommandValidator {
-
-    private static final Logger logger = LogManager.getLogger(ImageCommandValidator.class);
-
-    public void validate(ImageCommand imageCommand, BindingResult bindingResult) {
-      logger.debug("ImageCommandValidator::validate");
-    }
-
-
+public interface ImageCommandValidator {
+    void validate(ImageCommand imageCommand, BindingResult bindingResult);
 }
-

+ 54 - 0
src/main/java/scot/carricksoftware/grants/validators/images/ImageCommandValidatorImpl.java

@@ -0,0 +1,54 @@
+/*
+ * 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.ImageCommand;
+import scot.carricksoftware.grants.constants.ValidationConstants;
+import scot.carricksoftware.grants.validators.helpers.ValidateTypes;
+
+@SuppressWarnings("unused")
+@Component
+public class ImageCommandValidatorImpl implements ImageCommandValidator {
+
+    private static final Logger logger = LogManager.getLogger(ImageCommandValidatorImpl.class);
+
+    private final ValidateTypes validateTypes;
+
+    public ImageCommandValidatorImpl(ValidateTypes validateTypes) {
+        this.validateTypes = validateTypes;
+    }
+
+    @Override
+    public void validate(ImageCommand imageCommand, BindingResult bindingResult) {
+      logger.debug("ImageCommandValidator::validate");
+      validateName(imageCommand, bindingResult);
+      validateImageData(imageCommand, bindingResult);
+      validateFileType(imageCommand, bindingResult);
+      var z = bindingResult.getAllErrors();
+      var x = -1;
+    }
+
+    private void validateFileType(ImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateFileType");
+        validateTypes.validateFileType(imageCommand.getFileName(), "fileName", new String[]{"JPG", "GIF"}, ValidationConstants.UNSUPPORTED_FILE_TYPE, bindingResult);
+    }
+
+    private void validateName (ImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateName");
+        validateTypes.validateNullOrEmptyString(imageCommand.getName(), "name", ValidationConstants.NAME_IS_NULL, bindingResult);
+    }
+
+    private void validateImageData(ImageCommand imageCommand, BindingResult bindingResult) {
+        logger.debug("ImageCommandValidator::validateImageData");
+        validateTypes.validateNullOrEmptyString(imageCommand.getFileName(), "fileName", ValidationConstants.IMAGE_DATA_IS_NULL, bindingResult);
+    }
+
+}
+

+ 1 - 1
src/main/resources/templates/images/image/form.html

@@ -60,7 +60,7 @@
                 <td style="text-align: left;">
                     <input class="form-control" id="fileName"
                            th:field="*{fileName}" type="text" readonly>
-                    <div th:if="${#fields.hasErrors('name')}">
+                    <div th:if="${#fields.hasErrors('fileName')}">
                         <ul class="text-danger">
                             <li th:each="err : ${#fields.errors('fileName')}" th:text="${err}"/>
                         </ul>

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

@@ -19,7 +19,7 @@ import scot.carricksoftware.grants.converters.images.ConvertToBase64;
 import scot.carricksoftware.grants.converters.images.image.ImageCommandConverterImpl;
 import scot.carricksoftware.grants.converters.images.image.ImageConverterImpl;
 import scot.carricksoftware.grants.services.images.image.ImageService;
-import scot.carricksoftware.grants.validators.images.ImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.ImageCommandValidatorImpl;
 
 import java.io.IOException;
 
@@ -45,7 +45,7 @@ public class ImageFormControllerImageDataTest {
     private ImageConverterImpl imageConverterMock;
 
     @Mock
-    ImageCommandValidator imageCommandValidatorMock;
+    ImageCommandValidatorImpl imageCommandValidatorImplMock;
 
     @SuppressWarnings("unused")
     @Mock
@@ -68,7 +68,7 @@ public class ImageFormControllerImageDataTest {
         imageController = new ImageFormControllerImpl(imageServiceMock,
                 imageCommandConverterMock,
                 imageConverterMock,
-                imageCommandValidatorMock,
+                imageCommandValidatorImplMock,
                 convertToBase64Mock);
         when(imageServiceMock.saveImageCommand(any())).thenReturn(imageCommandMock);
     }

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

@@ -19,7 +19,7 @@ import scot.carricksoftware.grants.converters.images.ConvertToBase64;
 import scot.carricksoftware.grants.converters.images.image.ImageCommandConverterImpl;
 import scot.carricksoftware.grants.converters.images.image.ImageConverterImpl;
 import scot.carricksoftware.grants.services.images.image.ImageService;
-import scot.carricksoftware.grants.validators.images.ImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.ImageCommandValidatorImpl;
 
 import java.io.IOException;
 
@@ -50,7 +50,7 @@ public class ImageFormControllerSaveOrUpdateTest {
     BindingResult bindingResultMock;
 
     @Mock
-    private ImageCommandValidator imageCommandValidatorMock;
+    private ImageCommandValidatorImpl imageCommandValidatorImplMock;
 
     @Mock
     ConvertToBase64 convertToBase64Mock;
@@ -65,7 +65,7 @@ public class ImageFormControllerSaveOrUpdateTest {
         imageController = new ImageFormControllerImpl(imageServiceMock,
                 imageCommandConverterMock,
                 imageConverterMock,
-                imageCommandValidatorMock,
+                imageCommandValidatorImplMock,
                 convertToBase64Mock);
         imageCommand = new ImageCommandImpl();
     }

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

@@ -19,7 +19,7 @@ import scot.carricksoftware.grants.converters.images.image.ImageCommandConverter
 import scot.carricksoftware.grants.converters.images.image.ImageConverterImpl;
 import scot.carricksoftware.grants.domains.images.Image;
 import scot.carricksoftware.grants.services.images.image.ImageService;
-import scot.carricksoftware.grants.validators.images.ImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.ImageCommandValidatorImpl;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.verify;
@@ -50,7 +50,7 @@ public class ImageFormControllerTest {
     private ConvertToBase64 convertToBase64Mock;
 
     @Mock
-    private ImageCommandValidator imageCommandValidatorMock;
+    private ImageCommandValidatorImpl imageCommandValidatorImplMock;
 
 
     @BeforeEach
@@ -58,7 +58,7 @@ public class ImageFormControllerTest {
         imageController = new ImageFormControllerImpl(imageServiceMock,
                 imageCommandConverterMock,
                 imageConverterMock,
-                imageCommandValidatorMock,
+                imageCommandValidatorImplMock,
                 convertToBase64Mock);
     }
 

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

@@ -20,7 +20,7 @@ import scot.carricksoftware.grants.converters.images.ConvertToBase64;
 import scot.carricksoftware.grants.converters.images.image.ImageCommandConverterImpl;
 import scot.carricksoftware.grants.converters.images.image.ImageConverterImpl;
 import scot.carricksoftware.grants.services.images.image.ImageService;
-import scot.carricksoftware.grants.validators.images.ImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.ImageCommandValidatorImpl;
 
 import java.io.IOException;
 
@@ -44,7 +44,7 @@ public class ImageFormControllerValidationTest {
     private ImageConverterImpl imageConverterMock;
 
     @Mock
-    ImageCommandValidator imageCommandValidatorMock;
+    ImageCommandValidatorImpl imageCommandValidatorImplMock;
 
     @SuppressWarnings("unused")
     @Mock
@@ -64,7 +64,7 @@ public class ImageFormControllerValidationTest {
         imageController = new ImageFormControllerImpl(imageServiceMock,
                 imageCommandConverterMock,
                 imageConverterMock,
-                imageCommandValidatorMock,
+                imageCommandValidatorImplMock,
                 convertToBase64Mock);
     }
 
@@ -74,7 +74,7 @@ public class ImageFormControllerValidationTest {
         when(imageServiceMock.saveImageCommand(any())).thenReturn(imageCommand);
 
         imageController.saveOrUpdate(imageCommand,fileMock,bindingResultMock,modelMock);
-        verify(imageCommandValidatorMock).validate(imageCommand, bindingResultMock);
+        verify(imageCommandValidatorImplMock).validate(imageCommand, bindingResultMock);
     }
 
 

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

@@ -18,7 +18,7 @@ import scot.carricksoftware.grants.converters.images.ConvertToBase64;
 import scot.carricksoftware.grants.converters.images.image.ImageCommandConverterImpl;
 import scot.carricksoftware.grants.converters.images.image.ImageConverterImpl;
 import scot.carricksoftware.grants.services.images.image.ImageService;
-import scot.carricksoftware.grants.validators.images.ImageCommandValidator;
+import scot.carricksoftware.grants.validators.images.ImageCommandValidatorImpl;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -49,7 +49,7 @@ public class ImageFormShowByIdTest {
     private ConvertToBase64 convertToBase64Mock;
 
     @Mock
-    private ImageCommandValidator imageCommandValidatorMock;
+    private ImageCommandValidatorImpl imageCommandValidatorImplMock;
 
 
     @BeforeEach
@@ -57,7 +57,7 @@ public class ImageFormShowByIdTest {
         imageController = new ImageFormControllerImpl(imageServiceMock,
                 imageCommandConverterMock,
                 imageConverterMock,
-                imageCommandValidatorMock,
+                imageCommandValidatorImplMock,
                 convertToBase64Mock);
     }
 

+ 2 - 2
src/test/java/scot/carricksoftware/grants/controllers/images/images/ImageListControllerTest.java

@@ -67,9 +67,9 @@ public class ImageListControllerTest {
     }
 
     @Test
-    public void placeDeleteTest() {
+    public void imageDeleteTest() {
         Long id = GetRandomLong();
-        assertEquals("redirect:/countries", controller.imageDelete(Long.toString(id)));
+        assertEquals("redirect:/images", controller.imageDelete(Long.toString(id)));
         verify(imageServiceMock).deleteById(id);
     }
 

+ 1 - 1
src/test/java/scot/carricksoftware/grants/validators/images/PersonImageCommandValidatorTest.java → src/test/java/scot/carricksoftware/grants/validators/images/PersonImageCommandValidatorImplTest.java

@@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.verify;
 
 @ExtendWith(MockitoExtension.class)
-class PersonImageCommandValidatorTest {
+class PersonImageCommandValidatorImplTest {
 
     private PersonImageCommandValidator validator;
 

+ 1 - 1
src/test/java/scot/carricksoftware/grants/validators/images/PlaceImageCommandValidatorTest.java → src/test/java/scot/carricksoftware/grants/validators/images/PlaceImageCommandValidatorImplTest.java

@@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.verify;
 
 @ExtendWith(MockitoExtension.class)
-class PlaceImageCommandValidatorTest {
+class PlaceImageCommandValidatorImplTest {
 
     private PlaceImageCommandValidator validator;