Skip to content

Commit 58f2aa7

Browse files
HWeissbrodtfrantuma
authored andcommitted
fix patternproperties handling in SpecFilter.
1 parent 2e308bd commit 58f2aa7

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,19 @@ protected Map<String, Schema> filterComponentsSchema(OpenAPISpecFilter filter, M
255255
}
256256
}
257257

258+
Map<String, Schema> clonedPatternProperties = new LinkedHashMap<>();
259+
if (filteredDefinition.get().getPatternProperties() != null) {
260+
for (Object propName : filteredDefinition.get().getPatternProperties().keySet()) {
261+
Schema property = (Schema) filteredDefinition.get().getPatternProperties().get(propName);
262+
if (property != null) {
263+
Optional<Schema> filteredProperty = filter.filterSchemaProperty(property, definition, (String) propName, params, cookies, headers);
264+
if (filteredProperty.isPresent()) {
265+
clonedPatternProperties.put((String) propName, filteredProperty.get());
266+
}
267+
}
268+
}
269+
}
270+
258271
try {
259272
// TODO solve this, and generally handle clone and passing references
260273
Schema clonedModel;
@@ -269,6 +282,12 @@ protected Map<String, Schema> filterComponentsSchema(OpenAPISpecFilter filter, M
269282
if (!clonedProperties.isEmpty()) {
270283
clonedModel.setProperties(clonedProperties);
271284
}
285+
if(clonedModel.getPatternProperties() != null) {
286+
clonedModel.getPatternProperties().clear();
287+
}
288+
if(!clonedPatternProperties.isEmpty()) {
289+
clonedModel.setPatternProperties(clonedPatternProperties);
290+
}
272291
clonedComponentsSchema.put(key, clonedModel);
273292

274293
} catch (IOException e) {
@@ -304,6 +323,13 @@ private void addSchemaRef(Schema schema, Set<String> referencedDefinitions) {
304323
addSchemaRef((Schema)schema.getAdditionalProperties(), referencedDefinitions);
305324
}
306325

326+
if (schema.getPatternProperties() != null) {
327+
for (Object propName : schema.getPatternProperties().keySet()) {
328+
Schema property = (Schema) schema.getPatternProperties().get(propName);
329+
addSchemaRef(property, referencedDefinitions);
330+
}
331+
}
332+
307333
if (schema instanceof ArraySchema &&
308334
((ArraySchema) schema).getItems() != null) {
309335
addSchemaRef(((ArraySchema) schema).getItems(), referencedDefinitions);

modules/swagger-core/src/test/java/io/swagger/v3/core/filter/SpecFilterTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,11 @@ public void shouldRemoveBrokenNestedRefsKeepComposedSchemas() throws IOException
297297
final RemoveUnreferencedDefinitionsFilter remover = new RemoveUnreferencedDefinitionsFilter();
298298
final OpenAPI filtered = new SpecFilter().filter(openAPI, remover, null, null, null);
299299

300-
assertEquals(filtered.getComponents().getSchemas().size(), 4, "Expected to have parent and abstract child with both implementations schemas");
300+
assertEquals(filtered.getComponents().getSchemas().size(), 5, "Expected to have parent and abstract child with both implementations schemas");
301301
assertTrue(filtered.getComponents().getSchemas().containsKey("SomeChild1ImplObject"), "Schemas should contains child 1 implementation");
302302
assertTrue(filtered.getComponents().getSchemas().containsKey("SomeChild2ImplObject"), "Schemas should contains child 2 implementation");
303303
assertTrue(filtered.getComponents().getSchemas().containsKey("SomeChildObject"), "Schemas should contains child abstract parent");
304+
assertTrue(filtered.getComponents().getSchemas().containsKey("PatternPropertiesReferencedObject"), "Schemas should contains pattern properties referenced schema");
304305
}
305306

306307
@Test

modules/swagger-core/src/test/resources/specFiles/3.1.0/composed-schema-3.1.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
"SomeChildObject": {
1919
"description": "Some child object"
2020
},
21+
"PatternPropertiesReferencedObject": {
22+
"description": "An object schema with is ONLY referenced via pattern properties"
23+
},
2124
"SomeParentObject": {
2225
"description": "Some parent object",
2326
"properties": {
@@ -37,6 +40,11 @@
3740
}
3841
]
3942
}
43+
},
44+
"patternProperties": {
45+
"somePattern": {
46+
"$ref": "#/components/schemas/PatternPropertiesReferencedObject"
47+
}
4048
}
4149
}
4250
}

0 commit comments

Comments
 (0)