@@ -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
0 commit comments