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 extends Annotation> 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.