diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java index 0da130767d..aa329f6fe0 100755 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/filter/SpecFilter.java @@ -55,50 +55,52 @@ public OpenAPI filter(OpenAPI openAPI, OpenAPISpecFilter filter, Map filteredTags = new HashSet<>(); Paths clonedPaths = new Paths(); - for (String resourcePath : filteredOpenAPI.getPaths().keySet()) { - PathItem pathItem = filteredOpenAPI.getPaths().get(resourcePath); - - PathItem filteredPathItem = filterPathItem(filter, pathItem, resourcePath, params, cookies, headers); - - if (filteredPathItem != null) { - - PathItem clonedPathItem = new PathItem(); - clonedPathItem.set$ref(filteredPathItem.get$ref()); - clonedPathItem.setDescription(filteredPathItem.getDescription()); - clonedPathItem.setSummary(filteredPathItem.getSummary()); - clonedPathItem.setExtensions(filteredPathItem.getExtensions()); - clonedPathItem.setParameters(filteredPathItem.getParameters()); - clonedPathItem.setServers(filteredPathItem.getServers()); - - Map ops = filteredPathItem.readOperationsMap(); - - for (PathItem.HttpMethod key : ops.keySet()) { - Operation op = ops.get(key); - List opTagsBeforeFilter = null; - if (op.getTags() != null) { - opTagsBeforeFilter = new ArrayList<>(op.getTags()); - } else { - opTagsBeforeFilter = new ArrayList<>(); - } - op = filterOperation(filter, op, resourcePath, key.toString(), params, cookies, headers); - clonedPathItem.operation(key, op); - if (op == null) { - filteredTags.addAll(opTagsBeforeFilter); - } else { + if (filteredOpenAPI.getPaths() != null) { + for (String resourcePath : filteredOpenAPI.getPaths().keySet()) { + PathItem pathItem = filteredOpenAPI.getPaths().get(resourcePath); + + PathItem filteredPathItem = filterPathItem(filter, pathItem, resourcePath, params, cookies, headers); + + if (filteredPathItem != null) { + + PathItem clonedPathItem = new PathItem(); + clonedPathItem.set$ref(filteredPathItem.get$ref()); + clonedPathItem.setDescription(filteredPathItem.getDescription()); + clonedPathItem.setSummary(filteredPathItem.getSummary()); + clonedPathItem.setExtensions(filteredPathItem.getExtensions()); + clonedPathItem.setParameters(filteredPathItem.getParameters()); + clonedPathItem.setServers(filteredPathItem.getServers()); + + Map ops = filteredPathItem.readOperationsMap(); + + for (PathItem.HttpMethod key : ops.keySet()) { + Operation op = ops.get(key); + List opTagsBeforeFilter = null; if (op.getTags() != null) { - opTagsBeforeFilter.removeAll(op.getTags()); - allowedTags.addAll(op.getTags()); + opTagsBeforeFilter = new ArrayList<>(op.getTags()); + } else { + opTagsBeforeFilter = new ArrayList<>(); + } + op = filterOperation(filter, op, resourcePath, key.toString(), params, cookies, headers); + clonedPathItem.operation(key, op); + if (op == null) { + filteredTags.addAll(opTagsBeforeFilter); + } else { + if (op.getTags() != null) { + opTagsBeforeFilter.removeAll(op.getTags()); + allowedTags.addAll(op.getTags()); + } + filteredTags.addAll(opTagsBeforeFilter); } - filteredTags.addAll(opTagsBeforeFilter); - } - } - if (!clonedPathItem.readOperations().isEmpty()) { - clonedPaths.addPathItem(resourcePath, clonedPathItem); + } + if (!clonedPathItem.readOperations().isEmpty()) { + clonedPaths.addPathItem(resourcePath, clonedPathItem); + } } } + clone.paths(clonedPaths); } - clone.paths(clonedPaths); filteredTags.removeAll(allowedTags); diff --git a/modules/swagger-gradle-plugin/build.gradle b/modules/swagger-gradle-plugin/build.gradle index 58e6719bbc..c0318ea31d 100644 --- a/modules/swagger-gradle-plugin/build.gradle +++ b/modules/swagger-gradle-plugin/build.gradle @@ -29,6 +29,7 @@ dependencies { compile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.1.0' testCompile group: 'com.github.tomakehurst', name: 'wiremock', version:'2.14.0' testCompile gradleTestKit() + testCompile group: 'commons-io', name: 'commons-io', version:'2.6' testCompile 'junit:junit:4+' diff --git a/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/SwaggerResolveTest.java b/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/SwaggerResolveTest.java index b73d80c427..37adff725f 100644 --- a/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/SwaggerResolveTest.java +++ b/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/SwaggerResolveTest.java @@ -1,5 +1,6 @@ package io.swagger.v3.plugins.gradle; +import org.apache.commons.io.FileUtils; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; import org.junit.Before; @@ -54,7 +55,7 @@ public void setup() throws IOException { public void testSwaggerResolveTask() throws IOException { outputDir = testProjectDir.getRoot().toString() + "/target"; outputFile = testProjectDir.getRoot().toString() + "/testAPI.json"; - outputDir = "/tmp/a/target"; + //outputDir = "/tmp/a/target"; String resolveTask = "resolve"; String buildFileContent = @@ -99,6 +100,7 @@ public void testSwaggerResolveTask() throws IOException { " classpath = sourceSets.test.runtimeClasspath\n" + " resourcePackages = ['io.swagger.v3.plugins.gradle.petstore']\n" + " outputPath = \'" + outputDir + "\'\n" + + " filterClass = \'io.swagger.v3.plugins.gradle.resources.MyFilter\'\n" + " openApiFile = file(\'" + openapiInputFile.getAbsolutePath() + "\')\n" + "}"; @@ -126,6 +128,7 @@ public void testSwaggerResolveTask() throws IOException { assertEquals(SUCCESS, result.task(":" + resolveTask).getOutcome()); assertTrue(new File(outputDir + "/PetStoreAPI.json").exists()); + assertTrue(FileUtils.readFileToString(new File(outputDir + "/PetStoreAPI.json")).contains("UPDATEDBYFILTER")); } private void writeFile(File destination, String content) throws IOException { diff --git a/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/resources/MyFilter.java b/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/resources/MyFilter.java new file mode 100644 index 0000000000..a8dff77b84 --- /dev/null +++ b/modules/swagger-gradle-plugin/src/test/java/io/swagger/v3/plugins/gradle/resources/MyFilter.java @@ -0,0 +1,40 @@ +package io.swagger.v3.plugins.gradle.resources; + +import io.swagger.v3.core.filter.AbstractSpecFilter; +import io.swagger.v3.core.model.ApiDescription; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class MyFilter extends AbstractSpecFilter { + private static Logger LOGGER = LoggerFactory.getLogger(MyFilter.class); + + @Override + public Optional filterOpenAPI( + OpenAPI openAPI, + Map> params, + Map cookies, + Map> headers) { + openAPI.getInfo().setTitle("UPDATEDBYFILTER"); + return Optional.of(openAPI); + // some processing + //return super.filterOpenAPI(openAPI, params, cookies, headers); + } + + @Override + public Optional filterOperation( + Operation operation, + ApiDescription api, + Map> params, + Map cookies, + Map> headers) { + // some processing + return Optional.of(operation); + } + + } \ No newline at end of file diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java index 40368fad74..ad7e3e8458 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/integration/SwaggerLoader.java @@ -1,5 +1,7 @@ package io.swagger.v3.jaxrs2.integration; +import io.swagger.v3.core.filter.OpenAPISpecFilter; +import io.swagger.v3.core.filter.SpecFilter; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Yaml; import io.swagger.v3.oas.integration.GenericOpenApiContextBuilder; @@ -213,6 +215,17 @@ public Map resolve() throws Exception{ OpenAPI openAPI = builder .buildContext(true) .read(); + if (StringUtils.isNotBlank(filterClass)) { + try { + OpenAPISpecFilter filterImpl = (OpenAPISpecFilter) this.getClass().getClassLoader().loadClass(filterClass).newInstance(); + SpecFilter f = new SpecFilter(); + openAPI = f.filter(openAPI, filterImpl, new HashMap<>(), new HashMap<>(), + new HashMap<>()); + } catch (Exception e) { + throw new Exception("Error applying filter to API specification: " + e.getMessage(), e); + } + } + String openapiJson = null; String openapiYaml = null; if ("JSON".equals(outputFormat) || "JSONANDYAML".equals(outputFormat)) { diff --git a/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java b/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java index 99cb764688..fb6076bb56 100644 --- a/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java +++ b/modules/swagger-maven-plugin/src/main/java/io/swagger/v3/plugin/maven/SwaggerMojo.java @@ -1,5 +1,7 @@ package io.swagger.v3.plugin.maven; +import io.swagger.v3.core.filter.OpenAPISpecFilter; +import io.swagger.v3.core.filter.SpecFilter; import io.swagger.v3.core.util.Json; import io.swagger.v3.core.util.Yaml; import io.swagger.v3.jaxrs2.integration.JaxrsOpenApiContextBuilder; @@ -79,6 +81,19 @@ public void execute() throws MojoExecutionException, MojoFailureException { OpenAPI openAPI = builder .buildContext(true) .read(); + + if (StringUtils.isNotBlank(filterClass)) { + try { + OpenAPISpecFilter filterImpl = (OpenAPISpecFilter) this.getClass().getClassLoader().loadClass(filterClass).newInstance(); + SpecFilter f = new SpecFilter(); + openAPI = f.filter(openAPI, filterImpl, new HashMap<>(), new HashMap<>(), + new HashMap<>()); + } catch (Exception e) { + getLog().error( "Error applying filter to API specification" , e); + throw new MojoExecutionException("Error applying filter to API specification: " + e.getMessage(), e); + } + } + String openapiJson = null; String openapiYaml = null; if (Format.JSON.equals(outputFormat) || Format.JSONANDYAML.equals(outputFormat)) { diff --git a/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/SwaggerResolveTest.java b/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/SwaggerResolveTest.java index ea76a1b809..75d301c061 100644 --- a/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/SwaggerResolveTest.java +++ b/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/SwaggerResolveTest.java @@ -14,6 +14,11 @@ public void testResolve() throws Exception { checkOutput(runTest(pom)); } + public void testResolveWithFilter() throws Exception { + File pom = getTestFile("src/test/resources/pom.resolveToFileWithFilter.xml"); + checkOutput(runTest(pom)); + } + public void testResolveNoName() throws Exception { File pom = getTestFile("src/test/resources/pom.resolveToFileNoName.xml"); checkOutput(runTest(pom)); diff --git a/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/resources/MyFilter.java b/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/resources/MyFilter.java new file mode 100644 index 0000000000..a76aaef01f --- /dev/null +++ b/modules/swagger-maven-plugin/src/test/java/io/swagger/v3/plugin/maven/resources/MyFilter.java @@ -0,0 +1,40 @@ +package io.swagger.v3.plugin.maven.resources; + +import io.swagger.v3.core.filter.AbstractSpecFilter; +import io.swagger.v3.core.model.ApiDescription; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class MyFilter extends AbstractSpecFilter { + private static Logger LOGGER = LoggerFactory.getLogger(MyFilter.class); + + @Override + public Optional filterOpenAPI( + OpenAPI openAPI, + Map> params, + Map cookies, + Map> headers) { + openAPI.getInfo().setTitle("UPDATEDBYFILTER"); + return Optional.of(openAPI); + // some processing + //return super.filterOpenAPI(openAPI, params, cookies, headers); + } + + @Override + public Optional filterOperation( + Operation operation, + ApiDescription api, + Map> params, + Map cookies, + Map> headers) { + // some processing + return Optional.of(operation); + } + + } \ No newline at end of file diff --git a/modules/swagger-maven-plugin/src/test/resources/pom.resolveToFileWithFilter.xml b/modules/swagger-maven-plugin/src/test/resources/pom.resolveToFileWithFilter.xml new file mode 100644 index 0000000000..e4d6e23dde --- /dev/null +++ b/modules/swagger-maven-plugin/src/test/resources/pom.resolveToFileWithFilter.xml @@ -0,0 +1,51 @@ + + 4.0.0 + io.swagger.core.v3 + swagger-maven-plugin-test + jar + 1.0-SNAPSHOT + Test Resolve YAML + + + + + io.swagger.core.v3 + swagger-maven-plugin + + spec + ${project.basedir}/../../../target/generatedtest + ${project.basedir}/../../../src/test/resources/openapiinput.yaml + YAML + + io.swagger.v3.plugin.maven.petstore.petstore + + TRUE + io.swagger.v3.plugin.maven.resources.MyFilter + + + + + + + io.swagger.core.v3 + swagger-jaxrs2 + ${project.version} + + + + javax.ws.rs + javax.ws.rs-api + 2.1 + + + javax.servlet + javax.servlet-api + 3.1 + + + + + ISO-8859-1 + + \ No newline at end of file