Skip to content

Commit 3e05921

Browse files
authored
Merge pull request #149 from zgyorffi/if_then_else_support
If-then-else support: schema loading
2 parents 2d12181 + 3c21bb9 commit 3e05921

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-0
lines changed

core/src/main/java/org/everit/json/schema/loader/SchemaLoader.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.everit.json.schema.ArraySchema;
2323
import org.everit.json.schema.BooleanSchema;
2424
import org.everit.json.schema.CombinedSchema;
25+
import org.everit.json.schema.ConditionalSchema;
2526
import org.everit.json.schema.ConstSchema;
2627
import org.everit.json.schema.EmptySchema;
2728
import org.everit.json.schema.EnumSchema;
@@ -210,6 +211,8 @@ public SchemaLoaderBuilder nullableSupport(boolean nullableSupport) {
210211
}
211212
}
212213

214+
private static final List<String> CONDITIONAL_SCHEMA_KEYWORDS = asList("if", "then", "else");
215+
213216
private static final List<String> NUMBER_SCHEMA_PROPS = asList("minimum", "maximum",
214217
"exclusiveMinimum", "exclusiveMaximum", "multipleOf");
215218

@@ -363,6 +366,14 @@ private NumberSchema.Builder buildNumberSchema() {
363366
return builder;
364367
}
365368

369+
private ConditionalSchema.Builder buildConditionalSchema() {
370+
ConditionalSchema.Builder builder = ConditionalSchema.builder();
371+
ls.schemaJson().maybe("if").map(this::loadChild).map(Schema.Builder::build).ifPresent(builder::ifSchema);
372+
ls.schemaJson().maybe("then").map(this::loadChild).map(Schema.Builder::build).ifPresent(builder::thenSchema);
373+
ls.schemaJson().maybe("else").map(this::loadChild).map(Schema.Builder::build).ifPresent(builder::elseSchema);
374+
return builder;
375+
}
376+
366377
private Schema.Builder loadSchemaBoolean(Boolean rawBoolean) {
367378
return rawBoolean ? TrueSchema.builder() : FalseSchema.builder();
368379
}
@@ -473,6 +484,8 @@ Schema.Builder<?> sniffSchemaByProps() {
473484
return buildNumberSchema().requiresNumber(false);
474485
} else if (schemaHasAnyOf(STRING_SCHEMA_PROPS)) {
475486
return new StringSchemaLoader(ls, config.formatValidators).load().requiresString(false);
487+
} else if (config.specVersion.compareTo(DRAFT_6) > 0 && schemaHasAnyOf(CONDITIONAL_SCHEMA_KEYWORDS)) {
488+
return buildConditionalSchema();
476489
}
477490
return null;
478491
}

core/src/test/java/org/everit/json/schema/loader/SchemaLoaderTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static java.util.Arrays.asList;
44
import static org.everit.json.schema.TestSupport.asStream;
55
import static org.everit.json.schema.TestSupport.loadAsV6;
6+
import static org.everit.json.schema.TestSupport.loadAsV7;
67
import static org.everit.json.schema.TestSupport.v6Loader;
78
import org.everit.json.schema.internal.URIV4FormatValidator;
89
import static org.everit.json.schema.loader.SpecificationVersion.DRAFT_6;
@@ -24,6 +25,7 @@
2425
import org.everit.json.schema.ArraySchema;
2526
import org.everit.json.schema.BooleanSchema;
2627
import org.everit.json.schema.CombinedSchema;
28+
import org.everit.json.schema.ConditionalSchema;
2729
import org.everit.json.schema.ConstSchema;
2830
import org.everit.json.schema.EmptySchema;
2931
import org.everit.json.schema.EnumSchema;
@@ -140,6 +142,59 @@ public void integerSchema() {
140142
assertTrue(actual.requiresInteger());
141143
}
142144

145+
@Test
146+
public void conditionalSchemaIf() {
147+
ConditionalSchema actual = (ConditionalSchema) loadAsV7(get("conditionalSchemaIf"));
148+
Assert.assertTrue(actual.getIfSchema().isPresent());
149+
Assert.assertFalse(actual.getThenSchema().isPresent());
150+
Assert.assertFalse(actual.getElseSchema().isPresent());
151+
}
152+
153+
@Test
154+
public void conditionalSchemaThen() {
155+
ConditionalSchema actual = (ConditionalSchema) loadAsV7(get("conditionalSchemaThen"));
156+
Assert.assertFalse(actual.getIfSchema().isPresent());
157+
Assert.assertTrue(actual.getThenSchema().isPresent());
158+
Assert.assertFalse(actual.getElseSchema().isPresent());
159+
}
160+
161+
@Test
162+
public void conditionalSchemaElse() {
163+
ConditionalSchema actual = (ConditionalSchema) loadAsV7(get("conditionalSchemaElse"));
164+
Assert.assertFalse(actual.getIfSchema().isPresent());
165+
Assert.assertFalse(actual.getThenSchema().isPresent());
166+
Assert.assertTrue(actual.getElseSchema().isPresent());
167+
}
168+
169+
@Test
170+
public void conditionalSchemaIfThenElse() {
171+
ConditionalSchema actual = (ConditionalSchema) loadAsV7(get("conditionalSchemaIfThenElse"));
172+
Assert.assertTrue(actual.getIfSchema().isPresent());
173+
Assert.assertTrue(actual.getThenSchema().isPresent());
174+
Assert.assertTrue(actual.getElseSchema().isPresent());
175+
}
176+
177+
@Test
178+
public void conditionalSchemaLoadingV4() {
179+
Schema actual = SchemaLoader.load(get("conditionalSchemaIf"));
180+
assertFalse(actual instanceof ConditionalSchema);
181+
}
182+
183+
@Test
184+
public void conditionalSchemaLoadingV6() {
185+
Schema actual = loadAsV6(get("conditionalSchemaIf"));
186+
assertFalse(actual instanceof ConditionalSchema);
187+
}
188+
189+
@Test
190+
public void conditionalSchemaIfSubSchemaTrue() {
191+
ConditionalSchema actual = (ConditionalSchema) loadAsV7(get("conditionalSchemaIfSubSchemaTrue"));
192+
Assert.assertTrue(actual.getIfSchema().isPresent());
193+
Assert.assertFalse(actual.getThenSchema().isPresent());
194+
Assert.assertFalse(actual.getElseSchema().isPresent());
195+
assertTrue(actual.getIfSchema().get() instanceof TrueSchema);
196+
}
197+
143198
@Test(expected = SchemaException.class)
144199
public void invalidExclusiveMinimum() {
145200
SchemaLoader.load(get("invalidExclusiveMinimum"));

core/src/test/resources/org/everit/jsonvalidator/testschemas.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,35 @@
8383
"type": "integer",
8484
"exclusiveMinimum": "false"
8585
},
86+
"conditionalSchemaIf": {
87+
"if": {
88+
"exclusiveMinimum": 0
89+
}
90+
},
91+
"conditionalSchemaThen": {
92+
"then": {
93+
"maximum": 10
94+
}
95+
},
96+
"conditionalSchemaElse": {
97+
"else": {
98+
"multipleOf": 2
99+
}
100+
},
101+
"conditionalSchemaIfThenElse": {
102+
"if": {
103+
"exclusiveMinimum": 0
104+
},
105+
"then": {
106+
"maximum": 10
107+
},
108+
"else": {
109+
"multipleOf": 2
110+
}
111+
},
112+
"conditionalSchemaIfSubSchemaTrue": {
113+
"if": true
114+
},
86115
"objectWithSchemaRectangleDep": {
87116
"type": "object",
88117
"dependencies": {

0 commit comments

Comments
 (0)