diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..5e8201f
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,16 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "maven" # See documentation for possible values
+ directory: "/" # Location of package manifests
+ schedule:
+ interval: "daily"
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..56ea423
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,44 @@
+name: Build and Deploy Snapshots
+on:
+ push:
+ branches:
+ - master
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ packages: write
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'adopt'
+ cache: maven
+ - name: Deploy to Github packages
+ run: mvn --batch-mode clean deploy -Pgithub,coverage
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Upload coverage reports to Codecov
+ uses: codecov/codecov-action@v4
+ env:
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+ - name: Set up Java for publishing to Maven Central Repository
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: maven
+ server-id: ossrh
+ server-username: MAVEN_USERNAME
+ server-password: MAVEN_PASSWORD
+ gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}
+ gpg-passphrase: MAVEN_GPG_PASSPHRASE
+ - name: Publish to the Maven Central Repository
+ run: mvn --batch-mode clean deploy -Possrh
+ env:
+ MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
+ MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
deleted file mode 100644
index 22859fb..0000000
--- a/.github/workflows/ci.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-name: ci
-
-on: [push,pull_request]
-
-jobs:
- build:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- java: [ 8, 12, 15 ]
- steps:
- - uses: actions/checkout@v2
- - name: Set Java
- uses: actions/setup-java@v1
- with:
- java-version: ${{ matrix.java }}
- - name: Cache Maven packages
- uses: actions/cache@v2
- with:
- path: ~/.m2
- key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
- restore-keys: ${{ runner.os }}-m2
- - name: Build with Maven
- run: mvn --batch-mode --update-snapshots verify -Dgpg.skip=true
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
new file mode 100644
index 0000000..c5e5aaf
--- /dev/null
+++ b/.github/workflows/pr.yml
@@ -0,0 +1,28 @@
+name: Verify PR
+on:
+ pull_request:
+ branches:
+ - "**"
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ java-version: [17, 21 ]
+ runs-on: [ ubuntu-latest, macos-latest, windows-latest ]
+ name: Jdk ${{ matrix.java-version }}, os ${{ matrix.runs-on }}
+ runs-on: ${{ matrix.runs-on }}
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK ${{ matrix.java-version }}
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java-version }}
+ distribution: 'adopt'
+ cache: maven
+ - name: Build with Maven
+ run: mvn --batch-mode verify -Pcoverage
+ - name: Upload coverage reports to Codecov
+ uses: codecov/codecov-action@v4
+ env:
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..574f1e0
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,67 @@
+name: Release New Version
+on:
+ workflow_dispatch:
+ inputs:
+ releaseversion:
+ description: 'Release version'
+ required: true
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ packages: write
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'adopt'
+ cache: maven
+ - run: |
+ echo "Release version ${{ github.event.inputs.releaseversion }}!"
+ - name: Set projects Maven version to GitHub Action GUI set version
+ run: mvn versions:set "-DnewVersion=${{ github.event.inputs.releaseversion }}"
+ - name: Deploy to Github packages
+ run: mvn --batch-mode clean deploy -Pgithub
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Deploy to Maven Central Repository
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: maven
+ server-id: ossrh
+ server-username: MAVEN_USERNAME
+ server-password: MAVEN_PASSWORD
+ gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}
+ gpg-passphrase: MAVEN_GPG_PASSPHRASE
+ - name: Set projects Maven version to GitHub Action GUI set version
+ run: mvn versions:set "-DnewVersion=${{ github.event.inputs.releaseversion }}"
+ - name: Publish to the Maven Central Repository
+ run: mvn --batch-mode clean deploy -Possrh
+ env:
+ MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
+ MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
+ - name: Generate changelog
+ id: changelog
+ uses: metcalfc/changelog-generator@v4.3.1
+ with:
+ myToken: ${{ secrets.GITHUB_TOKEN }}
+ - name: Create GitHub Release
+ id: create_release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ github.event.inputs.releaseversion }}
+ release_name: ${{ github.event.inputs.releaseversion }}
+ body: |
+ ### Things that changed in this release
+ ${{ steps.changelog.outputs.changelog }}
+ draft: false
+ prerelease: false
+
diff --git a/README.md b/README.md
index eda3274..7bfbf12 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,19 @@
# Swagger Maven Plugin
This plugin is intended to use the [Swagger Core library](https://github.com/swagger-api/swagger-core) to generate
-OpenAPI documentation from a JAX-RS based REST service with as little change as possible. This allows for @SwaggerDefinition, @ReaderListener and ModelConverters to work the same way as with the core Swagger library.
+OpenAPI documentation from a JAX-RS or Jakarta based REST service with as little change as possible. This allows for @SwaggerDefinition, @ReaderListener and ModelConverters to work the same way as with the core Swagger library.
# Status
-The plugin is considered production ready. The version 2.x.x of the plugin is supporting generation of OpenAPI version 3 specifications using Swagger 2.x. To generate OpenAPI version 2 specifications using Swagger 1.x use the latest 1.x.x version of the plugin.
+The plugin is considered production ready.
+- The version 3.X (not released) will support jakarta annotations
+- The version 2.x.x of the plugin is supporting generation of OpenAPI version 3 specifications using Swagger 2.x.
+- To generate OpenAPI version 2 specifications using Swagger 1.x use the latest 1.x.x version of the plugin.
[](https://maven-badges.herokuapp.com/maven-central/io.openapitools.swagger/swagger-maven-plugin/)
[](https://www.javadoc.io/doc/io.openapitools.swagger/swagger-maven-plugin)
-[](https://travis-ci.org/openapi-tools/swagger-maven-plugin)
-[](https://snyk.io/test/github/openapi-tools/swagger-maven-plugin)
+[](https://travis-ci.org/openapi-tools/swagger-maven-plugin)
# Usage
@@ -23,8 +25,39 @@ To have Swagger generate the OpenAPI specifications as part of the build add in
...
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
+
+
+ io.openapitools.swagger.example
+ io.openapitools.swagger.example.alternate
+
+ ${basedir}/target/
+ swagger
+ JSON,YAML
+
+
+
+
+ generate
+
+
+
+
+ ...
+
+
+```
+
+Or Use the jakarta version :
+
+```xml
+
+
+ ...
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
io.openapitools.swagger.example
@@ -33,7 +66,6 @@ To have Swagger generate the OpenAPI specifications as part of the build add in
${basedir}/target/
swagger
JSON,YAML
- true
@@ -60,7 +92,7 @@ Most general properties of the Swagger model is configurable using the swaggerCo
```xml
- io.openapitools.swagger
+ io.github.dgautier
swagger-maven-plugin
@@ -99,7 +131,7 @@ The generated OpenAPI specifications may be installed and deployed as Maven arti
```xml
- io.openapitools.swagger
+ io.github.dgautier
swagger-maven-plugin
true
diff --git a/pom.xml b/pom.xml
index 9d760f2..c1083d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,13 +1,15 @@
-
+
4.0.0
Swagger Maven Plugin
- io.openapitools.swagger
- 2.1.7-SNAPSHOT
+
+ io.github.dgautier
+ 3.0.0-SNAPSHOT
swagger-maven-plugin
- maven-plugin
+ pom
Maven plugin to generate OpenAPI documentation using Swagger.
https://github.com/openapi-tools/swagger-maven-plugin
@@ -35,171 +37,101 @@
HEAD
-
-
- ossrh
- https://oss.sonatype.org/content/repositories/snapshots
-
-
- ossrh
- https://oss.sonatype.org/service/local/staging/deploy/maven2/
-
-
-
UTF-8
UTF-8
+ 17
+ ${java.version}
- 2.12.2
- 30.0-jre
+ 2.12.7.1
+ 33.0.0-jre
1.8.0
2.7.0-01
2.0.4-04
+ 4.8.149
1.0.8
- 2.1.7
+ 2.2.20
2.3.0
2.1
- 4.13.1
+ 3.1.0
+ 5.10.2
3.5
- 3.6.0
- 3.3.0
- 3.2.0
- 0.9.12
- 1.7.29
+ 3.9.6
+ 4.0.0-alpha-2
+ 2.0.12
+ 0.13.1
-
-
- io.swagger.core.v3
- swagger-jaxrs2
- ${io.swagger.core.v3.version}
-
-
- javax.ws.rs
- javax.ws.rs-api
- ${javax.ws.rs.version}
-
-
- org.slf4j
- slf4j-api
- ${org.slf4j.version}
-
-
- org.apache.maven.plugin-tools
- maven-plugin-annotations
- ${org.apache.maven.maven-plugin-annotations.version}
-
-
- org.apache.maven
- maven-plugin-api
- ${org.apache.maven.version}
-
-
- org.apache.maven
- maven-core
- ${org.apache.maven.version}
-
-
- org.apache.maven
- maven-artifact
- ${org.apache.maven.version}
-
-
- org.reflections
- reflections
- ${org.reflections.version}
-
-
- javax.xml.bind
- jaxb-api
- ${javax.xml.bin.jaxb-api.version}
- true
-
+
+ swagger-maven-plugin-core
+ swagger-maven-plugin-jaxrs2
+ swagger-maven-plugin-jakarta
+
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${com.fasterxml.jackson.core.version}
-
-
-
- com.google.guava
- guava
- ${com.google.guava.version}
-
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ org.apache.maven.plugin-tools
+ maven-plugin-annotations
+ ${org.apache.maven.maven-plugin-annotations.version}
+ provided
+
+
+ org.apache.maven
+ maven-plugin-api
+ ${org.apache.maven.version}
+ provided
+
+
+ org.apache.maven
+ maven-core
+ ${org.apache.maven.version}
+ provided
+
+
+ org.apache.maven
+ maven-artifact
+ ${org.apache.maven.version}
+ provided
+
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.slf4j
- slf4j-simple
- ${org.slf4j.version}
- test
-
-
- org.mockito
- mockito-core
- ${org.mockito.version}
- test
-
-
- org.apache.maven.plugin-testing
- maven-plugin-testing-harness
- ${org.apache.maven.plugin-testing.version}
- test
-
-
- org.apache.maven
- maven-compat
- ${org.apache.maven.version}
- test
-
-
- io.openapitools.jackson.dataformat
- jackson-dataformat-hal
- ${io.openapitools.jackson.dataformat.version}
- test
-
-
- org.codehaus.groovy
- groovy-eclipse-compiler
- ${groovy.eclipse.compiler.version}
- test
-
-
- org.codehaus.groovy
- groovy-eclipse-batch
- ${groovy-eclipse-batch.version}
- test
-
-
- org.codehaus.groovy
- groovy-all
- ${groovy.version}
- test
-
+
+ org.slf4j
+ slf4j-simple
+ ${org.slf4j.version}
+ test
+
+
+ io.openapitools.jackson.dataformat
+ jackson-dataformat-hal
+ ${io.openapitools.jackson.dataformat.version}
+ test
+
-
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-plugin-plugin
+ 3.11.0
+
+
+
-
- org.apache.maven.plugins
- maven-plugin-plugin
- 3.5
-
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
+ 3.12.1
- 1.8
- 1.8
-Xlint
@@ -213,102 +145,152 @@
org.apache.maven.plugins
maven-failsafe-plugin
- 2.22.0
-
-
-
- integration-test
- verify
-
-
-
-
-
- org.apache.maven.plugins
- maven-invoker-plugin
- 3.2.0
-
-
- integration-test
-
-
- install
- run
-
-
-
+ 3.2.5
- src/it
- ${project.build.directory}/it
-
- */pom.xml
-
- verify
- ${project.build.directory}/local-repo
- src/it/settings.xml
- true
- false
-
- ${https.protocols}
-
-
- clean
- package
-
+
+
+ ${maven.version}
+ ${maven.home}
+
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.6
- sign-artifacts
- verify
- sign
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 3.0.1
-
-
- attach-sources
-
- jar-no-fork
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 3.1.1
-
- 1.8
-
-
-
- attach-javadocs
-
- jar
+ integration-test
+ verify
-
- org.apache.maven.plugins
- maven-release-plugin
- 2.5.3
-
- v@{project.version}
-
-
+
+
+ ossrh
+
+
+ ossrh
+ Central Repository OSSRH
+ https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+ ossrh
+ Central Repository OSSRH
+ https://s01.oss.sonatype.org/content/repositories/snapshots
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 3.1.0
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+
+ --pinentry-mode
+ loopback
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.3.0
+
+
+ attach-sources
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.6.3
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.13
+ true
+
+ ossrh
+ https://s01.oss.sonatype.org/
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 3.0.1
+
+ [ci skip]
+
+
+
+
+
+
+ github
+
+
+ github
+ GitHub Packages
+ https://maven.pkg.github.com/dgautier/swagger-maven-plugin
+
+
+
+
+ coverage
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.11
+
+
+ prepare-agent
+
+ prepare-agent
+
+
+
+ jacoco-report
+ verify
+
+ report
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/io/openapitools/swagger/JaxRSScanner.java b/src/main/java/io/openapitools/swagger/JaxRSScanner.java
deleted file mode 100644
index 2c9c6d7..0000000
--- a/src/main/java/io/openapitools/swagger/JaxRSScanner.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package io.openapitools.swagger;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Application;
-
-import org.apache.maven.plugin.logging.Log;
-import org.reflections.Reflections;
-import org.reflections.scanners.ResourcesScanner;
-import org.reflections.scanners.SubTypesScanner;
-import org.reflections.scanners.TypeAnnotationsScanner;
-import org.reflections.util.ConfigurationBuilder;
-
-import io.swagger.v3.oas.annotations.OpenAPIDefinition;
-
-/**
- * Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition}
- * annotation, and for {@link Application} instances.
- */
-class JaxRSScanner {
-
- private final Log log;
-
- private final Set resourcePackages;
-
- private final boolean useResourcePackagesChildren;
-
- public JaxRSScanner(Log log, Set resourcePackages, Boolean useResourcePackagesChildren) {
- this.log = log;
- this.resourcePackages = resourcePackages == null ? Collections.emptySet() : new HashSet<>(resourcePackages);
- this.useResourcePackagesChildren = useResourcePackagesChildren != null && useResourcePackagesChildren;
- }
-
- Application applicationInstance() {
- ConfigurationBuilder config = ConfigurationBuilder
- .build(resourcePackages)
- .setScanners(new ResourcesScanner(), new TypeAnnotationsScanner(), new SubTypesScanner());
- Reflections reflections = new Reflections(config);
- Set> applicationClasses = reflections.getSubTypesOf(Application.class)
- .stream()
- .filter(this::filterClassByResourcePackages)
- .collect(Collectors.toSet());
- if (applicationClasses.isEmpty()) {
- return null;
- }
- if (applicationClasses.size() > 1) {
- log.warn("More than one javax.ws.rs.core.Application classes found on the classpath, skipping");
- return null;
- }
- return ClassUtils.createInstance(applicationClasses.iterator().next());
- }
-
- Set> classes() {
- ConfigurationBuilder config = ConfigurationBuilder
- .build(resourcePackages)
- .setScanners(new ResourcesScanner(), new TypeAnnotationsScanner(), new SubTypesScanner());
- Reflections reflections = new Reflections(config);
- Stream> apiClasses = reflections.getTypesAnnotatedWith(Path.class)
- .stream()
- .filter(this::filterClassByResourcePackages);
- Stream> 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)));
- }
-
-}
diff --git a/src/test/resources/expectedOutput/api/swagger.json b/src/test/resources/expectedOutput/api/swagger.json
deleted file mode 100644
index dbca506..0000000
--- a/src/test/resources/expectedOutput/api/swagger.json
+++ /dev/null
@@ -1 +0,0 @@
-{"openapi":"3.0.1","paths":{"/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/accounts/{regNo}-{accountNo}":{"get":{"description":"Get single account","operationId":"get","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","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":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdateRepresentation"}}}},"responses":{"404":{"description":"No updating possible"}}}}},"components":{"schemas":{"AccountUpdateRepresentation":{"required":["name"],"type":"object","properties":{"accountNo":{"pattern":"^[0-9]+$","type":"string"},"name":{"pattern":".{1,40}","type":"string"},"regNo":{"pattern":"^[0-9]{4}$","type":"string"}}}}}}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/application/swagger.json b/src/test/resources/expectedOutput/application/swagger.json
deleted file mode 100644
index e9ba5fe..0000000
--- a/src/test/resources/expectedOutput/application/swagger.json
+++ /dev/null
@@ -1 +0,0 @@
-{"openapi":"3.0.1","info":{"title":"My Title","description":"Description from ReaderListener","version":"1.0.0"},"paths":{"/api/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/api/accounts/{regNo}-{accountNo}":{"get":{"description":"Get single account","operationId":"get","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","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":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdateRepresentation"}}}},"responses":{"404":{"description":"No updating possible"}}}},"/api/alternate":{"get":{"operationId":"list_1","responses":{"default":{"description":"default response","content":{"*/*":{}}}}}}},"components":{"schemas":{"AccountUpdateRepresentation":{"required":["name"],"type":"object","properties":{"accountNo":{"pattern":"^[0-9]+$","type":"string"},"name":{"pattern":".{1,40}","type":"string"},"regNo":{"pattern":"^[0-9]{4}$","type":"string"}}}}}}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/application_scan/swagger.json b/src/test/resources/expectedOutput/application_scan/swagger.json
deleted file mode 100644
index 4ede6f5..0000000
--- a/src/test/resources/expectedOutput/application_scan/swagger.json
+++ /dev/null
@@ -1 +0,0 @@
-{"openapi":"3.0.1","info":{"title":"My Title","description":"Description from ReaderListener","version":"1.0.0"},"paths":{"/api/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/api/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"}}}},"/api/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"}}}}}}
diff --git a/src/test/resources/expectedOutput/default/swagger.json b/src/test/resources/expectedOutput/default/swagger.json
deleted file mode 100644
index fe709bd..0000000
--- a/src/test/resources/expectedOutput/default/swagger.json
+++ /dev/null
@@ -1 +0,0 @@
-{"openapi":"3.0.1","info":{"title":"My Title","description":"Description from ReaderListener","version":"1.0.0"},"paths":{"/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/accounts/{regNo}-{accountNo}":{"get":{"description":"Get single account","operationId":"get","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","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":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdateRepresentation"}}}},"responses":{"404":{"description":"No updating possible"}}}},"/alternate":{"get":{"operationId":"list_1","responses":{"default":{"description":"default response","content":{"*/*":{}}}}}}},"components":{"schemas":{"AccountUpdateRepresentation":{"required":["name"],"type":"object","properties":{"accountNo":{"pattern":"^[0-9]+$","type":"string"},"name":{"pattern":".{1,40}","type":"string"},"regNo":{"pattern":"^[0-9]{4}$","type":"string"}}}}}}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/full/open-api.json b/src/test/resources/expectedOutput/full/open-api.json
deleted file mode 100644
index 7ff8c06..0000000
--- a/src/test/resources/expectedOutput/full/open-api.json
+++ /dev/null
@@ -1 +0,0 @@
-{"openapi":"3.0.1","info":{"title":"Title","description":"# Description\n\nThis is some description to be included.","termsOfService":"Terms","contact":{"name":"My Name","url":"https://google.com","email":"e@mail.com"},"license":{"name":"MIT","url":"https://license"},"version":"1.0.0","x-custom-property":"In Info"},"externalDocs":{"description":"Some external doc at config level","url":"https://example.org","x-custom-property":"In configs's external document"},"servers":[{"url":"https://{sub}.example.it/base/path","description":"Example URL","variables":{"sub":{"description":"The Subdomain","default":"services","enum":["services","web","main"],"x-custom-property":"In ServerVariable"}},"x-custom-property":"In Server"}],"security":[{"first":[]},{"third":["requiredScope1","requiredScope2"]}],"tags":[{"name":"MyTag","description":"MyDescription","externalDocs":{"description":"Some tag's external doc","url":"https://tag.example.org","x-custom-property":"In tag's external document"},"x-custom-property":"In tag"}],"paths":{"/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/accounts/{regNo}-{accountNo}":{"get":{"description":"Get single account","operationId":"get","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","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":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdateRepresentation"}}}},"responses":{"404":{"description":"No updating possible"}}}}},"components":{"schemas":{"AccountUpdateRepresentation":{"required":["name"],"type":"object","properties":{"accountNo":{"pattern":"^[0-9]+$","type":"string"},"name":{"pattern":".{1,40}","type":"string"},"regNo":{"pattern":"^[0-9]{4}$","type":"string"}}}},"securitySchemes":{"first":{"type":"apiKey","description":"Via web gateway","name":"X-API-TOKEN","in":"header"},"fourth":{"type":"openIdConnect","openIdConnectUrl":"https://id.example.org"},"second":{"type":"http","scheme":"MyCredentials","bearerFormat":"password"},"third":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.example.org","refreshUrl":"https://refresh.example.org","scopes":{"x":"y"},"x-custom-property":"In third SecurityScheme's implicit flow"},"password":{"tokenUrl":"https://token.example.org"},"clientCredentials":{"tokenUrl":"https://client.token.example.org"},"authorizationCode":{"authorizationUrl":"https://code.auth.example.org","tokenUrl":"https://code.token.example.org"},"x-custom-property":"In third SecurityScheme's flow"}}}},"x-custom-property":"In Config"}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/semifull/swagger.json b/src/test/resources/expectedOutput/semifull/swagger.json
deleted file mode 100644
index 802e8c2..0000000
--- a/src/test/resources/expectedOutput/semifull/swagger.json
+++ /dev/null
@@ -1 +0,0 @@
-{"openapi":"3.0.1","info":{"title":"Title","description":"# Description\n\nThis is some description to be included.","termsOfService":"Terms","contact":{"name":"My Name","url":"https://google.com","email":"e@mail.com"},"license":{"name":"MIT","url":"https://license"},"version":"1.0.0"},"servers":[{"url":"https://services.example.it/base/path","description":"Example URL"}],"paths":{"/accounts":{"get":{"operationId":"list","responses":{"default":{"description":"default response","content":{"application/hal+json":{}}}}}},"/accounts/{regNo}-{accountNo}":{"get":{"description":"Get single account","operationId":"get","parameters":[{"name":"regNo","in":"path","required":true,"schema":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","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":{"pattern":"^[0-9]{4}$","type":"string"}},{"name":"accountNo","in":"path","required":true,"schema":{"pattern":"^[0-9]+$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdateRepresentation"}}}},"responses":{"404":{"description":"No updating possible"}}}}},"components":{"schemas":{"AccountUpdateRepresentation":{"required":["name"],"type":"object","properties":{"accountNo":{"pattern":"^[0-9]+$","type":"string"},"name":{"pattern":".{1,40}","type":"string"},"regNo":{"pattern":"^[0-9]{4}$","type":"string"}}}}}}
\ No newline at end of file
diff --git a/swagger-maven-plugin-core/pom.xml b/swagger-maven-plugin-core/pom.xml
new file mode 100644
index 0000000..fc29e37
--- /dev/null
+++ b/swagger-maven-plugin-core/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+ io.github.dgautier
+ swagger-maven-plugin
+ 3.0.0-SNAPSHOT
+
+
+ swagger-maven-plugin-core
+
+
+
+ io.swagger.core.v3
+ swagger-models
+ ${io.swagger.core.v3.version}
+
+
+ io.swagger.core.v3
+ swagger-core
+ ${io.swagger.core.v3.version}
+
+
+ org.apache.maven.plugin-tools
+ maven-plugin-annotations
+
+
+ org.apache.maven
+ maven-plugin-api
+
+
+ org.apache.maven
+ maven-core
+
+
+ org.apache.maven
+ maven-artifact
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.10.2
+ test
+
+
+
\ No newline at end of file
diff --git a/src/main/java/io/openapitools/swagger/ClassUtils.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/ClassUtils.java
similarity index 94%
rename from src/main/java/io/openapitools/swagger/ClassUtils.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/ClassUtils.java
index b5db050..bc4039e 100644
--- a/src/main/java/io/openapitools/swagger/ClassUtils.java
+++ b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/ClassUtils.java
@@ -1,6 +1,6 @@
package io.openapitools.swagger;
-final class ClassUtils {
+public final class ClassUtils {
private ClassUtils() {
}
diff --git a/src/main/java/io/openapitools/swagger/GenerateMojo.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/GenerateMojo.java
similarity index 59%
rename from src/main/java/io/openapitools/swagger/GenerateMojo.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/GenerateMojo.java
index fab7629..71ff009 100644
--- a/src/main/java/io/openapitools/swagger/GenerateMojo.java
+++ b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/GenerateMojo.java
@@ -1,6 +1,15 @@
package io.openapitools.swagger;
-import javax.ws.rs.core.Application;
+import io.openapitools.swagger.config.SwaggerConfig;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.*;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectHelper;
+
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
@@ -12,26 +21,10 @@
import java.util.LinkedHashSet;
import java.util.Set;
-import io.openapitools.swagger.config.SwaggerConfig;
-import io.swagger.v3.jaxrs2.Reader;
-import io.swagger.v3.oas.models.OpenAPI;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-
/**
* Maven mojo to generate OpenAPI documentation document based on Swagger.
*/
-@Mojo(name = "generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
-public class GenerateMojo extends AbstractMojo {
+public abstract class GenerateMojo extends AbstractMojo {
/**
* Skip the execution.
@@ -97,8 +90,7 @@ public class GenerateMojo extends AbstractMojo {
* When true, the plugin produces a pretty-printed JSON Swagger specification. Note that this parameter doesn't
* have any effect on the generation of the YAML version because YAML is pretty-printed by nature.
*/
- @Parameter(defaultValue = "false")
- private boolean prettyPrint;
+ private boolean prettyPrint = true;
@Component
private MavenProjectHelper projectHelper;
@@ -110,61 +102,44 @@ public void execute() throws MojoExecutionException, MojoFailureException {
return;
}
- ClassLoader origClzLoader = Thread.currentThread().getContextClassLoader();
- ClassLoader clzLoader = createClassLoader(origClzLoader);
-
- try {
- // set the TCCL before everything else
- Thread.currentThread().setContextClassLoader(clzLoader);
-
- Reader reader = new Reader(swaggerConfig == null ? new OpenAPI() : swaggerConfig.createSwaggerModel());
-
- JaxRSScanner reflectiveScanner = new JaxRSScanner(getLog(), resourcePackages, useResourcePackagesChildren);
+ OpenAPI swaggerJaxRS = getOpenApi();
- Application application = resolveApplication(reflectiveScanner);
- reader.setApplication(application);
-
- OpenAPI swagger = OpenAPISorter.sort(reader.read(reflectiveScanner.classes()));
-
- if (outputDirectory.mkdirs()) {
- getLog().debug("Created output directory " + outputDirectory);
- }
+ if (outputDirectory.mkdirs()) {
+ getLog().debug("Created output directory " + outputDirectory);
+ }
- outputFormats.forEach(format -> {
- try {
- File outputFile = new File(outputDirectory, outputFilename + "." + format.name().toLowerCase());
- format.write(swagger, outputFile, prettyPrint);
- if (attachSwaggerArtifact) {
- projectHelper.attachArtifact(project, format.name().toLowerCase(), "swagger", outputFile);
- }
- } catch (IOException e) {
- throw new RuntimeException("Unable write " + outputFilename + " document", e);
+ try {
+ for (OutputFormat format : outputFormats) {
+ File outputFile = new File(outputDirectory, outputFilename + "." + format.name().toLowerCase());
+ format.write(swaggerJaxRS, outputFile, prettyPrint);
+ if (attachSwaggerArtifact) {
+ projectHelper.attachArtifact(project, format.name().toLowerCase(), "swagger", outputFile);
}
- });
- } finally {
- // reset the TCCL back to the original class loader
- Thread.currentThread().setContextClassLoader(origClzLoader);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Unable write " + outputFilename + " document", e);
}
}
- private Application resolveApplication(JaxRSScanner reflectiveScanner) {
- if (applicationClass == null || applicationClass.isEmpty()) {
- return reflectiveScanner.applicationInstance();
- }
+ protected SwaggerConfig getSwaggerConfig(){
+ return this.swaggerConfig;
+ }
- Class> clazz = ClassUtils.loadClass(applicationClass, Thread.currentThread().getContextClassLoader());
+ protected Set getResourcePackages() {
+ return resourcePackages;
+ }
- if (clazz == null || !Application.class.isAssignableFrom(clazz)) {
- getLog().warn("Provided application class does not implement javax.ws.rs.core.Application, skipping");
- return null;
- }
+ protected Boolean getUseResourcePackagesChildren() {
+ return useResourcePackagesChildren;
+ }
- @SuppressWarnings("unchecked")
- Class extends Application> appClazz = (Class extends Application>)clazz;
- return ClassUtils.createInstance(appClazz);
+ protected String getApplicationClass() {
+ return applicationClass;
}
- private URLClassLoader createClassLoader(ClassLoader parent) {
+ protected abstract OpenAPI getOpenApi();
+
+ protected URLClassLoader createClassLoader() {
try {
Collection dependencies = getDependentClasspathElements();
URL[] urls = new URL[dependencies.size()];
@@ -172,7 +147,7 @@ private URLClassLoader createClassLoader(ClassLoader parent) {
for (String dependency : dependencies) {
urls[index++] = Paths.get(dependency).toUri().toURL();
}
- return new URLClassLoader(urls, parent);
+ return new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
} catch (MalformedURLException e) {
throw new RuntimeException("Unable to create class loader with compiled classes", e);
} catch (DependencyResolutionRequiredException e) {
diff --git a/src/main/java/io/openapitools/swagger/OpenAPISorter.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/OpenAPISorter.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/OpenAPISorter.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/OpenAPISorter.java
diff --git a/src/main/java/io/openapitools/swagger/OutputFormat.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/OutputFormat.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/OutputFormat.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/OutputFormat.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerComponents.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerComponents.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerComponents.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerComponents.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerConfig.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerConfig.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerConfig.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerConfig.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerContact.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerContact.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerContact.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerContact.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerExternalDoc.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerExternalDoc.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerExternalDoc.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerExternalDoc.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerFlows.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerFlows.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerFlows.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerFlows.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerInfo.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerInfo.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerInfo.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerInfo.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerLicense.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerLicense.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerLicense.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerLicense.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerSecurityRequirement.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerSecurityRequirement.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerSecurityRequirement.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerSecurityRequirement.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerSecurityScheme.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerSecurityScheme.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerSecurityScheme.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerSecurityScheme.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerServer.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerServer.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerServer.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerServer.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerServerVariable.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerServerVariable.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerServerVariable.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerServerVariable.java
diff --git a/src/main/java/io/openapitools/swagger/config/SwaggerTag.java b/swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerTag.java
similarity index 100%
rename from src/main/java/io/openapitools/swagger/config/SwaggerTag.java
rename to swagger-maven-plugin-core/src/main/java/io/openapitools/swagger/config/SwaggerTag.java
diff --git a/src/test/java/io/openapitools/swagger/OpenApiSorterTest.java b/swagger-maven-plugin-core/src/test/java/io/openapitools/swagger/OpenApiSorterTest.java
similarity index 97%
rename from src/test/java/io/openapitools/swagger/OpenApiSorterTest.java
rename to swagger-maven-plugin-core/src/test/java/io/openapitools/swagger/OpenApiSorterTest.java
index 1014139..c8a7316 100644
--- a/src/test/java/io/openapitools/swagger/OpenApiSorterTest.java
+++ b/swagger-maven-plugin-core/src/test/java/io/openapitools/swagger/OpenApiSorterTest.java
@@ -14,9 +14,9 @@
import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.oas.models.responses.ApiResponse;
import io.swagger.v3.oas.models.security.SecurityScheme;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
public class OpenApiSorterTest {
diff --git a/swagger-maven-plugin-jakarta/pom.xml b/swagger-maven-plugin-jakarta/pom.xml
new file mode 100644
index 0000000..30c9777
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+
+ io.github.dgautier
+ swagger-maven-plugin
+ 3.0.0-SNAPSHOT
+
+
+ swagger-maven-plugin-jakarta
+ maven-plugin
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-core
+ ${project.version}
+
+
+ org.apache.maven
+ maven-core
+
+
+ org.apache.maven
+ maven-plugin-api
+
+
+ org.apache.maven.plugin-tools
+ maven-plugin-annotations
+
+
+ io.swagger.core.v3
+ swagger-jaxrs2-jakarta
+ ${io.swagger.core.v3.version}
+
+
+ jakarta.ws.rs
+ jakarta.ws.rs-api
+ ${jakarta.ws.rs.version}
+
+
+ io.openapitools.jackson.dataformat
+ jackson-dataformat-hal
+
+
+ org.slf4j
+ slf4j-simple
+
+
+ org.apache.maven.plugin-testing
+ maven-plugin-testing-harness
+ 4.0.0-alpha-2
+ test
+
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-plugin-plugin
+
+ swagger
+
+
+
+
+
\ No newline at end of file
diff --git a/swagger-maven-plugin-jakarta/src/main/java/io/openapitools/swagger/jakarta/JakartaGenerateMojo.java b/swagger-maven-plugin-jakarta/src/main/java/io/openapitools/swagger/jakarta/JakartaGenerateMojo.java
new file mode 100644
index 0000000..7e73e63
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/main/java/io/openapitools/swagger/jakarta/JakartaGenerateMojo.java
@@ -0,0 +1,48 @@
+package io.openapitools.swagger.jakarta;
+
+import io.openapitools.swagger.ClassUtils;
+import io.openapitools.swagger.GenerateMojo;
+import io.openapitools.swagger.OpenAPISorter;
+import io.swagger.v3.jaxrs2.Reader;
+import io.swagger.v3.oas.models.OpenAPI;
+import jakarta.ws.rs.core.Application;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
+@Mojo(name = "generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
+public class JakartaGenerateMojo extends GenerateMojo {
+
+ @Override
+ protected OpenAPI getOpenApi() {
+ Reader reader = new Reader(getSwaggerConfig() == null ? new OpenAPI() : getSwaggerConfig().createSwaggerModel());
+
+ JakartaScanner reflectiveScanner = new JakartaScanner(getLog(), createClassLoader(), getResourcePackages(), getUseResourcePackagesChildren());
+
+ Application application = resolveApplication(reflectiveScanner);
+ reader.setApplication(application);
+
+ OpenAPI swagger = OpenAPISorter.sort(reader.read(reflectiveScanner.classes()));
+ return swagger;
+ }
+
+
+ private Application resolveApplication(JakartaScanner reflectiveScanner) {
+ if (getApplicationClass() == null || getApplicationClass().isEmpty()) {
+ return reflectiveScanner.applicationInstance();
+ }
+
+ Class> clazz = ClassUtils.loadClass(getApplicationClass(), Thread.currentThread().getContextClassLoader());
+
+ if (clazz == null || !Application.class.isAssignableFrom(clazz)) {
+ getLog().warn("Provided application class does not implement jakarta.ws.rs.core.Application, skipping");
+ return null;
+ } else {
+ getLog().info("Found Application Class : " + clazz.getName());
+ }
+
+ @SuppressWarnings("unchecked")
+ Class extends Application> appClazz = (Class extends Application>)clazz;
+ return ClassUtils.createInstance(appClazz);
+ }
+}
diff --git a/swagger-maven-plugin-jakarta/src/main/java/io/openapitools/swagger/jakarta/JakartaScanner.java b/swagger-maven-plugin-jakarta/src/main/java/io/openapitools/swagger/jakarta/JakartaScanner.java
new file mode 100644
index 0000000..64eb3de
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/main/java/io/openapitools/swagger/jakarta/JakartaScanner.java
@@ -0,0 +1,77 @@
+package io.openapitools.swagger.jakarta;
+
+import io.github.classgraph.ClassGraph;
+import io.github.classgraph.ClassInfo;
+import io.github.classgraph.ClassInfoList;
+import io.github.classgraph.ScanResult;
+import io.openapitools.swagger.ClassUtils;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.core.Application;
+import org.apache.maven.plugin.logging.Log;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition}
+ * annotation, and for {@link Application} instances.
+ */
+class JakartaScanner {
+
+ private final Log log;
+
+ private final ClassGraph classGraph;
+
+ private final Set resourcePackages;
+
+ private final boolean useResourcePackagesChildren;
+
+ public JakartaScanner(Log log, ClassLoader clzLoader, Set resourcePackages, Boolean useResourcePackagesChildren) {
+ this.log = log;
+ this.classGraph = new ClassGraph().enableClassInfo().enableAnnotationInfo()
+ .addClassLoader(clzLoader);
+ this.resourcePackages = resourcePackages == null ? Collections.emptySet() : new HashSet<>(resourcePackages);
+ this.useResourcePackagesChildren = Boolean.TRUE.equals(useResourcePackagesChildren);
+ }
+
+ Application applicationInstance() {
+ Application applicationInstance = null;
+ try (ScanResult scanResult = classGraph.scan()) {
+ ClassInfoList applicationClasses = scanResult.getSubclasses(Application.class.getName())
+ .filter(this::filterClassByResourcePackages);
+ if (applicationClasses.size() == 1) {
+ applicationInstance = ClassUtils.createInstance(applicationClasses.get(0).loadClass(Application.class));
+ } else if (applicationClasses.size() > 1) {
+ log.warn("More than one javax.ws.rs.core.Application classes found on the classpath, skipping");
+ }
+ }
+ return applicationInstance;
+ }
+
+ Set> classes() {
+ Set> classes;
+ try (ScanResult scanResult = classGraph.scan()) {
+ ClassInfoList apiClasses = scanResult.getClassesWithAnnotation(Path.class.getName());
+ ClassInfoList defClasses = scanResult.getClassesWithAnnotation(OpenAPIDefinition.class.getName());
+ classes = Stream.of(apiClasses, defClasses)
+ .flatMap(classList -> classList.filter(this::filterClassByResourcePackages).stream())
+ .map(ClassInfo::loadClass)
+ .collect(Collectors.toSet());
+ }
+ if (classes.isEmpty()) {
+ log.warn("No @Path or @OpenAPIDefinition annotated classes found in given resource packages: " + resourcePackages);
+ }
+ return classes;
+ }
+
+ private boolean filterClassByResourcePackages(ClassInfo cls) {
+ return resourcePackages.isEmpty()
+ || resourcePackages.contains(cls.getPackageName())
+ || (useResourcePackagesChildren && resourcePackages.stream().anyMatch(p -> cls.getPackageName().startsWith(p)));
+ }
+
+}
diff --git a/src/test/java/io/openapitools/swagger/GenerateMojoIT.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/GenerateMojoIT.java
similarity index 81%
rename from src/test/java/io/openapitools/swagger/GenerateMojoIT.java
rename to swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/GenerateMojoIT.java
index 8500ead..ab7b6d5 100644
--- a/src/test/java/io/openapitools/swagger/GenerateMojoIT.java
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/GenerateMojoIT.java
@@ -1,27 +1,26 @@
package io.openapitools.swagger;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Arrays;
-import java.util.List;
-
import com.fasterxml.jackson.databind.ObjectMapper;
+import io.openapitools.swagger.OutputFormat;
import io.swagger.v3.core.util.Json;
import io.swagger.v3.core.util.Yaml;
import io.swagger.v3.oas.models.OpenAPI;
import org.apache.maven.plugin.Mojo;
import org.apache.maven.plugin.testing.MojoRule;
-import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
public class GenerateMojoIT {
@Rule
@@ -39,9 +38,9 @@ private void assertYamlEquals(Path expectedYaml, Path generatedYaml) throws IOEx
private void assertFileContentEquals(Path expected, Path generated) {
try {
- Assert.assertEquals(String.join("\n", Files.readAllLines(expected, StandardCharsets.UTF_8)), String.join("\n", Files.readAllLines(generated, StandardCharsets.UTF_8)));
+ assertEquals(String.join("\n", Files.readAllLines(expected, StandardCharsets.UTF_8)), String.join("\n", Files.readAllLines(generated, StandardCharsets.UTF_8)));
} catch (IOException e) {
- Assert.fail();
+ fail();
}
}
@@ -50,7 +49,7 @@ private void assertOpenApiEquals(ObjectMapper mapper, Path expected, Path genera
OpenAPI generatedAPI = mapper.readValue(generated.toFile(), OpenAPI.class);
// OpenAPI.equals() performs a deep equal check of all its properties
- Assert.assertEquals(expectedAPI, generatedAPI);
+ assertEquals(expectedAPI, generatedAPI);
}
/**
@@ -59,12 +58,12 @@ private void assertOpenApiEquals(ObjectMapper mapper, Path expected, Path genera
* @param folder The base folder of the expected output.
* @param basename The basename for the generated Swagger specifications.
* @param pom The name of the POM file to be used for the test.
- * @param prettyPrinted If true, the generated JSON Swagger specification should be pretty-printed.
* @param outputFormats The output formats that should be generated and checked.
*
* @throws Exception If a JSON parsing or file-read exception happens.
*/
- private void testGenerate(String folder, String basename, String pom, boolean prettyPrinted, OutputFormat... outputFormats)
+
+ private void testGenerate(String folder, String basename, String pom, OutputFormat... outputFormats)
throws Exception {
Path output = Paths.get(folder);
@@ -83,7 +82,6 @@ private void testGenerate(String folder, String basename, String pom, boolean pr
// We test the indentation by simply checking that the generated JSON contains 2 spaces
String json = new String(Files.readAllBytes(generatedJson), StandardCharsets.UTF_8);
- Assert.assertEquals(prettyPrinted, json.contains(" "));
}
if (formats.contains(OutputFormat.YAML)) {
@@ -93,44 +91,46 @@ private void testGenerate(String folder, String basename, String pom, boolean pr
}
}
+ //@MavenGoal("${project.groupId}:${project.artifactId}:${project.version}:generate")
+ //@MavenTest
@Test
public void testGenerateApi() throws Exception {
- testGenerate("api", "swagger", "generate-mojo-pom.xml", false, OutputFormat.JSON, OutputFormat.YAML);
+ testGenerate("api", "swagger", "generate-mojo-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
}
@Test
public void testGenerateDefaults() throws Exception {
- testGenerate("default", "swagger", "generate-mojo-defaults-pom.xml", false, OutputFormat.JSON);
+ testGenerate("default", "swagger", "generate-mojo-defaults-pom.xml", OutputFormat.JSON);
}
@Test
public void testGenerateApplicationClass() throws Exception {
- testGenerate("application", "swagger", "generate-mojo-application.xml", false, OutputFormat.JSON);
+ testGenerate("application", "swagger", "generate-mojo-application.xml", OutputFormat.JSON);
}
@Test
public void testGenerateApplicationClassByScanning() throws Exception {
- testGenerate("application", "swagger", "generate-mojo-application-scan.xml", false, OutputFormat.JSON);
+ testGenerate("application", "swagger", "generate-mojo-application-scan.xml", OutputFormat.JSON);
}
@Test
public void testGenerateFull() throws Exception {
- testGenerate("full", "open-api", "generate-mojo-full-pom.xml", false, OutputFormat.JSON, OutputFormat.YAML);
+ testGenerate("full", "open-api", "generate-mojo-full-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
}
@Test
public void testGenerateFullNoFileName() throws Exception {
- testGenerate("semifull", "swagger", "generate-mojo-full-nofilename-pom.xml", false, OutputFormat.JSON, OutputFormat.YAML);
+ testGenerate("semifull", "swagger", "generate-mojo-full-nofilename-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
}
@Test
public void testGenerateFullPretty() throws Exception {
- testGenerate("fullpretty", "open-api", "generate-mojo-full-pretty-pom.xml", true, OutputFormat.JSON, OutputFormat.YAML);
+ testGenerate("fullpretty", "open-api", "generate-mojo-full-pretty-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
}
@Test
public void testGenerateRecursive() throws Exception {
- testGenerate("recursive", "swagger", "generate-mojo-recursive-pom.xml", true, OutputFormat.JSON);
+ testGenerate("recursive", "swagger", "generate-mojo-recursive-pom.xml", OutputFormat.JSON);
}
private static class DeleteVisitor extends SimpleFileVisitor {
diff --git a/src/test/java/io/openapitools/swagger/MavenProjectStub.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/MavenProjectStub.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/MavenProjectStub.java
rename to swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/MavenProjectStub.java
diff --git a/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java
new file mode 100644
index 0000000..4b53905
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java
@@ -0,0 +1,57 @@
+package io.openapitools.swagger.example;
+
+import io.openapitools.swagger.example.model.AccountUpdateRepresentation;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Pattern;
+
+/**
+ * Exposing account as REST service.
+ */
+@Path("/accounts")
+public class AccountServiceExposure {
+
+ @GET
+ @Produces({"application/hal+json"})
+ public Response list(@Context UriInfo uriInfo, @Context Request request) {
+ return Response.ok().build();
+ }
+
+ @GET
+ @Path("{regNo}-{accountNo}")
+ @Produces({"application/hal+json"})
+ @Operation(description = "Get single account",
+ responses = {@ApiResponse(responseCode = "404", description = "No account found.")})
+ public Response get(@PathParam("regNo") @Pattern(regexp = "^[0-9]{4}$") String regNo,
+ @PathParam("accountNo") @Pattern(regexp = "^[0-9]+$") String accountNo,
+ @Context UriInfo uriInfo, @Context Request request) {
+ return Response.ok().build();
+ }
+
+ @GET
+ @Path("{regNo}-{accountNo}")
+ @Produces({"application/hal+json;v=1"})
+ @Hidden
+ public Response getV1() {
+ return null;
+ }
+
+ @PUT
+ @Path("{regNo}-{accountNo}")
+ @Produces({"application/hal+json"})
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Operation(description = "Create new or update existing account",
+ responses = @ApiResponse(responseCode = "404", description = "No updating possible"))
+ public Response createOrUpdate(@PathParam("regNo") @Pattern(regexp = "^[0-9]{4}$") String regNo,
+ @PathParam("accountNo") @Pattern(regexp = "^[0-9]+$") String accountNo,
+ @Valid AccountUpdateRepresentation account,
+ @Context UriInfo uriInfo, @Context Request request) {
+ return Response.ok().build();
+ }
+
+}
diff --git a/src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java
rename to swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java
diff --git a/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java
new file mode 100644
index 0000000..7126ffd
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java
@@ -0,0 +1,16 @@
+package io.openapitools.swagger.example.alternate;
+
+
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.core.Response;
+
+@Path("alternate")
+public class AlternateResource {
+
+ @GET
+ public Response list() {
+ return null;
+ }
+
+}
diff --git a/src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
rename to swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
diff --git a/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/app/RestApplication.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/app/RestApplication.java
new file mode 100644
index 0000000..3ea8b39
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/app/RestApplication.java
@@ -0,0 +1,10 @@
+package io.openapitools.swagger.example.app;
+
+
+import jakarta.ws.rs.ApplicationPath;
+import jakarta.ws.rs.core.Application;
+
+@ApplicationPath("/api")
+public class RestApplication extends Application {
+
+}
diff --git a/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java
new file mode 100644
index 0000000..2a1538d
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java
@@ -0,0 +1,56 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.EmbeddedResource;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Represents a single as returned from REST service.
+ */
+@Resource
+public class AccountRepresentation {
+ private String regNo;
+ private String accountNo;
+ private String name;
+
+ @EmbeddedResource("transactions")
+ private Collection transactions;
+
+ @Link("account:transactions")
+ private HALLink transactionsResource;
+
+ @Link
+ private HALLink self;
+
+ public String getRegNo() {
+ return regNo;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Collection getTransactions() {
+ if (transactions == null) {
+ return null;
+ } else {
+ return Collections.unmodifiableCollection(transactions);
+ }
+ }
+
+ public HALLink getTransactionsResource() {
+ return transactionsResource;
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+}
diff --git a/src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
rename to swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
diff --git a/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
new file mode 100644
index 0000000..c5a334f
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
@@ -0,0 +1,33 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.EmbeddedResource;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Represents a set of accounts from the REST service exposure.
+ */
+@Resource
+public class AccountsRepresentation {
+
+ @Link
+ private HALLink self;
+
+ @EmbeddedResource("accounts")
+ private Collection accounts;
+
+ public AccountsRepresentation() {
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+
+ public Collection getAccounts() {
+ return Collections.unmodifiableCollection(accounts);
+ }
+}
diff --git a/src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
rename to swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
diff --git a/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
new file mode 100644
index 0000000..655eae0
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
@@ -0,0 +1,29 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.EmbeddedResource;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Represents a set of transactions as returned by the REST service.
+ */
+@Resource
+public class TransactionsRepresentation {
+ @EmbeddedResource("transactions")
+ private Collection transactions;
+
+ @Link
+ private HALLink self;
+
+ public Collection getTransactions() {
+ return Collections.unmodifiableCollection(transactions);
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+}
diff --git a/src/test/resources/descriptions.md b/swagger-maven-plugin-jakarta/src/test/resources/descriptions.md
similarity index 100%
rename from src/test/resources/descriptions.md
rename to swagger-maven-plugin-jakarta/src/test/resources/descriptions.md
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/api/swagger.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/api/swagger.json
new file mode 100644
index 0000000..a6fd330
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/api/swagger.json
@@ -0,0 +1,103 @@
+{
+ "openapi" : "3.0.1",
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/api/swagger.yaml b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/api/swagger.yaml
similarity index 100%
rename from src/test/resources/expectedOutput/api/swagger.yaml
rename to swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/api/swagger.yaml
diff --git a/src/test/resources/expectedOutput/recursive/swagger.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/application/swagger.json
similarity index 100%
rename from src/test/resources/expectedOutput/recursive/swagger.json
rename to swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/application/swagger.json
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/application_scan/swagger.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/application_scan/swagger.json
new file mode 100644
index 0000000..944474d
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/application_scan/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/api/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/api/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/api/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/default/swagger.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/default/swagger.json
new file mode 100644
index 0000000..4e9c78d
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/default/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/full/open-api.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/full/open-api.json
new file mode 100644
index 0000000..60926a5
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/full/open-api.json
@@ -0,0 +1,195 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "Title",
+ "description" : "# Description\n\nThis is some description to be included.",
+ "termsOfService" : "Terms",
+ "contact" : {
+ "name" : "My Name",
+ "url" : "https://google.com",
+ "email" : "e@mail.com"
+ },
+ "license" : {
+ "name" : "MIT",
+ "url" : "https://license"
+ },
+ "version" : "1.0.0",
+ "x-custom-property" : "In Info"
+ },
+ "externalDocs" : {
+ "description" : "Some external doc at config level",
+ "url" : "https://example.org",
+ "x-custom-property" : "In configs's external document"
+ },
+ "servers" : [ {
+ "url" : "https://{sub}.example.it/base/path",
+ "description" : "Example URL",
+ "variables" : {
+ "sub" : {
+ "description" : "The Subdomain",
+ "default" : "services",
+ "enum" : [ "services", "web", "main" ],
+ "x-custom-property" : "In ServerVariable"
+ }
+ },
+ "x-custom-property" : "In Server"
+ } ],
+ "security" : [ {
+ "first" : [ ]
+ }, {
+ "third" : [ "requiredScope1", "requiredScope2" ]
+ } ],
+ "tags" : [ {
+ "name" : "MyTag",
+ "description" : "MyDescription",
+ "externalDocs" : {
+ "description" : "Some tag's external doc",
+ "url" : "https://tag.example.org",
+ "x-custom-property" : "In tag's external document"
+ },
+ "x-custom-property" : "In tag"
+ } ],
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ },
+ "securitySchemes" : {
+ "first" : {
+ "type" : "apiKey",
+ "description" : "Via web gateway",
+ "name" : "X-API-TOKEN",
+ "in" : "header",
+ "x-custom-property" : "In first SecurityScheme"
+ },
+ "fourth" : {
+ "type" : "openIdConnect",
+ "openIdConnectUrl" : "https://id.example.org"
+ },
+ "second" : {
+ "type" : "http",
+ "scheme" : "MyCredentials",
+ "bearerFormat" : "password"
+ },
+ "third" : {
+ "type" : "oauth2",
+ "flows" : {
+ "implicit" : {
+ "authorizationUrl" : "https://auth.example.org",
+ "refreshUrl" : "https://refresh.example.org",
+ "scopes" : {
+ "x" : "y"
+ },
+ "x-custom-property" : "In third SecurityScheme's implicit flow"
+ },
+ "password" : {
+ "tokenUrl" : "https://token.example.org"
+ },
+ "clientCredentials" : {
+ "tokenUrl" : "https://client.token.example.org"
+ },
+ "authorizationCode" : {
+ "authorizationUrl" : "https://code.auth.example.org",
+ "tokenUrl" : "https://code.token.example.org"
+ },
+ "x-custom-property" : "In third SecurityScheme's flow"
+ }
+ }
+ }
+ },
+ "x-custom-property" : "In Config"
+}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/full/open-api.yaml b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/full/open-api.yaml
similarity index 98%
rename from src/test/resources/expectedOutput/full/open-api.yaml
rename to swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/full/open-api.yaml
index d7edb5f..530e257 100644
--- a/src/test/resources/expectedOutput/full/open-api.yaml
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/full/open-api.yaml
@@ -120,6 +120,7 @@ components:
description: Via web gateway
name: X-API-TOKEN
in: header
+ x-custom-property: In first SecurityScheme
fourth:
type: openIdConnect
openIdConnectUrl: https://id.example.org
diff --git a/src/test/resources/expectedOutput/fullpretty/open-api.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/fullpretty/open-api.json
similarity index 100%
rename from src/test/resources/expectedOutput/fullpretty/open-api.json
rename to swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/fullpretty/open-api.json
diff --git a/src/test/resources/expectedOutput/fullpretty/open-api.yaml b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/fullpretty/open-api.yaml
similarity index 100%
rename from src/test/resources/expectedOutput/fullpretty/open-api.yaml
rename to swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/fullpretty/open-api.yaml
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/recursive/swagger.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/recursive/swagger.json
new file mode 100644
index 0000000..944474d
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/recursive/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/api/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/api/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/api/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/semifull/swagger.json b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/semifull/swagger.json
new file mode 100644
index 0000000..13b1a31
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/semifull/swagger.json
@@ -0,0 +1,122 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "Title",
+ "description" : "# Description\n\nThis is some description to be included.",
+ "termsOfService" : "Terms",
+ "contact" : {
+ "name" : "My Name",
+ "url" : "https://google.com",
+ "email" : "e@mail.com"
+ },
+ "license" : {
+ "name" : "MIT",
+ "url" : "https://license"
+ },
+ "version" : "1.0.0"
+ },
+ "servers" : [ {
+ "url" : "https://services.example.it/base/path",
+ "description" : "Example URL"
+ } ],
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/expectedOutput/semifull/swagger.yaml b/swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/semifull/swagger.yaml
similarity index 100%
rename from src/test/resources/expectedOutput/semifull/swagger.yaml
rename to swagger-maven-plugin-jakarta/src/test/resources/expectedOutput/semifull/swagger.yaml
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-application-scan.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-application-scan.xml
new file mode 100644
index 0000000..512b1ef
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-application-scan.xml
@@ -0,0 +1,30 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+ io.openapitools.swagger.example
+ io.openapitools.swagger.example.alternate
+ io.openapitools.swagger.example.app
+
+ target/application
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-application.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-application.xml
new file mode 100644
index 0000000..ca4ccc1
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-application.xml
@@ -0,0 +1,30 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+ io.openapitools.swagger.example
+ io.openapitools.swagger.example.alternate
+
+ target/application
+ io.openapitools.swagger.example.app.RestApplication
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-defaults-pom.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-defaults-pom.xml
new file mode 100644
index 0000000..57eefc4
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-defaults-pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+ io.openapitools.swagger.example
+ io.openapitools.swagger.example.alternate
+
+ target/default
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-nofilename-pom.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-nofilename-pom.xml
new file mode 100644
index 0000000..c10c7a0
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-nofilename-pom.xml
@@ -0,0 +1,56 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+
+
+ https://services.example.it/base/path
+ Example URL
+
+
+
+ Title
+ 1.0.0
+ Terms
+
+ e@mail.com
+ My Name
+ https://google.com
+
+
+ https://license
+ MIT
+
+
+ src/test/resources/descriptions.md
+
+
+ io.openapitools.swagger.example
+
+
+ JSON
+ YAML
+
+ target/semifull
+
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-pom.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-pom.xml
new file mode 100644
index 0000000..f791da0
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-pom.xml
@@ -0,0 +1,175 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+
+ Title
+ 1.0.0
+ Terms
+
+ e@mail.com
+ My Name
+ https://google.com
+
+
+ https://license
+ MIT
+
+
+ In Info
+
+
+ src/test/resources/descriptions.md
+
+
+ https://{sub}.example.it/base/path
+ Example URL
+
+
+ The Subdomain
+ services
+
+ services
+ web
+ main
+
+
+ In ServerVariable
+
+
+
+
+ In Server
+
+
+
+
+
+
+ apikey
+ Via web gateway
+ X-API-TOKEN
+ header
+
+ In first SecurityScheme
+
+
+
+ http
+ MyCredentials
+ password
+
+
+ oauth2
+
+
+ https://auth.example.org
+ https://refresh.example.org
+
+ y
+
+
+ In third SecurityScheme's implicit flow
+
+
+
+ https://token.example.org
+
+
+
+ https://client.token.example.org
+
+
+
+ https://code.auth.example.org
+ https://code.token.example.org
+
+
+
+ In third SecurityScheme's flow
+
+
+
+
+ openIdConnect
+ https://id.example.org
+
+
+
+
+
+
+
+ first
+
+
+
+
+
+
+ third
+
+ requiredScope1
+ requiredScope2
+
+
+
+
+
+
+
+ MyTag
+ MyDescription
+
+ Some tag's external doc
+ https://tag.example.org
+
+ In tag's external document
+
+
+
+ In tag
+
+
+
+
+ Some external doc at config level
+ https://example.org
+
+ In configs's external document
+
+
+
+ In Config
+
+
+
+ io.openapitools.swagger.example
+
+
+ JSON
+ YAML
+
+ target/full
+ open-api
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-pretty-pom.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-pretty-pom.xml
new file mode 100644
index 0000000..6c6e045
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-full-pretty-pom.xml
@@ -0,0 +1,60 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+
+
+ https://services.example.it/base/path
+ Example URL
+
+
+
+ Title
+ 1.0.0
+ Terms
+
+ e@mail.com
+ My Name
+ https://google.com
+
+
+ https://license
+ MIT
+
+
+ My custom property
+
+
+ src/test/resources/descriptions.md
+
+
+ io.openapitools.swagger.example
+
+
+ JSON
+ YAML
+
+ target/fullpretty
+ open-api
+ true
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-pom.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-pom.xml
new file mode 100644
index 0000000..951fce6
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+ io.openapitools.swagger.example
+
+
+ JSON
+ YAML
+
+ target/api
+ swagger
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-recursive-pom.xml b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-recursive-pom.xml
new file mode 100644
index 0000000..2b82f10
--- /dev/null
+++ b/swagger-maven-plugin-jakarta/src/test/resources/generate-mojo-recursive-pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-jakarta
+
+
+ io.openapitools.swagger.example
+
+ target/recursive
+ true
+
+
+
+
+
+
+
diff --git a/swagger-maven-plugin-jaxrs2/pom.xml b/swagger-maven-plugin-jaxrs2/pom.xml
new file mode 100644
index 0000000..cbced6b
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+
+ io.github.dgautier
+ swagger-maven-plugin
+ 3.0.0-SNAPSHOT
+
+
+ swagger-maven-plugin-jaxrs2
+ maven-plugin
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin-core
+ ${project.version}
+
+
+ org.apache.maven
+ maven-core
+
+
+ org.apache.maven
+ maven-plugin-api
+
+
+ org.apache.maven.plugin-tools
+ maven-plugin-annotations
+
+
+ io.swagger.core.v3
+ swagger-jaxrs2
+ ${io.swagger.core.v3.version}
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+ ${javax.ws.rs.version}
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+
+
+ io.openapitools.jackson.dataformat
+ jackson-dataformat-hal
+
+
+ org.slf4j
+ slf4j-simple
+
+
+ org.apache.maven.plugin-testing
+ maven-plugin-testing-harness
+ 4.0.0-alpha-2
+ test
+
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-plugin-plugin
+
+ swagger
+
+
+
+
+
\ No newline at end of file
diff --git a/src/it/ISSUE-25/invoker.properties b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/invoker.properties
similarity index 100%
rename from src/it/ISSUE-25/invoker.properties
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/invoker.properties
diff --git a/src/it/ISSUE-25/pom.xml b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/pom.xml
similarity index 96%
rename from src/it/ISSUE-25/pom.xml
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/pom.xml
index d3db34a..c39779a 100644
--- a/src/it/ISSUE-25/pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/pom.xml
@@ -19,7 +19,7 @@
commons-fileupload
commons-fileupload
- 1.4
+ 1.5
@@ -30,7 +30,7 @@
- io.openapitools.swagger
+ io.github.dgautier
swagger-maven-plugin
@project.version@
diff --git a/src/it/ISSUE-25/src/main/java/foo/Application.java b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/java/foo/Application.java
similarity index 100%
rename from src/it/ISSUE-25/src/main/java/foo/Application.java
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/java/foo/Application.java
diff --git a/src/it/ISSUE-25/src/main/java/foo/Service.java b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/java/foo/Service.java
similarity index 100%
rename from src/it/ISSUE-25/src/main/java/foo/Service.java
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/java/foo/Service.java
diff --git a/src/it/ISSUE-25/src/main/resources/swagger-expected.json b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/resources/swagger-expected.json
similarity index 100%
rename from src/it/ISSUE-25/src/main/resources/swagger-expected.json
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/resources/swagger-expected.json
diff --git a/src/it/ISSUE-25/src/main/resources/swagger-expected.yaml b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/resources/swagger-expected.yaml
similarity index 100%
rename from src/it/ISSUE-25/src/main/resources/swagger-expected.yaml
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/src/main/resources/swagger-expected.yaml
diff --git a/src/it/ISSUE-25/verify.bsh b/swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/verify.bsh
similarity index 100%
rename from src/it/ISSUE-25/verify.bsh
rename to swagger-maven-plugin-jaxrs2/src/it/ISSUE-25/verify.bsh
diff --git a/src/it/settings.xml b/swagger-maven-plugin-jaxrs2/src/it/settings.xml
similarity index 100%
rename from src/it/settings.xml
rename to swagger-maven-plugin-jaxrs2/src/it/settings.xml
diff --git a/swagger-maven-plugin-jaxrs2/src/main/java/io/openapitools/swagger/JaxRSScanner.java b/swagger-maven-plugin-jaxrs2/src/main/java/io/openapitools/swagger/JaxRSScanner.java
new file mode 100644
index 0000000..9f5982c
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/main/java/io/openapitools/swagger/JaxRSScanner.java
@@ -0,0 +1,78 @@
+package io.openapitools.swagger;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Application;
+
+import org.apache.maven.plugin.logging.Log;
+
+import io.github.classgraph.ClassGraph;
+import io.github.classgraph.ClassInfo;
+import io.github.classgraph.ClassInfoList;
+import io.github.classgraph.ScanResult;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+
+/**
+ * Scan for classes with {@link Path} annotation or {@link OpenAPIDefinition}
+ * annotation, and for {@link Application} instances.
+ */
+class JaxRSScanner {
+
+ private final Log log;
+
+ private final ClassGraph classGraph;
+
+ private final Set resourcePackages;
+
+ private final boolean useResourcePackagesChildren;
+
+ public JaxRSScanner(Log log, ClassLoader clzLoader, Set resourcePackages, Boolean useResourcePackagesChildren) {
+ this.log = log;
+ this.classGraph = new ClassGraph().enableClassInfo().enableAnnotationInfo()
+ .addClassLoader(clzLoader);
+ this.resourcePackages = resourcePackages == null ? Collections.emptySet() : new HashSet<>(resourcePackages);
+ this.useResourcePackagesChildren = Boolean.TRUE.equals(useResourcePackagesChildren);
+ }
+
+ Application applicationInstance() {
+ Application applicationInstance = null;
+ try (ScanResult scanResult = classGraph.scan()) {
+ ClassInfoList applicationClasses = scanResult.getSubclasses(Application.class.getName())
+ .filter(this::filterClassByResourcePackages);
+ if (applicationClasses.size() == 1) {
+ applicationInstance = ClassUtils.createInstance(applicationClasses.get(0).loadClass(Application.class));
+ } else if (applicationClasses.size() > 1) {
+ log.warn("More than one javax.ws.rs.core.Application classes found on the classpath, skipping");
+ }
+ }
+ return applicationInstance;
+ }
+
+ Set> classes() {
+ Set> classes;
+ try (ScanResult scanResult = classGraph.scan()) {
+ ClassInfoList apiClasses = scanResult.getClassesWithAnnotation(Path.class.getName());
+ ClassInfoList defClasses = scanResult.getClassesWithAnnotation(OpenAPIDefinition.class.getName());
+ classes = Stream.of(apiClasses, defClasses)
+ .flatMap(classList -> classList.filter(this::filterClassByResourcePackages).stream())
+ .map(ClassInfo::loadClass)
+ .collect(Collectors.toSet());
+ }
+ if (classes.isEmpty()) {
+ log.warn("No @Path or @OpenAPIDefinition annotated classes found in given resource packages: " + resourcePackages);
+ }
+ return classes;
+ }
+
+ private boolean filterClassByResourcePackages(ClassInfo cls) {
+ return resourcePackages.isEmpty()
+ || resourcePackages.contains(cls.getPackageName())
+ || (useResourcePackagesChildren && resourcePackages.stream().anyMatch(p -> cls.getPackageName().startsWith(p)));
+ }
+
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/main/java/io/openapitools/swagger/JaxRsGenerateMojo.java b/swagger-maven-plugin-jaxrs2/src/main/java/io/openapitools/swagger/JaxRsGenerateMojo.java
new file mode 100644
index 0000000..710da95
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/main/java/io/openapitools/swagger/JaxRsGenerateMojo.java
@@ -0,0 +1,46 @@
+package io.openapitools.swagger;
+
+import io.swagger.v3.jaxrs2.Reader;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
+import javax.ws.rs.core.Application;
+
+
+@Mojo(name = "generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
+public class JaxRsGenerateMojo extends GenerateMojo {
+ @Override
+ protected OpenAPI getOpenApi() {
+ Reader reader = new Reader(getSwaggerConfig() == null ? new OpenAPI() : getSwaggerConfig().createSwaggerModel());
+
+ JaxRSScanner reflectiveScanner = new JaxRSScanner(getLog(), createClassLoader(), getResourcePackages(), getUseResourcePackagesChildren());
+
+ Application application = resolveApplication(reflectiveScanner);
+ reader.setApplication(application);
+
+ OpenAPI swagger = OpenAPISorter.sort(reader.read(reflectiveScanner.classes()));
+ return swagger;
+ }
+
+
+ private Application resolveApplication(JaxRSScanner reflectiveScanner) {
+ if (getApplicationClass() == null || getApplicationClass().isEmpty()) {
+ return reflectiveScanner.applicationInstance();
+ }
+
+ Class> clazz = ClassUtils.loadClass(getApplicationClass(), Thread.currentThread().getContextClassLoader());
+
+ if (clazz == null || !Application.class.isAssignableFrom(clazz)) {
+ getLog().warn("Provided application class does not implement javax.ws.rs.core.Application, skipping");
+ return null;
+ } else {
+ getLog().info("Found Application Class : " + clazz.getName());
+ }
+
+ @SuppressWarnings("unchecked")
+ Class extends Application> appClazz = (Class extends Application>)clazz;
+ return ClassUtils.createInstance(appClazz);
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/GenerateMojoIT.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/GenerateMojoIT.java
new file mode 100644
index 0000000..d6da535
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/GenerateMojoIT.java
@@ -0,0 +1,148 @@
+package io.openapitools.swagger;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.v3.core.util.Json;
+import io.swagger.v3.core.util.Yaml;
+import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.maven.plugin.Mojo;
+import org.apache.maven.plugin.testing.MojoRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class GenerateMojoIT {
+
+ @Rule
+ public MojoRule rule = new MojoRule();
+
+ private void assertJsonEquals(Path expectedJson, Path generatedJson) throws IOException {
+ assertOpenApiEquals(Json.mapper(), expectedJson, generatedJson);
+ assertFileContentEquals(expectedJson, generatedJson);
+ }
+
+ private void assertYamlEquals(Path expectedYaml, Path generatedYaml) throws IOException {
+ assertOpenApiEquals(Yaml.mapper(), expectedYaml, generatedYaml);
+ assertFileContentEquals(expectedYaml, generatedYaml);
+ }
+
+ private void assertFileContentEquals(Path expected, Path generated) {
+ try {
+ assertEquals(String.join("\n", Files.readAllLines(expected, StandardCharsets.UTF_8)), String.join("\n", Files.readAllLines(generated, StandardCharsets.UTF_8)));
+ } catch (IOException e) {
+ fail();
+ }
+ }
+
+ private void assertOpenApiEquals(ObjectMapper mapper, Path expected, Path generated) throws IOException {
+ OpenAPI expectedAPI = mapper.readValue(expected.toFile(), OpenAPI.class);
+ OpenAPI generatedAPI = mapper.readValue(generated.toFile(), OpenAPI.class);
+
+ // OpenAPI.equals() performs a deep equal check of all its properties
+ assertEquals(expectedAPI, generatedAPI);
+ }
+
+ /**
+ * Tests the generated Swagger specifications based on the given method parameters.
+ *
+ * @param folder The base folder of the expected output.
+ * @param basename The basename for the generated Swagger specifications.
+ * @param pom The name of the POM file to be used for the test.
+ * @param outputFormats The output formats that should be generated and checked.
+ *
+ * @throws Exception If a JSON parsing or file-read exception happens.
+ */
+
+ private void testGenerate(String folder, String basename, String pom, OutputFormat... outputFormats)
+ throws Exception {
+
+ Path output = Paths.get(folder);
+ if (Files.exists(output)) {
+ Files.walkFileTree(output, new DeleteVisitor());
+ }
+
+ Mojo mojo = rule.lookupMojo("generate", new File("src/test/resources/" + pom));
+ mojo.execute();
+
+ List formats = Arrays.asList(outputFormats);
+ if (formats.contains(OutputFormat.JSON)) {
+ Path expectedJson = Paths.get("src/test/resources/expectedOutput", folder, basename + ".json");
+ Path generatedJson = Paths.get("target", folder, basename + ".json");
+ assertJsonEquals(expectedJson, generatedJson);
+
+ // We test the indentation by simply checking that the generated JSON contains 2 spaces
+ String json = new String(Files.readAllBytes(generatedJson), StandardCharsets.UTF_8);
+ }
+
+ if (formats.contains(OutputFormat.YAML)) {
+ Path expectedYaml = Paths.get("src/test/resources/expectedOutput", folder, basename + ".yaml");
+ Path generatedYaml = Paths.get("target", folder, basename + ".yaml");
+ assertYamlEquals(expectedYaml, generatedYaml);
+ }
+ }
+
+ //@MavenGoal("${project.groupId}:${project.artifactId}:${project.version}:generate")
+ //@MavenTest
+ @Test
+ public void testGenerateApi() throws Exception {
+ testGenerate("api", "swagger", "generate-mojo-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
+ }
+
+ @Test
+ public void testGenerateDefaults() throws Exception {
+ testGenerate("default", "swagger", "generate-mojo-defaults-pom.xml", OutputFormat.JSON);
+ }
+
+ @Test
+ public void testGenerateApplicationClass() throws Exception {
+ testGenerate("application", "swagger", "generate-mojo-application.xml", OutputFormat.JSON);
+ }
+
+ @Test
+ public void testGenerateApplicationClassByScanning() throws Exception {
+ testGenerate("application", "swagger", "generate-mojo-application-scan.xml", OutputFormat.JSON);
+ }
+
+ @Test
+ public void testGenerateFull() throws Exception {
+ testGenerate("full", "open-api", "generate-mojo-full-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
+ }
+
+ @Test
+ public void testGenerateFullNoFileName() throws Exception {
+ testGenerate("semifull", "swagger", "generate-mojo-full-nofilename-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
+ }
+
+ @Test
+ public void testGenerateFullPretty() throws Exception {
+ testGenerate("fullpretty", "open-api", "generate-mojo-full-pretty-pom.xml", OutputFormat.JSON, OutputFormat.YAML);
+ }
+
+ @Test
+ public void testGenerateRecursive() throws Exception {
+ testGenerate("recursive", "swagger", "generate-mojo-recursive-pom.xml", OutputFormat.JSON);
+ }
+
+ private static class DeleteVisitor extends SimpleFileVisitor {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ Files.delete(dir);
+ return FileVisitResult.CONTINUE;
+ }
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/MavenProjectStub.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/MavenProjectStub.java
new file mode 100644
index 0000000..e237750
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/MavenProjectStub.java
@@ -0,0 +1,13 @@
+package io.openapitools.swagger;
+
+import org.apache.maven.model.Build;
+
+public class MavenProjectStub extends org.apache.maven.plugin.testing.stubs.MavenProjectStub {
+
+ public MavenProjectStub() {
+ Build b = new Build();
+ b.setOutputDirectory("target/test-classes");
+ setBuild(b);
+ }
+
+}
diff --git a/src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java
rename to swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/AccountServiceExposure.java
diff --git a/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java
new file mode 100644
index 0000000..5131366
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/APIDefinition.java
@@ -0,0 +1,9 @@
+package io.openapitools.swagger.example.alternate;
+
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.info.Info;
+
+@OpenAPIDefinition(info = @Info(title = "My Title", version = "1.0.0"))
+public interface APIDefinition {
+}
diff --git a/src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java
rename to swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/AlternateResource.java
diff --git a/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
new file mode 100644
index 0000000..4f04787
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
@@ -0,0 +1,22 @@
+package io.openapitools.swagger.example.alternate;
+
+import io.swagger.v3.jaxrs2.ReaderListener;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.integration.api.OpenApiReader;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+
+@OpenAPIDefinition
+public class ManipulatorListener implements ReaderListener {
+ @Override
+ public void beforeScan(OpenApiReader reader, OpenAPI swagger) {
+ Info info = new Info();
+ info.setTitle("Manipulator Title");
+ swagger.setInfo(info);
+ }
+
+ @Override
+ public void afterScan(OpenApiReader reader, OpenAPI swagger) {
+ swagger.getInfo().setDescription("Description from ReaderListener");
+ }
+}
diff --git a/src/test/java/io/openapitools/swagger/example/app/RestApplication.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/app/RestApplication.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/app/RestApplication.java
rename to swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/app/RestApplication.java
diff --git a/src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java
rename to swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountRepresentation.java
diff --git a/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
new file mode 100644
index 0000000..8982afe
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
@@ -0,0 +1,32 @@
+package io.openapitools.swagger.example.model;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * Creation and update of account.
+ */
+public class AccountUpdateRepresentation {
+
+ @Pattern(regexp = "^[0-9]{4}$")
+ private String regNo;
+
+ @Pattern(regexp = "^[0-9]+$")
+ private String accountNo;
+
+ @NotNull
+ @Pattern(regexp = ".{1,40}")
+ private String name;
+
+ public String getRegNo() {
+ return regNo;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
rename to swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
diff --git a/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
new file mode 100644
index 0000000..8311848
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
@@ -0,0 +1,34 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+/**
+ * Represents a single transaction as returned by the REST service.
+ */
+@Resource
+public class TransactionRepresentation {
+ private String id;
+ private String description;
+ private String amount;
+
+ @Link
+ private HALLink self;
+
+ public String getId() {
+ return id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getAmount() {
+ return amount;
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+}
diff --git a/src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
similarity index 100%
rename from src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
rename to swagger-maven-plugin-jaxrs2/src/test/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/pom.xml
new file mode 100644
index 0000000..763f4b4
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/pom.xml
@@ -0,0 +1,31 @@
+
+ 4.0.0
+ io.openapitools.swagger.test
+ mojo-test
+ jar
+ 1.0.0-SNAPSHOT
+ Swagger Generate Maven Mojo
+
+
+
+
+
+
+ io.github.dgautier
+ swagger-maven-plugin
+
+
+ io.openapitools.swagger.example
+
+
+ JSON
+ YAML
+
+ target/api
+ swagger
+
+
+
+
+
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/AccountServiceExposure.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/AccountServiceExposure.java
new file mode 100644
index 0000000..1d1b9fd
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/AccountServiceExposure.java
@@ -0,0 +1,57 @@
+package io.openapitools.swagger.example;
+
+import io.openapitools.swagger.example.model.AccountUpdateRepresentation;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Pattern;
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
+
+/**
+ * Exposing account as REST service.
+ */
+@Path("/accounts")
+public class AccountServiceExposure {
+
+ @GET
+ @Produces({"application/hal+json"})
+ public Response list(@Context UriInfo uriInfo, @Context Request request) {
+ return Response.ok().build();
+ }
+
+ @GET
+ @Path("{regNo}-{accountNo}")
+ @Produces({"application/hal+json"})
+ @Operation(description = "Get single account",
+ responses = {@ApiResponse(responseCode = "404", description = "No account found.")})
+ public Response get(@PathParam("regNo") @Pattern(regexp = "^[0-9]{4}$") String regNo,
+ @PathParam("accountNo") @Pattern(regexp = "^[0-9]+$") String accountNo,
+ @Context UriInfo uriInfo, @Context Request request) {
+ return Response.ok().build();
+ }
+
+ @GET
+ @Path("{regNo}-{accountNo}")
+ @Produces({"application/hal+json;v=1"})
+ @Hidden
+ public Response getV1() {
+ return null;
+ }
+
+ @PUT
+ @Path("{regNo}-{accountNo}")
+ @Produces({"application/hal+json"})
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Operation(description = "Create new or update existing account",
+ responses = @ApiResponse(responseCode = "404", description = "No updating possible"))
+ public Response createOrUpdate(@PathParam("regNo") @Pattern(regexp = "^[0-9]{4}$") String regNo,
+ @PathParam("accountNo") @Pattern(regexp = "^[0-9]+$") String accountNo,
+ @Valid AccountUpdateRepresentation account,
+ @Context UriInfo uriInfo, @Context Request request) {
+ return Response.ok().build();
+ }
+
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/APIDefinition.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/APIDefinition.java
new file mode 100644
index 0000000..5131366
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/APIDefinition.java
@@ -0,0 +1,9 @@
+package io.openapitools.swagger.example.alternate;
+
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.info.Info;
+
+@OpenAPIDefinition(info = @Info(title = "My Title", version = "1.0.0"))
+public interface APIDefinition {
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/AlternateResource.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/AlternateResource.java
new file mode 100644
index 0000000..b28ee9f
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/AlternateResource.java
@@ -0,0 +1,15 @@
+package io.openapitools.swagger.example.alternate;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+
+@Path("alternate")
+public class AlternateResource {
+
+ @GET
+ public Response list() {
+ return null;
+ }
+
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
new file mode 100644
index 0000000..4f04787
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/alternate/ManipulatorListener.java
@@ -0,0 +1,22 @@
+package io.openapitools.swagger.example.alternate;
+
+import io.swagger.v3.jaxrs2.ReaderListener;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.integration.api.OpenApiReader;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+
+@OpenAPIDefinition
+public class ManipulatorListener implements ReaderListener {
+ @Override
+ public void beforeScan(OpenApiReader reader, OpenAPI swagger) {
+ Info info = new Info();
+ info.setTitle("Manipulator Title");
+ swagger.setInfo(info);
+ }
+
+ @Override
+ public void afterScan(OpenApiReader reader, OpenAPI swagger) {
+ swagger.getInfo().setDescription("Description from ReaderListener");
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/app/RestApplication.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/app/RestApplication.java
new file mode 100644
index 0000000..4fa6d3b
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/app/RestApplication.java
@@ -0,0 +1,8 @@
+package io.openapitools.swagger.example.app;
+
+import javax.ws.rs.ApplicationPath;
+
+@ApplicationPath("/api")
+public class RestApplication extends javax.ws.rs.core.Application {
+
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountRepresentation.java
new file mode 100644
index 0000000..2a1538d
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountRepresentation.java
@@ -0,0 +1,56 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.EmbeddedResource;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Represents a single as returned from REST service.
+ */
+@Resource
+public class AccountRepresentation {
+ private String regNo;
+ private String accountNo;
+ private String name;
+
+ @EmbeddedResource("transactions")
+ private Collection transactions;
+
+ @Link("account:transactions")
+ private HALLink transactionsResource;
+
+ @Link
+ private HALLink self;
+
+ public String getRegNo() {
+ return regNo;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Collection getTransactions() {
+ if (transactions == null) {
+ return null;
+ } else {
+ return Collections.unmodifiableCollection(transactions);
+ }
+ }
+
+ public HALLink getTransactionsResource() {
+ return transactionsResource;
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
new file mode 100644
index 0000000..8982afe
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountUpdateRepresentation.java
@@ -0,0 +1,32 @@
+package io.openapitools.swagger.example.model;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * Creation and update of account.
+ */
+public class AccountUpdateRepresentation {
+
+ @Pattern(regexp = "^[0-9]{4}$")
+ private String regNo;
+
+ @Pattern(regexp = "^[0-9]+$")
+ private String accountNo;
+
+ @NotNull
+ @Pattern(regexp = ".{1,40}")
+ private String name;
+
+ public String getRegNo() {
+ return regNo;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountsRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
new file mode 100644
index 0000000..c5a334f
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/AccountsRepresentation.java
@@ -0,0 +1,33 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.EmbeddedResource;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Represents a set of accounts from the REST service exposure.
+ */
+@Resource
+public class AccountsRepresentation {
+
+ @Link
+ private HALLink self;
+
+ @EmbeddedResource("accounts")
+ private Collection accounts;
+
+ public AccountsRepresentation() {
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+
+ public Collection getAccounts() {
+ return Collections.unmodifiableCollection(accounts);
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/TransactionRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
new file mode 100644
index 0000000..8311848
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/TransactionRepresentation.java
@@ -0,0 +1,34 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+/**
+ * Represents a single transaction as returned by the REST service.
+ */
+@Resource
+public class TransactionRepresentation {
+ private String id;
+ private String description;
+ private String amount;
+
+ @Link
+ private HALLink self;
+
+ public String getId() {
+ return id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getAmount() {
+ return amount;
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
new file mode 100644
index 0000000..655eae0
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources-its/io/openapitools/swagger/GenerateMojoIT/testGenerateApi/src/main/java/io/openapitools/swagger/example/model/TransactionsRepresentation.java
@@ -0,0 +1,29 @@
+package io.openapitools.swagger.example.model;
+
+import io.openapitools.jackson.dataformat.hal.HALLink;
+import io.openapitools.jackson.dataformat.hal.annotation.EmbeddedResource;
+import io.openapitools.jackson.dataformat.hal.annotation.Link;
+import io.openapitools.jackson.dataformat.hal.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Represents a set of transactions as returned by the REST service.
+ */
+@Resource
+public class TransactionsRepresentation {
+ @EmbeddedResource("transactions")
+ private Collection transactions;
+
+ @Link
+ private HALLink self;
+
+ public Collection getTransactions() {
+ return Collections.unmodifiableCollection(transactions);
+ }
+
+ public HALLink getSelf() {
+ return self;
+ }
+}
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/descriptions.md b/swagger-maven-plugin-jaxrs2/src/test/resources/descriptions.md
new file mode 100644
index 0000000..8667a6b
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/descriptions.md
@@ -0,0 +1,3 @@
+# Description
+
+This is some description to be included.
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/api/swagger.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/api/swagger.json
new file mode 100644
index 0000000..a6fd330
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/api/swagger.json
@@ -0,0 +1,103 @@
+{
+ "openapi" : "3.0.1",
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/api/swagger.yaml b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/api/swagger.yaml
new file mode 100644
index 0000000..a858a35
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/api/swagger.yaml
@@ -0,0 +1,70 @@
+openapi: 3.0.1
+paths:
+ /accounts:
+ get:
+ operationId: list
+ responses:
+ default:
+ description: default response
+ content:
+ application/hal+json: {}
+ /accounts/{regNo}-{accountNo}:
+ get:
+ description: Get single account
+ operationId: get
+ parameters:
+ - name: regNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ 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:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccountUpdateRepresentation'
+ responses:
+ "404":
+ description: No updating possible
+components:
+ schemas:
+ AccountUpdateRepresentation:
+ required:
+ - name
+ type: object
+ properties:
+ accountNo:
+ pattern: "^[0-9]+$"
+ type: string
+ name:
+ pattern: ".{1,40}"
+ type: string
+ regNo:
+ pattern: "^[0-9]{4}$"
+ type: string
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/application/swagger.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/application/swagger.json
new file mode 100644
index 0000000..944474d
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/application/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/api/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/api/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/api/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/application_scan/swagger.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/application_scan/swagger.json
new file mode 100644
index 0000000..944474d
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/application_scan/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/api/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/api/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/api/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/default/swagger.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/default/swagger.json
new file mode 100644
index 0000000..4e9c78d
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/default/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/full/open-api.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/full/open-api.json
new file mode 100644
index 0000000..60926a5
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/full/open-api.json
@@ -0,0 +1,195 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "Title",
+ "description" : "# Description\n\nThis is some description to be included.",
+ "termsOfService" : "Terms",
+ "contact" : {
+ "name" : "My Name",
+ "url" : "https://google.com",
+ "email" : "e@mail.com"
+ },
+ "license" : {
+ "name" : "MIT",
+ "url" : "https://license"
+ },
+ "version" : "1.0.0",
+ "x-custom-property" : "In Info"
+ },
+ "externalDocs" : {
+ "description" : "Some external doc at config level",
+ "url" : "https://example.org",
+ "x-custom-property" : "In configs's external document"
+ },
+ "servers" : [ {
+ "url" : "https://{sub}.example.it/base/path",
+ "description" : "Example URL",
+ "variables" : {
+ "sub" : {
+ "description" : "The Subdomain",
+ "default" : "services",
+ "enum" : [ "services", "web", "main" ],
+ "x-custom-property" : "In ServerVariable"
+ }
+ },
+ "x-custom-property" : "In Server"
+ } ],
+ "security" : [ {
+ "first" : [ ]
+ }, {
+ "third" : [ "requiredScope1", "requiredScope2" ]
+ } ],
+ "tags" : [ {
+ "name" : "MyTag",
+ "description" : "MyDescription",
+ "externalDocs" : {
+ "description" : "Some tag's external doc",
+ "url" : "https://tag.example.org",
+ "x-custom-property" : "In tag's external document"
+ },
+ "x-custom-property" : "In tag"
+ } ],
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ },
+ "securitySchemes" : {
+ "first" : {
+ "type" : "apiKey",
+ "description" : "Via web gateway",
+ "name" : "X-API-TOKEN",
+ "in" : "header",
+ "x-custom-property" : "In first SecurityScheme"
+ },
+ "fourth" : {
+ "type" : "openIdConnect",
+ "openIdConnectUrl" : "https://id.example.org"
+ },
+ "second" : {
+ "type" : "http",
+ "scheme" : "MyCredentials",
+ "bearerFormat" : "password"
+ },
+ "third" : {
+ "type" : "oauth2",
+ "flows" : {
+ "implicit" : {
+ "authorizationUrl" : "https://auth.example.org",
+ "refreshUrl" : "https://refresh.example.org",
+ "scopes" : {
+ "x" : "y"
+ },
+ "x-custom-property" : "In third SecurityScheme's implicit flow"
+ },
+ "password" : {
+ "tokenUrl" : "https://token.example.org"
+ },
+ "clientCredentials" : {
+ "tokenUrl" : "https://client.token.example.org"
+ },
+ "authorizationCode" : {
+ "authorizationUrl" : "https://code.auth.example.org",
+ "tokenUrl" : "https://code.token.example.org"
+ },
+ "x-custom-property" : "In third SecurityScheme's flow"
+ }
+ }
+ }
+ },
+ "x-custom-property" : "In Config"
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/full/open-api.yaml b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/full/open-api.yaml
new file mode 100644
index 0000000..530e257
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/full/open-api.yaml
@@ -0,0 +1,148 @@
+openapi: 3.0.1
+info:
+ title: Title
+ description: |-
+ # Description
+
+ This is some description to be included.
+ termsOfService: Terms
+ contact:
+ name: My Name
+ url: https://google.com
+ email: e@mail.com
+ license:
+ name: MIT
+ url: https://license
+ version: 1.0.0
+ x-custom-property: In Info
+externalDocs:
+ description: Some external doc at config level
+ url: https://example.org
+ x-custom-property: In configs's external document
+servers:
+- url: "https://{sub}.example.it/base/path"
+ description: Example URL
+ variables:
+ sub:
+ description: The Subdomain
+ default: services
+ enum:
+ - services
+ - web
+ - main
+ x-custom-property: In ServerVariable
+ x-custom-property: In Server
+security:
+- first: []
+- third:
+ - requiredScope1
+ - requiredScope2
+tags:
+- name: MyTag
+ description: MyDescription
+ externalDocs:
+ description: Some tag's external doc
+ url: https://tag.example.org
+ x-custom-property: In tag's external document
+ x-custom-property: In tag
+paths:
+ /accounts:
+ get:
+ operationId: list
+ responses:
+ default:
+ description: default response
+ content:
+ application/hal+json: {}
+ /accounts/{regNo}-{accountNo}:
+ get:
+ description: Get single account
+ operationId: get
+ parameters:
+ - name: regNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ 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:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccountUpdateRepresentation'
+ responses:
+ "404":
+ description: No updating possible
+components:
+ schemas:
+ AccountUpdateRepresentation:
+ required:
+ - name
+ type: object
+ properties:
+ accountNo:
+ pattern: "^[0-9]+$"
+ type: string
+ name:
+ pattern: ".{1,40}"
+ type: string
+ regNo:
+ pattern: "^[0-9]{4}$"
+ type: string
+ securitySchemes:
+ first:
+ type: apiKey
+ description: Via web gateway
+ name: X-API-TOKEN
+ in: header
+ x-custom-property: In first SecurityScheme
+ fourth:
+ type: openIdConnect
+ openIdConnectUrl: https://id.example.org
+ second:
+ type: http
+ scheme: MyCredentials
+ bearerFormat: password
+ third:
+ type: oauth2
+ flows:
+ implicit:
+ authorizationUrl: https://auth.example.org
+ refreshUrl: https://refresh.example.org
+ scopes:
+ x: "y"
+ x-custom-property: In third SecurityScheme's implicit flow
+ password:
+ tokenUrl: https://token.example.org
+ clientCredentials:
+ tokenUrl: https://client.token.example.org
+ authorizationCode:
+ authorizationUrl: https://code.auth.example.org
+ tokenUrl: https://code.token.example.org
+ x-custom-property: In third SecurityScheme's flow
+x-custom-property: In Config
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/fullpretty/open-api.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/fullpretty/open-api.json
new file mode 100644
index 0000000..22514e1
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/fullpretty/open-api.json
@@ -0,0 +1,123 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "Title",
+ "description" : "# Description\n\nThis is some description to be included.",
+ "termsOfService" : "Terms",
+ "contact" : {
+ "name" : "My Name",
+ "url" : "https://google.com",
+ "email" : "e@mail.com"
+ },
+ "license" : {
+ "name" : "MIT",
+ "url" : "https://license"
+ },
+ "version" : "1.0.0",
+ "x-custom-property" : "My custom property"
+ },
+ "servers" : [ {
+ "url" : "https://services.example.it/base/path",
+ "description" : "Example URL"
+ } ],
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/fullpretty/open-api.yaml b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/fullpretty/open-api.yaml
new file mode 100644
index 0000000..3cb0990
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/fullpretty/open-api.yaml
@@ -0,0 +1,89 @@
+openapi: 3.0.1
+info:
+ title: Title
+ description: |-
+ # Description
+
+ This is some description to be included.
+ termsOfService: Terms
+ contact:
+ name: My Name
+ url: https://google.com
+ email: e@mail.com
+ license:
+ name: MIT
+ url: https://license
+ version: 1.0.0
+ x-custom-property: My custom property
+servers:
+- url: https://services.example.it/base/path
+ description: Example URL
+paths:
+ /accounts:
+ get:
+ operationId: list
+ responses:
+ default:
+ description: default response
+ content:
+ application/hal+json: {}
+ /accounts/{regNo}-{accountNo}:
+ get:
+ description: Get single account
+ operationId: get
+ parameters:
+ - name: regNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ 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:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccountUpdateRepresentation'
+ responses:
+ "404":
+ description: No updating possible
+components:
+ schemas:
+ AccountUpdateRepresentation:
+ required:
+ - name
+ type: object
+ properties:
+ accountNo:
+ pattern: "^[0-9]+$"
+ type: string
+ name:
+ pattern: ".{1,40}"
+ type: string
+ regNo:
+ pattern: "^[0-9]{4}$"
+ type: string
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/recursive/swagger.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/recursive/swagger.json
new file mode 100644
index 0000000..944474d
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/recursive/swagger.json
@@ -0,0 +1,121 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "My Title",
+ "description" : "Description from ReaderListener",
+ "version" : "1.0.0"
+ },
+ "paths" : {
+ "/api/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/api/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ },
+ "/api/alternate" : {
+ "get" : {
+ "operationId" : "list_1",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "*/*" : { }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/semifull/swagger.json b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/semifull/swagger.json
new file mode 100644
index 0000000..13b1a31
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/semifull/swagger.json
@@ -0,0 +1,122 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "Title",
+ "description" : "# Description\n\nThis is some description to be included.",
+ "termsOfService" : "Terms",
+ "contact" : {
+ "name" : "My Name",
+ "url" : "https://google.com",
+ "email" : "e@mail.com"
+ },
+ "license" : {
+ "name" : "MIT",
+ "url" : "https://license"
+ },
+ "version" : "1.0.0"
+ },
+ "servers" : [ {
+ "url" : "https://services.example.it/base/path",
+ "description" : "Example URL"
+ } ],
+ "paths" : {
+ "/accounts" : {
+ "get" : {
+ "operationId" : "list",
+ "responses" : {
+ "default" : {
+ "description" : "default response",
+ "content" : {
+ "application/hal+json" : { }
+ }
+ }
+ }
+ }
+ },
+ "/accounts/{regNo}-{accountNo}" : {
+ "get" : {
+ "description" : "Get single account",
+ "operationId" : "get",
+ "parameters" : [ {
+ "name" : "regNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "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" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }, {
+ "name" : "accountNo",
+ "in" : "path",
+ "required" : true,
+ "schema" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AccountUpdateRepresentation"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "404" : {
+ "description" : "No updating possible"
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "AccountUpdateRepresentation" : {
+ "required" : [ "name" ],
+ "type" : "object",
+ "properties" : {
+ "accountNo" : {
+ "pattern" : "^[0-9]+$",
+ "type" : "string"
+ },
+ "name" : {
+ "pattern" : ".{1,40}",
+ "type" : "string"
+ },
+ "regNo" : {
+ "pattern" : "^[0-9]{4}$",
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/semifull/swagger.yaml b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/semifull/swagger.yaml
new file mode 100644
index 0000000..e87ddfc
--- /dev/null
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/expectedOutput/semifull/swagger.yaml
@@ -0,0 +1,88 @@
+openapi: 3.0.1
+info:
+ title: Title
+ description: |-
+ # Description
+
+ This is some description to be included.
+ termsOfService: Terms
+ contact:
+ name: My Name
+ url: https://google.com
+ email: e@mail.com
+ license:
+ name: MIT
+ url: https://license
+ version: 1.0.0
+servers:
+- url: https://services.example.it/base/path
+ description: Example URL
+paths:
+ /accounts:
+ get:
+ operationId: list
+ responses:
+ default:
+ description: default response
+ content:
+ application/hal+json: {}
+ /accounts/{regNo}-{accountNo}:
+ get:
+ description: Get single account
+ operationId: get
+ parameters:
+ - name: regNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ 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:
+ pattern: "^[0-9]{4}$"
+ type: string
+ - name: accountNo
+ in: path
+ required: true
+ schema:
+ pattern: "^[0-9]+$"
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccountUpdateRepresentation'
+ responses:
+ "404":
+ description: No updating possible
+components:
+ schemas:
+ AccountUpdateRepresentation:
+ required:
+ - name
+ type: object
+ properties:
+ accountNo:
+ pattern: "^[0-9]+$"
+ type: string
+ name:
+ pattern: ".{1,40}"
+ type: string
+ regNo:
+ pattern: "^[0-9]{4}$"
+ type: string
diff --git a/src/test/resources/generate-mojo-application-scan.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-application-scan.xml
similarity index 90%
rename from src/test/resources/generate-mojo-application-scan.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-application-scan.xml
index 18a3f33..58c04e3 100644
--- a/src/test/resources/generate-mojo-application-scan.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-application-scan.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
io.openapitools.swagger.example
diff --git a/src/test/resources/generate-mojo-application.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-application.xml
similarity index 90%
rename from src/test/resources/generate-mojo-application.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-application.xml
index 5757158..8b5aceb 100644
--- a/src/test/resources/generate-mojo-application.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-application.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
io.openapitools.swagger.example
diff --git a/src/test/resources/generate-mojo-defaults-pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-defaults-pom.xml
similarity index 90%
rename from src/test/resources/generate-mojo-defaults-pom.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-defaults-pom.xml
index c152deb..7018eb4 100644
--- a/src/test/resources/generate-mojo-defaults-pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-defaults-pom.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
io.openapitools.swagger.example
diff --git a/src/test/resources/generate-mojo-full-nofilename-pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-nofilename-pom.xml
similarity index 95%
rename from src/test/resources/generate-mojo-full-nofilename-pom.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-nofilename-pom.xml
index aed7fbf..ebc7263 100644
--- a/src/test/resources/generate-mojo-full-nofilename-pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-nofilename-pom.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
diff --git a/src/test/resources/generate-mojo-full-pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-pom.xml
similarity index 98%
rename from src/test/resources/generate-mojo-full-pom.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-pom.xml
index a7d0fb0..fedb304 100644
--- a/src/test/resources/generate-mojo-full-pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-pom.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
diff --git a/src/test/resources/generate-mojo-full-pretty-pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-pretty-pom.xml
similarity index 95%
rename from src/test/resources/generate-mojo-full-pretty-pom.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-pretty-pom.xml
index b88df24..d3f358d 100644
--- a/src/test/resources/generate-mojo-full-pretty-pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-full-pretty-pom.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
diff --git a/src/test/resources/generate-mojo-pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-pom.xml
similarity index 91%
rename from src/test/resources/generate-mojo-pom.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-pom.xml
index 12abbc3..9a36864 100644
--- a/src/test/resources/generate-mojo-pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-pom.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
io.openapitools.swagger.example
diff --git a/src/test/resources/generate-mojo-recursive-pom.xml b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-recursive-pom.xml
similarity index 89%
rename from src/test/resources/generate-mojo-recursive-pom.xml
rename to swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-recursive-pom.xml
index 780f24c..f648192 100644
--- a/src/test/resources/generate-mojo-recursive-pom.xml
+++ b/swagger-maven-plugin-jaxrs2/src/test/resources/generate-mojo-recursive-pom.xml
@@ -12,8 +12,8 @@
- io.openapitools.swagger
- swagger-maven-plugin
+ io.github.dgautier
+ swagger-maven-plugin-jaxrs2
io.openapitools.swagger.example