Skip to content

Commit

Permalink
🔀 Merge branch 'sunnymoon-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
langecode committed Feb 22, 2019
2 parents 9e12ea3 + 4f60540 commit b62abe7
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 7 deletions.
20 changes: 19 additions & 1 deletion src/main/java/io/openapitools/swagger/GenerateMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@
@Mojo(name = "generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class GenerateMojo extends AbstractMojo {

/**
* Skip the execution.
*/
@Parameter(name = "skip", property = "openapi.generation.skip", required = false, defaultValue = "false")
private Boolean skip;

/**
* Static information to provide for the generation.
*/
Expand All @@ -39,6 +45,13 @@ public class GenerateMojo extends AbstractMojo {
@Parameter
private Set<String> resourcePackages;


/**
* Recurse into resourcePackages child packages.
*/
@Parameter(required=false, defaultValue = "false")
private Boolean useResourcePackagesChildren;

/**
* Directory to contain generated documentation.
*/
Expand Down Expand Up @@ -79,12 +92,17 @@ public class GenerateMojo extends AbstractMojo {

@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (skip!=null && skip) {
getLog().info("OpenApi generation is skipped.");
return;
}

Thread.currentThread().setContextClassLoader(createClassLoader());

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


JaxRSScanner reflectiveScanner = new JaxRSScanner();
JaxRSScanner reflectiveScanner = new JaxRSScanner(useResourcePackagesChildren);
if (resourcePackages != null && !resourcePackages.isEmpty()) {
reflectiveScanner.setResourcePackages(resourcePackages);
}
Expand Down
28 changes: 22 additions & 6 deletions src/main/java/io/openapitools/swagger/JaxRSScanner.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,38 @@
import org.reflections.util.ConfigurationBuilder;

/**
* Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition} annotation.
* Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition}
* annotation.
*/
class JaxRSScanner {
private Set<String> resourcePackages = Collections.emptySet();

private boolean useResourcePackagesChildren;

public JaxRSScanner(Boolean useResourcePackagesChildren) {
this.useResourcePackagesChildren = useResourcePackagesChildren != null && useResourcePackagesChildren;
}

Set<Class<?>> classes() {
ConfigurationBuilder config = ConfigurationBuilder.build(resourcePackages)
ConfigurationBuilder config = ConfigurationBuilder
.build(resourcePackages)
.setScanners(new ResourcesScanner(), new TypeAnnotationsScanner(), new SubTypesScanner());
Reflections reflections = new Reflections(config);
Stream<Class<?>> apiClasses = reflections.getTypesAnnotatedWith(Path.class).stream()
.filter(cls -> resourcePackages.isEmpty() || resourcePackages.contains(cls.getPackage().getName()));
Stream<Class<?>> defClasses = reflections.getTypesAnnotatedWith(OpenAPIDefinition.class).stream()
.filter(cls -> resourcePackages.isEmpty() || resourcePackages.contains(cls.getPackage().getName()));
Stream<Class<?>> apiClasses = reflections.getTypesAnnotatedWith(Path.class)
.stream()
.filter(this::filterClassByResourcePackages);
Stream<Class<?>> defClasses = reflections.getTypesAnnotatedWith(OpenAPIDefinition.class)
.stream()
.filter(this::filterClassByResourcePackages);
return Stream.concat(apiClasses, defClasses).collect(Collectors.toSet());
}

private boolean filterClassByResourcePackages(Class<?> cls) {
return resourcePackages.isEmpty()
|| resourcePackages.contains(cls.getPackage().getName())
|| (useResourcePackagesChildren && resourcePackages.stream().anyMatch(p -> cls.getPackage().getName().startsWith(p)));
}

void setResourcePackages(Set<String> resourcePackages) {
this.resourcePackages = new HashSet<>(resourcePackages);
}
Expand Down
5 changes: 5 additions & 0 deletions src/test/java/io/openapitools/swagger/GenerateMojoIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ public void testGenerateFullPretty() throws Exception {
testGenerate("fullpretty", "open-api", "generate-mojo-full-pretty-pom.xml", true, OutputFormat.JSON, OutputFormat.YAML);
}

@Test
public void testGenerateRecursive() throws Exception {
testGenerate("recursive", "swagger", "generate-mojo-recursive-pom.xml", true, OutputFormat.JSON);
}

private static class DeleteVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Expand Down
1 change: 1 addition & 0 deletions src/test/resources/expectedOutput/recursive/swagger.json
Original file line number Diff line number Diff line change
@@ -0,0 +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"}}}}}}
29 changes: 29 additions & 0 deletions src/test/resources/generate-mojo-recursive-pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.openapitools.swagger.test</groupId>
<artifactId>mojo-test</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>Swagger Generate Maven Mojo</name>

<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.openapitools.swagger</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<configuration>
<resourcePackages>
<resourcePackage>io.openapitools.swagger.example</resourcePackage>
</resourcePackages>
<outputDirectory>target/recursive</outputDirectory>
<useResourcePackagesChildren>true</useResourcePackagesChildren>

<project implementation="io.openapitools.swagger.MavenProjectStub"/>
</configuration>
</plugin>
</plugins>
</build>
</project>

0 comments on commit b62abe7

Please sign in to comment.