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. [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.openapitools.swagger/swagger-maven-plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.openapitools.swagger/swagger-maven-plugin/) [![Javadoc](https://javadoc.io/badge/io.openapitools.swagger/swagger-maven-plugin/badge.svg)](https://www.javadoc.io/doc/io.openapitools.swagger/swagger-maven-plugin) -[![Build status](https://travis-ci.org/openapi-tools/swagger-maven-plugin.svg?branch=master)](https://travis-ci.org/openapi-tools/swagger-maven-plugin) -[![Known Vulnerabilities](https://snyk.io/test/github/openapi-tools/swagger-maven-plugin/badge.svg)](https://snyk.io/test/github/openapi-tools/swagger-maven-plugin) +[![Build status](https://github.com/dgautier/swagger-maven-plugin/actions/workflows/build.yml/badge.svg)](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 appClazz = (Class)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 appClazz = (Class)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 appClazz = (Class)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