Skip to content

Commit 5f9778f

Browse files
authored
Merge branch 'master' into master
2 parents ccf39a3 + 153070c commit 5f9778f

File tree

54 files changed

+2663
-106
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2663
-106
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ You can include this library from Sonatype OSS for SNAPSHOTS, or Maven central f
114114
<dependency>
115115
<groupId>io.swagger.parser.v3</groupId>
116116
<artifactId>swagger-parser</artifactId>
117-
<version>2.1.22</version>
117+
<version>2.1.24</version>
118118
</dependency>
119119
```
120120

modules/swagger-parser-cli/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>swagger-parser-project</artifactId>
77
<groupId>io.swagger.parser.v3</groupId>
8-
<version>2.1.23-SNAPSHOT</version>
8+
<version>2.1.25-SNAPSHOT</version>
99
<relativePath>../..</relativePath>
1010
</parent>
1111
<modelVersion>4.0.0</modelVersion>
@@ -91,7 +91,7 @@
9191
<dependency>
9292
<groupId>io.swagger.parser.v3</groupId>
9393
<artifactId>swagger-parser-v3</artifactId>
94-
<version>2.1.23-SNAPSHOT</version>
94+
<version>2.1.25-SNAPSHOT</version>
9595
<scope>compile</scope>
9696
</dependency>
9797
<dependency>

modules/swagger-parser-core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<groupId>io.swagger.parser.v3</groupId>
55
<artifactId>swagger-parser-project</artifactId>
6-
<version>2.1.23-SNAPSHOT</version>
6+
<version>2.1.25-SNAPSHOT</version>
77
<relativePath>../..</relativePath>
88
</parent>
99
<modelVersion>4.0.0</modelVersion>

modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class ParseOptions {
1515
private boolean validateInternalRefs = true;
1616
private boolean legacyYamlDeserialization = false;
1717
private boolean resolveRequestBody = false;
18-
18+
private boolean resolveResponses = false;
1919
private boolean oaiAuthor;
2020
private boolean inferSchemaType = true;
2121
private boolean safelyResolveURL;
@@ -161,4 +161,12 @@ public List<String> getRemoteRefBlockList() {
161161
public void setRemoteRefBlockList(List<String> remoteRefBlockList) {
162162
this.remoteRefBlockList = remoteRefBlockList;
163163
}
164+
165+
public boolean isResolveResponses() {
166+
return resolveResponses;
167+
}
168+
169+
public void setResolveResponses(boolean resolveResponses) {
170+
this.resolveResponses = resolveResponses;
171+
}
164172
}

modules/swagger-parser-safe-url-resolver/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>io.swagger.parser.v3</groupId>
88
<artifactId>swagger-parser-project</artifactId>
9-
<version>2.1.23-SNAPSHOT</version>
9+
<version>2.1.25-SNAPSHOT</version>
1010
<relativePath>../../pom.xml</relativePath>
1111

1212
</parent>

modules/swagger-parser-v2-converter/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<groupId>io.swagger.parser.v3</groupId>
55
<artifactId>swagger-parser-project</artifactId>
6-
<version>2.1.23-SNAPSHOT</version>
6+
<version>2.1.25-SNAPSHOT</version>
77
<relativePath>../..</relativePath>
88
</parent>
99
<modelVersion>4.0.0</modelVersion>

modules/swagger-parser-v3/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<groupId>io.swagger.parser.v3</groupId>
55
<artifactId>swagger-parser-project</artifactId>
6-
<version>2.1.23-SNAPSHOT</version>
6+
<version>2.1.25-SNAPSHOT</version>
77
<relativePath>../..</relativePath>
88
</parent>
99
<modelVersion>4.0.0</modelVersion>

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java

Lines changed: 102 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44
import java.net.URI;
55
import java.nio.file.Paths;
66
import java.util.Collection;
7+
import java.util.Collections;
78
import java.util.LinkedHashMap;
89
import java.util.List;
910
import java.util.Map;
1011
import java.util.Objects;
12+
import java.util.Optional;
13+
import java.util.function.Function;
14+
import java.util.stream.Collectors;
15+
import java.util.stream.Stream;
1116

1217
import io.swagger.v3.oas.models.Components;
1318
import io.swagger.v3.oas.models.OpenAPI;
@@ -29,6 +34,7 @@
2934
import io.swagger.v3.parser.ResolverCache;
3035
import io.swagger.v3.parser.models.RefFormat;
3136
import io.swagger.v3.parser.models.RefType;
37+
3238
import org.apache.commons.io.FilenameUtils;
3339
import org.apache.commons.lang3.StringUtils;
3440
import org.slf4j.LoggerFactory;
@@ -246,9 +252,31 @@ private void processSchema(Schema property, String file) {
246252
}
247253
if (property instanceof ComposedSchema) {
248254
ComposedSchema composed = (ComposedSchema) property;
255+
final Map<String, String> refMap = Optional.ofNullable(composed.getDiscriminator())
256+
.map(Discriminator::getMapping).orElse(Collections.emptyMap()).entrySet()
257+
.stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
258+
Map<String, Schema> refCache = (!refMap.isEmpty() &&
259+
(composed.getAnyOf() != null || composed.getOneOf() != null)) ? Stream.of(
260+
composed.getAnyOf(), composed.getOneOf()
261+
)
262+
.filter(Objects::nonNull)
263+
.filter(l -> !l.isEmpty())
264+
.flatMap(Collection::stream)
265+
.filter(s -> s.get$ref() != null)
266+
.collect(Collectors.toMap(Schema::get$ref, Function.identity())) : Collections.emptyMap();
267+
249268
processProperties(composed.getAllOf(), file);
250269
processProperties(composed.getAnyOf(), file);
251270
processProperties(composed.getOneOf(), file);
271+
272+
if (!refMap.isEmpty() && !refCache.isEmpty()) {
273+
refCache.entrySet()
274+
.stream().filter(e -> !e.getKey().equals(e.getValue().get$ref()))
275+
.forEach(entry -> {
276+
String newRef = entry.getValue().get$ref();
277+
property.getDiscriminator().getMapping().put(refMap.get(entry.getKey()), newRef);
278+
});
279+
}
252280
}
253281
}
254282
}
@@ -298,71 +326,75 @@ public PathItem processRefToExternalPathItem(String $ref, RefFormat refFormat) {
298326
cache.putRenamedRef($ref, newRef);
299327

300328
if(pathItem != null) {
301-
if(pathItem.readOperationsMap() != null) {
302-
final Map<PathItem.HttpMethod, Operation> operationMap = pathItem.readOperationsMap();
303-
for (PathItem.HttpMethod httpMethod : operationMap.keySet()) {
304-
Operation operation = operationMap.get(httpMethod);
305-
if (operation.getResponses() != null) {
306-
final Map<String, ApiResponse> responses = operation.getResponses();
307-
if (responses != null) {
308-
for (String responseCode : responses.keySet()) {
309-
ApiResponse response = responses.get(responseCode);
310-
if (response != null) {
311-
Schema schema = null;
312-
if (response.getContent() != null) {
313-
Map<String, MediaType> content = response.getContent();
314-
for (String mediaName : content.keySet()) {
315-
MediaType mediaType = content.get(mediaName);
316-
if (mediaType.getSchema() != null) {
317-
schema = mediaType.getSchema();
318-
if (schema != null) {
319-
processRefSchemaObject(mediaType.getSchema(), $ref);
320-
}
321-
if (mediaType.getExamples() != null) {
322-
processRefExamples(mediaType.getExamples(), $ref);
323-
}
329+
processPathItem(pathItem, $ref);
330+
}
331+
332+
return pathItem;
333+
}
324334

335+
private void processPathItem(PathItem pathItem, String $ref) {
336+
if(pathItem.readOperationsMap() != null) {
337+
final Map<PathItem.HttpMethod, Operation> operationMap = pathItem.readOperationsMap();
338+
for (PathItem.HttpMethod httpMethod : operationMap.keySet()) {
339+
Operation operation = operationMap.get(httpMethod);
340+
if (operation.getResponses() != null) {
341+
final Map<String, ApiResponse> responses = operation.getResponses();
342+
if (responses != null) {
343+
for (String responseCode : responses.keySet()) {
344+
ApiResponse response = responses.get(responseCode);
345+
if (response != null) {
346+
Schema schema = null;
347+
if (response.getContent() != null) {
348+
Map<String, MediaType> content = response.getContent();
349+
for (String mediaName : content.keySet()) {
350+
MediaType mediaType = content.get(mediaName);
351+
if (mediaType.getSchema() != null) {
352+
schema = mediaType.getSchema();
353+
if (schema != null) {
354+
processRefSchemaObject(mediaType.getSchema(), $ref);
355+
}
356+
if (mediaType.getExamples() != null) {
357+
processRefExamples(mediaType.getExamples(), $ref);
325358
}
359+
326360
}
327361
}
328-
if (response.getLinks() != null) {
329-
processRefLinks(response.getLinks(), $ref);
330-
}
331-
if (response.getHeaders() != null) {
332-
processRefHeaders(response.getHeaders(), $ref);
333-
}
362+
}
363+
if (response.getLinks() != null) {
364+
processRefLinks(response.getLinks(), $ref);
365+
}
366+
if (response.getHeaders() != null) {
367+
processRefHeaders(response.getHeaders(), $ref);
334368
}
335369
}
336370
}
337371
}
338-
if (operation.getRequestBody() != null) {
339-
RequestBody body = operation.getRequestBody();
340-
if (body.getContent() != null) {
341-
Schema schema;
342-
Map<String, MediaType> content = body.getContent();
343-
for (String mediaName : content.keySet()) {
344-
MediaType mediaType = content.get(mediaName);
345-
if (mediaType.getSchema() != null) {
346-
schema = mediaType.getSchema();
347-
if (schema != null) {
348-
processRefSchemaObject(mediaType.getSchema(), $ref);
349-
}
372+
}
373+
if (operation.getRequestBody() != null) {
374+
RequestBody body = operation.getRequestBody();
375+
if (body.getContent() != null) {
376+
Schema schema;
377+
Map<String, MediaType> content = body.getContent();
378+
for (String mediaName : content.keySet()) {
379+
MediaType mediaType = content.get(mediaName);
380+
if (mediaType.getSchema() != null) {
381+
schema = mediaType.getSchema();
382+
if (schema != null) {
383+
processRefSchemaObject(mediaType.getSchema(), $ref);
350384
}
351385
}
352386
}
353387
}
388+
}
354389

355-
final List<Parameter> parameters = operation.getParameters();
356-
if (parameters != null) {
357-
parameters.stream()
358-
.filter(parameter -> parameter.getSchema() != null)
359-
.forEach(parameter -> this.processRefSchemaObject(parameter.getSchema(), $ref));
360-
}
390+
final List<Parameter> parameters = operation.getParameters();
391+
if (parameters != null) {
392+
parameters.stream()
393+
.filter(parameter -> parameter.getSchema() != null)
394+
.forEach(parameter -> this.processRefSchemaObject(parameter.getSchema(), $ref));
361395
}
362396
}
363397
}
364-
365-
return pathItem;
366398
}
367399

368400
private void processDiscriminator(Discriminator d, String file) {
@@ -838,6 +870,9 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
838870
if(parameter.getSchema() != null){
839871
processRefSchemaObject(parameter.getSchema(), $ref);
840872
}
873+
if(parameter.getExamples() != null) {
874+
processRefExamples(parameter.getExamples(), $ref);
875+
}
841876
}
842877

843878
return newRef;
@@ -897,6 +932,24 @@ public String processRefToExternalCallback(String $ref, RefFormat refFormat) {
897932
processRefToExternalCallback(file + callback.get$ref(), RefFormat.RELATIVE);
898933
}
899934
}
935+
} else {
936+
for (String path : callback.keySet()) {
937+
PathItem pathItem = callback.get(path);
938+
if(pathItem != null) {
939+
if (pathItem.get$ref() != null) {
940+
RefFormat pathRefFormat = computeRefFormat(pathItem.get$ref());
941+
String path$ref = pathItem.get$ref();
942+
if (isAnExternalRefFormat(refFormat)) {
943+
pathItem = this.processRefToExternalPathItem(path$ref, pathRefFormat);
944+
} else {
945+
pathItem = cache.loadRef(pathItem.get$ref(), refFormat, PathItem.class);
946+
}
947+
callback.put(path, pathItem);
948+
} else {
949+
this.processPathItem(pathItem, $ref);
950+
}
951+
}
952+
}
900953
}
901954
}
902955

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void processOperation(Operation operation) {
7070
for (String responseCode : responses.keySet()) {
7171
ApiResponse response = responses.get(responseCode);
7272
if(response != null) {
73-
//This part allows parser to put response inline without the resolveFully option set to true
74-
if (response.get$ref() != null) {
73+
//This part allows parser to put response inline when resolveResponses = true
74+
if (response.get$ref() != null && cache != null && cache.getParseOptions() != null && cache.getParseOptions().isResolveResponses()) {
7575

7676
responseProcessor.processResponse(response);
7777

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919
import io.swagger.v3.parser.models.RefFormat;
2020

2121
import java.util.ArrayList;
22+
import java.util.Collection;
23+
import java.util.HashMap;
2224
import java.util.List;
2325
import java.util.Map;
26+
import java.util.Objects;
27+
import java.util.stream.Stream;
2428

2529
import static io.swagger.v3.parser.util.RefUtils.computeRefFormat;
2630
import static io.swagger.v3.parser.util.RefUtils.isAnExternalRefFormat;
@@ -155,6 +159,9 @@ protected void updateRefs(PathItem path, String pathRef) {
155159
for (String name : callbacks.keySet()) {
156160
Callback callback = callbacks.get(name);
157161
if (callback != null) {
162+
if(callback.get$ref() != null) {
163+
callback.set$ref(computeRef(callback.get$ref(), pathRef));
164+
}
158165
for(String callbackName : callback.keySet()) {
159166
PathItem pathItem = callback.get(callbackName);
160167
updateRefs(pathItem,pathRef);
@@ -256,15 +263,33 @@ else if(model instanceof ComposedSchema) {
256263
for (Schema innerModel : composedSchema.getAllOf()) {
257264
updateRefs(innerModel, pathRef);
258265
}
259-
}if (composedSchema.getAnyOf() != null) {
260-
for(Schema innerModel : composedSchema.getAnyOf()) {
261-
updateRefs(innerModel, pathRef);
262-
}
263-
}if (composedSchema.getOneOf() != null) {
264-
for (Schema innerModel : composedSchema.getOneOf()) {
265-
updateRefs(innerModel, pathRef);
266+
}
267+
if (composedSchema.getAnyOf() != null || composedSchema.getOneOf() != null) {
268+
// Map to cache old - new refs in composed schemas
269+
Map<String, String> refMappings = composedSchema.getDiscriminator() != null &&
270+
composedSchema.getDiscriminator().getMapping() != null ? new HashMap<>() : null;
271+
272+
Stream.of(composedSchema.getAnyOf(), composedSchema.getOneOf())
273+
.filter(Objects::nonNull).filter(l -> !l.isEmpty())
274+
.flatMap(Collection::stream)
275+
.forEach(innerModel -> {
276+
String oldRef = innerModel.get$ref();
277+
updateRefs(innerModel, pathRef);
278+
if(oldRef != null && refMappings != null && !oldRef.equals(innerModel.get$ref())) {
279+
refMappings.put(oldRef, innerModel.get$ref());
280+
}
281+
});
282+
// Update refs in discriminator mappings
283+
if(refMappings != null && !refMappings.isEmpty()) {
284+
Map<String, String> discriminatorMappings = composedSchema.getDiscriminator().getMapping();
285+
for(String key : discriminatorMappings.keySet()) {
286+
if(refMappings.containsKey(discriminatorMappings.get(key))) {
287+
discriminatorMappings.put(key, refMappings.get(discriminatorMappings.get(key)));
288+
}
289+
}
266290
}
267291
}
292+
268293
}
269294
else if(model instanceof ArraySchema) {
270295
ArraySchema arraySchema = (ArraySchema) model;

0 commit comments

Comments
 (0)