Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit 0b68047

Browse files
committed
Adds min/maxContains handling in templates
1 parent e8bd86a commit 0b68047

File tree

10 files changed

+120
-0
lines changed

10 files changed

+120
-0
lines changed

src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,12 @@ public void processOpts() {
591591
keywordValidatorFiles.add("LongValueMethod");
592592
keywordValidatorFiles.add("MapSchemaValidator");
593593
keywordValidatorFiles.add("MapUtils");
594+
keywordValidatorFiles.add("MaxContainsValidator");
594595
keywordValidatorFiles.add("MaximumValidator");
595596
keywordValidatorFiles.add("MaxItemsValidator");
596597
keywordValidatorFiles.add("MaxLengthValidator");
597598
keywordValidatorFiles.add("MaxPropertiesValidator");
599+
keywordValidatorFiles.add("MinContainsValidator");
598600
keywordValidatorFiles.add("MinimumValidator");
599601
keywordValidatorFiles.add("MinItemsValidator");
600602
keywordValidatorFiles.add("MinLengthValidator");

src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_anytypeOrMultitype.hbs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements {
102102
{{#if contains}}
103103
{{> src/main/java/packagename/components/schemas/SchemaClass/_contains }}
104104
{{/if}}
105+
{{#neq maxContains null}}
106+
{{> src/main/java/packagename/components/schemas/SchemaClass/_maxContains }}
107+
{{/neq}}
108+
{{#neq minContains null}}
109+
{{> src/main/java/packagename/components/schemas/SchemaClass/_minContains }}
110+
{{/neq}}
105111
);
106112
}
107113

src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_list.hbs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements L
4747
{{#if contains}}
4848
{{> src/main/java/packagename/components/schemas/SchemaClass/_contains }}
4949
{{/if}}
50+
{{#neq maxContains null}}
51+
{{> src/main/java/packagename/components/schemas/SchemaClass/_maxContains }}
52+
{{/if}}
53+
{{#neq minContains null}}
54+
{{> src/main/java/packagename/components/schemas/SchemaClass/_minContains }}
55+
{{/neq}}
5056
);
5157
}
5258

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{{#if forDocs}}
2+
maxContains = {{maxContains}}
3+
{{~else}}
4+
.maxContains({{maxContains}})
5+
{{/if}}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{{#if forDocs}}
2+
minContains = {{minContains}}
3+
{{~else}}
4+
.minContains({{minContains}})
5+
{{/if}}

src/main/resources/java/src/main/java/packagename/components/schemas/docschema_fields_field.hbs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,9 @@
7676
{{#if contains}}
7777
| Class<? extends JsonSchema> | {{> src/main/java/packagename/components/schemas/SchemaClass/_contains }} |
7878
{{/if}}
79+
{{#neq maxContains null}}
80+
| Integer | {{> src/main/java/packagename/components/schemas/SchemaClass/_maxContains }} |
81+
{{/neq}}
82+
{{#neq minContains null}}
83+
| Integer | {{> src/main/java/packagename/components/schemas/SchemaClass/_minContains }} |
84+
{{/neq}}

src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchema.hbs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,20 @@ public abstract class JsonSchema {
236236
new ContainsValidator(this.contains)
237237
);
238238
}
239+
this.maxContains = jsonSchemaInfo.maxContains;
240+
if (this.maxContains != null) {
241+
keywordToValidator.put(
242+
"maxContains",
243+
new MaxContainsValidator(this.maxContains)
244+
);
245+
}
246+
this.minContains = jsonSchemaInfo.minContains;
247+
if (this.minContains != null) {
248+
keywordToValidator.put(
249+
"minContains",
250+
new MinContainsValidator(this.minContains)
251+
);
252+
}
239253
this.keywordToValidator = keywordToValidator;
240254
}
241255

src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchemaInfo.hbs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,14 @@ public class JsonSchemaInfo {
147147
this.contains = contains;
148148
return this;
149149
}
150+
public @Nullable Integer maxContains = null;
151+
public JsonSchemaInfo maxContains(Integer maxContains) {
152+
this.maxContains = maxContains;
153+
return this;
154+
}
155+
public @Nullable Integer minContains = null;
156+
public JsonSchemaInfo minContains(Integer minContains) {
157+
this.minContains = minContains;
158+
return this;
159+
}
150160
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package {{{packageName}}}.schemas.validation;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import {{{packageName}}}.exceptions.ValidationException;
5+
6+
import java.util.List;
7+
8+
public class MaxContainsValidator implements KeywordValidator {
9+
public final int maxContains;
10+
11+
public MaxContainsValidator(int maxContains) {
12+
this.maxContains = maxContains;
13+
}
14+
15+
@Override
16+
public @Nullable PathToSchemasMap validate(
17+
JsonSchema schema,
18+
@Nullable Object arg,
19+
ValidationMetadata validationMetadata,
20+
List<PathToSchemasMap> containsPathToSchemas
21+
) {
22+
if (!(arg instanceof List)) {
23+
return null;
24+
}
25+
if (containsPathToSchemas.size() > maxContains) {
26+
throw new ValidationException(
27+
"Validation failed for maxContains keyword in class="+schema.getClass()+
28+
" at pathToItem="+validationMetadata.pathToItem()+". Too many items validated to the contains schema."
29+
)
30+
}
31+
return null;
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package {{{packageName}}}.schemas.validation;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import {{{packageName}}}.exceptions.ValidationException;
5+
6+
import java.util.List;
7+
8+
public class MinContainsValidator implements KeywordValidator {
9+
public final int minContains;
10+
11+
public MinContainsValidator(int minContains) {
12+
this.minContains = minContains;
13+
}
14+
15+
@Override
16+
public @Nullable PathToSchemasMap validate(
17+
JsonSchema schema,
18+
@Nullable Object arg,
19+
ValidationMetadata validationMetadata,
20+
List<PathToSchemasMap> containsPathToSchemas
21+
) {
22+
if (!(arg instanceof List)) {
23+
return null;
24+
}
25+
if (containsPathToSchemas.size() < minContains) {
26+
throw new ValidationException(
27+
"Validation failed for minContains keyword in class="+schema.getClass()+
28+
" at pathToItem="+validationMetadata.pathToItem()+". Too few items validated to the contains schema."
29+
)
30+
}
31+
return null;
32+
}
33+
}

0 commit comments

Comments
 (0)