diff --git a/core/src/main/java/it/extared/dpp/validator/json/JsonSchemaMetadataExtractor.java b/core/src/main/java/it/extared/dpp/validator/json/JsonSchemaMetadataExtractor.java index 4ff22a5..f970cbe 100644 --- a/core/src/main/java/it/extared/dpp/validator/json/JsonSchemaMetadataExtractor.java +++ b/core/src/main/java/it/extared/dpp/validator/json/JsonSchemaMetadataExtractor.java @@ -222,9 +222,38 @@ private Set recurseIntoProperty( if (itemResolved != null) { JsonNode itemFlat = flattenAllOf(itemResolved, root, visited); JsonNode itemType = itemFlat.get(TYPE_KEY); - if (itemType != null && itemType.asText().equals(OBJECT_KEY)) { + boolean isObjectLike = + (itemType != null && itemType.asText().equals(OBJECT_KEY)) + || (itemType == null + && (itemFlat.has(PROPERTIES_KEY) + || itemFlat.has(REQUIRED_KEY))); + if (isObjectLike) { paths.addAll( extractRequiredPaths(itemFlat, root, fullPath + "[]", visited)); + } else { + // oneOf/anyOf into items + String choiceKey = + itemFlat.has(ONE_OF_KEY) + ? ONE_OF_KEY + : itemFlat.has(ANY_OF_KEY) ? ANY_OF_KEY : null; + if (choiceKey != null) { + for (JsonNode variant : itemFlat.get(choiceKey)) { + Set variantVisited = + Collections.newSetFromMap(new IdentityHashMap<>()); + variantVisited.addAll(visited); + JsonNode varResolved = + resolveRefSafe(variant, root, variantVisited); + if (varResolved == null) continue; + JsonNode varFlat = + flattenAllOf(varResolved, root, variantVisited); + paths.addAll( + extractRequiredPaths( + varFlat, + root, + fullPath + "[]", + variantVisited)); + } + } } } } diff --git a/core/src/test/java/it/extrared/dpp/validator/json/JsonSchemaMetadataExtractorTest.java b/core/src/test/java/it/extrared/dpp/validator/json/JsonSchemaMetadataExtractorTest.java index 74250b0..1ced68b 100644 --- a/core/src/test/java/it/extrared/dpp/validator/json/JsonSchemaMetadataExtractorTest.java +++ b/core/src/test/java/it/extrared/dpp/validator/json/JsonSchemaMetadataExtractorTest.java @@ -63,7 +63,7 @@ public void testExtraction3() { public void testExtraction4() { SchemaMetadata schema = extractor.extractMetadata(CommonUtils.readJsonSchemaNode("test-aas-schema.json")); - assertEquals(111, schema.getRequiredPaths().size()); + assertEquals(166, schema.getRequiredPaths().size()); assertFalse(schema.isHasVariants()); assertEquals(0, schema.getPatternProperties().size()); }