Skip to content

Commit b62abe7

Browse files
committed
🔀 Merge branch 'sunnymoon-master'
2 parents 9e12ea3 + 4f60540 commit b62abe7

File tree

5 files changed

+76
-7
lines changed

5 files changed

+76
-7
lines changed

src/main/java/io/openapitools/swagger/GenerateMojo.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
@Mojo(name = "generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
2828
public class GenerateMojo extends AbstractMojo {
2929

30+
/**
31+
* Skip the execution.
32+
*/
33+
@Parameter(name = "skip", property = "openapi.generation.skip", required = false, defaultValue = "false")
34+
private Boolean skip;
35+
3036
/**
3137
* Static information to provide for the generation.
3238
*/
@@ -39,6 +45,13 @@ public class GenerateMojo extends AbstractMojo {
3945
@Parameter
4046
private Set<String> resourcePackages;
4147

48+
49+
/**
50+
* Recurse into resourcePackages child packages.
51+
*/
52+
@Parameter(required=false, defaultValue = "false")
53+
private Boolean useResourcePackagesChildren;
54+
4255
/**
4356
* Directory to contain generated documentation.
4457
*/
@@ -79,12 +92,17 @@ public class GenerateMojo extends AbstractMojo {
7992

8093
@Override
8194
public void execute() throws MojoExecutionException, MojoFailureException {
95+
if (skip!=null && skip) {
96+
getLog().info("OpenApi generation is skipped.");
97+
return;
98+
}
99+
82100
Thread.currentThread().setContextClassLoader(createClassLoader());
83101

84102
Reader reader = new Reader(swaggerConfig == null ? new OpenAPI() : swaggerConfig.createSwaggerModel());
85103

86104

87-
JaxRSScanner reflectiveScanner = new JaxRSScanner();
105+
JaxRSScanner reflectiveScanner = new JaxRSScanner(useResourcePackagesChildren);
88106
if (resourcePackages != null && !resourcePackages.isEmpty()) {
89107
reflectiveScanner.setResourcePackages(resourcePackages);
90108
}

src/main/java/io/openapitools/swagger/JaxRSScanner.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,38 @@
1414
import org.reflections.util.ConfigurationBuilder;
1515

1616
/**
17-
* Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition} annotation.
17+
* Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition}
18+
* annotation.
1819
*/
1920
class JaxRSScanner {
2021
private Set<String> resourcePackages = Collections.emptySet();
2122

23+
private boolean useResourcePackagesChildren;
24+
25+
public JaxRSScanner(Boolean useResourcePackagesChildren) {
26+
this.useResourcePackagesChildren = useResourcePackagesChildren != null && useResourcePackagesChildren;
27+
}
28+
2229
Set<Class<?>> classes() {
23-
ConfigurationBuilder config = ConfigurationBuilder.build(resourcePackages)
30+
ConfigurationBuilder config = ConfigurationBuilder
31+
.build(resourcePackages)
2432
.setScanners(new ResourcesScanner(), new TypeAnnotationsScanner(), new SubTypesScanner());
2533
Reflections reflections = new Reflections(config);
26-
Stream<Class<?>> apiClasses = reflections.getTypesAnnotatedWith(Path.class).stream()
27-
.filter(cls -> resourcePackages.isEmpty() || resourcePackages.contains(cls.getPackage().getName()));
28-
Stream<Class<?>> defClasses = reflections.getTypesAnnotatedWith(OpenAPIDefinition.class).stream()
29-
.filter(cls -> resourcePackages.isEmpty() || resourcePackages.contains(cls.getPackage().getName()));
34+
Stream<Class<?>> apiClasses = reflections.getTypesAnnotatedWith(Path.class)
35+
.stream()
36+
.filter(this::filterClassByResourcePackages);
37+
Stream<Class<?>> defClasses = reflections.getTypesAnnotatedWith(OpenAPIDefinition.class)
38+
.stream()
39+
.filter(this::filterClassByResourcePackages);
3040
return Stream.concat(apiClasses, defClasses).collect(Collectors.toSet());
3141
}
3242

43+
private boolean filterClassByResourcePackages(Class<?> cls) {
44+
return resourcePackages.isEmpty()
45+
|| resourcePackages.contains(cls.getPackage().getName())
46+
|| (useResourcePackagesChildren && resourcePackages.stream().anyMatch(p -> cls.getPackage().getName().startsWith(p)));
47+
}
48+
3349
void setResourcePackages(Set<String> resourcePackages) {
3450
this.resourcePackages = new HashSet<>(resourcePackages);
3551
}

src/test/java/io/openapitools/swagger/GenerateMojoIT.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ public void testGenerateFullPretty() throws Exception {
107107
testGenerate("fullpretty", "open-api", "generate-mojo-full-pretty-pom.xml", true, OutputFormat.JSON, OutputFormat.YAML);
108108
}
109109

110+
@Test
111+
public void testGenerateRecursive() throws Exception {
112+
testGenerate("recursive", "swagger", "generate-mojo-recursive-pom.xml", true, OutputFormat.JSON);
113+
}
114+
110115
private static class DeleteVisitor extends SimpleFileVisitor<Path> {
111116
@Override
112117
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"openapi":"3.0.1","info":{"title":"My Title","description":"Description from ReaderListener","version":"1.0.0"},"paths":{"/accounts/{regNo}-{accountNo}":{"get":{"description":"Get single account","operationId":"get","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"No account found."}}},"put":{"description":"Create new or update existing account","operationId":"createOrUpdate","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdateRepresentation"}}}},"responses":{"404":{"description":"No updating possible"}}}},"/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/alternate":{"get":{"operationId":"list_1","responses":{"default":{"description":"default response","content":{"*/*":{}}}}}}},"components":{"schemas":{"AccountUpdateRepresentation":{"required":["name"],"type":"object","properties":{"regNo":{"pattern":"^[0-9]{4}$","type":"string"},"accountNo":{"pattern":"^[0-9]+$","type":"string"},"name":{"pattern":".{1,40}","type":"string"}}}}}}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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.openapitools.swagger.test</groupId>
5+
<artifactId>mojo-test</artifactId>
6+
<packaging>jar</packaging>
7+
<version>1.0.0-SNAPSHOT</version>
8+
<name>Swagger Generate Maven Mojo</name>
9+
10+
<dependencies>
11+
</dependencies>
12+
<build>
13+
<plugins>
14+
<plugin>
15+
<groupId>io.openapitools.swagger</groupId>
16+
<artifactId>swagger-maven-plugin</artifactId>
17+
<configuration>
18+
<resourcePackages>
19+
<resourcePackage>io.openapitools.swagger.example</resourcePackage>
20+
</resourcePackages>
21+
<outputDirectory>target/recursive</outputDirectory>
22+
<useResourcePackagesChildren>true</useResourcePackagesChildren>
23+
24+
<project implementation="io.openapitools.swagger.MavenProjectStub"/>
25+
</configuration>
26+
</plugin>
27+
</plugins>
28+
</build>
29+
</project>

0 commit comments

Comments
 (0)