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

Commit 7316f89

Browse files
authored
Java, adds dependentRequired (#363)
* 310 regen with partial dependentRequired * Fixes java 310 tests * Samples regen
1 parent b1901fc commit 7316f89

File tree

24 files changed

+314
-10
lines changed

24 files changed

+314
-10
lines changed

docs/generators/java.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
279279
|Const|✓|OAS3
280280
|Contains|✓|OAS3
281281
|Default|✓|OAS2,OAS3
282-
|DependentRequired||OAS3
282+
|DependentRequired||OAS3
283283
|DependentSchemas|✗|OAS3
284284
|Discriminator|✗|OAS2,OAS3
285285
|Else|✗|OAS3

samples/client/3_0_3_unit_test/java/.openapi-generator/FILES

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidato
213213
src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java
214214
src/main/java/org/openapijsonschematools/client/schemas/validation/CustomIsoparser.java
215215
src/main/java/org/openapijsonschematools/client/schemas/validation/DefaultValueMethod.java
216+
src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java
216217
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleEnumValidator.java
217218
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleValueMethod.java
218219
src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.openapijsonschematools.client.schemas.validation;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import org.openapijsonschematools.client.exceptions.ValidationException;
5+
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
public class DependentRequiredValidator implements KeywordValidator {
12+
public final Map<String, Set<String>> dependentRequired;
13+
14+
public DependentRequiredValidator(Map<String, Set<String>> dependentRequired) {
15+
this.dependentRequired = dependentRequired;
16+
}
17+
18+
@Override
19+
public @Nullable PathToSchemasMap validate(
20+
JsonSchema schema,
21+
@Nullable Object arg,
22+
ValidationMetadata validationMetadata,
23+
@Nullable List<PathToSchemasMap> containsPathToSchemas
24+
) {
25+
if (!(arg instanceof Map)) {
26+
return null;
27+
}
28+
for (Map.Entry<String, Set<String>> entry: dependentRequired.entrySet()) {
29+
if (!((Map<?, ?>) arg).containsKey(entry.getKey())) {
30+
continue;
31+
}
32+
Set<String> missingKeys = new HashSet<>(entry.getValue());
33+
for (Object objKey: ((Map<?, ?>) arg).keySet()) {
34+
if (objKey instanceof String key) {
35+
missingKeys.remove(key);
36+
}
37+
}
38+
if (missingKeys.isEmpty()) {
39+
continue;
40+
}
41+
throw new ValidationException(
42+
"Validation failed for dependentRequired because these_keys="+missingKeys+" are "+
43+
"missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass()
44+
);
45+
}
46+
return null;
47+
}
48+
}

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public abstract class JsonSchema {
5050
public final @Nullable Integer maxContains;
5151
public final @Nullable Integer minContains;
5252
public final @Nullable Class<? extends JsonSchema> propertyNames;
53+
public @Nullable Map<String, Set<String>> dependentRequired;
5354
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;
5455

5556
protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
@@ -260,6 +261,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
260261
new PropertyNamesValidator(this.propertyNames)
261262
);
262263
}
264+
this.dependentRequired = jsonSchemaInfo.dependentRequired;
265+
if (this.dependentRequired != null) {
266+
keywordToValidator.put(
267+
"dependentRequired",
268+
new DependentRequiredValidator(this.dependentRequired)
269+
);
270+
}
263271
this.keywordToValidator = keywordToValidator;
264272
}
265273

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java

+5
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,9 @@ public JsonSchemaInfo propertyNames(Class<? extends JsonSchema> propertyNames) {
162162
this.propertyNames = propertyNames;
163163
return this;
164164
}
165+
public @Nullable Map<String, Set<String>> dependentRequired = null;
166+
public JsonSchemaInfo dependentRequired(Map<String, Set<String>> dependentRequired) {
167+
this.dependentRequired = dependentRequired;
168+
return this;
169+
}
165170
}

samples/client/3_1_0_unit_test/java/.openapi-generator/FILES

+1
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidato
265265
src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java
266266
src/main/java/org/openapijsonschematools/client/schemas/validation/CustomIsoparser.java
267267
src/main/java/org/openapijsonschematools/client/schemas/validation/DefaultValueMethod.java
268+
src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java
268269
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleEnumValidator.java
269270
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleValueMethod.java
270271
src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java

samples/client/3_1_0_unit_test/java/docs/components/schemas/EmptyDependents.md

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ A schema class that validates payloads
1919
### Field Summary
2020
| Modifier and Type | Field and Description |
2121
| ----------------- | ---------------------- |
22+
| Map<String, Set<String>> | dependentRequired = MapUtils.makeMap(<br>
23+
&nbsp;&nbsp;&nbsp;&nbsp;new AbstractMap.SimpleEntry<>(<br>
24+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bar",<br>
25+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetMaker.makeSet(
26+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
27+
&nbsp;&nbsp;&nbsp;&nbsp;)<br>
28+
)
29+
|
2230

2331
### Method Summary
2432
| Modifier and Type | Method and Description |

samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/EmptyDependents.java

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.openapijsonschematools.client.components.schemas;
22
import java.time.LocalDate;
33
import java.time.ZonedDateTime;
4+
import java.util.AbstractMap;
45
import java.util.ArrayList;
56
import java.util.HashSet;
67
import java.util.LinkedHashMap;
@@ -17,6 +18,7 @@
1718
import org.openapijsonschematools.client.exceptions.InvalidTypeException;
1819
import org.openapijsonschematools.client.exceptions.UnsetPropertyException;
1920
import org.openapijsonschematools.client.exceptions.ValidationException;
21+
import org.openapijsonschematools.client.schemas.SetMaker;
2022
import org.openapijsonschematools.client.schemas.UnsetAddPropsSetter;
2123
import org.openapijsonschematools.client.schemas.validation.BooleanSchemaValidator;
2224
import org.openapijsonschematools.client.schemas.validation.FrozenList;
@@ -25,6 +27,7 @@
2527
import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo;
2628
import org.openapijsonschematools.client.schemas.validation.ListSchemaValidator;
2729
import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator;
30+
import org.openapijsonschematools.client.schemas.validation.MapUtils;
2831
import org.openapijsonschematools.client.schemas.validation.NullSchemaValidator;
2932
import org.openapijsonschematools.client.schemas.validation.NumberSchemaValidator;
3033
import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap;
@@ -46,6 +49,13 @@ public static class EmptyDependents1 extends JsonSchema implements NullSchemaVal
4649

4750
protected EmptyDependents1() {
4851
super(new JsonSchemaInfo()
52+
.dependentRequired(MapUtils.makeMap(
53+
new AbstractMap.SimpleEntry<>(
54+
"bar",
55+
SetMaker.makeSet(
56+
)
57+
)
58+
))
4959
);
5060
}
5161

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.openapijsonschematools.client.schemas.validation;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import org.openapijsonschematools.client.exceptions.ValidationException;
5+
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
public class DependentRequiredValidator implements KeywordValidator {
12+
public final Map<String, Set<String>> dependentRequired;
13+
14+
public DependentRequiredValidator(Map<String, Set<String>> dependentRequired) {
15+
this.dependentRequired = dependentRequired;
16+
}
17+
18+
@Override
19+
public @Nullable PathToSchemasMap validate(
20+
JsonSchema schema,
21+
@Nullable Object arg,
22+
ValidationMetadata validationMetadata,
23+
@Nullable List<PathToSchemasMap> containsPathToSchemas
24+
) {
25+
if (!(arg instanceof Map)) {
26+
return null;
27+
}
28+
for (Map.Entry<String, Set<String>> entry: dependentRequired.entrySet()) {
29+
if (!((Map<?, ?>) arg).containsKey(entry.getKey())) {
30+
continue;
31+
}
32+
Set<String> missingKeys = new HashSet<>(entry.getValue());
33+
for (Object objKey: ((Map<?, ?>) arg).keySet()) {
34+
if (objKey instanceof String key) {
35+
missingKeys.remove(key);
36+
}
37+
}
38+
if (missingKeys.isEmpty()) {
39+
continue;
40+
}
41+
throw new ValidationException(
42+
"Validation failed for dependentRequired because these_keys="+missingKeys+" are "+
43+
"missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass()
44+
);
45+
}
46+
return null;
47+
}
48+
}

samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public abstract class JsonSchema {
5050
public final @Nullable Integer maxContains;
5151
public final @Nullable Integer minContains;
5252
public final @Nullable Class<? extends JsonSchema> propertyNames;
53+
public @Nullable Map<String, Set<String>> dependentRequired;
5354
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;
5455

5556
protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
@@ -260,6 +261,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
260261
new PropertyNamesValidator(this.propertyNames)
261262
);
262263
}
264+
this.dependentRequired = jsonSchemaInfo.dependentRequired;
265+
if (this.dependentRequired != null) {
266+
keywordToValidator.put(
267+
"dependentRequired",
268+
new DependentRequiredValidator(this.dependentRequired)
269+
);
270+
}
263271
this.keywordToValidator = keywordToValidator;
264272
}
265273

samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java

+5
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,9 @@ public JsonSchemaInfo propertyNames(Class<? extends JsonSchema> propertyNames) {
162162
this.propertyNames = propertyNames;
163163
return this;
164164
}
165+
public @Nullable Map<String, Set<String>> dependentRequired = null;
166+
public JsonSchemaInfo dependentRequired(Map<String, Set<String>> dependentRequired) {
167+
this.dependentRequired = dependentRequired;
168+
return this;
169+
}
165170
}

samples/client/petstore/java/.openapi-generator/FILES

+1
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidato
691691
src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java
692692
src/main/java/org/openapijsonschematools/client/schemas/validation/CustomIsoparser.java
693693
src/main/java/org/openapijsonschematools/client/schemas/validation/DefaultValueMethod.java
694+
src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java
694695
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleEnumValidator.java
695696
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleValueMethod.java
696697
src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.openapijsonschematools.client.schemas.validation;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import org.openapijsonschematools.client.exceptions.ValidationException;
5+
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
public class DependentRequiredValidator implements KeywordValidator {
12+
public final Map<String, Set<String>> dependentRequired;
13+
14+
public DependentRequiredValidator(Map<String, Set<String>> dependentRequired) {
15+
this.dependentRequired = dependentRequired;
16+
}
17+
18+
@Override
19+
public @Nullable PathToSchemasMap validate(
20+
JsonSchema schema,
21+
@Nullable Object arg,
22+
ValidationMetadata validationMetadata,
23+
@Nullable List<PathToSchemasMap> containsPathToSchemas
24+
) {
25+
if (!(arg instanceof Map)) {
26+
return null;
27+
}
28+
for (Map.Entry<String, Set<String>> entry: dependentRequired.entrySet()) {
29+
if (!((Map<?, ?>) arg).containsKey(entry.getKey())) {
30+
continue;
31+
}
32+
Set<String> missingKeys = new HashSet<>(entry.getValue());
33+
for (Object objKey: ((Map<?, ?>) arg).keySet()) {
34+
if (objKey instanceof String key) {
35+
missingKeys.remove(key);
36+
}
37+
}
38+
if (missingKeys.isEmpty()) {
39+
continue;
40+
}
41+
throw new ValidationException(
42+
"Validation failed for dependentRequired because these_keys="+missingKeys+" are "+
43+
"missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass()
44+
);
45+
}
46+
return null;
47+
}
48+
}

samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public abstract class JsonSchema {
5050
public final @Nullable Integer maxContains;
5151
public final @Nullable Integer minContains;
5252
public final @Nullable Class<? extends JsonSchema> propertyNames;
53+
public @Nullable Map<String, Set<String>> dependentRequired;
5354
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;
5455

5556
protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
@@ -260,6 +261,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
260261
new PropertyNamesValidator(this.propertyNames)
261262
);
262263
}
264+
this.dependentRequired = jsonSchemaInfo.dependentRequired;
265+
if (this.dependentRequired != null) {
266+
keywordToValidator.put(
267+
"dependentRequired",
268+
new DependentRequiredValidator(this.dependentRequired)
269+
);
270+
}
263271
this.keywordToValidator = keywordToValidator;
264272
}
265273

samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java

+5
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,9 @@ public JsonSchemaInfo propertyNames(Class<? extends JsonSchema> propertyNames) {
162162
this.propertyNames = propertyNames;
163163
return this;
164164
}
165+
public @Nullable Map<String, Set<String>> dependentRequired = null;
166+
public JsonSchemaInfo dependentRequired(Map<String, Set<String>> dependentRequired) {
167+
this.dependentRequired = dependentRequired;
168+
return this;
169+
}
165170
}

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ public JavaClientGenerator() {
258258
SchemaFeature.Const,
259259
SchemaFeature.Contains,
260260
SchemaFeature.Default,
261-
// SchemaFeature.DependentRequired,
261+
SchemaFeature.DependentRequired,
262262
// SchemaFeature.DependentSchemas,
263263
// SchemaFeature.Discriminator,
264264
// SchemaFeature.Else,
@@ -567,6 +567,7 @@ public void processOpts() {
567567
keywordValidatorFiles.add("BigDecimalValidator");
568568
keywordValidatorFiles.add("CustomIsoparser");
569569
keywordValidatorFiles.add("DefaultValueMethod");
570+
keywordValidatorFiles.add("DependentRequiredValidator");
570571
keywordValidatorFiles.add("DoubleEnumValidator");
571572
keywordValidatorFiles.add("DoubleValueMethod");
572573
keywordValidatorFiles.add("EnumValidator");
@@ -1347,6 +1348,7 @@ public Set<String> getImports(String sourceJsonPath, CodegenSchema schema, Featu
13471348
addMultipleOfValidator(schema, imports);
13481349
addAdditionalPropertiesImports(schema, imports);
13491350
addDefaultValueImport(schema, imports);
1351+
addDependentRequiredImports(schema, imports);
13501352
if (schema.mapValueSchema != null) {
13511353
imports.addAll(getDeeperImports(sourceJsonPath, schema.mapValueSchema));
13521354
}
@@ -1460,6 +1462,14 @@ private void addPropertiesValidator(CodegenSchema schema, Set<String> imports) {
14601462
}
14611463
}
14621464

1465+
private void addDependentRequiredImports(CodegenSchema schema, Set<String> imports) {
1466+
if (schema.dependentRequired != null) {
1467+
imports.add("import "+packageName + ".schemas.validation.MapUtils;");
1468+
imports.add("import java.util.AbstractMap;");
1469+
imports.add("import "+packageName + ".schemas.SetMaker;");
1470+
}
1471+
}
1472+
14631473
private void addAllOfValidator(CodegenSchema schema, Set<String> imports) {
14641474
if (schema.allOf != null) {
14651475
imports.add("import java.util.List;");
@@ -1554,6 +1564,7 @@ private void addMapSchemaImports(Set<String> imports, CodegenSchema schema) {
15541564
addAnyOfValidator(schema, imports);
15551565
addOneOfValidator(schema, imports);
15561566
addAdditionalPropertiesImports(schema, imports);
1567+
addDependentRequiredImports(schema, imports);
15571568
}
15581569

15591570
private void addListSchemaImports(Set<String> imports, CodegenSchema schema) {

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements {
111111
{{#if propertyNames}}
112112
{{> src/main/java/packagename/components/schemas/SchemaClass/_propertyNames }}
113113
{{/if}}
114+
{{#if dependentRequired}}
115+
{{> src/main/java/packagename/components/schemas/SchemaClass/_dependentRequired }}
116+
{{/if}}
114117
);
115118
}
116119

@@ -135,9 +138,6 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements {
135138
{{#if else_}}
136139
{{!> components/schemas/schema_cls/_else }}
137140
{{/if}}
138-
{{#if dependentRequired}}
139-
{{!> components/schemas/schema_cls/_dependent_required }}
140-
{{/if}}
141141
{{#if dependentSchemas}}
142142
{{!> components/schemas/schema_cls/_dependent_schemas }}
143143
{{/if}}

0 commit comments

Comments
 (0)