Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/maven-pulls.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
java-version: ${{ matrix.java }}
distribution: 'zulu'
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/maven-v1-pulls.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
java-version: ${{ matrix.java }}
distribution: 'zulu'
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/maven-v1.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/next-snapshot-v1.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/next-snapshot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/prepare-release-v1.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-v1.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache local Maven repository
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class ParseOptions {
private boolean safelyResolveURL;
private List<String> remoteRefAllowList;
private List<String> remoteRefBlockList;
private boolean explicitStyleAndExplode = true;


public boolean isResolve() {
Expand Down Expand Up @@ -169,4 +170,13 @@ public boolean isResolveResponses() {
public void setResolveResponses(boolean resolveResponses) {
this.resolveResponses = resolveResponses;
}

public boolean isExplicitStyleAndExplode() {
return explicitStyleAndExplode;
}

public void setExplicitStyleAndExplode(boolean explicitStyleAndExplode) {
this.explicitStyleAndExplode = explicitStyleAndExplode;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ public SwaggerParseResult deserialize(JsonNode rootNode, String path, ParseOptio
rootParse.setInferSchemaType(options.isInferSchemaType());
rootParse.setAllowEmptyStrings(options.isAllowEmptyString());
rootParse.setValidateInternalRefs(options.isValidateInternalRefs());
rootParse.setExplicitStyleAndExplode(options.isExplicitStyleAndExplode());
OpenAPI api = parseRoot(rootNode, rootParse, path);
result.openapi31(rootParse.isOpenapi31());
result.setOpenAPI(api);
Expand Down Expand Up @@ -1520,7 +1521,9 @@ public Encoding getEncoding(ObjectNode node, String location, ParseResult result
value = getString("style", node, false, location, result);

if (StringUtils.isBlank(value)) {
encoding.setStyle(Encoding.StyleEnum.FORM);
if (result.isExplicitStyleAndExplode()) {
encoding.setStyle(Encoding.StyleEnum.FORM);
}
} else {
if (value.equals(Encoding.StyleEnum.FORM.toString())) {
encoding.setStyle(Encoding.StyleEnum.FORM);
Expand Down Expand Up @@ -2131,9 +2134,9 @@ else if(parameter.getSchema() == null) {
Boolean explode = getBoolean("explode", obj, false, location, result);
if (explode != null) {
parameter.setExplode(explode);
} else if (StyleEnum.FORM.equals(parameter.getStyle())) {
} else if (StyleEnum.FORM.equals(parameter.getStyle()) && result.isExplicitStyleAndExplode()) {
parameter.setExplode(Boolean.TRUE);
} else {
} else if (result.isExplicitStyleAndExplode()){
parameter.setExplode(Boolean.FALSE);
}
}
Expand Down Expand Up @@ -2237,15 +2240,26 @@ public Header getHeader(ObjectNode headerNode, String location, ParseResult resu
header.setDeprecated(deprecated);
}

String style = getString("style", headerNode, false, location, result);
if (StringUtils.isBlank(style)) {
if (result.isExplicitStyleAndExplode()) {
header.setStyle(Header.StyleEnum.SIMPLE);
}
} else {
if (value.equals(Header.StyleEnum.SIMPLE.toString())) {
header.setStyle(Header.StyleEnum.SIMPLE);
} else {
result.invalidType(location, "style", "simple", headerNode);
}
}

Boolean explode = getBoolean("explode", headerNode, false, location, result);
if (explode != null) {
header.setExplode(explode);
} else {
} else if (result.isExplicitStyleAndExplode()){
header.setExplode(Boolean.FALSE);
}

header.setStyle(Header.StyleEnum.SIMPLE);

ObjectNode headerObject = getObject("schema", headerNode, false, location, result);
if (headerObject != null) {
header.setSchema(getSchema(headerObject, location, result));
Expand Down Expand Up @@ -3369,11 +3383,13 @@ public Example getExample(ObjectNode node, String location, ParseResult result)

public void setStyle(String value, Parameter parameter, String location, ObjectNode obj, ParseResult result) {
if (StringUtils.isBlank(value)) {
if (QUERY_PARAMETER.equals(parameter.getIn()) || COOKIE_PARAMETER.equals(parameter.getIn())) {
parameter.setStyle(StyleEnum.FORM);
} else if (PATH_PARAMETER.equals(parameter.getIn()) || HEADER_PARAMETER.equals(parameter.getIn())) {
parameter.setStyle(StyleEnum.SIMPLE);
}
if (result.isExplicitStyleAndExplode()) {
if (QUERY_PARAMETER.equals(parameter.getIn()) || COOKIE_PARAMETER.equals(parameter.getIn())) {
parameter.setStyle(StyleEnum.FORM);
} else if (PATH_PARAMETER.equals(parameter.getIn()) || HEADER_PARAMETER.equals(parameter.getIn())) {
parameter.setStyle(StyleEnum.SIMPLE);
}
}
} else {
if (value.equals(StyleEnum.FORM.toString())) {
parameter.setStyle(StyleEnum.FORM);
Expand Down Expand Up @@ -4275,6 +4291,8 @@ public static class ParseResult {
private boolean openapi31 = false;
private boolean oaiAuthor = false;

private boolean explicitStyleAndExplode = true;

public boolean isInferSchemaType() {
return inferSchemaType;
}
Expand Down Expand Up @@ -4370,6 +4388,19 @@ public ParseResult oaiAuthor(boolean oaiAuthor) {
return this;
}

public boolean isExplicitStyleAndExplode() {
return explicitStyleAndExplode;
}

public void setExplicitStyleAndExplode(boolean explicitStyleAndExplode) {
this.explicitStyleAndExplode = explicitStyleAndExplode;
}

public ParseResult explicitStyleAndExplode(boolean explicitStyleAndExplode) {
this.explicitStyleAndExplode = explicitStyleAndExplode;
return this;
}

public List<String> getMessages() {
List<String> messages = new ArrayList<String>();
for (Location l : extra.keySet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3362,6 +3362,63 @@ public void testResolveFullyResponses(){
SwaggerParseResult parseResult = openApiParser.readLocation("resolve-responses-test.yaml", null, options);
OpenAPI openAPI = parseResult.getOpenAPI();
assertNull(openAPI.getPaths().get("/users").getGet().getResponses().get("400").get$ref());
}

@Test(description = "style and explode should not be set with explicitStyleAndExplode = false")
public void testStyleAndExplodeNotExplicit(){
ParseOptions options = new ParseOptions();
options.setExplicitStyleAndExplode(false);
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
SwaggerParseResult parseResult = openApiParser.readLocation("style-explode.yaml", null, options);
OpenAPI openAPI = parseResult.getOpenAPI();
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(0).getStyle().toString(), "form");
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(0).getExplode(), true);
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(1).getStyle().toString(), "spaceDelimited");
assertNull(openAPI.getPaths().get("/test").getGet().getParameters().get(1).getExplode());
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(2).getExplode(), true);
assertNull(openAPI.getPaths().get("/test").getGet().getParameters().get(2).getStyle());
assertNull(openAPI.getPaths().get("/test").getGet().getParameters().get(6).getStyle());
assertNull(openAPI.getPaths().get("/test").getGet().getParameters().get(6).getExplode());
assertNull(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("bar").getExplode());
assertNull(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("bar").getStyle());
assertEquals(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("foo").getExplode(), false);
assertNull(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("foo").getStyle());
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("file").getStyle().toString(), "form");
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("file").getExplode(), true);
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyStyle").getStyle().toString(), "form");
assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyStyle").getExplode());
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyExplode").getExplode(), true);
assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyExplode").getStyle());
assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithout").getStyle());
assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithout").getExplode());
}

@Test(description = "style and explode should be set with explicitStyleAndExplode = true")
public void testStyleAndExplodeExplicit(){
ParseOptions options = new ParseOptions();
options.setExplicitStyleAndExplode(true);
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
SwaggerParseResult parseResult = openApiParser.readLocation("style-explode.yaml", null, options);
OpenAPI openAPI = parseResult.getOpenAPI();
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(0).getStyle().toString(), "form");
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(0).getExplode(), true);
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(1).getStyle().toString(), "spaceDelimited");
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(1).getExplode(), false);
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(2).getStyle().toString(), "form");
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(2).getExplode(), true);
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(6).getStyle().toString(), "simple");
assertEquals(openAPI.getPaths().get("/test").getGet().getParameters().get(6).getExplode(), false);
assertEquals(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("bar").getExplode(), false);
assertEquals(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("bar").getStyle().toString(), "simple");
assertEquals(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("foo").getExplode(), false);
assertNull(openAPI.getPaths().get("/test").getGet().getResponses().get("200").getHeaders().get("foo").getStyle());
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("file").getStyle().toString(), "form");
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("file").getExplode(), true);
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyStyle").getStyle().toString(), "form");
assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyStyle").getExplode());
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyExplode").getExplode(), true);
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithOnlyExplode").getStyle().toString(), "form");
assertEquals(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithout").getStyle().toString(), "form");
assertNull(openAPI.getPaths().get("/test").getPost().getRequestBody().getContent().get("multipart/form-data").getEncoding().get("fileWithout").getExplode());
}
}
Loading
Loading