Skip to content

Commit 0e8ac54

Browse files
authored
Merge pull request #3 from wavesoftware/bugfix/map-extraction
Support for Vavr's Map keys & values validation
2 parents 5263cf4 + 6478ae8 commit 0e8ac54

29 files changed

+1061
-56
lines changed

.travis.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
language: java
2-
2+
sudo: false
3+
dist: trusty
34
jdk:
45
- oraclejdk8
5-
- oraclejdk9
6+
- oraclejdk9
7+
- openjdk10
8+
- openjdk11

README.md

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
This module provides support for bean validation 2.0 (JSR380). Can be used with any service provider of the bean validation spec
66
e.g. `org.hibernate.validator:hibernate-validator`
77

8-
Added validations:
8+
Features:
99

1010
- `@Size` for vavr's `Traversable<T>`
1111
- `@NotEmpty` for vavr's `Value<T>`
12-
- All available validations can be applied to nested Tuple Values. see example below
12+
- All available validations can be applied to nested Tuple Values. See example below
13+
- All available validations can be applied to vavr's `Map<K, V>`s and `Traversable<T>`s
14+
including `Multimap<K, V>`s
15+
- All available validations on nested collection element types now give proper feedback
16+
as to where violations occurred (index for `Seq`s and key for `Map`s)
1317

1418
# Using the module
1519

@@ -19,7 +23,7 @@ Add the dependency to your classpath. For maven:
1923
<dependency>
2024
<groupId>io.vavr</groupId>
2125
<artifactId>vavr-beanvalidation2</artifactId>
22-
<version>0.9.2</version>
26+
<version>0.10.0</version>
2327
</dependency>
2428
```
2529

@@ -44,14 +48,27 @@ Now JSR 380 validations will work on vavr types. e.g.
4448
public class TestBean {
4549

4650
@Size(min = 1, max = 2)
47-
private Seq<Integer> seqWithOneOrTwoElems = List.of(0);
51+
private Seq<@Max(10) Integer> seqWithOneOrTwoDecimals = List.of(0);
4852

4953
@NotEmpty
50-
private Either<String, Integer> mustNotBeLeftOrNull = Either.right(42);
54+
private Either<String, @Positive Integer> mustNotBeLeftOrNull = Either.right(42);
5155

52-
private Tuple3<@NotBlank String, @NotBlank String, @NotNull Integer> allElementsMustBeProvided = Tuple.of("a", "x", 3);
56+
private Tuple3<@NotBlank String, @NotBlank String, @NotNull Integer> allElementsMustBeProvided =
57+
Tuple.of("a", "x", 3);
5358

59+
@NotNull
60+
@NotEmpty
61+
private Map<@Pattern(regexp = "^[a-z]$") String, @NotBlank String> allCharKeysMustHaveNonBlankValues =
62+
HashMap.of("a", "Alice");
63+
5464
// getters and setters
5565

5666
}
57-
```
67+
```
68+
69+
# Considerations/Limitations
70+
71+
- While it is possible to validate `Try<T>` and `Lazy<T>`, the usage of these monads for beanvalidation
72+
is questionable. Furthermore if the nested value of `Lazy<T>` is to be validated,
73+
evaluation will be forced and thus defeating the purpose of `Lazy<T>`.
74+
- Validation of `io.vavr.control.Validation<T>` is out of scope/undefined for obvious reasons.

generator/Generator.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,28 @@ import java.nio.file.{Files, Paths, StandardOpenOption}
2525
// see io.vavr:vavr Generator
2626

2727
val N = 8
28-
val TUPLE_NODE_NAME = "<tuple element>"
28+
val TUPLE_NODE_NAME = "<element>"
2929
val TARGET_MAIN = s"${project.getBasedir()}/src-gen/main/java"
3030
val TARGET_TEST = s"${project.getBasedir()}/src-gen/test/java"
3131
val TARGET_MAIN_RES = s"${project.getBasedir()}/src-gen/main/resources"
3232
val CHARSET = java.nio.charset.StandardCharsets.UTF_8
3333

34+
val collectionValueExtractors =
35+
"""io.vavr.beanvalidation2.valueextraction.SeqValueExtractor
36+
|io.vavr.beanvalidation2.valueextraction.MapKeyExtractor
37+
|io.vavr.beanvalidation2.valueextraction.MapValueExtractor
38+
|io.vavr.beanvalidation2.valueextraction.MultimapKeyExtractor
39+
|io.vavr.beanvalidation2.valueextraction.MultimapValueExtractor
40+
|io.vavr.beanvalidation2.valueextraction.EitherLeftExtractor
41+
|io.vavr.beanvalidation2.valueextraction.EitherRightExtractor
42+
|""".stripMargin
43+
3444
// generate extractors
3545
for (t <- 1 to N) genVavrFile("io.vavr.beanvalidation2.valueextraction", s"Tuple${t}Extractor")(genExtractor(t))
3646

3747
// generate service loader file
3848
genFile(TARGET_MAIN_RES, "META-INF/services", "javax.validation.valueextraction.ValueExtractor"){
39-
(for {
49+
collectionValueExtractors + (for {
4050
a <- 1 to N
4151
p <- 1 to a
4252
} yield s"""io.vavr.beanvalidation2.valueextraction.Tuple${a}Extractor$$${getNameForPosition(p)}Extractor""").mkString("\n")

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>io.vavr</groupId>
66
<artifactId>vavr-beanvalidation2</artifactId>
7-
<version>0.9.3-SNAPSHOT</version>
7+
<version>0.10.0-SNAPSHOT</version>
88
<parent>
99
<groupId>org.sonatype.oss</groupId>
1010
<artifactId>oss-parent</artifactId>
@@ -54,7 +54,7 @@
5454
<maven.install.version>2.5.2</maven.install.version>
5555
<maven.deploy.version>2.8.2</maven.deploy.version>
5656
<maven.gpg.version>1.6</maven.gpg.version>
57-
<maven.jacoco.version>0.8.0</maven.jacoco.version>
57+
<maven.jacoco.version>0.8.4</maven.jacoco.version>
5858
<maven.jar.version>3.0.2</maven.jar.version>
5959
<maven.javadoc.version>3.0.0</maven.javadoc.version>
6060
<maven.release.version>2.5.3</maven.release.version>

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple1Extractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple1<@ExtractedValue ?>> {
3838

3939
@Override
4040
public void extractValues(Tuple1<?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple2Extractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple2<@ExtractedValue ?, ?>> {
3838

3939
@Override
4040
public void extractValues(Tuple2<?, ?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}
@@ -48,7 +48,7 @@ class SecondExtractor implements ValueExtractor<Tuple2<?, @ExtractedValue ?>> {
4848

4949
@Override
5050
public void extractValues(Tuple2<?, ?> originalValue, ValueReceiver receiver) {
51-
receiver.indexedValue("<tuple element>", 2, originalValue._2);
51+
receiver.indexedValue("<element>", 2, originalValue._2);
5252
}
5353

5454
}

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple3Extractor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple3<@ExtractedValue ?, ?, ?>>
3838

3939
@Override
4040
public void extractValues(Tuple3<?, ?, ?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}
@@ -48,7 +48,7 @@ class SecondExtractor implements ValueExtractor<Tuple3<?, @ExtractedValue ?, ?>>
4848

4949
@Override
5050
public void extractValues(Tuple3<?, ?, ?> originalValue, ValueReceiver receiver) {
51-
receiver.indexedValue("<tuple element>", 2, originalValue._2);
51+
receiver.indexedValue("<element>", 2, originalValue._2);
5252
}
5353

5454
}
@@ -58,7 +58,7 @@ class ThirdExtractor implements ValueExtractor<Tuple3<?, ?, @ExtractedValue ?>>
5858

5959
@Override
6060
public void extractValues(Tuple3<?, ?, ?> originalValue, ValueReceiver receiver) {
61-
receiver.indexedValue("<tuple element>", 3, originalValue._3);
61+
receiver.indexedValue("<element>", 3, originalValue._3);
6262
}
6363

6464
}

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple4Extractor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple4<@ExtractedValue ?, ?, ?, ?
3838

3939
@Override
4040
public void extractValues(Tuple4<?, ?, ?, ?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}
@@ -48,7 +48,7 @@ class SecondExtractor implements ValueExtractor<Tuple4<?, @ExtractedValue ?, ?,
4848

4949
@Override
5050
public void extractValues(Tuple4<?, ?, ?, ?> originalValue, ValueReceiver receiver) {
51-
receiver.indexedValue("<tuple element>", 2, originalValue._2);
51+
receiver.indexedValue("<element>", 2, originalValue._2);
5252
}
5353

5454
}
@@ -58,7 +58,7 @@ class ThirdExtractor implements ValueExtractor<Tuple4<?, ?, @ExtractedValue ?, ?
5858

5959
@Override
6060
public void extractValues(Tuple4<?, ?, ?, ?> originalValue, ValueReceiver receiver) {
61-
receiver.indexedValue("<tuple element>", 3, originalValue._3);
61+
receiver.indexedValue("<element>", 3, originalValue._3);
6262
}
6363

6464
}
@@ -68,7 +68,7 @@ class FourthExtractor implements ValueExtractor<Tuple4<?, ?, ?, @ExtractedValue
6868

6969
@Override
7070
public void extractValues(Tuple4<?, ?, ?, ?> originalValue, ValueReceiver receiver) {
71-
receiver.indexedValue("<tuple element>", 4, originalValue._4);
71+
receiver.indexedValue("<element>", 4, originalValue._4);
7272
}
7373

7474
}

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple5Extractor.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple5<@ExtractedValue ?, ?, ?, ?
3838

3939
@Override
4040
public void extractValues(Tuple5<?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}
@@ -48,7 +48,7 @@ class SecondExtractor implements ValueExtractor<Tuple5<?, @ExtractedValue ?, ?,
4848

4949
@Override
5050
public void extractValues(Tuple5<?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
51-
receiver.indexedValue("<tuple element>", 2, originalValue._2);
51+
receiver.indexedValue("<element>", 2, originalValue._2);
5252
}
5353

5454
}
@@ -58,7 +58,7 @@ class ThirdExtractor implements ValueExtractor<Tuple5<?, ?, @ExtractedValue ?, ?
5858

5959
@Override
6060
public void extractValues(Tuple5<?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
61-
receiver.indexedValue("<tuple element>", 3, originalValue._3);
61+
receiver.indexedValue("<element>", 3, originalValue._3);
6262
}
6363

6464
}
@@ -68,7 +68,7 @@ class FourthExtractor implements ValueExtractor<Tuple5<?, ?, ?, @ExtractedValue
6868

6969
@Override
7070
public void extractValues(Tuple5<?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
71-
receiver.indexedValue("<tuple element>", 4, originalValue._4);
71+
receiver.indexedValue("<element>", 4, originalValue._4);
7272
}
7373

7474
}
@@ -78,7 +78,7 @@ class FifthExtractor implements ValueExtractor<Tuple5<?, ?, ?, ?, @ExtractedValu
7878

7979
@Override
8080
public void extractValues(Tuple5<?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
81-
receiver.indexedValue("<tuple element>", 5, originalValue._5);
81+
receiver.indexedValue("<element>", 5, originalValue._5);
8282
}
8383

8484
}

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple6Extractor.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple6<@ExtractedValue ?, ?, ?, ?
3838

3939
@Override
4040
public void extractValues(Tuple6<?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}
@@ -48,7 +48,7 @@ class SecondExtractor implements ValueExtractor<Tuple6<?, @ExtractedValue ?, ?,
4848

4949
@Override
5050
public void extractValues(Tuple6<?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
51-
receiver.indexedValue("<tuple element>", 2, originalValue._2);
51+
receiver.indexedValue("<element>", 2, originalValue._2);
5252
}
5353

5454
}
@@ -58,7 +58,7 @@ class ThirdExtractor implements ValueExtractor<Tuple6<?, ?, @ExtractedValue ?, ?
5858

5959
@Override
6060
public void extractValues(Tuple6<?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
61-
receiver.indexedValue("<tuple element>", 3, originalValue._3);
61+
receiver.indexedValue("<element>", 3, originalValue._3);
6262
}
6363

6464
}
@@ -68,7 +68,7 @@ class FourthExtractor implements ValueExtractor<Tuple6<?, ?, ?, @ExtractedValue
6868

6969
@Override
7070
public void extractValues(Tuple6<?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
71-
receiver.indexedValue("<tuple element>", 4, originalValue._4);
71+
receiver.indexedValue("<element>", 4, originalValue._4);
7272
}
7373

7474
}
@@ -78,7 +78,7 @@ class FifthExtractor implements ValueExtractor<Tuple6<?, ?, ?, ?, @ExtractedValu
7878

7979
@Override
8080
public void extractValues(Tuple6<?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
81-
receiver.indexedValue("<tuple element>", 5, originalValue._5);
81+
receiver.indexedValue("<element>", 5, originalValue._5);
8282
}
8383

8484
}
@@ -88,7 +88,7 @@ class SixthExtractor implements ValueExtractor<Tuple6<?, ?, ?, ?, ?, @ExtractedV
8888

8989
@Override
9090
public void extractValues(Tuple6<?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
91-
receiver.indexedValue("<tuple element>", 6, originalValue._6);
91+
receiver.indexedValue("<element>", 6, originalValue._6);
9292
}
9393

9494
}

src-gen/main/java/io/vavr/beanvalidation2/valueextraction/Tuple7Extractor.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FirstExtractor implements ValueExtractor<Tuple7<@ExtractedValue ?, ?, ?, ?
3838

3939
@Override
4040
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
41-
receiver.indexedValue("<tuple element>", 1, originalValue._1);
41+
receiver.indexedValue("<element>", 1, originalValue._1);
4242
}
4343

4444
}
@@ -48,7 +48,7 @@ class SecondExtractor implements ValueExtractor<Tuple7<?, @ExtractedValue ?, ?,
4848

4949
@Override
5050
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
51-
receiver.indexedValue("<tuple element>", 2, originalValue._2);
51+
receiver.indexedValue("<element>", 2, originalValue._2);
5252
}
5353

5454
}
@@ -58,7 +58,7 @@ class ThirdExtractor implements ValueExtractor<Tuple7<?, ?, @ExtractedValue ?, ?
5858

5959
@Override
6060
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
61-
receiver.indexedValue("<tuple element>", 3, originalValue._3);
61+
receiver.indexedValue("<element>", 3, originalValue._3);
6262
}
6363

6464
}
@@ -68,7 +68,7 @@ class FourthExtractor implements ValueExtractor<Tuple7<?, ?, ?, @ExtractedValue
6868

6969
@Override
7070
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
71-
receiver.indexedValue("<tuple element>", 4, originalValue._4);
71+
receiver.indexedValue("<element>", 4, originalValue._4);
7272
}
7373

7474
}
@@ -78,7 +78,7 @@ class FifthExtractor implements ValueExtractor<Tuple7<?, ?, ?, ?, @ExtractedValu
7878

7979
@Override
8080
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
81-
receiver.indexedValue("<tuple element>", 5, originalValue._5);
81+
receiver.indexedValue("<element>", 5, originalValue._5);
8282
}
8383

8484
}
@@ -88,7 +88,7 @@ class SixthExtractor implements ValueExtractor<Tuple7<?, ?, ?, ?, ?, @ExtractedV
8888

8989
@Override
9090
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
91-
receiver.indexedValue("<tuple element>", 6, originalValue._6);
91+
receiver.indexedValue("<element>", 6, originalValue._6);
9292
}
9393

9494
}
@@ -98,7 +98,7 @@ class SeventhExtractor implements ValueExtractor<Tuple7<?, ?, ?, ?, ?, ?, @Extra
9898

9999
@Override
100100
public void extractValues(Tuple7<?, ?, ?, ?, ?, ?, ?> originalValue, ValueReceiver receiver) {
101-
receiver.indexedValue("<tuple element>", 7, originalValue._7);
101+
receiver.indexedValue("<element>", 7, originalValue._7);
102102
}
103103

104104
}

0 commit comments

Comments
 (0)