Skip to content

Commit 3b9f390

Browse files
committed
tidy up
1 parent 8cefcb7 commit 3b9f390

File tree

5 files changed

+121
-124
lines changed

5 files changed

+121
-124
lines changed

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

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ public class Jtd {
1818
/// Top-level definitions map for ref resolution
1919
private final Map<String, JtdSchema> definitions = new java.util.HashMap<>();
2020

21-
// Removed: RFC 8927 strict mode - no context-aware compilation needed
22-
2321
/// Stack frame for iterative validation with path and offset tracking
2422
record Frame(JtdSchema schema, JsonValue instance, String ptr, Crumbs crumbs, String discriminatorKey) {
2523
/// Constructor for normal validation without discriminator context
@@ -165,7 +163,7 @@ void validatePropertiesSchema(Frame frame, JtdSchema.PropertiesSchema propsSchem
165163
for (String key : obj.members().keySet()) {
166164
if (!propsSchema.properties().containsKey(key) && !propsSchema.optionalProperties().containsKey(key)) {
167165
// Only exempt the discriminator field itself, not all additional properties
168-
if (discriminatorKey != null && key.equals(discriminatorKey)) {
166+
if (key.equals(discriminatorKey)) {
169167
continue; // Skip the discriminator field - it's exempt
170168
}
171169
JsonValue value = obj.members().get(key);
@@ -204,14 +202,11 @@ void pushChildFrames(Frame frame, java.util.Deque<Frame> stack) {
204202
if (instance instanceof JsonObject obj) {
205203
String discriminatorKey = frame.discriminatorKey();
206204

207-
// ================================= CHANGE 1: SKIP DISCRIMINATOR FIELD =================================
208-
// ADDED: Skip the discriminator field when pushing required property validation frames
209-
// Push required properties that are present (except discriminator field)
210205
for (var entry : propsSchema.properties().entrySet()) {
211206
String key = entry.getKey();
212207

213208
// Skip the discriminator field - it was already validated by discriminator logic
214-
if (discriminatorKey != null && key.equals(discriminatorKey)) {
209+
if (key.equals(discriminatorKey)) {
215210
LOG.finer(() -> "Skipping discriminator field validation for: " + key);
216211
continue;
217212
}
@@ -227,13 +222,11 @@ void pushChildFrames(Frame frame, java.util.Deque<Frame> stack) {
227222
}
228223
}
229224

230-
// ADDED: Skip the discriminator field when pushing optional property validation frames
231-
// Push optional properties that are present (except discriminator field)
232225
for (var entry : propsSchema.optionalProperties().entrySet()) {
233226
String key = entry.getKey();
234227

235228
// Skip the discriminator field - it was already validated by discriminator logic
236-
if (discriminatorKey != null && key.equals(discriminatorKey)) {
229+
if (key.equals(discriminatorKey)) {
237230
LOG.finer(() -> "Skipping discriminator field validation for optional: " + key);
238231
continue;
239232
}
@@ -250,7 +243,6 @@ void pushChildFrames(Frame frame, java.util.Deque<Frame> stack) {
250243
}
251244
}
252245

253-
// ============================= END CHANGE 1: SKIP DISCRIMINATOR FIELD =============================
254246
}
255247
}
256248
case JtdSchema.ValuesSchema valuesSchema -> {
@@ -274,23 +266,9 @@ void pushChildFrames(Frame frame, java.util.Deque<Frame> stack) {
274266
JtdSchema variantSchema = discSchema.mapping().get(discriminatorValueStr);
275267
if (variantSchema != null) {
276268

277-
// ========================== CHANGE 2: REMOVE FAULTY OPTIMIZATION ==========================
278-
// REMOVED: Special-case optimization that skipped validation for discriminator-only objects
279-
// OLD CODE:
280-
// if (obj.members().size() == 1 && obj.members().containsKey(discSchema.discriminator())) {
281-
// LOG.finer(() -> "Skipping variant schema push for discriminator-only object");
282-
// } else {
283-
// Frame variantFrame = new Frame(variantSchema, instance, frame.ptr, frame.crumbs, discSchema.discriminator());
284-
// stack.push(variantFrame);
285-
// LOG.finer(() -> "Pushed discriminator variant frame for " + discriminatorValueStr + " with discriminator key: " + discSchema.discriminator());
286-
// }
287-
288-
// NEW CODE: Always push variant schema for validation with discriminator key context
289269
Frame variantFrame = new Frame(variantSchema, instance, frame.ptr, frame.crumbs, discSchema.discriminator());
290270
stack.push(variantFrame);
291271
LOG.finer(() -> "Pushed discriminator variant frame for " + discriminatorValueStr + " with discriminator key: " + discSchema.discriminator());
292-
// ======================== END CHANGE 2: REMOVE FAULTY OPTIMIZATION ========================
293-
294272
}
295273
}
296274
}
@@ -500,11 +478,8 @@ JtdSchema compilePropertiesSchema(JsonObject obj) {
500478
throw new IllegalArgumentException("additionalProperties must be a boolean");
501479
}
502480
additionalProperties = bool.value();
503-
} else if (properties.isEmpty() && optionalProperties.isEmpty()) {
504-
// Empty schema with no properties defined rejects additional properties by default
505-
additionalProperties = false;
506-
}
507-
481+
} // Empty schema with no properties defined rejects additional properties by default
482+
508483
return new JtdSchema.PropertiesSchema(properties, optionalProperties, additionalProperties);
509484
}
510485

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
/// JTD Schema interface - validates JSON instances against JTD schemas
1010
/// Following RFC 8927 specification with eight mutually-exclusive schema forms
11-
public sealed interface JtdSchema {
11+
sealed interface JtdSchema {
1212

1313
/// Validates a JSON instance against this schema
1414
/// @param instance The JSON value to validate
@@ -210,12 +210,9 @@ static boolean isValidRfc3339Timestamp(String timestamp) {
210210

211211
// Handle leap seconds: seconds = 60 is valid only if minutes = 59
212212
if (second == 60) {
213-
if (minute != 59) {
214-
return false;
215-
}
213+
return minute == 59;
216214
// For leap seconds, we accept the format but don't validate the specific date
217215
// This matches RFC 8927 behavior - format validation only
218-
return true;
219216
}
220217

221218
if (second < 0 || second > 59) {
@@ -364,7 +361,7 @@ public Jtd.Result validate(JsonValue instance, boolean verboseErrors) {
364361
public boolean validateWithFrame(Jtd.Frame frame, java.util.List<String> errors, boolean verboseErrors) {
365362
JsonValue instance = frame.instance();
366363

367-
if (!(instance instanceof JsonArray arr)) {
364+
if (!(instance instanceof JsonArray)) {
368365
String error = verboseErrors
369366
? Jtd.Error.EXPECTED_ARRAY.message(instance, instance.getClass().getSimpleName())
370367
: Jtd.Error.EXPECTED_ARRAY.message(instance.getClass().getSimpleName());
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package json.java21.jdt.demo;
2+
3+
import jdk.sandbox.java.util.json.Json;
4+
import jdk.sandbox.java.util.json.JsonValue;
5+
import json.java21.jtd.Jtd;
6+
import json.java21.jtd.JtdTestBase;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.util.logging.Logger;
10+
11+
import static org.assertj.core.api.Assertions.assertThat;
12+
13+
14+
public class VisibilityTest extends JtdTestBase {
15+
16+
static final Logger LOG = Logger.getLogger("json.java21.jtd");
17+
18+
/// Test ref schema resolution with valid definitions
19+
/// RFC 8927 Section 3.3.2: Ref schemas must resolve against definitions
20+
@Test
21+
public void testRefSchemaValid() {
22+
JsonValue schema = Json.parse("{\"ref\": \"address\", \"definitions\": {\"address\": {\"type\": \"string\"}}}");
23+
JsonValue validData = Json.parse("\"123 Main St\"");
24+
25+
Jtd validator = new Jtd();
26+
Jtd.Result result = validator.validate(schema, validData);
27+
28+
assertThat(result.isValid()).isTrue();
29+
assertThat(result.errors()).isEmpty();
30+
LOG.fine(() -> "Ref schema valid test - schema: " + schema + ", data: " + validData);
31+
}
32+
}

0 commit comments

Comments
 (0)