Skip to content

Commit 11b31ec

Browse files
committed
oas 3.1 - dereference support
1 parent 114f05d commit 11b31ec

File tree

191 files changed

+7266
-216
lines changed

Some content is hidden

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

191 files changed

+7266
-216
lines changed

.editorconfig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ charset = utf-8
1515

1616
[modules/swagger-parser-v3/src/test/resources/**/*.json]
1717
trim_trailing_whitespace = false
18-
18+
insert_final_newline = false
1919
[modules/swagger-parser-v3/src/test/resources/**/*.yaml]
2020
trim_trailing_whitespace = false
21+
insert_final_newline = false

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIResolver.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ public OpenAPI resolve() {
7272
pathProcessor.processPaths();
7373
componentsProcessor.processComponents();
7474

75-
7675
if(openApi.getPaths() != null) {
7776
for(String pathname : openApi.getPaths().keySet()) {
7877
PathItem pathItem = openApi.getPaths().get(pathname);
@@ -83,7 +82,6 @@ public OpenAPI resolve() {
8382
}
8483
}
8584
}
86-
8785
return openApi;
8886
}
8987

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import io.swagger.v3.parser.core.models.SwaggerParseResult;
1111
import io.swagger.v3.parser.exception.EncodingNotSupportedException;
1212
import io.swagger.v3.parser.exception.ReadContentException;
13+
import io.swagger.v3.parser.reference.DereferencerContext;
14+
import io.swagger.v3.parser.reference.DereferencersFactory;
15+
import io.swagger.v3.parser.reference.OpenAPIDereferencer;
1316
import io.swagger.v3.parser.util.ClasspathHelper;
1417
import io.swagger.v3.parser.util.DeserializationUtils;
1518
import io.swagger.v3.parser.util.InlineModelResolver;
@@ -145,7 +148,7 @@ public SwaggerParseResult readContents(String yaml) {
145148
return readContents(yaml, null, options);
146149
}
147150

148-
private SwaggerParseResult readContents(String swaggerAsString, List<AuthorizationValue> auth, ParseOptions options,
151+
public SwaggerParseResult readContents(String swaggerAsString, List<AuthorizationValue> auth, ParseOptions options,
149152
String location) {
150153
if (swaggerAsString == null || swaggerAsString.trim().isEmpty()) {
151154
return SwaggerParseResult.ofError("Null or empty definition");
@@ -202,9 +205,26 @@ private SwaggerParseResult resolve(SwaggerParseResult result, List<Authorization
202205
try {
203206
if (options != null) {
204207
if (options.isResolve() || options.isResolveFully()) {
205-
OpenAPIResolver resolver = new OpenAPIResolver(result.getOpenAPI(), emptyListIfNull(auth),
206-
location, null, options);
207-
resolver.resolve(result);
208+
if (result.getOpenAPI().getOpenapi() != null && result.getOpenAPI().getOpenapi().startsWith("3.1")) {
209+
DereferencerContext dereferencerContext = new DereferencerContext(
210+
result,
211+
auth,
212+
location,
213+
options,
214+
null,
215+
null,
216+
true
217+
);
218+
List<OpenAPIDereferencer> dereferencers = DereferencersFactory.getInstance().getDereferencers();
219+
if (dereferencers.iterator().hasNext()) {
220+
OpenAPIDereferencer dereferencer = dereferencers.iterator().next();
221+
dereferencer.dereference(dereferencerContext, dereferencers.iterator());
222+
}
223+
} else {
224+
OpenAPIResolver resolver = new OpenAPIResolver(result.getOpenAPI(), emptyListIfNull(auth),
225+
location, null, options);
226+
resolver.resolve(result);
227+
}
208228
if (options.isResolveFully()) {
209229
new ResolverFully(options.isResolveCombinators()).resolveFully(result.getOpenAPI());
210230
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.swagger.v3.parser.processors;
22

33

4-
import java.io.File;
54
import java.net.URI;
65
import java.nio.file.Paths;
76
import java.util.Collection;
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package io.swagger.v3.parser.reference;
2+
3+
import io.swagger.v3.oas.models.Components;
4+
import io.swagger.v3.oas.models.OpenAPI;
5+
import io.swagger.v3.oas.models.Operation;
6+
import io.swagger.v3.oas.models.PathItem;
7+
import io.swagger.v3.oas.models.Paths;
8+
import io.swagger.v3.oas.models.examples.Example;
9+
import io.swagger.v3.oas.models.headers.Header;
10+
import io.swagger.v3.oas.models.links.Link;
11+
import io.swagger.v3.oas.models.media.Encoding;
12+
import io.swagger.v3.oas.models.media.MediaType;
13+
import io.swagger.v3.oas.models.media.Schema;
14+
import io.swagger.v3.oas.models.parameters.Parameter;
15+
import io.swagger.v3.oas.models.parameters.RequestBody;
16+
import io.swagger.v3.oas.models.responses.ApiResponse;
17+
import io.swagger.v3.oas.models.responses.ApiResponses;
18+
import io.swagger.v3.oas.models.security.SecurityScheme;
19+
20+
import java.util.List;
21+
22+
public abstract class AbstractVisitor implements Visitor {
23+
24+
@Override
25+
public OpenAPI visitOpenApi(OpenAPI openAPI){
26+
return null;
27+
}
28+
@Override
29+
public Paths visitPaths(Paths paths){
30+
return null;
31+
}
32+
33+
@Override
34+
public Components visitComponents(Components components){
35+
return null;
36+
}
37+
38+
@Override
39+
public PathItem visitPathItem(PathItem pathItem){
40+
return null;
41+
}
42+
43+
@Override
44+
public Parameter visitParameter(Parameter parameter){
45+
return null;
46+
}
47+
48+
@Override
49+
public Operation visitOperation(Operation operation){
50+
return null;
51+
}
52+
53+
@Override
54+
public Schema visitSchema(Schema schema, List<String> inheritedIds){
55+
return null;
56+
}
57+
58+
@Override
59+
public ApiResponse visitResponse(ApiResponse response){
60+
return null;
61+
}
62+
63+
@Override
64+
public RequestBody visitRequestBody(RequestBody requestBody){
65+
return null;
66+
}
67+
68+
@Override
69+
public Link visitLink(Link link){
70+
return null;
71+
}
72+
73+
@Override
74+
public SecurityScheme visitSecurityScheme(SecurityScheme securityScheme){
75+
return null;
76+
}
77+
78+
@Override
79+
public ApiResponses visitResponses(ApiResponses responses){
80+
return null;
81+
}
82+
83+
@Override
84+
public MediaType visitMediaType(MediaType mediaType){
85+
return null;
86+
}
87+
88+
@Override
89+
public Encoding visitEncoding(Encoding encoding){
90+
return null;
91+
}
92+
93+
@Override
94+
public Header visitHeader(Header header){
95+
return null;
96+
}
97+
98+
@Override
99+
public Example visitExample(Example example){
100+
return null;
101+
}
102+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package io.swagger.v3.parser.reference;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import io.swagger.v3.parser.core.models.AuthorizationValue;
5+
import io.swagger.v3.parser.core.models.ParseOptions;
6+
import io.swagger.v3.parser.core.models.SwaggerParseResult;
7+
8+
import java.util.LinkedHashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
public class DereferencerContext {
13+
14+
protected final OpenAPI openApi;
15+
16+
protected final List<AuthorizationValue> auths;
17+
protected final String rootUri;
18+
protected final ParseOptions parseOptions;
19+
protected String providedBaseUri;
20+
protected SwaggerParseResult swaggerParseResult;
21+
protected boolean addParametersToEachOperation = true;
22+
protected String currentUri;
23+
24+
private Map<String, Reference> referenceSet = new LinkedHashMap<>();
25+
26+
public DereferencerContext(
27+
SwaggerParseResult swaggerParseResult,
28+
List<AuthorizationValue> auths,
29+
String rootUri,
30+
ParseOptions parseOptions,
31+
String providedBaseUri,
32+
Map<String, Reference> referenceSet,
33+
Boolean addParametersToEachOperation) {
34+
this.swaggerParseResult = swaggerParseResult;
35+
this.openApi = swaggerParseResult.getOpenAPI();
36+
this.auths = auths;
37+
this.rootUri = rootUri;
38+
this.currentUri = rootUri;
39+
this.parseOptions = parseOptions;
40+
this.providedBaseUri = providedBaseUri;
41+
this.addParametersToEachOperation = addParametersToEachOperation != null ? addParametersToEachOperation : true;
42+
this.referenceSet = referenceSet != null ? referenceSet : new LinkedHashMap<>();
43+
}
44+
45+
public OpenAPI getOpenApi() {
46+
return openApi;
47+
}
48+
49+
public List<AuthorizationValue> getAuths() {
50+
return auths;
51+
}
52+
53+
public String getRootUri() {
54+
return rootUri;
55+
}
56+
57+
public ParseOptions getParseOptions() {
58+
return parseOptions;
59+
}
60+
61+
public String getProvidedBaseUri() {
62+
return providedBaseUri;
63+
}
64+
65+
public SwaggerParseResult getSwaggerParseResult() {
66+
return swaggerParseResult;
67+
}
68+
69+
public boolean isAddParametersToEachOperation() {
70+
return addParametersToEachOperation;
71+
}
72+
73+
public void setAddParametersToEachOperation(boolean addParametersToEachOperation) {
74+
this.addParametersToEachOperation = addParametersToEachOperation;
75+
}
76+
77+
public String getCurrentUri() {
78+
return currentUri;
79+
}
80+
81+
public void setCurrentUri(String currentUri) {
82+
this.currentUri = currentUri;
83+
}
84+
85+
public DereferencerContext providedBaseUri(String providedBaseUri) {
86+
this.providedBaseUri = providedBaseUri;
87+
return this;
88+
}
89+
90+
public DereferencerContext swaggerParseResult(SwaggerParseResult swaggerParseResult) {
91+
this.swaggerParseResult = swaggerParseResult;
92+
return this;
93+
}
94+
95+
public DereferencerContext addParametersToEachOperation(boolean addParametersToEachOperation) {
96+
this.addParametersToEachOperation = addParametersToEachOperation;
97+
return this;
98+
}
99+
100+
public DereferencerContext currentUri(String currentUri) {
101+
this.currentUri = currentUri;
102+
return this;
103+
}
104+
105+
public Map<String, Reference> getReferenceSet() {
106+
return referenceSet;
107+
}
108+
109+
public void setReferenceSet(Map<String, Reference> referenceSet) {
110+
this.referenceSet = referenceSet;
111+
}
112+
113+
public DereferencerContext referenceSet(Map<String, Reference> referenceSet) {
114+
this.referenceSet = referenceSet;
115+
return this;
116+
}
117+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.swagger.v3.parser.reference;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import java.util.Collections;
7+
import java.util.Iterator;
8+
import java.util.List;
9+
import java.util.ServiceLoader;
10+
import java.util.concurrent.CopyOnWriteArrayList;
11+
12+
public class DereferencersFactory {
13+
14+
private static DereferencersFactory instance;
15+
static Logger LOGGER = LoggerFactory.getLogger(DereferencersFactory.class);
16+
private final List<OpenAPIDereferencer> dereferencers;
17+
18+
private DereferencersFactory() {
19+
dereferencers = new CopyOnWriteArrayList<>();
20+
dereferencers.add(new OpenAPIDereferencer31());
21+
}
22+
23+
public static DereferencersFactory getInstance() {
24+
if (instance == null) {
25+
instance = new DereferencersFactory();
26+
}
27+
return instance;
28+
}
29+
30+
public void addDereferencer(OpenAPIDereferencer dereferencer) {
31+
dereferencers.add(0, dereferencer);
32+
}
33+
34+
public void removeDereferencer(OpenAPIDereferencer dereferencer) {
35+
dereferencers.remove(dereferencer);
36+
}
37+
38+
public List<OpenAPIDereferencer> getDereferencers() {
39+
return Collections.unmodifiableList(dereferencers);
40+
}
41+
42+
static {
43+
ServiceLoader<OpenAPIDereferencer> loader = ServiceLoader.load(OpenAPIDereferencer.class);
44+
Iterator<OpenAPIDereferencer> itr = loader.iterator();
45+
while (itr.hasNext()) {
46+
OpenAPIDereferencer ext = itr.next();
47+
if (ext == null) {
48+
LOGGER.error("failed to load extension {}", ext);
49+
} else {
50+
instance.addDereferencer(ext);
51+
LOGGER.debug("adding OpenAPIDereferencer: {}", ext);
52+
}
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)