Skip to content

Commit 141d71f

Browse files
Merge pull request #2 from swagger-api/master
Sync to base
2 parents c5404fd + 26bcac1 commit 141d71f

File tree

88 files changed

+5365
-542
lines changed

Some content is hidden

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

88 files changed

+5365
-542
lines changed

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
**NOTE:** If you're looking for `swagger-parser` 1.X and OpenAPI 2.0, please refer to [v1 branch](https://github.com/swagger-api/swagger-parser/tree/v1)
44

5-
[![Build Status](https://img.shields.io/jenkins/s/https/jenkins.swagger.io/view/OSS%20-%20Java/job/oss-swagger-parser-v2.svg)](https://jenkins.swagger.io/view/OSS%20-%20Java/job/oss-swagger-parser-v2)
5+
[![Build Status](https://img.shields.io/jenkins/build.svg?jobUrl=https://jenkins.swagger.io/job/oss-swagger-parser-v2/)](https://jenkins.swagger.io/job/oss-swagger-parser-v2/)
6+
7+
[![Build Status](https://jenkins.swagger.io/view/OSS%20-%20Java/job/oss-swagger-parser-v2/badge/icon?subject=jenkins%20build%20-%20java%208)](https://jenkins.swagger.io/view/OSS%20-%20Java/job/oss-swagger-parser-v2/)
8+
9+
[![Build Status](https://jenkins.swagger.io/view/OSS%20-%20Java/job/oss-swagger-parser-v2-java9/badge/icon?subject=jenkins%20build%20-%20java%209)](https://jenkins.swagger.io/view/OSS%20-%20Java/job/oss-swagger-parser-v2-java9/)
610

711
## Overview
812
This is the Swagger Parser project, which reads OpenAPI definitions into current Java POJOs. It also provides a simple framework to add additional converters from different formats into the Swagger objects, making the entire toolchain available.
@@ -99,10 +103,13 @@ You can include this library from Sonatype OSS for SNAPSHOTS, or Maven central f
99103
<dependency>
100104
<groupId>io.swagger.parser.v3</groupId>
101105
<artifactId>swagger-parser</artifactId>
102-
<version>2.0.12</version>
106+
<version>2.0.16</version>
103107
</dependency>
104108
```
105109

110+
## Security contact
111+
112+
Please disclose any security-related issues or vulnerabilities by emailing [[email protected]](mailto:[email protected]), instead of using the public issue tracker.
106113

107114
License
108115
-------

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.0.13-SNAPSHOT</version>
6+
<version>2.0.17-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/AuthorizationValue.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
package io.swagger.v3.parser.core.models;
22

3+
import java.net.URL;
4+
import java.util.Objects;
5+
import java.util.function.Predicate;
6+
7+
38
public class AuthorizationValue {
49
private String value, type, keyName;
10+
private Predicate<URL> urlMatcher;
511

612
public AuthorizationValue() {
713
}
814

9-
public AuthorizationValue(String keyName, String value, String type) {
15+
public AuthorizationValue(String keyName, String value, String type, Predicate<URL> urlMatcher) {
1016
this.setKeyName(keyName);
1117
this.setValue(value);
1218
this.setType(type);
19+
this.setUrlMatcher(urlMatcher);
20+
}
21+
22+
public AuthorizationValue(String keyName, String value, String type) {
23+
this(keyName, value, type, url -> true);
1324
}
1425

1526
public AuthorizationValue value(String value) {
@@ -27,6 +38,11 @@ public AuthorizationValue keyName(String keyName) {
2738
return this;
2839
}
2940

41+
public AuthorizationValue urlMatcher(Predicate<URL> urlMatcher) {
42+
setUrlMatcher(urlMatcher);
43+
return this;
44+
}
45+
3046
public String getValue() {
3147
return value;
3248
}
@@ -51,13 +67,22 @@ public void setKeyName(String keyName) {
5167
this.keyName = keyName;
5268
}
5369

70+
public Predicate<URL> getUrlMatcher() {
71+
return urlMatcher;
72+
}
73+
74+
public void setUrlMatcher(Predicate<URL> urlMatcher) {
75+
this.urlMatcher = Objects.requireNonNull(urlMatcher);
76+
}
77+
5478
@Override
5579
public int hashCode() {
5680
final int prime = 31;
5781
int result = 1;
5882
result = prime * result + ((keyName == null) ? 0 : keyName.hashCode());
5983
result = prime * result + ((type == null) ? 0 : type.hashCode());
6084
result = prime * result + ((value == null) ? 0 : value.hashCode());
85+
result = prime * result + urlMatcher.hashCode();
6186
return result;
6287
}
6388

@@ -94,6 +119,9 @@ public boolean equals(Object obj) {
94119
} else if (!value.equals(other.value)) {
95120
return false;
96121
}
122+
if (!urlMatcher.equals(other.urlMatcher)) {
123+
return false;
124+
}
97125
return true;
98126
}
99127
}

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/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.0.13-SNAPSHOT</version>
6+
<version>2.0.17-SNAPSHOT</version>
77
<relativePath>../..</relativePath>
88
</parent>
99
<modelVersion>4.0.0</modelVersion>

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

Lines changed: 52 additions & 15 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) {
@@ -420,7 +439,7 @@ private List<Server> convert(List<Scheme> schemes, String host, String basePath)
420439
servers.add(server);
421440
}
422441
} else {
423-
if (!"/".equals(baseUrl)) {
442+
if (!StringUtils.startsWith(baseUrl, "/") && !"/".equals(baseUrl)) {
424443
baseUrl = "//" + baseUrl;
425444
}
426445
Server server = new Server();
@@ -555,6 +574,7 @@ public Operation convert(io.swagger.models.Operation v2Operation) {
555574
}
556575
operation.setDeprecated(v2Operation.isDeprecated());
557576
operation.setOperationId(v2Operation.getOperationId());
577+
operation.setExtensions(convert(v2Operation.getVendorExtensions()));
558578

559579
operation.setTags(v2Operation.getTags());
560580

@@ -566,6 +586,7 @@ public Operation convert(io.swagger.models.Operation v2Operation) {
566586
formParams.add(param);
567587
} else if ("body".equals(param.getIn())) {
568588
operation.setRequestBody(convertParameterToRequestBody(param, v2Operation.getConsumes()));
589+
operation.addExtension("x-codegen-request-body-name", param.getName());
569590
} else {
570591
Parameter convert = convert(param);
571592
String $ref = convert.get$ref();
@@ -612,8 +633,6 @@ public Operation convert(io.swagger.models.Operation v2Operation) {
612633
operation.setSecurity(convertSecurityRequirementsMap(v2Operation.getSecurity()));
613634
}
614635

615-
operation.setExtensions(convert(v2Operation.getVendorExtensions()));
616-
617636
return operation;
618637
}
619638

@@ -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());
@@ -1142,6 +1172,9 @@ public Schema convert(io.swagger.models.Model v2Model) {
11421172
composed.setTitle(composedModel.getTitle());
11431173
composed.setExtensions(convert(composedModel.getVendorExtensions()));
11441174
composed.setAllOf(composedModel.getAllOf().stream().map(this::convert).collect(Collectors.toList()));
1175+
1176+
addProperties(v2Model, composed);
1177+
11451178
result = composed;
11461179
} else {
11471180
String v2discriminator = null;
@@ -1155,14 +1188,7 @@ public Schema convert(io.swagger.models.Model v2Model) {
11551188

11561189
result = Json.mapper().convertValue(v2Model, Schema.class);
11571190

1158-
if ((v2Model.getProperties() != null) && (v2Model.getProperties().size() > 0)) {
1159-
Map<String, Property> properties = v2Model.getProperties();
1160-
1161-
properties.forEach((k, v) -> {
1162-
result.addProperties(k, convert(v));
1163-
});
1164-
1165-
}
1191+
addProperties(v2Model, result);
11661192

11671193
if (v2Model instanceof ModelImpl) {
11681194
ModelImpl model = (ModelImpl) v2Model;
@@ -1195,5 +1221,16 @@ public Schema convert(io.swagger.models.Model v2Model) {
11951221

11961222
return result;
11971223
}
1224+
1225+
private void addProperties(Model v2Model, Schema schema) {
1226+
if ((v2Model.getProperties() != null) && (v2Model.getProperties().size() > 0)) {
1227+
Map<String, Property> properties = v2Model.getProperties();
1228+
1229+
properties.forEach((k, v) -> {
1230+
schema.addProperties(k, convert(v));
1231+
});
1232+
1233+
}
1234+
}
11981235
}
11991236

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

Lines changed: 54 additions & 3 deletions
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;
@@ -90,6 +92,8 @@ public class V2ConverterTest {
9092
private static final String ISSUE_768_JSON = "issue-786.json";
9193
private static final String ISSUE_820_YAML = "issue-820.yaml";
9294
private static final String ISSUE_1032_YAML = "issue-1032.yaml";
95+
private static final String ISSUE_1113_YAML = "issue-1113.yaml";
96+
private static final String ISSUE_1164_YAML = "issue-1164.yaml";
9397

9498
private static final String API_BATCH_PATH = "/api/batch/";
9599
private static final String PETS_PATH = "/pets";
@@ -674,8 +678,15 @@ public void testIssue758() throws Exception {
674678
public void testIssue762() throws Exception {
675679
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_762_JSON);
676680
assertNotNull(oas);
677-
}
678-
681+
}
682+
683+
@Test(description = "OpenAPI v2 Converter: Ensure body name is preserved in x-codegen-request-body-name extension")
684+
public void testPreserveBodyParameterName() throws Exception {
685+
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_762_JSON);
686+
assertNotNull(oas);
687+
assertEquals(oas.getPaths().get("/").getPut().getExtensions().get("x-codegen-request-body-name"), "pet");
688+
}
689+
679690
@Test(description = "requestBody not correctly populated when Parameters is a list of $refs (OAS 2 to 3 conversion)")
680691
public void testIssue765() throws Exception {
681692
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_765_YAML);
@@ -779,7 +790,47 @@ public void testIssue1032() throws Exception {
779790
assertEquals(INTEGER_TYPE, integerSchema.getType());
780791
assertEquals(INT64_FORMAT, integerSchema.getFormat());
781792
}
782-
793+
794+
@Test(description = "OpenAPI v2 converter - converts URL correctly when it begins with forward slash")
795+
public void testIssue1113() throws Exception {
796+
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_1113_YAML);
797+
assertNotNull(oas);
798+
assertNotNull(oas.getServers());
799+
assertFalse(oas.getServers().isEmpty());
800+
assertNotNull(oas.getServers().get(0));
801+
assertEquals(oas.getServers().get(0).getUrl(), "/test");
802+
}
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+
783834
private OpenAPI getConvertedOpenAPIFromJsonFile(String file) throws IOException, URISyntaxException {
784835
SwaggerConverter converter = new SwaggerConverter();
785836
String swaggerAsString = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource(file).toURI())));
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
swagger: '2.0'
2+
info:
3+
title: Test for Issue 1113
4+
version: 1.0.0
5+
basePath: /test
6+
paths:
7+
/ping:
8+
get:
9+
summary: test
10+
description: 'test'
11+
operationId: pingOp
12+
responses:
13+
'200':
14+
description: OK

0 commit comments

Comments
 (0)