Skip to content
This repository was archived by the owner on Nov 24, 2022. It is now read-only.

Commit e0eee3a

Browse files
committed
Merge remote-tracking branch 'origin/master' into 2.0-OpenAPITools
2 parents 73c1388 + 6a83fb0 commit e0eee3a

39 files changed

Lines changed: 1444 additions & 332 deletions

File tree

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public class ParseOptions {
55
private boolean resolveCombinators = true;
66
private boolean resolveFully;
77
private boolean flatten;
8+
private boolean skipMatches;
89

910
public boolean isResolve() {
1011
return resolve;
@@ -33,4 +34,12 @@ public void setResolveFully(boolean resolveFully) {
3334
public boolean isFlatten() { return flatten; }
3435

3536
public void setFlatten(boolean flatten) { this.flatten = flatten; }
37+
38+
public boolean isSkipMatches() {
39+
return skipMatches;
40+
}
41+
42+
public void setSkipMatches(boolean skipMatches) {
43+
this.skipMatches = skipMatches;
44+
}
3645
}

modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import io.swagger.parser.SwaggerResolver;
3333
import io.swagger.parser.util.SwaggerDeserializationResult;
3434
import io.swagger.v3.core.util.Json;
35+
import io.swagger.v3.core.util.PrimitiveType;
36+
import io.swagger.v3.core.util.Yaml;
3537
import io.swagger.v3.oas.models.Components;
3638
import io.swagger.v3.oas.models.ExternalDocumentation;
3739
import io.swagger.v3.oas.models.OpenAPI;
@@ -59,6 +61,7 @@
5961
import io.swagger.v3.oas.models.security.SecurityScheme;
6062
import io.swagger.v3.oas.models.servers.Server;
6163
import io.swagger.v3.oas.models.tags.Tag;
64+
import io.swagger.v3.parser.OpenAPIV3Parser;
6265
import io.swagger.v3.parser.core.extensions.SwaggerParserExtension;
6366
import io.swagger.v3.parser.core.models.AuthorizationValue;
6467
import io.swagger.v3.parser.core.models.ParseOptions;
@@ -106,7 +109,23 @@ public SwaggerParseResult readContents(String swaggerAsString, List<Authorizatio
106109
result.setSwagger(resolved);
107110
}
108111
}
109-
return convert(result);
112+
SwaggerParseResult out = convert(result);
113+
if (out != null && options != null && options.isFlatten()) {
114+
try {
115+
SwaggerParseResult resultV3 = new OpenAPIV3Parser().readContents(Yaml.pretty(out.getOpenAPI()), auth, options);
116+
out.setOpenAPI(resultV3.getOpenAPI());
117+
if (out.getMessages() != null) {
118+
out.getMessages().addAll(resultV3.getMessages());
119+
out.messages(out.getMessages().stream()
120+
.distinct()
121+
.collect(Collectors.toList()));
122+
} else {
123+
out.messages(resultV3.getMessages());
124+
}
125+
} catch (Exception ignore) {}
126+
}
127+
return out;
128+
110129
}
111130

112131
public List<io.swagger.models.auth.AuthorizationValue> convert(List<AuthorizationValue> auths) {
@@ -692,9 +711,20 @@ private Schema convert(SerializableParameter sp) {
692711
}
693712
schema = as;
694713
} else {
695-
schema = new Schema();
696-
schema.setType(sp.getType());
697-
schema.setFormat(sp.getFormat());
714+
PrimitiveType ptype = PrimitiveType.fromTypeAndFormat(sp.getType(), sp.getFormat());
715+
if (ptype != null) {
716+
schema = ptype.createProperty();
717+
} else {
718+
ptype = PrimitiveType.fromTypeAndFormat(sp.getType(), null);
719+
if (ptype != null) {
720+
schema = ptype.createProperty();
721+
schema.setFormat(sp.getFormat());
722+
} else {
723+
schema = new Schema();
724+
schema.setType(sp.getType());
725+
schema.setFormat(sp.getFormat());
726+
}
727+
}
698728
}
699729

700730
schema.setDescription(sp.getDescription());

modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import io.swagger.v3.oas.models.headers.Header;
88
import io.swagger.v3.oas.models.info.Info;
99
import io.swagger.v3.oas.models.media.ArraySchema;
10+
import io.swagger.v3.oas.models.media.BooleanSchema;
1011
import io.swagger.v3.oas.models.media.ComposedSchema;
1112
import io.swagger.v3.oas.models.media.IntegerSchema;
13+
import io.swagger.v3.oas.models.media.StringSchema;
1214
import io.swagger.v3.oas.models.media.Schema;
1315
import io.swagger.v3.oas.models.parameters.Parameter;
1416
import io.swagger.v3.oas.models.parameters.RequestBody;
@@ -91,6 +93,7 @@ public class V2ConverterTest {
9193
private static final String ISSUE_820_YAML = "issue-820.yaml";
9294
private static final String ISSUE_1032_YAML = "issue-1032.yaml";
9395
private static final String ISSUE_1113_YAML = "issue-1113.yaml";
96+
private static final String ISSUE_1164_YAML = "issue-1164.yaml";
9497

9598
private static final String API_BATCH_PATH = "/api/batch/";
9699
private static final String PETS_PATH = "/pets";
@@ -797,7 +800,37 @@ public void testIssue1113() throws Exception {
797800
assertNotNull(oas.getServers().get(0));
798801
assertEquals(oas.getServers().get(0).getUrl(), "/test");
799802
}
800-
803+
804+
@Test(description = "OpenAPI v2 converter - uses specialized schema subclasses where available")
805+
public void testIssue1164() throws Exception {
806+
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_1164_YAML);
807+
assertNotNull(oas);
808+
assertNotNull(oas.getPaths());
809+
assertNotNull(oas.getPaths().get("/foo"));
810+
assertNotNull(oas.getPaths().get("/foo").getGet());
811+
assertNotNull(oas.getPaths().get("/foo").getGet().getRequestBody());
812+
assertNotNull(oas.getPaths().get("/foo").getGet().getRequestBody().getContent());
813+
assertNotNull(oas.getPaths().get("/foo").getGet().getRequestBody().getContent().get("multipart/form-data"));
814+
Schema formSchema = oas.getPaths().get("/foo").getGet().getRequestBody().getContent().get("multipart/form-data").getSchema();
815+
assertNotNull(formSchema);
816+
assertNotNull(formSchema.getProperties());
817+
assertEquals(4, formSchema.getProperties().size());
818+
assertTrue(formSchema.getProperties().get("first") instanceof StringSchema);
819+
820+
assertTrue(formSchema.getProperties().get("second") instanceof BooleanSchema);
821+
822+
assertTrue(formSchema.getProperties().get("third") instanceof StringSchema);
823+
StringSchema third = (StringSchema) formSchema.getProperties().get("third");
824+
assertNotNull(third.getFormat());
825+
assertTrue("password".equals(third.getFormat()));
826+
827+
assertTrue(formSchema.getProperties().get("fourth") instanceof BooleanSchema);
828+
Schema fourth = (Schema) formSchema.getProperties().get("fourth");
829+
assertNotNull(fourth.getType());
830+
assertNotNull(fourth.getFormat());
831+
assertTrue("completely-custom".equals(fourth.getFormat()));
832+
}
833+
801834
private OpenAPI getConvertedOpenAPIFromJsonFile(String file) throws IOException, URISyntaxException {
802835
SwaggerConverter converter = new SwaggerConverter();
803836
String swaggerAsString = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource(file).toURI())));
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
swagger: '2.0'
2+
info:
3+
title: Test for Issue 1164
4+
version: 1.0.0
5+
paths:
6+
/foo:
7+
get:
8+
operationId: doFoo
9+
parameters:
10+
- in: formData
11+
name: first
12+
type: string
13+
required: true
14+
- in: formData
15+
name: second
16+
type: boolean
17+
required: true
18+
- in: formData
19+
name: third
20+
type: string
21+
format: password
22+
required: true
23+
- in: formData
24+
name: fourth
25+
type: boolean
26+
format: completely-custom
27+
required: true
28+
responses:
29+
'200':
30+
description: OK

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public OpenAPI resolve() {
4949
pathProcessor.processPaths();
5050
componentsProcessor.processComponents();
5151

52+
5253
if(openApi.getPaths() != null) {
5354
for(String pathname : openApi.getPaths().keySet()) {
5455
PathItem pathItem = openApi.getPaths().get(pathname);

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.slf4j.LoggerFactory;
1919

2020
import java.net.URI;
21+
import java.nio.charset.Charset;
2122
import java.nio.file.Files;
2223
import java.nio.file.Path;
2324
import java.nio.file.Paths;
@@ -30,11 +31,23 @@
3031
public class OpenAPIV3Parser implements SwaggerParserExtension {
3132
private static ObjectMapper JSON_MAPPER, YAML_MAPPER;
3233
private static final Logger LOGGER = LoggerFactory.getLogger(OpenAPIV3Parser.class);
34+
private static String encoding = "UTF-8";
3335

3436
static {
3537
JSON_MAPPER = ObjectMapperFactory.createJson();
3638
YAML_MAPPER = ObjectMapperFactory.createYaml();
3739
}
40+
41+
public static String getEncoding() {
42+
return encoding;
43+
}
44+
45+
public static void setEncoding(String encoding) {
46+
if (Charset.isSupported(encoding)) {
47+
OpenAPIV3Parser.encoding = encoding;
48+
}
49+
}
50+
3851
@Override
3952
public SwaggerParseResult readLocation(String url, List<AuthorizationValue> auth, ParseOptions options) {
4053
SwaggerParseResult result = new SwaggerParseResult();
@@ -55,9 +68,10 @@ public SwaggerParseResult readLocation(String url, List<AuthorizationValue> auth
5568
if (options.isResolveFully()) {
5669
result.setOpenAPI(resolver.resolve());
5770
new ResolverFully(options.isResolveCombinators()).resolveFully(result.getOpenAPI());
58-
}else if (options.isFlatten()){
59-
InlineModelResolver inlineResolver = new InlineModelResolver();
60-
inlineResolver.flatten(result.getOpenAPI());
71+
} else if (options.isFlatten()) {
72+
InlineModelResolver inlineModelResolver = new InlineModelResolver();
73+
inlineModelResolver.setSkipMatches(options.isSkipMatches());
74+
inlineModelResolver.flatten(result.getOpenAPI());
6175
}
6276
}
6377
}
@@ -130,7 +144,7 @@ public SwaggerParseResult readWithInfo(String location, List<AuthorizationValue>
130144
path = Paths.get(location);
131145
}
132146
if (Files.exists(path)) {
133-
data = FileUtils.readFileToString(path.toFile(), "UTF-8");
147+
data = FileUtils.readFileToString(path.toFile(), encoding);
134148
} else {
135149
data = ClasspathHelper.loadFileFromClasspath(location);
136150
}
@@ -181,7 +195,9 @@ public SwaggerParseResult readContents(String swaggerAsString, List<Authorizatio
181195
result.setOpenAPI(new OpenAPIResolver(result.getOpenAPI(), auth, null).resolve());
182196
new ResolverFully(options.isResolveCombinators()).resolveFully(result.getOpenAPI());
183197
} else if (options.isFlatten()) {
184-
new InlineModelResolver().flatten(result.getOpenAPI());
198+
InlineModelResolver inlineModelResolver = new InlineModelResolver();
199+
inlineModelResolver.setSkipMatches(options.isSkipMatches());
200+
inlineModelResolver.flatten(result.getOpenAPI());
185201
}
186202
}else{
187203
JsonNode rootNode = mapper.readTree(swaggerAsString.getBytes());

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,13 @@ public <T> T loadRef(String ref, RefFormat refFormat, Class<T> expectedType) {
118118
if(parentDirectory != null) {
119119
contents = RefUtils.readExternalRef(file, refFormat, auths, parentDirectory);
120120
}
121-
else if(rootPath != null) {
121+
else if(rootPath != null && rootPath.startsWith("http")) {
122122
contents = RefUtils.readExternalUrlRef(file, refFormat, auths, rootPath);
123123
}
124+
else if (rootPath != null) {
125+
contents = RefUtils.readExternalClasspathRef(file, refFormat, auths, rootPath);
126+
127+
}
124128
externalFileCache.put(file, contents);
125129
}
126130

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public void processComponents() {
5555
return;
5656
}
5757

58-
final Map<String, Schema> schemas = openApi.getComponents().getSchemas();
58+
5959
final Map<String, ApiResponse> responses = openApi.getComponents().getResponses();
6060
final Map<String, RequestBody> requestBodies = openApi.getComponents().getRequestBodies();
6161
final Map<String, Parameter> parameters = openApi.getComponents().getParameters();
@@ -65,13 +65,7 @@ public void processComponents() {
6565
final Map<String, Callback> callbacks = openApi.getComponents().getCallbacks();
6666
final Map<String, SecurityScheme> securitySchemes = openApi.getComponents().getSecuritySchemes();
6767

68-
//schemas
69-
if (schemas != null) {
70-
Set<String> keySet = new LinkedHashSet<>();
71-
while(schemas.keySet().size() > keySet.size()) {
72-
processSchemas(keySet, schemas);
73-
}
74-
}
68+
7569

7670
//responses
7771
if (responses != null) {
@@ -136,6 +130,16 @@ public void processComponents() {
136130
processSecuritySchemes(keySet, securitySchemes);
137131
}
138132
}
133+
134+
final Map<String, Schema> schemas = openApi.getComponents().getSchemas();
135+
136+
//schemas
137+
if (schemas != null) {
138+
Set<String> keySet = new LinkedHashSet<>();
139+
while(schemas.keySet().size() > keySet.size()) {
140+
processSchemas(keySet, schemas);
141+
}
142+
}
139143
}
140144

141145
private void processSecuritySchemes(Set<String> securitySchemeKey, Map<String, SecurityScheme> securitySchemes) {

0 commit comments

Comments
 (0)