Skip to content

Commit a589276

Browse files
committed
ref #3144 - support filter in maven/gradle plugins
1 parent cd0028f commit a589276

File tree

9 files changed

+209
-39
lines changed

9 files changed

+209
-39
lines changed

modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -55,50 +55,52 @@ public OpenAPI filter(OpenAPI openAPI, OpenAPISpecFilter filter, Map<String, Lis
5555
final Set<String> filteredTags = new HashSet<>();
5656

5757
Paths clonedPaths = new Paths();
58-
for (String resourcePath : filteredOpenAPI.getPaths().keySet()) {
59-
PathItem pathItem = filteredOpenAPI.getPaths().get(resourcePath);
60-
61-
PathItem filteredPathItem = filterPathItem(filter, pathItem, resourcePath, params, cookies, headers);
62-
63-
if (filteredPathItem != null) {
64-
65-
PathItem clonedPathItem = new PathItem();
66-
clonedPathItem.set$ref(filteredPathItem.get$ref());
67-
clonedPathItem.setDescription(filteredPathItem.getDescription());
68-
clonedPathItem.setSummary(filteredPathItem.getSummary());
69-
clonedPathItem.setExtensions(filteredPathItem.getExtensions());
70-
clonedPathItem.setParameters(filteredPathItem.getParameters());
71-
clonedPathItem.setServers(filteredPathItem.getServers());
72-
73-
Map<PathItem.HttpMethod, Operation> ops = filteredPathItem.readOperationsMap();
74-
75-
for (PathItem.HttpMethod key : ops.keySet()) {
76-
Operation op = ops.get(key);
77-
List<String> opTagsBeforeFilter = null;
78-
if (op.getTags() != null) {
79-
opTagsBeforeFilter = new ArrayList<>(op.getTags());
80-
} else {
81-
opTagsBeforeFilter = new ArrayList<>();
82-
}
83-
op = filterOperation(filter, op, resourcePath, key.toString(), params, cookies, headers);
84-
clonedPathItem.operation(key, op);
85-
if (op == null) {
86-
filteredTags.addAll(opTagsBeforeFilter);
87-
} else {
58+
if (filteredOpenAPI.getPaths() != null) {
59+
for (String resourcePath : filteredOpenAPI.getPaths().keySet()) {
60+
PathItem pathItem = filteredOpenAPI.getPaths().get(resourcePath);
61+
62+
PathItem filteredPathItem = filterPathItem(filter, pathItem, resourcePath, params, cookies, headers);
63+
64+
if (filteredPathItem != null) {
65+
66+
PathItem clonedPathItem = new PathItem();
67+
clonedPathItem.set$ref(filteredPathItem.get$ref());
68+
clonedPathItem.setDescription(filteredPathItem.getDescription());
69+
clonedPathItem.setSummary(filteredPathItem.getSummary());
70+
clonedPathItem.setExtensions(filteredPathItem.getExtensions());
71+
clonedPathItem.setParameters(filteredPathItem.getParameters());
72+
clonedPathItem.setServers(filteredPathItem.getServers());
73+
74+
Map<PathItem.HttpMethod, Operation> ops = filteredPathItem.readOperationsMap();
75+
76+
for (PathItem.HttpMethod key : ops.keySet()) {
77+
Operation op = ops.get(key);
78+
List<String> opTagsBeforeFilter = null;
8879
if (op.getTags() != null) {
89-
opTagsBeforeFilter.removeAll(op.getTags());
90-
allowedTags.addAll(op.getTags());
80+
opTagsBeforeFilter = new ArrayList<>(op.getTags());
81+
} else {
82+
opTagsBeforeFilter = new ArrayList<>();
83+
}
84+
op = filterOperation(filter, op, resourcePath, key.toString(), params, cookies, headers);
85+
clonedPathItem.operation(key, op);
86+
if (op == null) {
87+
filteredTags.addAll(opTagsBeforeFilter);
88+
} else {
89+
if (op.getTags() != null) {
90+
opTagsBeforeFilter.removeAll(op.getTags());
91+
allowedTags.addAll(op.getTags());
92+
}
93+
filteredTags.addAll(opTagsBeforeFilter);
9194
}
92-
filteredTags.addAll(opTagsBeforeFilter);
93-
}
9495

95-
}
96-
if (!clonedPathItem.readOperations().isEmpty()) {
97-
clonedPaths.addPathItem(resourcePath, clonedPathItem);
96+
}
97+
if (!clonedPathItem.readOperations().isEmpty()) {
98+
clonedPaths.addPathItem(resourcePath, clonedPathItem);
99+
}
98100
}
99101
}
102+
clone.paths(clonedPaths);
100103
}
101-
clone.paths(clonedPaths);
102104

103105
filteredTags.removeAll(allowedTags);
104106

modules/swagger-gradle-plugin/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929
compile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.1.0'
3030
testCompile group: 'com.github.tomakehurst', name: 'wiremock', version:'2.14.0'
3131
testCompile gradleTestKit()
32+
testCompile group: 'commons-io', name: 'commons-io', version:'2.6'
3233
testCompile 'junit:junit:4+'
3334

3435

modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/SwaggerResolveTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.v3.plugins.gradle;
22

3+
import org.apache.commons.io.FileUtils;
34
import org.gradle.testkit.runner.BuildResult;
45
import org.gradle.testkit.runner.GradleRunner;
56
import org.junit.Before;
@@ -54,7 +55,7 @@ public void setup() throws IOException {
5455
public void testSwaggerResolveTask() throws IOException {
5556
outputDir = testProjectDir.getRoot().toString() + "/target";
5657
outputFile = testProjectDir.getRoot().toString() + "/testAPI.json";
57-
outputDir = "/tmp/a/target";
58+
//outputDir = "/tmp/a/target";
5859
String resolveTask = "resolve";
5960

6061
String buildFileContent =
@@ -99,6 +100,7 @@ public void testSwaggerResolveTask() throws IOException {
99100
" classpath = sourceSets.test.runtimeClasspath\n" +
100101
" resourcePackages = ['io.swagger.v3.plugins.gradle.petstore']\n" +
101102
" outputPath = \'" + outputDir + "\'\n" +
103+
" filterClass = \'io.swagger.v3.plugins.gradle.resources.MyFilter\'\n" +
102104
" openApiFile = file(\'" + openapiInputFile.getAbsolutePath() + "\')\n" +
103105
"}";
104106

@@ -126,6 +128,7 @@ public void testSwaggerResolveTask() throws IOException {
126128

127129
assertEquals(SUCCESS, result.task(":" + resolveTask).getOutcome());
128130
assertTrue(new File(outputDir + "/PetStoreAPI.json").exists());
131+
assertTrue(FileUtils.readFileToString(new File(outputDir + "/PetStoreAPI.json")).contains("UPDATEDBYFILTER"));
129132
}
130133

131134
private void writeFile(File destination, String content) throws IOException {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.swagger.v3.plugins.gradle.resources;
2+
3+
import io.swagger.v3.core.filter.AbstractSpecFilter;
4+
import io.swagger.v3.core.model.ApiDescription;
5+
import io.swagger.v3.oas.models.OpenAPI;
6+
import io.swagger.v3.oas.models.Operation;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Optional;
13+
14+
public class MyFilter extends AbstractSpecFilter {
15+
private static Logger LOGGER = LoggerFactory.getLogger(MyFilter.class);
16+
17+
@Override
18+
public Optional<OpenAPI> filterOpenAPI(
19+
OpenAPI openAPI,
20+
Map<String, List<String>> params,
21+
Map<String, String> cookies,
22+
Map<String, List<String>> headers) {
23+
openAPI.getInfo().setTitle("UPDATEDBYFILTER");
24+
return Optional.of(openAPI);
25+
// some processing
26+
//return super.filterOpenAPI(openAPI, params, cookies, headers);
27+
}
28+
29+
@Override
30+
public Optional<io.swagger.v3.oas.models.Operation> filterOperation(
31+
Operation operation,
32+
ApiDescription api,
33+
Map<String, List<String>> params,
34+
Map<String, String> cookies,
35+
Map<String, List<String>> headers) {
36+
// some processing
37+
return Optional.of(operation);
38+
}
39+
40+
}

modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.swagger.v3.jaxrs2.integration;
22

3+
import io.swagger.v3.core.filter.OpenAPISpecFilter;
4+
import io.swagger.v3.core.filter.SpecFilter;
35
import io.swagger.v3.core.util.Json;
46
import io.swagger.v3.core.util.Yaml;
57
import io.swagger.v3.oas.integration.GenericOpenApiContextBuilder;
@@ -213,6 +215,17 @@ public Map<String, String> resolve() throws Exception{
213215
OpenAPI openAPI = builder
214216
.buildContext(true)
215217
.read();
218+
if (StringUtils.isNotBlank(filterClass)) {
219+
try {
220+
OpenAPISpecFilter filterImpl = (OpenAPISpecFilter) this.getClass().getClassLoader().loadClass(filterClass).newInstance();
221+
SpecFilter f = new SpecFilter();
222+
openAPI = f.filter(openAPI, filterImpl, new HashMap<>(), new HashMap<>(),
223+
new HashMap<>());
224+
} catch (Exception e) {
225+
throw new Exception("Error applying filter to API specification: " + e.getMessage(), e);
226+
}
227+
}
228+
216229
String openapiJson = null;
217230
String openapiYaml = null;
218231
if ("JSON".equals(outputFormat) || "JSONANDYAML".equals(outputFormat)) {

modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.swagger.v3.plugin.maven;
22

3+
import io.swagger.v3.core.filter.OpenAPISpecFilter;
4+
import io.swagger.v3.core.filter.SpecFilter;
35
import io.swagger.v3.core.util.Json;
46
import io.swagger.v3.core.util.Yaml;
57
import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder;
@@ -79,6 +81,19 @@ public void execute() throws MojoExecutionException, MojoFailureException {
7981
OpenAPI openAPI = builder
8082
.buildContext(true)
8183
.read();
84+
85+
if (StringUtils.isNotBlank(filterClass)) {
86+
try {
87+
OpenAPISpecFilter filterImpl = (OpenAPISpecFilter) this.getClass().getClassLoader().loadClass(filterClass).newInstance();
88+
SpecFilter f = new SpecFilter();
89+
openAPI = f.filter(openAPI, filterImpl, new HashMap<>(), new HashMap<>(),
90+
new HashMap<>());
91+
} catch (Exception e) {
92+
getLog().error( "Error applying filter to API specification" , e);
93+
throw new MojoExecutionException("Error applying filter to API specification: " + e.getMessage(), e);
94+
}
95+
}
96+
8297
String openapiJson = null;
8398
String openapiYaml = null;
8499
if (Format.JSON.equals(outputFormat) || Format.JSONANDYAML.equals(outputFormat)) {

modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/SwaggerResolveTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public void testResolve() throws Exception {
1414
checkOutput(runTest(pom));
1515
}
1616

17+
public void testResolveWithFilter() throws Exception {
18+
File pom = getTestFile("src/test/resources/pom.resolveToFileWithFilter.xml");
19+
checkOutput(runTest(pom));
20+
}
21+
1722
public void testResolveNoName() throws Exception {
1823
File pom = getTestFile("src/test/resources/pom.resolveToFileNoName.xml");
1924
checkOutput(runTest(pom));
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.swagger.v3.plugin.maven.resources;
2+
3+
import io.swagger.v3.core.filter.AbstractSpecFilter;
4+
import io.swagger.v3.core.model.ApiDescription;
5+
import io.swagger.v3.oas.models.OpenAPI;
6+
import io.swagger.v3.oas.models.Operation;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Optional;
13+
14+
public class MyFilter extends AbstractSpecFilter {
15+
private static Logger LOGGER = LoggerFactory.getLogger(MyFilter.class);
16+
17+
@Override
18+
public Optional<OpenAPI> filterOpenAPI(
19+
OpenAPI openAPI,
20+
Map<String, List<String>> params,
21+
Map<String, String> cookies,
22+
Map<String, List<String>> headers) {
23+
openAPI.getInfo().setTitle("UPDATEDBYFILTER");
24+
return Optional.of(openAPI);
25+
// some processing
26+
//return super.filterOpenAPI(openAPI, params, cookies, headers);
27+
}
28+
29+
@Override
30+
public Optional<Operation> filterOperation(
31+
Operation operation,
32+
ApiDescription api,
33+
Map<String, List<String>> params,
34+
Map<String, String> cookies,
35+
Map<String, List<String>> headers) {
36+
// some processing
37+
return Optional.of(operation);
38+
}
39+
40+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>io.swagger.core.v3</groupId>
5+
<artifactId>swagger-maven-plugin-test</artifactId>
6+
<packaging>jar</packaging>
7+
<version>1.0-SNAPSHOT</version>
8+
<name>Test Resolve YAML</name>
9+
10+
<build>
11+
<plugins>
12+
<plugin>
13+
<groupId>io.swagger.core.v3</groupId>
14+
<artifactId>swagger-maven-plugin</artifactId>
15+
<configuration>
16+
<outputFileName>spec</outputFileName>
17+
<outputPath>${project.basedir}/../../../target/generatedtest</outputPath>
18+
<openapiFilePath>${project.basedir}/../../../src/test/resources/openapiinput.yaml</openapiFilePath>
19+
<outputFormat>YAML</outputFormat>
20+
<resourcePackages>
21+
<package>io.swagger.v3.plugin.maven.petstore.petstore</package>
22+
</resourcePackages>
23+
<prettyPrint>TRUE</prettyPrint>
24+
<filterClass>io.swagger.v3.plugin.maven.resources.MyFilter</filterClass>
25+
</configuration>
26+
</plugin>
27+
</plugins>
28+
</build>
29+
<dependencies>
30+
<dependency>
31+
<groupId>io.swagger.core.v3</groupId>
32+
<artifactId>swagger-jaxrs2</artifactId>
33+
<version>${project.version}</version>
34+
</dependency>
35+
36+
<dependency>
37+
<groupId>javax.ws.rs</groupId>
38+
<artifactId>javax.ws.rs-api</artifactId>
39+
<version>2.1</version>
40+
</dependency>
41+
<dependency>
42+
<groupId>javax.servlet</groupId>
43+
<artifactId>javax.servlet-api</artifactId>
44+
<version>3.1</version>
45+
</dependency>
46+
47+
</dependencies>
48+
<properties>
49+
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
50+
</properties>
51+
</project>

0 commit comments

Comments
 (0)