Skip to content

Commit 4d65ee3

Browse files
committed
wip
1 parent bd2a7c6 commit 4d65ee3

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

json-java21-jtd/src/main/java/json/java21/jtd/Jtd.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@ public class Jtd {
2020
private final Map<String, JtdSchema> compiledDefinitions = new java.util.HashMap<>();
2121

2222
/// Stack frame for iterative validation with path and offset tracking
23-
record Frame(JtdSchema schema, JsonValue instance, String ptr, Crumbs crumbs) {}
23+
record Frame(JtdSchema schema, JsonValue instance, String ptr, Crumbs crumbs, String discriminatorKey) {
24+
/// Constructor for normal validation without discriminator context
25+
Frame(JtdSchema schema, JsonValue instance, String ptr, Crumbs crumbs) {
26+
this(schema, instance, ptr, crumbs, null);
27+
}
28+
}
2429

2530
/// Lightweight breadcrumb trail for human-readable error paths
2631
record Crumbs(String value) {
@@ -145,7 +150,8 @@ void validatePropertiesSchema(Frame frame, JtdSchema.PropertiesSchema propsSchem
145150
}
146151

147152
// Check for additional properties if not allowed
148-
if (!propsSchema.additionalProperties()) {
153+
// RFC 8927 §2.2.8: In discriminator context, variant schemas ignore additionalProperties enforcement
154+
if (!propsSchema.additionalProperties() && frame.discriminatorKey() == null) {
149155
for (String key : obj.members().keySet()) {
150156
if (!propsSchema.properties().containsKey(key) && !propsSchema.optionalProperties().containsKey(key)) {
151157
JsonValue value = obj.members().get(key);
@@ -232,10 +238,10 @@ void pushChildFrames(Frame frame, java.util.Deque<Frame> stack) {
232238
String discriminatorValueStr = discStr.value();
233239
JtdSchema variantSchema = discSchema.mapping().get(discriminatorValueStr);
234240
if (variantSchema != null) {
235-
// Push variant schema for validation
236-
Frame variantFrame = new Frame(variantSchema, instance, frame.ptr, frame.crumbs);
241+
// Push variant schema for validation with discriminator key context
242+
Frame variantFrame = new Frame(variantSchema, instance, frame.ptr, frame.crumbs, discSchema.discriminator());
237243
stack.push(variantFrame);
238-
LOG.finer(() -> "Pushed discriminator variant frame for " + discriminatorValueStr);
244+
LOG.finer(() -> "Pushed discriminator variant frame for " + discriminatorValueStr + " with discriminator key: " + discSchema.discriminator());
239245
}
240246
}
241247
}

json-java21-jtd/src/main/java/json/java21/jtd/JtdSchema.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public Jtd.Result validate(JsonValue instance) {
8383

8484
@Override
8585
public boolean validateWithFrame(Jtd.Frame frame, java.util.List<String> errors, boolean verboseErrors) {
86-
// Create new frame with the resolved schema but same instance, path, and crumbs
87-
Jtd.Frame resolvedFrame = new Jtd.Frame(resolvedSchema, frame.instance(), frame.ptr(), frame.crumbs());
86+
// Create new frame with the resolved schema but preserve all context including discriminator key
87+
Jtd.Frame resolvedFrame = new Jtd.Frame(resolvedSchema, frame.instance(), frame.ptr(), frame.crumbs(), frame.discriminatorKey());
8888
return resolvedSchema.validateWithFrame(resolvedFrame, errors, verboseErrors);
8989
}
9090
}

json-java21-jtd/src/test/java/json/java21/jtd/TestRfc8927Compliance.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/// RFC 8927 compliance tests for failing JTD specification cases
1010
/// These are the exact test cases that were failing in JtdSpecIT
1111
/// with explicit multiline strings for schema and JSON documents
12-
public class TestRfc8927Compliance extends JtdTestBase {
12+
public class TestRfc8927Compliance extends JtdTestBase {
1313

1414
/// Test ref schema with nested definitions
1515
/// "ref schema - nested ref" from JTD specification test suite
@@ -290,4 +290,4 @@ public void testStrictMixedPropertiesBadAdditionalProperty() throws Exception {
290290
.isNotEmpty()
291291
.anySatisfy(error -> assertThat(error).contains("baz"));
292292
}
293-
}
293+
}

0 commit comments

Comments
 (0)