diff --git a/pom.xml b/pom.xml index fe714c6..2aab438 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.sashirestela slimvalidator - 1.1.0 + 1.2.0 jar slimvalidator @@ -52,16 +52,16 @@ 11 2.0.12 - 1.18.30 + 1.18.32 5.10.2 - 3.12.1 + 3.13.0 3.4.1 3.2.5 3.2.0 - 0.8.11 + 0.8.12 2.16.2 - 3.3.0 + 3.3.1 3.6.3 3.1.0 1.6.13 diff --git a/src/main/java/io/github/sashirestela/slimvalidator/constraints/Extension.java b/src/main/java/io/github/sashirestela/slimvalidator/constraints/Extension.java new file mode 100644 index 0000000..6c86e00 --- /dev/null +++ b/src/main/java/io/github/sashirestela/slimvalidator/constraints/Extension.java @@ -0,0 +1,20 @@ +package io.github.sashirestela.slimvalidator.constraints; + +import io.github.sashirestela.slimvalidator.Constraint; +import io.github.sashirestela.slimvalidator.validators.ExtensionValidator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Constraint(validatedBy = ExtensionValidator.class) +@Target({ ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface Extension { + + String message() default "extension must be one of {value}."; + + String[] value(); + +} diff --git a/src/main/java/io/github/sashirestela/slimvalidator/util/Common.java b/src/main/java/io/github/sashirestela/slimvalidator/util/Common.java index fc3083b..5bd2ea1 100644 --- a/src/main/java/io/github/sashirestela/slimvalidator/util/Common.java +++ b/src/main/java/io/github/sashirestela/slimvalidator/util/Common.java @@ -57,6 +57,9 @@ public static String toStringByAnnotMethodType(Object value) { return value.toString(); } } + if (value.getClass().isArray() && value.getClass().getComponentType().equals(String.class)) { + return Arrays.toString((String[]) value); + } return value.toString(); } diff --git a/src/main/java/io/github/sashirestela/slimvalidator/validators/ExtensionValidator.java b/src/main/java/io/github/sashirestela/slimvalidator/validators/ExtensionValidator.java new file mode 100644 index 0000000..5b88596 --- /dev/null +++ b/src/main/java/io/github/sashirestela/slimvalidator/validators/ExtensionValidator.java @@ -0,0 +1,42 @@ +package io.github.sashirestela.slimvalidator.validators; + +import io.github.sashirestela.slimvalidator.ConstraintValidator; +import io.github.sashirestela.slimvalidator.constraints.Extension; +import io.github.sashirestela.slimvalidator.exception.ValidationException; + +import java.io.File; +import java.nio.file.Path; +import java.util.Arrays; + +/** + * Checks that the file extension is one of an expected list. Applies to {@link java.nio.file.Path + * Path} and {@link java.io.File File} objects. + */ +public class ExtensionValidator implements ConstraintValidator { + + private String[] extensions; + + @Override + public void initialize(Extension annotation) { + extensions = annotation.value(); + } + + @Override + public boolean isValid(Object value) { + if (value == null) { + return true; + } + return Arrays.stream(extensions).anyMatch(ext -> ext.equals(getExtension(value))); + } + + private String getExtension(Object value) { + if (value instanceof Path) { + return ((Path) value).toString().split("\\.")[1]; + } else if (value instanceof File) { + return ((File) value).getName().split("\\.")[1]; + } else { + throw new ValidationException("Cannot get a extension from {0}.", value.getClass().getName(), null); + } + } + +} diff --git a/src/main/java/io/github/sashirestela/slimvalidator/validators/RequiredValidator.java b/src/main/java/io/github/sashirestela/slimvalidator/validators/RequiredValidator.java index 0d4284a..ad8a196 100644 --- a/src/main/java/io/github/sashirestela/slimvalidator/validators/RequiredValidator.java +++ b/src/main/java/io/github/sashirestela/slimvalidator/validators/RequiredValidator.java @@ -16,12 +16,7 @@ public boolean isValid(Object value) { if (value == null) { return false; } else { - var groupSize = getGroupSize(value); - if (groupSize == -1) { - return true; - } else { - return (groupSize > 0); - } + return getGroupSize(value) != 0; } } diff --git a/src/test/java/io/github/sashirestela/slimvalidator/validators/ExtensionValidatorTest.java b/src/test/java/io/github/sashirestela/slimvalidator/validators/ExtensionValidatorTest.java new file mode 100644 index 0000000..26b892d --- /dev/null +++ b/src/test/java/io/github/sashirestela/slimvalidator/validators/ExtensionValidatorTest.java @@ -0,0 +1,88 @@ +package io.github.sashirestela.slimvalidator.validators; + +import io.github.sashirestela.slimvalidator.constraints.Extension; +import io.github.sashirestela.slimvalidator.exception.ValidationException; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.lang.annotation.Annotation; +import java.nio.file.Paths; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class ExtensionValidatorTest { + + String fileName = "src/test/resources/sample.txt"; + + @Test + void shouldReturnTrueWhenValidatingObjectAgainstAnnnotation() { + Object[][] data = { + { null, Sample.extension(null) }, + { new File(fileName), Sample.extension(new String[] { "doc", "csv", "txt" }) }, + { Paths.get(fileName), Sample.extension(new String[] { "doc", "csv", "txt" }) } + }; + for (Object[] value : data) { + var validator = new ExtensionValidator(); + var annotation = (Extension) value[1]; + validator.initialize(annotation); + var actualResult = validator.isValid(value[0]); + var expectedResult = true; + assertEquals(expectedResult, actualResult); + } + } + + @Test + void shouldReturnFalseWhenValidatingObjectAgainstAnnnotation() { + Object[][] data = { + { new File(fileName), Sample.extension(new String[] { "jpg", "gif", "bmp" }) }, + { Paths.get(fileName), Sample.extension(new String[] { "jpg", "gif", "bmp" }) } + }; + for (Object[] value : data) { + var validator = new ExtensionValidator(); + var annotation = (Extension) value[1]; + validator.initialize(annotation); + var actualResult = validator.isValid(value[0]); + var expectedResult = false; + assertEquals(expectedResult, actualResult); + } + } + + @Test + void shouldThrownExceptionWhenNonExpectedObjectIsPassed() { + var validator = new ExtensionValidator(); + var annotation = Sample.extension(new String[] { "mp3", "wav" }); + validator.initialize(annotation); + var exception = assertThrows(ValidationException.class, () -> validator.isValid("filename.mp3")); + var actualMessage = exception.getMessage(); + var expectedMessage = "Cannot get a extension from java.lang.String."; + assertEquals(expectedMessage, actualMessage); + } + + static class Sample { + + static Extension extension(String[] value) { + return new Extension() { + + @Override + public Class annotationType() { + return Extension.class; + } + + @Override + public String message() { + return ""; + } + + @Override + public String[] value() { + return value; + } + + }; + + } + + } + +} diff --git a/src/test/resources/sample.txt b/src/test/resources/sample.txt new file mode 100644 index 0000000..27b74e7 --- /dev/null +++ b/src/test/resources/sample.txt @@ -0,0 +1 @@ +This is a sample file for testing.